diff --git a/.gitignore b/.gitignore index 21d6c4a..8f252ae 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ /dl compile_commands.json .cache +/test +/linux diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3fa4b23..faec06f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,6 +4,11 @@ variables: GITEE_REPO: git@gitee.com:kendryte/k230_linux_sdk.git DL_SITE: https://ai.b-bug.org/~/wangjianxin/dl/ HW_VER: v0.1 + TFTP_BASE: /data1/tftp_server + NFS_SERVER: 10.10.1.94 + NFS_BASE: /data/nfs_server + IMAGE_DIR: linux_sdk_images + IMAGE_NAME: "*_linux_*_nncase_*.img.gz" TEST_CONFIGS: > k230_canmv_defconfig k230d_canmv_defconfig @@ -153,9 +158,21 @@ before_script: - git config --global --add safe.directory $CI_PROJECT_DIR - echo '----------fetch all tags----------' - timeout 3m git fetch --tags || { timeout 3m git fetch --tags || { timeout 3m git fetch --tags || exit 1; }; } - - HW_TYPE=$(echo $CONF | awk -F '_' '{print $1}') - - HW_MODEL=$(echo $CONF | awk -F "_" '{if ($3 == "v2") print $2"_"$3; else print $2}') - - echo "HW_TYPE ${HW_TYPE}, HW_MODEL ${HW_MODEL}" + - | + echo "get hw type and modle based on configs name" + if [[ "$CONF" == "BPI-CanMV-K230D-Zero_defconfig" ]]; then + HW_TYPE="k230d" + HW_MODEL="bpi" + else + HW_TYPE=$(echo $CONF | awk -F '_' '{print $1}') + HW_MODEL=$(echo $CONF | awk -F "_" '{if ($3 == "v2") print $2"_"$3; else print $2}') + fi + echo "HW_TYPE ${HW_TYPE}, HW_MODEL ${HW_MODEL}" + - echo "set only_linux and only_rtt flag for test jobs" + - ONLY_LINUX=True + - ONLY_RTT=False + - echo "ONLY_RTT is ${ONLY_RTT}" + - echo "ONLY_LINUX is ${ONLY_LINUX}" .github_to_gitlab_gitee: timeout: 30m @@ -236,26 +253,26 @@ before_script: script: - cd $CI_PROJECT_DIR - ls -alht - - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/release_k230_linux_sdk_image.sh -O ./release_k230_linux_sdk_image.sh - - chmod +x ./release_k230_linux_sdk_image.sh + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/release_images.sh -O ./release_images.sh + - chmod +x ./release_images.sh - echo $CI_COMMIT_TAG || exit 1 - echo $CONF || exit 1 - - time ./release_k230_linux_sdk_image.sh $CI_COMMIT_TAG $CONF || time ./release_k230_linux_sdk_image.sh $CI_COMMIT_TAG $CONF - - echo "all release file synced" + - time ./release_images.sh $CI_COMMIT_TAG $CONF $IMAGE_DIR $IMAGE_NAME $IMAGE_DIR || time ./release_images.sh $CI_COMMIT_TAG $CONF $IMAGE_DIR $IMAGE_NAME $IMAGE_DIR + - echo "all release file published" .update_version: &update_version - - echo "---curren version ${ver}" + - echo "---curren version ${SUB_BASE}" - > if [[ $CI_COMMIT_TAG =~ ^v[0-9]+\.[0-9]+.*$ ]]; then echo "release tag exist, will replace version dir with tag"; SUB_BASE=$CI_COMMIT_TAG; - echo "tag is ${ver}"; + echo "tag is ${SUB_BASE}"; else echo "tag is null, skip ver overwrite"; - echo "ver is ${ver}"; + echo "ver is ${SUB_BASE}"; fi - - echo "---update version ${ver}" + - echo "---update version ${SUB_BASE}" .build_job: &build_job - pwd @@ -281,7 +298,7 @@ before_script: - echo "----------save image----------" - echo ${DST_BASE} - echo "set DST_DIR with different type based on docs/images/src" - - DST_DIR="${DST_BASE}/linux_sdk_images" + - DST_DIR="${DST_BASE}/${IMAGE_DIR}" - echo ${DST_DIR} - echo "---create repo dir---" - sudo mkdir -p ${DST_DIR} @@ -291,12 +308,13 @@ before_script: - echo "---create current image version dir---" - sudo mkdir -p ${DST_DIR}/${SUB_DIR}/ || exit 1 - echo "---save sdk build output---" - - sudo cp -rf --sparse=always -L ${SRC_DIR}/${HW_TYPE}_${HW_MODEL}_*.img.gz ${DST_DIR}/${SUB_DIR}/ + - ls "${SRC_DIR}" + - sudo cp -rf --sparse=always -L ${SRC_DIR}/${IMAGE_NAME} ${DST_DIR}/${SUB_DIR}/ - echo "${DST_DIR}/${SUB_DIR}/" - ls "${DST_DIR}/${SUB_DIR}/" - echo "add latest link for current build" - test -h ${DST_DIR}/latest && sudo rm ${DST_DIR}/latest - - sudo ln -s ${DST_DIR}/${ver} ${DST_DIR}/latest || exit 1 + - sudo ln -s ${DST_DIR}/${SUB_BASE} ${DST_DIR}/latest || exit 1 - ls ${DST_DIR}/latest - echo "----------output URL----------" - echo "${DST_DIR}/${SUB_DIR}/" | sed "s/\/data1/https:\/\/ai\.b-bug\.org/g" @@ -331,9 +349,9 @@ before_script: CI_MERGE_REQUEST_IID=$CI_PIPELINE_SOURCE; fi echo "current MR ID ${CI_MERGE_REQUEST_IID}"; - SUB_DIR="${CI_MERGE_REQUEST_IID}_${CI_PIPELINE_ID}"; + SUB_DIR="${CI_MERGE_REQUEST_IID}_${CI_PIPELINE_ID}/${CONF}"; sudo mkdir -p ${DST_DIR}/${SUB_DIR}/ || exit 1; - src_file="${SRC_DIR}/${HW_TYPE}_${HW_MODEL}_*.img.gz"; + src_file="${SRC_DIR}/${IMAGE_NAME}"; echo ${SRC_DIR}; echo ${src_file}; ls -alht output/${CONF}/images/ || exit 1; @@ -354,6 +372,375 @@ before_script: done - echo "----------save image to tftp done----------" +.test: + test_setup: + - echo "----------Step 1. get available test devices----------" + - | + echo "check job from MR or tag or schedule or web"; + if [[ ${CI_MERGE_REQUEST_IID} ]]; then + echo "current job is MR, skip and use CI_MERGE_REQUEST_IID"; + elif [[ ${CI_COMMIT_TAG} ]]; then + echo "current job is release job, use CI_COMMIT_TAG"; + CI_MERGE_REQUEST_IID=${CI_COMMIT_TAG}; + elif [[ $CI_PIPELINE_SOURCE == "schedule" ]]; then + echo "current job is daily build schedule job, use CI_PIPELINE_SOURCE"; + CI_MERGE_REQUEST_IID=$CI_PIPELINE_SOURCE; + else + echo "current job is not match, use CI_PIPELINE_SOURCE"; + CI_MERGE_REQUEST_IID=$CI_PIPELINE_SOURCE; + fi + - echo "MR ID ${CI_MERGE_REQUEST_IID}" + - echo "Pipeline ID ${CI_PIPELINE_ID}" + - test -d bin || mkdir ./bin + - test -f ./bin/ailab && rm -rf ./bin/ailab + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/tools/ailab -O ./bin/ailab + - chmod +x ./bin/ailab + - | + echo "for loop to get available test device" + for i in {1..6}; do + if [ $i -eq 6 ]; + then + echo "ERROR: No Available DUT after 5 times retry, Please rerun curent job to check it again"; + exit 1; + fi + starttime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---loop $i start time: $starttime"; + echo "---start to get available test device in loop $i---"; + available=$(./bin/ailab show --dest available --domain ${DOMAIN} --hw_type ${HW_TYPE} --hw_model ${HW_MODEL} --hw_ver ${HW_VER} --format args) + echo ${available} + if [[ $available =~ "k230" ]]; + then + echo "---Get Available DUT pass in loop $i---"; + echo "----------get available test devices done----------"; + echo "----------Step 2. reserve test device----------"; + reserved=$(./bin/ailab add ${available} --time 15m --site ${CI_PROJECT_NAME} --source ${CI_MERGE_REQUEST_IID} --job ${CI_PIPELINE_ID} --format args); + echo ${reserved}; + if [[ ${reserved} =~ "gitlab" ]]; + then + echo "Reserve DUT pass in loop $i, break loop and continue the next job"; + # exit for loop with break once device avaiable and reserved pass + break; + else + echo "ERROR: Reserve DUT failed"; + if [ $i -eq 6 ]; + then + echo "ERROR: No Available DUT after 5 times retry, Please rerun curent job to check it again"; + exit 1; + else + echo "---sleep 30 seconds and auto rerun in next loop..."; + sleep 30 + fi + fi + else + echo "ERROR: Get available test device failed in loop $i, ignore Error and try again..."; + echo "---sleep for 30seconds and start to rerun in next loop..."; + sleep 30; + fi + done + - echo "----------Step 3. save reserved/available for after_script----------" + - echo "${available}" > available + - echo "${reserved}" > reserved + - echo "${HW_MODEL}" > HW_MODEL + - echo "----------Step 4. power on/reset test device before test start----------" + - power_off="./bin/ailab power --type=off ${available}"; + - power_on="./bin/ailab power --type=on ${available}"; + - power_reset="./bin/ailab power --type=cycle ${available}"; + - echo $power_off + - echo $power_on + - echo $power_reset + - | + echo "---start to run device power job before test start..."; + if [[ "$HW_MODEL" =~ "canmv_v2" ]] + then + echo "---canmv v2 board will be power reset at test start ---"; + $power_reset; + sleep 2; + echo "canmv_v2 board power reset done. continue to run test job"; + elif [[ "$HW_MODEL" == "canmv" ]] + then + echo "---canmv board will be power reset at test start ---"; + $power_reset; + sleep 2; + echo "canmv board power reset done. continue to run test job"; + else + echo "---evb board will be power off and power on at test start---"; + $power_off; + sleep 2; + $power_on; + sleep 2; + echo "evb board power off and power on done. continue in next loop"; + fi + echo "---device power action done, start to run test job..."; + - echo "----------reserve test device and power on/reset test device done----------" + test_teardown: + - echo "----------release test device----------" + - echo "get variables from previous steps" + - reserved=$(cat reserved) + - available=$(cat available) + - HW_MODEL=$(cat HW_MODEL) + - echo "Release DUT start" + - test -d bin || mkdir ./bin + - test -f ./bin/ailab && rm -rf ./bin/ailab + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/tools/ailab -O ./bin/ailab + - chmod +x ./bin/ailab + - result=$(./bin/ailab update --dest=reserved ${reserved}) + - echo $result + - | + if [[ $result =~ "True" ]]; then + echo "Release DUT pass"; + else + echo "ERROR: Release DUT failed"; + exit 1; + fi + - power_off="./bin/ailab power --type=off ${available}"; + - power_on="./bin/ailab power --type=on ${available}"; + - power_reset="./bin/ailab power --type=cycle ${available}"; + - echo $power_off + - echo $power_on + - echo $power_reset + - | + echo "---start to run device power job after test done..."; + if [[ "$HW_MODEL" =~ "canmv_v2" ]] + then + echo "---canmv v2 board will skip power job at test start ---"; + # $power_reset; + # sleep 2; + # echo "canmv_v2 board power reset done. continue to run test job"; + elif [[ "$HW_MODEL" == "canmv" ]] + then + echo "---canmv board will skip power job after test done---"; + # $power_reset; + # sleep 2; + # echo "canmv board power reset done. continue to run test job"; + else + echo "---evb board will be power off after test done---"; + $power_off; + # sleep 2; + # $power_on; + # sleep 2; + echo "evb board power off and power on done. continue in next loop"; + fi + echo "---device power job done---"; + - echo "----------release test device done----------" + copy_test_resource: + - echo "----------Step 5. copy test resource----------" + - echo "get build step result" + - echo $image_path + - echo $SUB_BASE + - echo $HW_TYPE + - echo $HW_MODEL + - echo $HW_VER + - echo "current test device config is ${CONF}" + - pwd + - echo "----------Step 6. save test resource to nfs case folder----------" + - echo "---get nfs case folder---" + - | + echo ${NFS_BASE}; + echo "set NFS_DST_DIR with different type based on docs/images/src"; + NFS_DST_DIR="${NFS_BASE}/${HW_TYPE}/${HW_MODEL}_${HW_VER}"; + echo ${NFS_DST_DIR}; + echo "---create NFS dir---"; + echo "generate sub dir for MR/Pre-releae/relese job"; + echo "check job from MR or tag or schedule or web"; + if [[ ${CI_MERGE_REQUEST_IID} ]]; then + echo "current job is MR, skip and use CI_MERGE_REQUEST_IID"; + elif [[ ${CI_COMMIT_TAG} ]]; then + echo "current job is release job, use CI_COMMIT_TAG"; + CI_MERGE_REQUEST_IID=${CI_COMMIT_TAG}; + elif [[ $CI_PIPELINE_SOURCE == "schedule" ]]; then + echo "current job is daily build schedule job, use CI_PIPELINE_SOURCE"; + CI_MERGE_REQUEST_IID=$CI_PIPELINE_SOURCE; + else + echo "current job is not match, use CI_PIPELINE_SOURCE"; + CI_MERGE_REQUEST_IID=$CI_PIPELINE_SOURCE; + fi + echo "current MR ID ${CI_MERGE_REQUEST_IID}"; + SUB_DIR="${CI_MERGE_REQUEST_IID}_${CI_PIPELINE_ID}"; + NFS_CASE_FOLDER="${NFS_DST_DIR}/${SUB_DIR}/${CONF}/${DOMAIN}"; + echo "NFS_CASE_FOLDER: $NFS_CASE_FOLDER"; + - echo "create $NFS_CASE_FOLDER" + - sudo mkdir -p ${NFS_CASE_FOLDER} || exit 1; + - sudo chmod -R 777 ${NFS_CASE_FOLDER} || exit 1; + - echo "----------Step 7. generate test device yml file for test job----------" + - echo "run command ./bin/ailab convert --dest=script --format yaml --file_name=${DOMAIN}.yml --nfs_server_ip $NFS_SERVER --nfs_case_folder $NFS_CASE_FOLDER --only_rtt ${ONLY_RTT} --only_linux ${ONLY_LINUX}--conf ${CONF} --pr_id ${CI_MERGE_REQUEST_IID} --job_id ${CI_PIPELINE_ID} --sysimage_md5 ${sysimage_md5} ${available}" + - ./bin/ailab convert --dest=script --format yaml --file_name=${DOMAIN}.yml --nfs_server_ip $NFS_SERVER --nfs_case_folder $NFS_CASE_FOLDER --only_rtt ${ONLY_RTT} --only_linux ${ONLY_LINUX} --conf ${CONF} --pr_id ${CI_MERGE_REQUEST_IID} --job_id ${CI_PIPELINE_ID} --sysimage_md5 ${sysimage_md5} ${available} + - test -f ${DOMAIN}.yml || exit 1 + - cat ${DOMAIN}.yml || exit 1 + - echo "cp ${DOMAIN}.yml to nfs_case_folder" + - cp -rf --sparse=always ${DOMAIN}.yml $NFS_CASE_FOLDER/ || exit 1 + - test -f $NFS_CASE_FOLDER/${DOMAIN}.yml || exit 1 + - echo "show test resource in nfs_server" + - echo $NFS_CASE_FOLDER + - ls -alht $NFS_CASE_FOLDER + load_image: + - echo "----------load image to test device----------" + - echo "sysimage-sdcard.img.gz md5 ${sysimage_md5}" + - test -d bin || mkdir ./bin + - test -f ./bin/aiload && rm -rf ./bin/aiload + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/tools/k230load -O ./bin/aiload + - chmod +x ./bin/aiload + - echo "MR ID ${CI_MERGE_REQUEST_IID}" + - echo "Pipeline ID ${CI_PIPELINE_ID}" + - | + echo "---start to load image in for loop"; + stime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---load image start time: $stime"; + load_cmd="./bin/aiload --file_name=$NFS_CASE_FOLDER/${DOMAIN}.yml"; + echo "${load_cmd}"; + for i in {1..6}; do + if [ $i -eq 6 ] + then + echo "ERROR: Max retries reached with load image"; + exit 1; + fi + starttime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---loop $i start time: $starttime"; + echo "---start to load image in loop $i---"; + if eval $load_cmd + then + echo "---loop $i load image pass---"; + break; + else + echo "ERROR:loop $i load image failed, ignore Error and retry again..."; + echo "---start to run device power job after failed job..."; + if [[ "$HW_MODEL" == "canmv_v2" ]] + then + echo "---canmv_v2 board will be power reset at the end of loop $i ---"; + $power_reset; + sleep 15; + echo "canmv_v2 board power reset done. continue in next loop"; + elif [[ "$HW_MODEL" == "canmv" ]] + then + echo "---canmv board will be power reset at the end of loop $i ---"; + $power_reset; + sleep 15; + echo "canmv board power reset done. continue in next loop"; + else + echo "---evb board will be power off and power on at the end of loop $i---"; + $power_off; + sleep 3; + $power_on; + sleep 15; + echo "evb board power off and power on done. continue in next loop"; + fi + echo "---device power action, start to rerun in next loop..."; + fi + endtime=$(date +'%Y-%m-%d %H:%M:%S'); + start_seconds=$(date -d "$starttime" +%s); + end_seconds=$(date -d "$endtime" +%s); + echo "---loop $i end time: $endtime"; + echo "---loop $i total cost time:$((end_seconds - start_seconds)) s"; + done + etime=$(date +'%Y-%m-%d %H:%M:%S'); + s_seconds=$(date -d "$stime" +%s); + e_seconds=$(date -d "$etime" +%s); + echo "---load image end time: $etime"; + echo "---load image total cost time:$((e_seconds - s_seconds)) s"; + echo "---finished load image in loop $i"; + - echo "---load image pass" + - echo "----------load image to test device done----------" + smoke_test: + - echo "----------Run Smoke Test start----------" + - test -d bin || mkdir ./bin + - test -f ./bin/airobot && rm -rf ./bin/airobot + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/tools/airobot -O ./bin/airobot + - chmod +x ./bin/airobot + - echo "---add smoke test script" + - git clone ${TEST_SCRIPTS_REPO} k230_testscripts || exit 1 + - cd k230_testscripts || exit 1 + - git fetch origin dev || { sleep 30; git fetch origin dev || { sleep 30; git fetch origin dev || exit 1; } } + - git checkout dev || exit 1 + - cd ../ || exit 1 + - echo "---download evb board smoke test script in loop $i---"; + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/testscripts/k230_sdk_smoke_test.sh -O ./k230_sdk_smoke_test.sh; + - chmod +x ./k230_sdk_smoke_test.sh + - | + echo "---start to run k230 smoke test in for loop"; + stime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---run k230 smoke test start time: $stime"; + test_cmd="./k230_sdk_smoke_test.sh $NFS_CASE_FOLDER/${DOMAIN}.yml"; + for i in {1..3}; do + if [ $i -eq 3 ]; + then + echo "ERROR: Max retries reached with run k230 smoke test"; + exit 1; + fi + starttime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---loop $i start time: $starttime"; + echo "---start to run k230 smoke test in loop $i---"; + if eval $test_cmd; + then + echo "---loop $i run k230 smoke test pass---"; + break; + else + echo "ERROR:loop $i run k230 smoke test failed, ignore Error and try again..."; + echo "---start to rerun in next loop..."; + sleep 3 + fi + endtime=$(date +'%Y-%m-%d %H:%M:%S'); + start_seconds=$(date -d "$starttime" +%s); + end_seconds=$(date -d "$endtime" +%s); + echo "---loop $i end time: $endtime"; + echo "---loop $i total cost time:$((end_seconds - start_seconds)) s"; + done + etime=$(date +'%Y-%m-%d %H:%M:%S'); + s_seconds=$(date -d "$stime" +%s); + e_seconds=$(date -d "$etime" +%s); + echo "---run k230 smoke test end time: $etime"; + echo "---run k230 smoke test total cost time:$((e_seconds - s_seconds)) s"; + echo "---finished run k230 smoke test in loop $i"; + - echo "----------Run Smoke Test pass----------" + daily_test: + - echo "----------Run Daily Test start----------" + - test -d bin || mkdir ./bin + - test -f ./bin/airobot && rm -rf ./bin/airobot + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/tools/airobot -O ./bin/airobot + - chmod +x ./bin/airobot + - echo "---get daily test scripts" + - git clone ${TEST_SCRIPTS_REPO} k230_testscripts || exit 1 + - cd k230_testscripts || exit 1 + - git fetch origin dev || { sleep 30; git fetch origin dev || { sleep 30; git fetch origin dev || exit 1; } } + - git checkout dev || exit 1 + - cd ../ || exit 1 + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/testscripts/k230_sdk_daily_test.sh -O ./k230_sdk_daily_test.sh + - chmod +x ./k230_sdk_daily_test.sh + - | + echo "---start to run k230 daily test in for loop"; + stime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---run k230 daily test start time: $stime"; + test_cmd="./k230_sdk_daily_test.sh $NFS_CASE_FOLDER/${DOMAIN}.yml"; + for i in {1..3}; do + if [ $i -eq 3 ]; + then + echo "ERROR: Max retries reached with run k230 daily test"; + exit 1; + fi + starttime=$(date +'%Y-%m-%d %H:%M:%S'); + echo "---loop $i start time: $starttime"; + echo "---start to run k230 daily test in loop $i---"; + if eval $test_cmd; + then + echo "---loop $i run k230 daily test pass---"; + break; + else + echo "ERROR:loop $i run k230 daily test failed, ignore Error and try again..."; + echo "---start to rerun in next loop..."; + sleep 3; + fi + endtime=$(date +'%Y-%m-%d %H:%M:%S'); + start_seconds=$(date -d "$starttime" +%s); + end_seconds=$(date -d "$endtime" +%s); + echo "---loop $i end time: $endtime"; + echo "---loop $i total cost time:$((end_seconds - start_seconds)) s"; + done + etime=$(date +'%Y-%m-%d %H:%M:%S'); + s_seconds=$(date -d "$stime" +%s); + e_seconds=$(date -d "$etime" +%s); + echo "---run k230 daily test end time: $etime"; + echo "---run k230 daily test total cost time:$((e_seconds - s_seconds)) s"; + echo "---finished run k230 daily test in loop $i"; + - echo "----------Run Daily Test pass----------" + # download dir publish with tag download_dir_release: stage: release @@ -369,7 +756,10 @@ release_image_publish: - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG =~ /^v\d+\.\d+.*$/ parallel: matrix: - - CONF: [k230_canmv_defconfig] + - CONF: + - k230_canmv_defconfig + - k230d_canmv_defconfig + - BPI-CanMV-K230D-Zero_defconfig extends: - .sync_release_image @@ -463,6 +853,7 @@ build-image: - CONF: - k230_canmv_defconfig - k230d_canmv_defconfig + - BPI-CanMV-K230D-Zero_defconfig variables: DST_BASE: /data1/k230/gitlab-ci/images/${CI_PROJECT_NAME} SRC_DIR: ./output/${CONF}/images @@ -477,7 +868,7 @@ build-image: - if: $CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_TAG !~ /^v\d+\.\d+.*$/ # daily build - if: $CI_PIPELINE_SOURCE == "schedule" - timeout: 45m + timeout: 60m script: - *show_vars - *check_build_result @@ -493,11 +884,12 @@ load_image_smoke_test: image: ai.b-bug.org:5000/k230_testscripts:latest stage: smoke_test variables: - TEST_ENV: ai + DOMAIN: ai parallel: matrix: - CONF: - k230_canmv_defconfig + - k230d_canmv_defconfig rules: # MR open - if: $CI_PIPELINE_SOURCE == "merge_request_event" @@ -509,12 +901,13 @@ load_image_smoke_test: - if: $CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_TAG !~ /^v\d+\.\d+.*$/ # daily build - if: $CI_PIPELINE_SOURCE == "schedule" - timeout: 30m + timeout: 60m script: - *show_vars - *check_build_result - - echo "==============================" - - echo "There is NO test job NOW" - - echo "==============================" - - echo "add this stage for future job" - - echo "==============================" + - !reference [.test, test_setup] + - !reference [.test, copy_test_resource] + - !reference [.test, load_image] + #- !reference [.test, smoke_test] + after_script: + - !reference [.test, test_teardown] diff --git a/Makefile b/Makefile index c11d4a3..73b6972 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ include .last_conf BRW_BUILD_DIR = $(CURDIR)/output/$(CONF) -.PHONY: all buildroot debian ubuntu openouler ruyi k230d_32bit_rootfs k230d_canmv_kernel64_root32 +.PHONY: all buildroot debian ubuntu openouler ruyi all : buildroot debian ubuntu openouler : buildroot @@ -21,14 +21,6 @@ debian ubuntu openouler : buildroot buildroot: $(BRW_BUILD_DIR)/.config make -C $(BRW_BUILD_DIR) all -k230d_32bit_rootfs:sync - make -C $(BR_SRC_DIR) k230d_canmv_32bit_rootfs_defconfig O=$(CURDIR)/output/k230d_canmv_32bit_rootfs_defconfig - make -C $(CURDIR)/output/k230d_canmv_32bit_rootfs_defconfig all - -k230d_canmv_kernel64_root32: sync k230d_32bit_rootfs - make -C $(BR_SRC_DIR) k230d_canmv_64kernel_32rootfs_defconfig O=$(CURDIR)/output/k230d_canmv_64kernel_32rootfs_defconfig - make -C $(CURDIR)/output/k230d_canmv_64kernel_32rootfs_defconfig all - .PHONY:dl dl: $(BRW_BUILD_DIR)/.config echo "download all source" @@ -48,14 +40,14 @@ help:sync @echo " make CONF=k230_canmv_defconfig -build k230 linux sdk user k230_canmv_defconfig" @echo " -CONF can be $$(ls $(BR_OVERLAY_DIR)/configs | tr '\n' '/')" @echo "dcoker build and run example:" - @echo " docker build -f tools/docker/Dockerfile -t wjx/linux_sdk_docker_tt tools/docker " - @echo ' docker run -it -h k230 -e uid=$$(id -u) -e gid=$$(id -g) -e user=$${USER} -v $$HOME:$$HOME -w $$(pwd) wjx/linux_sdk_docker_tt:latest ' + @echo " docker build -f tools/docker/Dockerfile -t wjx/d tools/docker " + @echo ' docker run -it --rm -h k230 -e uid=$$(id -u) -e gid=$$(id -g) -e user=$${USER} -v $$HOME:$$HOME -v /opt/toolchain:/opt/toolchain -w $$(pwd) wjx/d:latest ' .PHONY:sync sync: make -f tools/sync.mk sync BR_SRC_DIR=$(BR_SRC_DIR) BR_OVERLAY_DIR=$(BR_OVERLAY_DIR) BR_NAME=$(BR_NAME) -this-makefile := $(lastword $(MAKEFILE_LIST)) all dl help savedefconfig sync %_defconfig k230d_32bit_rootfs k230d_canmv_kernel64_root32 +this-makefile := $(lastword $(MAKEFILE_LIST)) all dl help savedefconfig sync %_defconfig $(filter-out $(this-makefile) , $(MAKECMDGOALS)): $(BRW_BUILD_DIR)/.config [ -d $(BRW_BUILD_DIR) ] && make -C $(BRW_BUILD_DIR) $@ diff --git a/README.md b/README.md index 66b6772..9e1cb9e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,32 @@ # K230 Linux SDK +>This document uses the k230d_canmv_defconfig configuration as an example. If you use other configurations, replace k230d_canmv_defconfig with correct names. All the configurations supported by this sdk, can be found in buildroot-overlay/configs directory. +## Install toolchain and dependencies ->This document uses the k230d_canmv_defconfig configuration as an example. If you use other configurations, replace k230d_canmv_defconfig with correct names. All the configurations supported by this sdk, can be found in buildroot-overlay/configs directory. +download Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1-20240712.tar.gz toolchan from `https://www.xrvm.cn/community/download?id=4333581795569242112` +uncompress the toolchain to the /opt/toolchain(Refer command): +```bash +mkdir -p /opt/toolchain; +tar -zxvf Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1-20240712.tar.gz -C /opt/toolchain; +``` +install dependencies(Refer command): + +```bash +apt-get install -y git sed make binutils build-essential diffutils gcc g++ bash patch gzip \ + bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 \ + libssl-dev gawk cmake bison flex bash-completion +``` + +>k230d_canmv_ilp32_defconfig required ubuntu 22.04 or 24.04 and install rv64ilp32 toolchain(refer command): +> +>`wget -c https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/releases/download/2024.06.25/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25-nightly.tar.gz;` +> +>`mkdir -p /opt/toolchain/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25/;` +》 +>`tar -xvf riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25-nightly.tar.gz -C /opt/toolchain/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25/;` ## build @@ -12,12 +34,11 @@ make CONF=k230d_canmv_defconfig #build k230d canmv image (kernel and rootfs both 64bit); # make CONF=k230_canmv_defconfig # build k230 canmv image -# make CONF=k230d_canmv_32bit_rootfs_defconfig #build k230d canmv 32bit rootfs; -# make CONF=k230d_canmv_64kernel_32rootfs_defconfig #build k230d 64bit kernel and 32bit rootfs image +# make CONF=k230d_canmv_ilp32_defconfig #build k230d canmv 32bit rootfs; # make help # view help ``` ->[BR2_PRIMARY_SIT configuration primary download site]("https://bootlin.com/pub/conferences/2011/elce/using-buildroot-real-project/using-buildroot-real-project.pdf") for example:make CONF=k230d_canmv_defconfig BR2_PRIMARY_SITE=https://ai.b-bug.org/~/wangjianxin/dl/ +>[BR2_PRIMARY_SIT configuration primary download site]("https://bootlin.com/pub/conferences/2011/elce/using-buildroot-real-project/using-buildroot-real-project.pdf") for example: `make CONF=k230d_canmv_defconfig BR2_PRIMARY_SITE=https://ai.b-bug.org/~/wangjianxin/dl/` ## output @@ -44,14 +65,13 @@ output/k230d_canmv_defconfig/build/uboot-2022.10/ #uboot full code,uboot build d make linux-menuconfig #modify configuration make linux-savedefconfig #save to defconfig -make linux-rebuild opensbi-rebuild #rebuild linux,rebuild opensbi +make linux-rebuild #rebuild linux make linux-dirclean #linux clean ``` >linux source code can be specified using the LINUX_OVERRIDE_SRCDIR macro,for example: >echo LINUX_OVERRIDE_SRCDIR=/home/wangjianxin/t/linux-xuantie-kernel >output/k230d_canmv_defconfig/local.mk - ## buildroot ```bash diff --git a/buildroot-overlay/board/canaan/k230-soc/default.env b/buildroot-overlay/board/canaan/k230-soc/default.env index 86b384a..b0ed3f2 100755 --- a/buildroot-overlay/board/canaan/k230-soc/default.env +++ b/buildroot-overlay/board/canaan/k230-soc/default.env @@ -22,5 +22,9 @@ ramdisk_addr=0xa100000 serverip=10.10.1.94 vendor=canaan quick_boot=false -blinux=ext4load mmc 1:1 0x3000000 /fw_jump_add_uboot_head.bin && ext4load mmc 1:1 0x200000 /Image && ext4load mmc 1:1 0x2200000 /k.dtb && bootm 0x3000000 - 0x2200000; -bnuttx=ext4load mmc 1:1 0x7000000 /nuttx-7000000-uart2.bin && boot_baremetal 0 0x${fileaddr} 0x${filesize}; +k=Image +kilp32=Image_ilp32 +nuttex=nuttx-7000000-uart2.bin +blinux=ext4load mmc 1:1 0x3000000 /fw_jump_add_uboot_head.bin && ext4load mmc 1:1 0x200000 /${k} && ext4load mmc 1:1 0x2200000 /k.dtb && bootm 0x3000000 - 0x2200000; +blinuxilp32= setenv k Image_ilp32 && run blinux; +bnuttx=ext4load mmc 1:1 0x7000000 /${nuttex} && boot_baremetal 0 0x${fileaddr} 0x${filesize}; diff --git a/buildroot-overlay/board/canaan/k230-soc/post-image.sh b/buildroot-overlay/board/canaan/k230-soc/post-image.sh index 175ab08..4238127 100755 --- a/buildroot-overlay/board/canaan/k230-soc/post-image.sh +++ b/buildroot-overlay/board/canaan/k230-soc/post-image.sh @@ -25,21 +25,23 @@ gz_file_add_ver() local CONF=$(basename ${BASE_DIR}) local sdk_ver="v0.0.0"; - local nncase_ver="0.0.0"; + local nncase_ver="2.9.0"; local sdk_ver_file="${K230_SDK_ROOT}/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/etc/version/release_version" - #local nncase_ver_file="${K230_SDK_ROOT}/src/big/nncase/riscv64/nncase/include/nncase/version.h" + local nncase_ver_file="${K230_SDK_ROOT}/output/${CONF}/build/libnncase/nncase/include/nncase/version.h" + local storage="$(echo "$f" | sed -nE "s#[^-]*-([^\.]*).*#\1#p")" local conf_name="${CONF%%_defconfig}" - sdk_ver=$(awk -F- '/^sdk:/ { print $1}' ${sdk_ver_file} | cut -d: -f2 ) - # cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2 > /dev/null && \ - # nncase_ver=$(cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2) - rm -rf ${conf_name}_${storage}_${sdk_ver}_nncase_v${nncase_ver}.img.gz; - ln -s $f ${conf_name}_${storage}_${sdk_ver}_nncase_v${nncase_ver}.img.gz; + if [ -e "${nncase_ver_file}" ]; then + cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2 > /dev/null && \ + nncase_ver=$(cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2) + fi + rm -rf ${conf_name}_linux_${sdk_ver}_nncase_v${nncase_ver}.img.gz; + ln -s $f ${conf_name}_linux_${sdk_ver}_nncase_v${nncase_ver}.img.gz; } @@ -199,24 +201,35 @@ gen_image() gen_env_bin() { local mkenvimage="${UBOOT_BUILD_DIR}/tools/mkenvimage" + local CONFT=${BUILD_DIR%/build*} + local CONF=${CONFT##*/output/}; + + cd "${BINARIES_DIR}/"; local default_env_file=${env_dir}/default.env; + if [ ${DTB} == "k230-canmv-01studio.dtb" ]; then default_env_file=${env_dir}/01studio.env; fi + if [ ${CONF} == "k230d_canmv_ilp32_defconfig" ]; then + sed -i 's/^bootcmd=.*$/bootcmd=run blinuxilp32;/g' ${default_env_file} + else + sed -i 's/^bootcmd=.*$/bootcmd=run blinux;/g' ${default_env_file} + fi ${mkenvimage} -s 0x10000 -o uboot/env.env ${default_env_file} } gen_boot_ext4() { cd "${BINARIES_DIR}/"; - mkdir boot; + mkdir -p boot; cp ${K230_SDK_ROOT}/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/boot/nuttx-7000000-uart2.bin boot/; cp Image boot/; - ${UBOOT_BUILD_DIR}/tools/mkimage -A riscv -O linux -T kernel -C none -a 0 -e 0 -n linux -d ${BINARIES_DIR}/fw_jump.bin boot/fw_jump_add_uboot_head.bin + [ ! -f "Image_ilp32" ] || cp Image_ilp32 boot/; cp ${DTB} boot; cd boot; rm -rf k.dtb;ln -s ${DTB} k.dtb; cd -; + ${UBOOT_BUILD_DIR}/tools/mkimage -A riscv -O linux -T kernel -C none -a 0 -e 0 -n linux -d ${BINARIES_DIR}/fw_jump.bin boot/fw_jump_add_uboot_head.bin rm -rf boot.ext4 ;fakeroot mkfs.ext4 -d boot -r 1 -N 0 -m 1 -L "boot" -O ^64bit boot.ext4 45M } diff --git a/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/etc/version/release_version b/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/etc/version/release_version index 55b8f86..df4a9b0 100644 --- a/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/etc/version/release_version +++ b/buildroot-overlay/board/canaan/k230-soc/rootfs_overlay/etc/version/release_version @@ -1,3 +1,3 @@ #############SDK VERSION###################################### -sdk:v0.1-20240606-114414-wangjianxin-develop-5bc8e1c +sdk:v0.2-20240722-041214-wangjianxin-k230-a402e06 ############################################################## diff --git a/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv.dts b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv.dts index bab36d4..89784a3 100755 --- a/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv.dts +++ b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv.dts @@ -145,9 +145,9 @@ (IO44) ( 1< CAM - (IO48) ( 1<; }; -}; +}; \ No newline at end of file diff --git a/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv_bpi.dts b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv_bpi.dts new file mode 100755 index 0000000..0ee753e --- /dev/null +++ b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/arch/riscv/dts/k230d_canmv_bpi.dts @@ -0,0 +1,172 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "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 COPYRIGHT HOLDER OR + * CONTRIBUTORS 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. + */ +/dts-v1/; +#include +#define BANK_VOLTAGE_IO0_IO1 K230_MSC_1V8 // FIXED +#define BANK_VOLTAGE_IO2_IO13 K230_MSC_3V3 +#define BANK_VOLTAGE_IO14_IO25 K230_MSC_3V3 +#define BANK_VOLTAGE_IO26_IO37 K230_MSC_3V3 +#define BANK_VOLTAGE_IO38_IO49 K230_MSC_3V3 +#define BANK_VOLTAGE_IO50_IO61 K230_MSC_3V3 +#define BANK_VOLTAGE_IO62_IO63 K230_MSC_3V3 +#include "k230d.dtsi" + +/ { + model = "kendryte k230d canmv"; + compatible = "kendryte,k230d_canmv"; + + memory@0 { + device_type = "memory"; + reg = < + 0x0 0 0x0 0x7000000 /*MEM_LINUX_SYS*/ + 0x0 0x7000000 0 0x1000000 /*nuttx*/ + >; + }; +}; + +&mmc0 { + status = "okay"; +}; + +&mmc1 { + status = "okay"; +}; + +&usbotg0 { + status = "okay"; +}; + +&iomux { + pinctrl-names = "default"; + pinctrl-0 = <&drop_pins &pins>; + +// Please pay attention to the bank voltage! will damage the chip. + pins: iomux_pins { + u-boot,dm-pre-reloc; + pinctrl-single,pins = < + + // SW3 KEY + (IO0 ) ( 0< CAM0 + (IO7 ) ( 2< CAM + (IO40) ( 2<; + }; +}; diff --git a/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/configs/k230d_canmv_bpi_defconfig b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/configs/k230d_canmv_bpi_defconfig new file mode 100755 index 0000000..45bacab --- /dev/null +++ b/buildroot-overlay/boot/uboot/u-boot-2022.10-overlay/configs/k230d_canmv_bpi_defconfig @@ -0,0 +1,113 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x0 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_ENV_OFFSET=0x1e0000 +CONFIG_SPL_DM_SPI=y +CONFIG_DEFAULT_DEVICE_TREE="k230d_canmv_bpi" +CONFIG_SPL_TEXT_BASE=0x80300000 +CONFIG_SYS_PROMPT="K230# " +CONFIG_SPL_MMC=y +CONFIG_SPL_SYS_MALLOC_F_LEN=0x30000 +CONFIG_SPL_SIZE_LIMIT=0x80000 +CONFIG_SPL=y +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI=y +CONFIG_SYS_LOAD_ADDR=0x7000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230D_CANMV=y +CONFIG_DDR_SIZE=0x8000000 +CONFIG_ARCH_RV64I=y +# CONFIG_SPL_SMP is not set +CONFIG_SHOW_REGS=y +CONFIG_SYS_MEMTEST_END=0x100000 +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_SPL_FIT=y +# CONFIG_SPL_LOAD_FIT is not set +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=5 +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +CONFIG_BOARD_LATE_INIT=y +CONFIG_SPL_MAX_SIZE=0x80000 +CONFIG_SPL_BSS_START_ADDR=0x80380000 +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1000 +CONFIG_SPL_ENV_SUPPORT=y +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_MTD_SUPPORT=y +CONFIG_SPL_NAND_SUPPORT=y +CONFIG_SPL_DM_SPI_FLASH=y +# CONFIG_SPL_SPI_FLASH_TINY is not set +CONFIG_SPL_SPI_LOAD=y +CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000 +CONFIG_SPL_YMODEM_SUPPORT=y +# CONFIG_CMD_CPU is not set +CONFIG_CMD_BOOTMETH=y +CONFIG_SYS_BOOTM_LEN=0x8000000 +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_MD5SUM=y +CONFIG_MD5SUM_VERIFY=y +CONFIG_CMD_MEMTEST=y +CONFIG_SYS_ALT_MEMTEST=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +CONFIG_CMD_SF_TEST=y +CONFIG_CMD_USB=y +# CONFIG_SPL_DOS_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_ENV_IS_IN_MMC=y +CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_ENV_SECT_SIZE_AUTO=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_PROT_UDP=y +CONFIG_BOOTP_SERVERIP=y +CONFIG_SPL_DM_DEVICE_REMOVE=y +CONFIG_SPL_CLK=y +CONFIG_DM_KEYBOARD=y +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_SPL_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_SPL_PINCONF=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_USB_DWC2=y +CONFIG_USB_HOST_ETHER=y +CONFIG_USB_ETHER_ASIX=y +CONFIG_USB_ETHER_ASIX88179=y +CONFIG_USB_ETHER_MCS7830=y +CONFIG_USB_ETHER_RTL8152=y +CONFIG_USB_ETHER_SMSC95XX=y +CONFIG_FAT_WRITE=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_defconfig b/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_defconfig new file mode 100755 index 0000000..d8e5424 --- /dev/null +++ b/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_defconfig @@ -0,0 +1,58 @@ +BR2_riscv=y +BR2_RISCV_ISA_RVC=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y +BR2_DL_DIR="$(TOPDIR)/../../dl" +BR2_SYSTEM_DHCP="eth0" +BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/canaan/k230-soc/post-build.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/canaan/k230-soc/post-image.sh" +BR2_ROOTFS_POST_SCRIPT_ARGS="bananapi-canmv-k230d-zero $(LINUX_DIR)" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_GIT=y +BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" +BR2_LINUX_KERNEL_DEFCONFIG="k230" +BR2_LINUX_KERNEL_DTS_SUPPORT=y +BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/bananapi-canmv-k230d-zero" +BR2_LINUX_KERNEL_INSTALL_TARGET=y +BR2_PACKAGE_LINUX_TOOLS_GPIO=y +BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_VVCAM=y +BR2_PACKAGE_COREMARK=y +BR2_PACKAGE_COREMARK_PRO=y +BR2_PACKAGE_VG_LITE_DEMOS=y +BR2_PACKAGE_LVGL=y +BR2_PACKAGE_LIBGPIOD=y +BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_LRZSZ=y +BR2_PACKAGE_OPENSSH=y +BR2_PACKAGE_LIBMMZ=y +BR2_PACKAGE_LIBNNCASE=y +BR2_PACKAGE_FACE_DETECT=y +BR2_PACKAGE_AI2D_KPU=y +BR2_TARGET_ROOTFS_EXT2=y +BR2_TARGET_ROOTFS_EXT2_4=y +BR2_TARGET_ROOTFS_EXT2_SIZE="256M" +BR2_TARGET_OPENSBI=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.4" +BR2_TARGET_OPENSBI_PLAT="generic" +# BR2_TARGET_OPENSBI_INSTALL_DYNAMIC_IMG is not set +BR2_TARGET_OPENSBI_LINUX_PAYLOAD=y +BR2_TARGET_OPENSBI_ADDITIONAL_VARIABLES="FW_TEXT_START=0" +BR2_TARGET_UBOOT=y +BR2_TARGET_UBOOT_BOARDNAME="k230d_canmv_bpi" +BR2_TARGET_UBOOT_CUSTOM_VERSION=y +BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2022.10" +BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_ilp32_defconfig b/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_ilp32_defconfig new file mode 100755 index 0000000..bc5d652 --- /dev/null +++ b/buildroot-overlay/configs/BPI-CanMV-K230D-Zero_ilp32_defconfig @@ -0,0 +1,55 @@ +BR2_riscv=y +BR2_RISCV_ISA_RVC=y +BR2_RISCV_32=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y +BR2_DL_DIR="$(TOPDIR)/../../dl" +BR2_SSP_REGULAR=y +BR2_FORTIFY_SOURCE_NONE=y +BR2_SYSTEM_DHCP="eth0" +BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/canaan/k230-soc/post-build.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/canaan/k230-soc/post-image.sh" +BR2_ROOTFS_POST_SCRIPT_ARGS="k230d-canmv $(LINUX_DIR)" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_GIT=y +BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" +BR2_LINUX_KERNEL_DEFCONFIG="k230" +BR2_LINUX_KERNEL_DTS_SUPPORT=y +BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/bananapi-canmv-k230d-zero.dts" +BR2_LINUX_KERNEL_INSTALL_TARGET=y +BR2_PACKAGE_LINUX_ILP32=y +BR2_PACKAGE_FIO=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_LIBDRM=y +BR2_PACKAGE_LIBGPIOD=y +BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_IPERF3=y +BR2_TARGET_ROOTFS_EXT2=y +BR2_TARGET_ROOTFS_EXT2_4=y +BR2_TARGET_ROOTFS_EXT2_SIZE="128M" +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_OPENSBI=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.4" +BR2_TARGET_OPENSBI_PLAT="generic" +BR2_TARGET_OPENSBI_LINUX_PAYLOAD=y +BR2_TARGET_OPENSBI_ADDITIONAL_VARIABLES="FW_TEXT_START=0" +BR2_TARGET_UBOOT=y +BR2_TARGET_UBOOT_BOARDNAME="k230d_canmv_bp" +BR2_TARGET_UBOOT_CUSTOM_VERSION=y +BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2022.10" +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_VG_LITE=y +BR2_PACKAGE_VG_LITE_DEMOS=y +BR2_PACKAGE_LVGL=y diff --git a/buildroot-overlay/configs/k230_canmv_01studio_defconfig b/buildroot-overlay/configs/k230_canmv_01studio_defconfig index 0e97e59..3830d97 100755 --- a/buildroot-overlay/configs/k230_canmv_01studio_defconfig +++ b/buildroot-overlay/configs/k230_canmv_01studio_defconfig @@ -1,8 +1,16 @@ BR2_riscv=y BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y BR2_DL_DIR="$(TOPDIR)/../../dl" BR2_SYSTEM_DHCP="eth0" BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" @@ -12,7 +20,7 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="k230-canmv-01studio $(LINUX_DIR)" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_GIT=y BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="a75016b196d1e4a64297e4a8c8996d2f9db7cede" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" BR2_LINUX_KERNEL_DEFCONFIG="k230" BR2_LINUX_KERNEL_DTS_SUPPORT=y BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230-canmv-01studio" @@ -26,6 +34,7 @@ BR2_PACKAGE_COREMARK_PRO=y BR2_PACKAGE_VG_LITE_DEMOS=y BR2_PACKAGE_LIBGPIOD=y BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_LRZSZ=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="128M" diff --git a/buildroot-overlay/configs/k230_canmv_defconfig b/buildroot-overlay/configs/k230_canmv_defconfig index a43e210..00e12c4 100755 --- a/buildroot-overlay/configs/k230_canmv_defconfig +++ b/buildroot-overlay/configs/k230_canmv_defconfig @@ -1,8 +1,16 @@ BR2_riscv=y BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y BR2_DL_DIR="$(TOPDIR)/../../dl" BR2_SYSTEM_DHCP="eth0" BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" @@ -12,7 +20,7 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="k230-canmv $(LINUX_DIR)" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_GIT=y BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="a75016b196d1e4a64297e4a8c8996d2f9db7cede" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" BR2_LINUX_KERNEL_DEFCONFIG="k230" BR2_LINUX_KERNEL_DTS_SUPPORT=y BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230-canmv" @@ -26,9 +34,15 @@ BR2_PACKAGE_COREMARK_PRO=y BR2_PACKAGE_VG_LITE_DEMOS=y BR2_PACKAGE_LIBGPIOD=y BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_LRZSZ=y +BR2_PACKAGE_OPENSSH=y +BR2_PACKAGE_LIBMMZ=y +BR2_PACKAGE_LIBNNCASE=y +BR2_PACKAGE_FACE_DETECT=y +BR2_PACKAGE_AI2D_KPU=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y -BR2_TARGET_ROOTFS_EXT2_SIZE="128M" +BR2_TARGET_ROOTFS_EXT2_SIZE="256M" BR2_TARGET_OPENSBI=y BR2_TARGET_OPENSBI_CUSTOM_VERSION=y BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.4" diff --git a/buildroot-overlay/configs/k230_evb_defconfig b/buildroot-overlay/configs/k230_evb_defconfig index b060dcc..8272f79 100755 --- a/buildroot-overlay/configs/k230_evb_defconfig +++ b/buildroot-overlay/configs/k230_evb_defconfig @@ -1,8 +1,16 @@ BR2_riscv=y BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y BR2_DL_DIR="$(TOPDIR)/../../dl" BR2_SYSTEM_DHCP="eth0" BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" @@ -12,7 +20,7 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="k230-evb $(LINUX_DIR)" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_GIT=y BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="a75016b196d1e4a64297e4a8c8996d2f9db7cede" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" BR2_LINUX_KERNEL_DEFCONFIG="k230" BR2_LINUX_KERNEL_DTS_SUPPORT=y BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230-evb" @@ -26,6 +34,7 @@ BR2_PACKAGE_COREMARK_PRO=y BR2_PACKAGE_VG_LITE_DEMOS=y BR2_PACKAGE_LIBGPIOD=y BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_LRZSZ=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="128M" diff --git a/buildroot-overlay/configs/k230d_canmv_32bit_rootfs_defconfig b/buildroot-overlay/configs/k230d_canmv_32bit_rootfs_defconfig deleted file mode 100755 index 1fe85ef..0000000 --- a/buildroot-overlay/configs/k230d_canmv_32bit_rootfs_defconfig +++ /dev/null @@ -1,24 +0,0 @@ -BR2_riscv=y -BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_RISCV_32=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y -BR2_DL_DIR="$(TOPDIR)/../../dl" -BR2_SSP_REGULAR=y -BR2_FORTIFY_SOURCE_NONE=y -BR2_SYSTEM_DHCP="eth0" -BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" -BR2_ROOTFS_POST_BUILD_SCRIPT="board/canaan/k230-soc/post-build.sh" -BR2_PACKAGE_FIO=y -BR2_PACKAGE_E2FSPROGS=y -BR2_PACKAGE_IPERF3=y -BR2_TARGET_ROOTFS_EXT2=y -BR2_TARGET_ROOTFS_EXT2_4=y -BR2_TARGET_ROOTFS_EXT2_SIZE="128M" -# BR2_TARGET_ROOTFS_TAR is not set -BR2_PACKAGE_HOST_GENIMAGE=y -BR2_PACKAGE_VG_LITE_DEMOS=y -BR2_PACKAGE_LVGL=y -BR2_PACKAGE_LIBGPIOD=y -BR2_PACKAGE_LIBGPIOD_TOOLS=y diff --git a/buildroot-overlay/configs/k230d_canmv_64kernel_32rootfs_defconfig b/buildroot-overlay/configs/k230d_canmv_64kernel_32rootfs_defconfig deleted file mode 100755 index c3f24f3..0000000 --- a/buildroot-overlay/configs/k230d_canmv_64kernel_32rootfs_defconfig +++ /dev/null @@ -1,30 +0,0 @@ -BR2_riscv=y -BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y -BR2_DL_DIR="$(TOPDIR)/../../dl" -BR2_INIT_NONE=y -# BR2_TARGET_ENABLE_ROOT_LOGIN is not set -BR2_ROOTFS_POST_IMAGE_SCRIPT="board/canaan/k230-soc/post-image.sh" -BR2_ROOTFS_POST_SCRIPT_ARGS="k230d-canmv $(LINUX_DIR) $(TOPDIR)/../k230d_canmv_32bit_rootfs_defconfig/images/rootfs.ext4" -BR2_LINUX_KERNEL=y -BR2_LINUX_KERNEL_CUSTOM_GIT=y -BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="a75016b196d1e4a64297e4a8c8996d2f9db7cede" -BR2_LINUX_KERNEL_DEFCONFIG="k230" -BR2_LINUX_KERNEL_DTS_SUPPORT=y -BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230d-canmv" -BR2_LINUX_KERNEL_INSTALL_TARGET=y -# BR2_TARGET_ROOTFS_TAR is not set -BR2_TARGET_OPENSBI=y -BR2_TARGET_OPENSBI_CUSTOM_VERSION=y -BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.4" -BR2_TARGET_OPENSBI_PLAT="generic" -BR2_TARGET_OPENSBI_LINUX_PAYLOAD=y -BR2_TARGET_OPENSBI_ADDITIONAL_VARIABLES="FW_TEXT_START=0" -BR2_TARGET_UBOOT=y -BR2_TARGET_UBOOT_BOARDNAME="k230d_canmv" -BR2_TARGET_UBOOT_CUSTOM_VERSION=y -BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2022.10" -BR2_PACKAGE_HOST_GENIMAGE=y diff --git a/buildroot-overlay/configs/k230d_canmv_defconfig b/buildroot-overlay/configs/k230d_canmv_defconfig index 7c566f2..69ad2a4 100755 --- a/buildroot-overlay/configs/k230d_canmv_defconfig +++ b/buildroot-overlay/configs/k230d_canmv_defconfig @@ -1,8 +1,16 @@ BR2_riscv=y BR2_RISCV_ISA_RVC=y -BR2_RISCV_ISA_RVV=y -BR2_GCC_VERSION_14_X=y -BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y BR2_DL_DIR="$(TOPDIR)/../../dl" BR2_SYSTEM_DHCP="eth0" BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" @@ -12,7 +20,7 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="k230d-canmv $(LINUX_DIR)" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_GIT=y BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="a75016b196d1e4a64297e4a8c8996d2f9db7cede" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" BR2_LINUX_KERNEL_DEFCONFIG="k230" BR2_LINUX_KERNEL_DTS_SUPPORT=y BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230d-canmv" @@ -27,6 +35,8 @@ BR2_PACKAGE_VG_LITE_DEMOS=y BR2_PACKAGE_LVGL=y BR2_PACKAGE_LIBGPIOD=y BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_LRZSZ=y +BR2_PACKAGE_OPENSSH=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="128M" diff --git a/buildroot-overlay/configs/k230d_canmv_ilp32_defconfig b/buildroot-overlay/configs/k230d_canmv_ilp32_defconfig new file mode 100755 index 0000000..17cb183 --- /dev/null +++ b/buildroot-overlay/configs/k230d_canmv_ilp32_defconfig @@ -0,0 +1,55 @@ +BR2_riscv=y +BR2_RISCV_ISA_RVC=y +BR2_RISCV_32=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y +BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1" +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-gnu" +BR2_TOOLCHAIN_EXTERNAL_GCC_10=y +BR2_TOOLCHAIN_EXTERNAL_HEADERS_6_6=y +BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y +# BR2_TOOLCHAIN_EXTERNAL_INET_RPC is not set +BR2_TOOLCHAIN_EXTERNAL_CXX=y +BR2_TOOLCHAIN_EXTERNAL_FORTRAN=y +BR2_TOOLCHAIN_EXTERNAL_OPENMP=y +BR2_DL_DIR="$(TOPDIR)/../../dl" +BR2_SSP_REGULAR=y +BR2_FORTIFY_SOURCE_NONE=y +BR2_SYSTEM_DHCP="eth0" +BR2_ROOTFS_OVERLAY="board/canaan/k230-soc/rootfs_overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/canaan/k230-soc/post-build.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/canaan/k230-soc/post-image.sh" +BR2_ROOTFS_POST_SCRIPT_ARGS="k230d-canmv $(LINUX_DIR)" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_GIT=y +BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/ruyisdk/linux-xuantie-kernel.git" +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="29ca31b84050c86353b9e7207491e4c1201b10ea" +BR2_LINUX_KERNEL_DEFCONFIG="k230" +BR2_LINUX_KERNEL_DTS_SUPPORT=y +BR2_LINUX_KERNEL_INTREE_DTS_NAME="canaan/k230d-canmv" +BR2_LINUX_KERNEL_INSTALL_TARGET=y +BR2_PACKAGE_LINUX_ILP32=y +BR2_PACKAGE_FIO=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_LIBDRM=y +BR2_PACKAGE_LIBGPIOD=y +BR2_PACKAGE_LIBGPIOD_TOOLS=y +BR2_PACKAGE_IPERF3=y +BR2_TARGET_ROOTFS_EXT2=y +BR2_TARGET_ROOTFS_EXT2_4=y +BR2_TARGET_ROOTFS_EXT2_SIZE="128M" +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_OPENSBI=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION=y +BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.4" +BR2_TARGET_OPENSBI_PLAT="generic" +BR2_TARGET_OPENSBI_LINUX_PAYLOAD=y +BR2_TARGET_OPENSBI_ADDITIONAL_VARIABLES="FW_TEXT_START=0" +BR2_TARGET_UBOOT=y +BR2_TARGET_UBOOT_BOARDNAME="k230d_canmv" +BR2_TARGET_UBOOT_CUSTOM_VERSION=y +BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2022.10" +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_VG_LITE=y +BR2_PACKAGE_VG_LITE_DEMOS=y +BR2_PACKAGE_LVGL=y diff --git a/buildroot-overlay/linux/Config.in b/buildroot-overlay/linux/Config.in new file mode 100644 index 0000000..721e515 --- /dev/null +++ b/buildroot-overlay/linux/Config.in @@ -0,0 +1,497 @@ +menu "Kernel" + +config BR2_LINUX_KERNEL + bool "Linux Kernel" + select BR2_PACKAGE_HOST_KMOD # Unconditional, even if modules not enabled + select BR2_PACKAGE_HOST_IMAGEMAGICK if BR2_LINUX_KERNEL_CUSTOM_LOGO_PATH != "" + help + Enable this option if you want to build a Linux kernel for + your embedded device + +if BR2_LINUX_KERNEL + +# Packages that need to have a kernel with support for loadable modules, +# but do not use the kernel-modules infrastructure, should select that +# option. +config BR2_LINUX_NEEDS_MODULES + bool + +# +# Version selection. We provide the choice between: +# +# 1. A single fairly recent stable kernel version +# 2. A custom stable version +# 3. A custom tarball +# 4. A set of custom repository locations +# +choice + prompt "Kernel version" + +config BR2_LINUX_KERNEL_LATEST_VERSION + bool "Latest version (6.6)" + select BR2_TOOLCHAIN_HEADERS_AT_LEAST_6_6 if BR2_KERNEL_HEADERS_AS_KERNEL + +config BR2_LINUX_KERNEL_LATEST_CIP_VERSION + bool "Latest CIP SLTS version (5.10.162-cip24)" + select BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_10 if BR2_KERNEL_HEADERS_AS_KERNEL + help + CIP launched in the spring of 2016 to address the needs of + organizations in industries such as power generation and + distribution, water, oil and gas, transportation, building + automation and more for reliable and secure Linux-based + embedded systems that can be sustained over a period of + 10 to as many as 60 years. + The project's goal is to provide an open source base layer + of industrial-grade software that permits the use and + implementation of software building blocks that meet + these requirements. + + The CIP community plans to maintain 5.10 for security and + bug fixes for more than 10 years. + + https://www.cip-project.org + +config BR2_LINUX_KERNEL_LATEST_CIP_RT_VERSION + bool "Latest CIP RT SLTS version (5.10.162-cip24-rt10)" + select BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_10 if BR2_KERNEL_HEADERS_AS_KERNEL + help + Same as the CIP version, but this is the PREEMPT_RT realtime + variant. + + The CIP community plans to maintain 5.10 for security and + bug fixes for more than 10 years. + + https://www.cip-project.org + +config BR2_LINUX_KERNEL_CUSTOM_VERSION + bool "Custom version" + help + This option allows to use a specific official version from + kernel.org, like 2.6.x, 2.6.x.y, 3.x.y, ... + + Note: you cannot use this option to select a _longterm_ 2.6 + kernel, because these kernels are not located at the standard + URL at kernel.org. Instead, select "Custom tarball" and + specify the right URL directly. + +config BR2_LINUX_KERNEL_CUSTOM_TARBALL + bool "Custom tarball" + help + This option allows to specify a URL pointing to a kernel + source tarball. This URL can use any protocol recognized by + Buildroot, like http://, ftp://, file:// or scp://. + + When pointing to a local tarball using file://, you may want + to use a make variable like $(TOPDIR) to reference the root of + the Buildroot tree. + +config BR2_LINUX_KERNEL_CUSTOM_GIT + bool "Custom Git repository" + help + This option allows Buildroot to get the Linux kernel source + code from a Git repository. + +config BR2_LINUX_KERNEL_CUSTOM_HG + bool "Custom Mercurial repository" + help + This option allows Buildroot to get the Linux kernel source + code from a Mercurial repository. + +config BR2_LINUX_KERNEL_CUSTOM_SVN + bool "Custom Subversion repository" + help + This option allows Buildroot to get the Linux kernel source + code from a Subversion repository. + +endchoice + +config BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE + string "Kernel version" + depends on BR2_LINUX_KERNEL_CUSTOM_VERSION + +config BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION + string "URL of custom kernel tarball" + depends on BR2_LINUX_KERNEL_CUSTOM_TARBALL + +if BR2_LINUX_KERNEL_CUSTOM_GIT || BR2_LINUX_KERNEL_CUSTOM_HG || BR2_LINUX_KERNEL_CUSTOM_SVN + +config BR2_LINUX_KERNEL_CUSTOM_REPO_URL + string "URL of custom repository" + +config BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION + string "Custom repository version" + help + Revision to use in the typical format used by + Git/Mercurial/Subversion E.G. a sha id, a tag, branch, .. + +endif + +config BR2_LINUX_KERNEL_VERSION + string + default "6.6.22" if BR2_LINUX_KERNEL_LATEST_VERSION + default "5.10.162-cip24" if BR2_LINUX_KERNEL_LATEST_CIP_VERSION + default "5.10.162-cip24-rt10" if BR2_LINUX_KERNEL_LATEST_CIP_RT_VERSION + default BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE \ + if BR2_LINUX_KERNEL_CUSTOM_VERSION + default "custom" if BR2_LINUX_KERNEL_CUSTOM_TARBALL + default BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION \ + if BR2_LINUX_KERNEL_CUSTOM_GIT || BR2_LINUX_KERNEL_CUSTOM_HG || BR2_LINUX_KERNEL_CUSTOM_SVN + +# +# Patch selection +# + +config BR2_LINUX_KERNEL_PATCH + string "Custom kernel patches" + help + A space-separated list of patches to apply to the + kernel. Each patch can be described as an URL, a local file + path, or a directory. In the case of a directory, all files + matching *.patch in the directory will be applied. + +# +# Configuration selection +# + +choice + prompt "Kernel configuration" + default BR2_LINUX_KERNEL_USE_DEFCONFIG + +config BR2_LINUX_KERNEL_USE_DEFCONFIG + bool "Using an in-tree defconfig file" + +config BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG + bool "Use the architecture default configuration" + help + This option will use the default configuration for the + selected architecture. I.e, it is equivalent to running + "make ARCH= defconfig". This is useful on architectures + that have a single defconfig file, such as ARM64. + +config BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG + bool "Using a custom (def)config file" + +endchoice + +config BR2_LINUX_KERNEL_DEFCONFIG + string "Defconfig name" + depends on BR2_LINUX_KERNEL_USE_DEFCONFIG + help + Name of the kernel defconfig file to use, without the + trailing _defconfig. The defconfig is located in + arch//configs in the kernel tree. + +config BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE + string "Configuration file path" + depends on BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG + help + Path to the kernel configuration file + + Note: this can be a defconfig file or a complete .config file, + which can later be saved back with make + linux-update-(def)config. + +config BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES + string "Additional configuration fragment files" + help + A space-separated list of kernel configuration fragment files, + that will be merged to the main kernel configuration file. + +config BR2_LINUX_KERNEL_CUSTOM_LOGO_PATH + string "Custom boot logo file path" + help + Use a custom Linux framebuffer boot logo. + Custom logo should be in PNG or JPEG format, it will be + converted to the linux kernel format (224 colors only) + and copied over the original logo file. + +# +# Binary format +# + +choice + prompt "Kernel binary format" + default BR2_LINUX_KERNEL_ZIMAGE if BR2_arm || BR2_armeb + +config BR2_LINUX_KERNEL_UIMAGE + bool "uImage" + depends on BR2_arc || BR2_arm || BR2_armeb || \ + BR2_powerpc || BR2_powerpc64 || BR2_powerpc64le || \ + BR2_sh || BR2_mips || BR2_mipsel || \ + BR2_mips64 || BR2_mips64el || BR2_xtensa + select BR2_PACKAGE_HOST_UBOOT_TOOLS + +config BR2_LINUX_KERNEL_APPENDED_UIMAGE + bool "uImage with appended DT" + depends on BR2_arm || BR2_armeb + select BR2_LINUX_KERNEL_DTS_SUPPORT + select BR2_LINUX_KERNEL_APPENDED_DTB + select BR2_PACKAGE_HOST_UBOOT_TOOLS + +config BR2_LINUX_KERNEL_BZIMAGE + bool "bzImage" + depends on BR2_i386 || BR2_x86_64 || BR2_s390x + +config BR2_LINUX_KERNEL_ZIMAGE + bool "zImage" + depends on BR2_arm || BR2_armeb || BR2_powerpc || \ + BR2_powerpc64 || BR2_powerpc64le || BR2_sparc || \ + BR2_sh || BR2_xtensa + +config BR2_LINUX_KERNEL_ZIMAGE_EPAPR + bool "zImage.epapr" + depends on BR2_powerpc64 || BR2_powerpc64le + +config BR2_LINUX_KERNEL_APPENDED_ZIMAGE + bool "zImage with appended DT" + depends on BR2_arm || BR2_armeb + select BR2_LINUX_KERNEL_DTS_SUPPORT + select BR2_LINUX_KERNEL_APPENDED_DTB + +config BR2_LINUX_KERNEL_CUIMAGE + bool "cuImage" + depends on BR2_powerpc + select BR2_PACKAGE_HOST_UBOOT_TOOLS + select BR2_LINUX_KERNEL_DTS_SUPPORT + select BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT + +config BR2_LINUX_KERNEL_SIMPLEIMAGE + bool "simpleImage" + depends on BR2_microblaze + select BR2_PACKAGE_HOST_UBOOT_TOOLS + select BR2_LINUX_KERNEL_DTS_SUPPORT + select BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT + +config BR2_LINUX_KERNEL_IMAGE + bool "Image" + depends on BR2_aarch64 || BR2_aarch64_be || BR2_riscv + +config BR2_LINUX_KERNEL_IMAGEGZ + bool "Image.gz" + depends on BR2_aarch64 || BR2_aarch64_be || BR2_riscv + +config BR2_LINUX_KERNEL_LINUX_BIN + bool "linux.bin" + depends on BR2_microblaze + select BR2_PACKAGE_HOST_UBOOT_TOOLS + +config BR2_LINUX_KERNEL_VMLINUX_BIN + bool "vmlinux.bin" + depends on BR2_mips || BR2_mipsel || BR2_sh + +config BR2_LINUX_KERNEL_VMLINUX + bool "vmlinux" + +config BR2_LINUX_KERNEL_VMLINUZ + bool "vmlinuz" + depends on BR2_mips || BR2_mipsel + +config BR2_LINUX_KERNEL_VMLINUZ_BIN + bool "vmlinuz.bin" + depends on BR2_mips || BR2_mipsel + +config BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM + bool "custom target" + help + For certain cases a board-specific target image must be + used. For example, on powerPC where the OpenFirmware + description is attached in a board-specific kernel image + target like 'cuImage.mpc8379_rdb'. + + Select this option and specify the make target in "Kernel + image target name". + +endchoice + +# +# Kernel compression format +# + +choice + prompt "Kernel compression format" + help + This selection will just ensure that the correct host tools + are built. The actual compression for the kernel should be + selected in the kernel configuration menu. + +config BR2_LINUX_KERNEL_GZIP + bool "gzip compression" + +config BR2_LINUX_KERNEL_LZ4 + bool "lz4 compression" + +config BR2_LINUX_KERNEL_LZMA + bool "lzma compression" + +config BR2_LINUX_KERNEL_LZO + bool "lzo compression" + +config BR2_LINUX_KERNEL_XZ + bool "xz compression" + +config BR2_LINUX_KERNEL_ZSTD + bool "zstd compression" + +config BR2_LINUX_KERNEL_UNCOMPRESSED + bool "uncompressed" + depends on BR2_s390x + +endchoice + +config BR2_LINUX_KERNEL_IMAGE_TARGET_NAME + string "Kernel image target name" + depends on BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM + help + Specify the kernel make target to build the kernel that you + need. + +config BR2_LINUX_KERNEL_IMAGE_NAME + string "Kernel image name" + depends on BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM + help + The filename of the kernel image, if it is different from + the make target (above). Defaults to + BR2_LINUX_KERNEL_IMAGE_TARGET_NAME. If specified, the + filename is relative to arch/ARCH/boot/. + + If unsure, leave it empty. + +config BR2_LINUX_KERNEL_UIMAGE_LOADADDR + string "load address (for 3.7+ multi-platform image)" + depends on BR2_arm || BR2_armeb + depends on BR2_LINUX_KERNEL_UIMAGE || BR2_LINUX_KERNEL_APPENDED_UIMAGE + help + If your ARM system's Linux kernel is configured with the new + (3.7+) multi-architecture support (CONFIG_ARCH_MULTIPLATFORM=y + in your kernel config), then it is necessary to specify a + kernel load address when building the uImage. This should be a + hexadecimal string beginning with 0x, for example: 0x00008000. + + If unsure, let this option empty. + +config BR2_LINUX_KERNEL_DTS_SUPPORT + bool "Build a Device Tree Blob (DTB)" + help + Compile one or more device tree sources into device tree + blobs. + Select the dts files to compile in the options below. + +if BR2_LINUX_KERNEL_DTS_SUPPORT + +# We have mainly three cases when it comes to device tree support: +# 1) We don't want any support at all. Then the ..DTS_SUPPORT +# variable won't be set +# 2) We want device tree support, so we need the user to enter the +# device tree name or the path to the custom device he uses, but +# the kernel abstracts this from us and only build an image that +# looks like a regular kernel image. In this case, we only need +# to derive the kernel image name from the given device tree +# name, and all the rest is as usual +# 3) We want device tree support, but the kernel requires us to +# build the device tree blob separately. In this case, some +# more logic will be needed. +# The variable below address the second case, were you only want +# limited actions from buildroot. +config BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT + bool "DTB is built by kernel itself" + help + Normally, the device tree(s) to be built have to be passed + explicitly to the kernel build system. For some binary + formats, however, the kernel build system links in the + device tree directly in the kernel binary. Select this option + if you have such a kernel binary format. + +config BR2_LINUX_KERNEL_APPENDED_DTB + bool + +config BR2_LINUX_KERNEL_INTREE_DTS_NAME + string "In-tree Device Tree Source file names" + help + Name of in-tree device tree source file, without + the trailing .dts. You can provide a list of + dts files to build, separated by spaces. + +config BR2_LINUX_KERNEL_CUSTOM_DTS_PATH + string "Out-of-tree Device Tree Source file paths" + help + Paths to out-of-tree Device Tree Source (.dts) and Device Tree + Source Include (.dtsi) files, separated by spaces. These files + will be copied to the kernel sources and the .dts files will + be compiled from there. + +config BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME + bool "Keep the directory name of the Device Tree" + help + If enabled, the device tree blobs keep their + directory prefixes when they get copied to the + output image directory or the target directory. + +config BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT + bool "Build Device Tree with overlay support" + help + If enabled, pass the "-@" option to dtc, such that + symbols are generated in the compiled Device Tree. + Choose this option to support Device Tree overlays + on the target system. + +endif + +config BR2_LINUX_KERNEL_INSTALL_TARGET + bool "Install kernel image to /boot in target" + depends on !BR2_TARGET_ROOTFS_INITRAMFS + help + Select this option to have the kernel image installed to + /boot in the target root filesystem, as is typically done on + x86/x86_64 systems. + + Note that this option also installs the Device Tree Blobs to + /boot if DTBs have been generated by the kernel build + process. + +config BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL + bool "Needs host OpenSSL" + help + Some Linux kernel configuration options (such as + CONFIG_SYSTEM_TRUSTED_KEYRING) require building a host + program called extract-cert, which itself needs + OpenSSL. Enabling this option will ensure host-openssl gets + built before the Linux kernel. + + Enable this option if you get a Linux kernel build failure + such as "scripts/extract-cert.c:21:25: fatal error: + openssl/bio.h: No such file or directory". + +config BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF + bool "Needs host libelf" + help + Some Linux kernel configuration options (such as + CONFIG_UNWINDER_ORC) require building a host program that + needs libelf. Enabling this option will ensure host-elfutils + (which provides libelf) gets built before the Linux kernel. + + Enable this option if you get a Linux kernel build failure + such as "Cannot generate ORC metadata for + CONFIG_UNWINDER_ORC=y, please install libelf-dev, + libelf-devel or elfutils-libelf-devel". + +config BR2_LINUX_KERNEL_NEEDS_HOST_PAHOLE + bool "Needs host pahole" + help + Some Linux kernel configuration options (such as + CONFIG_DEBUG_INFO_BTF) require building a host program + called pahole. Enabling this option will ensure host-pahole + gets built before the Linux kernel. + + Enable this option if you get a Linux kernel build failure + such as "BTF: .tmp_vmlinux.btf: pahole (pahole) is not + available". + +# Linux extensions +source "linux/Config.ext.in" + +# Linux tools +source "package/linux-tools/Config.in" +source "linux/linux_ilp32/Config.in" +endif # BR2_LINUX_KERNEL + +endmenu diff --git a/buildroot-overlay/linux/linux.mk b/buildroot-overlay/linux/linux.mk index a1edf17..cacc597 100755 --- a/buildroot-overlay/linux/linux.mk +++ b/buildroot-overlay/linux/linux.mk @@ -668,6 +668,7 @@ linux-rebuild-with-initramfs: # $(LINUX_DIR)/.overlay_sync:$(TOPDIR)/../.linux_overlay_sync $(LINUX_DIR)/.stamp_patched # rsync -a $(LINUX_OVERLAY_DIRS)/ $(LINUX_DIR)/ # touch $@ -# $(LINUX_DIR)/.overlay_sync: $(LINUX_DIR)/.stamp_patched +# $(LINUX_DIR)/.overlay_sync: $(LINUX_DIR)/.stamp_patched +include linux/linux_ilp32/linux_ilp32.mk diff --git a/buildroot-overlay/linux/linux_ilp32/Config.in b/buildroot-overlay/linux/linux_ilp32/Config.in new file mode 100644 index 0000000..ba8f9b2 --- /dev/null +++ b/buildroot-overlay/linux/linux_ilp32/Config.in @@ -0,0 +1,22 @@ +config BR2_PACKAGE_LINUX_ILP32 + bool "build RV64ILP32 64ilp32.config Linux Kernel " + default n + help + Enable this option if you want to build a RV64ILP32 64ilp32.config + Linux kernel for your embedded device + +config BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_BIN_PATH + string "ruyi new 32 bit Toolchain relative binary path" + default "/opt/toolchain/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25/riscv" + depends on BR2_PACKAGE_LINUX_ILP32 + help + Path to where the binaries (e.g. the compiler) can be found, + relative to the downloaded toolchain root directory. The + default is "bin" and is correct for most toolchains. + +config BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_PREFIX + string "Ruyi new 32 bit Toolchain prefix" + default "riscv64-unknown-elf" + depends on BR2_PACKAGE_LINUX_ILP32 + help + Component name prefix used by your external toolchain. diff --git a/buildroot-overlay/linux/linux_ilp32/linux_ilp32.mk b/buildroot-overlay/linux/linux_ilp32/linux_ilp32.mk new file mode 100755 index 0000000..7def703 --- /dev/null +++ b/buildroot-overlay/linux/linux_ilp32/linux_ilp32.mk @@ -0,0 +1,46 @@ +################################################################################ +# +# Linux kernel target +# +################################################################################ +LINUX_ILP32_VERSION = $(call qstrip,$(BR2_LINUX_KERNEL_VERSION)) +LINUX_ILP32_LICENSE = GPL-2.0 + + +# Compute LINUX_SOURCE and LINUX_SITE from the configuration +LINUX_ILP32_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL)) +LINUX_ILP32_SITE_METHOD = git + +LINUX_ILP32_DEPENDENCIES += linux + +# LINUX_ILP32_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) HOSTCC="$(HOSTCC_NOCCACHE)" +#BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_BIN_PATH +#BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_PREFIX +RYSDI_NEW32_TOOLCHAIN = $(call qstrip,$(BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_BIN_PATH))/bin/$(call qstrip,$(BR2_TOOLCHAIN_EXTERNAL_RUYI_NEW32_RV64ILP32_PREFIX))- + +# LINUX_ILP32_KCONFIG_DEFCONFIG = $(LINUX_KCONFIG_DEFCONFIG) +# #linux/linux_ilp32/64ilp32.config +# LINUX_ILP32_KCONFIG_FRAGMENT_FILES = linux/linux_ilp32/64ilp32.config + +# Compilation. We make sure the kernel gets rebuilt when the +# configuration has changed. We call the 'all' and +# '$(LINUX_TARGET_NAME)' targets separately because calling them in +# the same $(BR2_MAKE) invocation has shown to cause parallel build +# issues. +# The call to disable gcc-plugins is a stop-gap measure: +# http://lists.busybox.net/pipermail/buildroot/2020-May/282727.html +define LINUX_ILP32_BUILD_CMDS + CROSS_COMPILE=$(RYSDI_NEW32_TOOLCHAIN) ARCH=riscv $(BR2_MAKE) -C $(@D) $(LINUX_KCONFIG_DEFCONFIG) 64ilp32.config + CROSS_COMPILE=$(RYSDI_NEW32_TOOLCHAIN) ARCH=riscv $(BR2_MAKE) -C $(@D) all $(LINUX_TARGET_NAME) +endef + +define LINUX_ILP32_INSTALL_TARGET_CMDS +endef +LINUX_ILP32_INSTALL_IMAGES=YES +define LINUX_ILP32_INSTALL_IMAGES_CMDS + cp $(@D)/arch/riscv/boot/Image $(BINARIES_DIR)/Image_ilp32 +endef +#$(eval $(kconfig-package)) +$(eval $(generic-package)) +#$(eval $(virtual-package)) + diff --git a/buildroot-overlay/package/Config.in b/buildroot-overlay/package/Config.in index acdb940..382b22c 100644 --- a/buildroot-overlay/package/Config.in +++ b/buildroot-overlay/package/Config.in @@ -2839,4 +2839,11 @@ menu "Text editors and viewers" source "package/vim/Config.in" endmenu +menu "AI" + source "package/libmmz/Config.in" + source "package/libnncase/Config.in" + source "package/face_detect/Config.in" + source "package/ai2d_kpu/Config.in" +endmenu + endmenu diff --git a/buildroot-overlay/package/ai2d_kpu/Config.in b/buildroot-overlay/package/ai2d_kpu/Config.in new file mode 100755 index 0000000..43d51ba --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_AI2D_KPU + bool "ai2d kpu test case" + help + ai2d and kpu test case diff --git a/buildroot-overlay/package/ai2d_kpu/Makefile b/buildroot-overlay/package/ai2d_kpu/Makefile new file mode 100755 index 0000000..95448c7 --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/Makefile @@ -0,0 +1,15 @@ +CXX=/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1/bin/riscv64-unknown-linux-gnu-g++ + +OBJ = main.cpp + +LIBDIR = -L ../libnncase/nncase/lib -L ../libmmz +LIBS = -l nncase.rt_modules.k230 -l Nncase.Runtime.Native -lfunctional_k230 -lmmz -lpthread +INCLUDE = -I ./ -I ../libnncase/nncase -I ../libnncase/nncase/include -I ../libmmz + +CXX_FLAG = -O2 -march=rv64imafdcv -mabi=lp64d -mcmodel=medany -std=c++17 -DLINUX_RUNTIME -Wno-multichar -Wno-unused-result + +all: + $(CXX) $(CXX_FLAG) $(INCLUDE) $(OBJ) -o ai2d_kpu.elf $(LIBDIR) $(LIBS) + +clean: + rm -f *.o *.elf diff --git a/buildroot-overlay/package/ai2d_kpu/ai2d_input.bin b/buildroot-overlay/package/ai2d_kpu/ai2d_input.bin new file mode 100755 index 0000000..a6549c8 --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/ai2d_input.bin @@ -0,0 +1,3836 @@ +ɼ~ɯƩտ|ti^bx¾}zutsv|yslmihmtqmkklruxyyx{|~}woddUK?5.)$'+,($ &13()+/479DQ^xy}~yvuuy{yzk^SLJB5* !"$&5ARZa[UME?ƺ徖ūٿſͻzrg_dz|yussw}{uomigmrpmkjmquvwxwyz~}wne`TI@71,&&++)&!&/134578755;@B@EL\ioponpsx{ǽƳjG63221EXtl]QWdu{k]KA?AJOarͮhWWn~|yuhWKHJUgu{|xuqnnmljilnpquw˼r_Tazm_\YVM:' &/MfžodYTQLLVqÿĽɵz^A6;A?804EPXal{{~~yusuz¿~~yk`RLHB7-! "$&)7DS\b]UMD=߻ֿټɽ¾vnf`hüzxtrtx}}wsojfjpollknquvwxxxy}ztof]SIA:3.)&+-,'"(12<=82202348DUbnqpnmou|Ǽ{eN@:51/5&&(*,/>K[didYPG?ظԻ׸ȹ½¼~qjecnĽ{usqrx~{wplfjmmjlmorsuvvwwx{{uolfZPHA;30+$),,)$" !,35?ABC>822,0.07BR_npqmikt~ŷwcXKB;52.1>Q\ZJ3$$)8QSF?>DMT]]RC530112;ATc}ʸw{}|}|{vrj\OKMN[ly|~~|zwwxvrqpmkijjllmot}жs]`oɹne`ZTH5%-GjrknŽ༉`OOTPWZgz|vsrtz}pbWRNG?0/146:GVfnslbWMDֺ׽ԳǶ½ykedgvĿý}yupmou}}|tmghlllloqrstuvuvwzzrmkicVLE=82.*!"&),(#! !!""!%079ACDA=87:;=>@EOZcpqpkgjvk\UOLGA:431.(3EPP@'&AG>8AJVahbTE631457?FUd{̸|{{|{xsmeXOPV[gx}zywux{{wurpljkjkkjkpuzz¿ſ˭bVdĬvaZY[UC- 2Tw~}¿ǪcTU_cimz~|vtrszû}pc]XQJ><=?AFRapx|ti]QGdzٿӳ¿rdacl~~~}xsmkls|}}wqghklmpqrtsttuuuvy|}vohddc_TK@91-*(#"$&*'# !! !$$%)4;>BCA?;>DL[_acgilnsrojinx¿ƸoVA637772/1/*#-84468?FU`uǰ~zyxy{zuoh_RJPYgs}zvwtsx}yvsokkkijggkpttz¾xWVn˸f\X]ZJ8.! )Bb¿ökZSWfpvy~zvstr{Ž|rke_WOKLNNT`my|obTJһήſ}i^]bp~~|vrkhjqy~|}xrgfilmprttssttuuvx{~~ypjb][[^\TH;2+'$$'&#!#(%! $$%+5>@=>><@K]lxtmjlq{ǼƴkQ9,(,/1//1.'(5BIJFEBB=BQYjzξ|zwvuvxypjbWJCKWjv~xtvssy{xupmjkjjfehlnnu}¾ʲhOY|ŴreaZJ?;,%&5Mi¿ѹscTQS]kvyz}{wuts{{upjb^_a`eq~xj[Pʴã~~ucYW`pý~~~|wqighmw{z{xqedhjlprrtsrssrssuxzz{{{yyz{xsme_WSQVWWPD7,%#!"))%!&# "%%+6@B99;=G[u|uljnv}}ǽyqeen~oU<-*&,0/25.$'2>IQX]Z[PHH:(%)=Vkvxnc^TJHJGEEKS`nŲ~zwvutvxynh_QA=FSfq}vssrrz~zwrmkiiiedejklqz}½]J]þķsfXG?@5+(/AZ}ɮvcSHKU`mvutwxz|ywwt|ŵ}wsqqrrtsdYǿɴzuzvlZPQ_wĿ~||xurjggjrutuqnfabfloqnllossqppopoqqqpnmkkhb]SOLIIMTTNB3%"'*("" $-368248CWrsmnpy{utxƼtcVJ>BN^lǾtYF92+-/36420,+/9EO[eh`UI?3' &9Retzxrfc^XRNMLOV`jwɹ~}wutrtvutje\K72ARan{ztqpvzzvrnlllkfgfgijkow{¾ūjLOeź¯v`RE:;1*+7MjÿwaK?HT[dnnmpry}~~|{{~|yxyv~Ŷ~}ohȽȼ~yytv{vkbSOTby~||zxtlgcfmpprplb\\afjnljiknmkkijiihhgie_]ZXSMCA@?BFKKI>1$&)(# &+,-*2>Og¼Ƿuossy}wutxlZJ?4+.9GTfzvbP@7/2489830)()/5<811469?DD>6+ "###! "7Sqͱ}ywzp]H;2.-,1;8;AHVi|~qeXJA?AHRYYUMIFGHD:36=>=<2*&*2G`}yrliponov|xusrusqqpomh_VLDBK]o||zyz}xqolijkkkjjigeedekpruxyzz|zvtrtvxwx~½^=7Mh¾úofbdcbnz]KA5*')4FVh{ÿyzqhygF1(6GNZcnnpoqvsnsvvvttvx|}}zvuuxxʽ{wssvtpmmmmnoponnopputrqqrtx~|zzy{vk`ULFA:>Nm|~}{xpi`[\bimf_SJFHQY^_^\XWUTTRPOMKJHBCA>;41,((,/4;CE:2) ##"" &<]}ž}vv_M:2./36:?><=;62*($"#*.4:?B61*!#%&'!   -Ef̬{yeQB3/.5;@BB@:8:@GS]`[WPD=9961+(+,-08>?A?=40*#$)+,+('" (;Ppϳuk]N@768?GKJE?99@JPV\ZURTNISa~|~uqwŲ{ywusqnnlkjkljdaWI<=FRajzuica^`cehilljgfcbcghhijklmmkifdcbdkq}þgB(1Qly]F4.GLNKECCB@>><<:8620-)&+16=AIMLE?940+& ',/0630*! (2G[wɳ~~ric[SG;:?ENRLGA;=KX_cgb[[dfdkwzw{|wvxxvsmkggeggea]SC78CNYbow~~qf`^[[`cehmlkiheeeffeddfffihfec`^aho{d=#+Ki}yxxwvYA+!.CNSVPNZl}}ePI>3,0F\r¾°tnda]^]\{˹XF/&3BJT`aaccjqrpmmommmoqpqpooqv|}rjecipv|dzϽ~|}zy{zuqli_[VQPOMNJJJIKLNNPPPPQPPQTRPOOLIFD<773-(&2Hjȵʿ}tw{Ļ~~~|xqh`[WT[ecbUB50008>BA=;9743444220*)+*+1=DKOWUQNC;;82*! " "),.-122/' (2EYv˰~uha_\UJ??BDEDDDGO[iuuptrimzwmiihq|{}|vnrqrssrlhfdcedaZSI=31:FU`jr|wkbVUVX_begijmmlhdba`]\[^_cc`^cb]XZcnY1!'Fhv{sf_bjmydF.$*5@@DHO_uoYL?969Lb{rg_^YZ__hĹsY?0'-:ISXVYcinqrrkjhjlpstoljklrx~ulknspw~|{xvîǽyqxŹ{yxvwz}~yuqlh_XTMJGEECCBBEFIJLLKKKJJJLJJIFEB=;3-/,**)5Nm°}wwrtvy~׻yd][Zu}~~zwskc\WTYadbXC5/,*/5996221-,--.-.-*,-05=IQY^a\ULC8973,% $&$$$(*,-0110+" +(1?Pjȴvmc^^]WNFCDDCEJNZfvvu}¾yneaahq||{~~yrqooqrolgfdddc]QID:14@FKXkzaSIDCHZnxla[\YZ]`q¼mS;.',7COUVZdkqtsslhhhkostqmmmqtz}rlmsxwupnmnml«{zpjnųÿxuutu{x|}~~zuqjf]XRLHEB??@??BEHJMLKJJIIIJHECC@>87.+++*.1>Vvöysmkj`cgmvzvy}ÙoO?82Hg~~|yvmg`[X\dhg^J;1+&*-010.,,&''(*+--,.49@LYbmpqi]RE;:83.)&'(+**(()+.../.,& + #,4D\tĶĽuhb\YZZWOOKJGDJU`xɷ{}{mb_aeipsuvz~zxzzxtnllopnlgedffcZJ?<628BN[es{ug^SSUZ`egjhllmlihfca_\\[[\^ZZ\\WSUbs½`9.8Uousoh`THEJh|¯|aOCCEDGPZjĵl^TSTZk¿vlcZUXYZZd~hN6+(,4=HQVZdlstuulkhhjmpsuuvvxz~zqlmu{vpgebbfkoqο{~~vrrsϹvssrszx}||~zvqje]VPKEA=;:988<@EHKKLKJIGFFA>=<:821*&''(/5F\~οzrrrqnhZ]enzlZSSWtӵeC0'!-C]{¿|wojd_[^elmeRA3)"'*,+*(%# !"%(+**.4=ER`irwxncXLB?=82/.//./0.)),01/-,-*# !-8K`zľƺukc^YXZZYRTSRMMVixƼ»pgecabbbabht~~zxwxxvpnmnomkfccfgbWD8534?JValzsd\RRUY_dghhjkklkiieda^][ZZ]XY[[URUevýhC;F`uxsmf]PA:<^wísidd]bn|ɽuf\\ahz¿½|vme^XUY^^\miO3+(,17DNV\gotwwuolighjlqx{~~¾~skmtx~unfffjr{þwvsx~ҿ¿}tqpooyy}|~~{vqid[VPJC?98542137<@FGKKJHEB>975520++'"##&08KdĹjackwxo`ckwdPDACa{jO6(!(;X{xqlgb]`fopj[J9,#&())%# "&''-4=FS`hqwyqhaVMHD=75452//0,)(,01-,*-*$ &-;Mjýƿ~qea^\\]^^YVX[\aoäqjc_[VSQRU]fs~|yvuvz{uqonnkidaadd_S?2-.7ER]isoa[QQTX_cfffgiiijiihgeb_\[Z[WWZZVTWj}¾pLDMdusmg`XJ:/1Ro¬ð~k_bjr}}½|xsmha^ZZ]abg}nS3+),-2AMW]iqxzzvrnjgghkq{Ÿ¾ukhjoyyvqqsz¸±}yjgjnwȿþ~wtspow{~~~~~{vohbZVPID=8652.+,16:BEIIIFA=4/.,-+)%$!"#(4?TkhNMXj}xlkq~xcXTPO_m{i`QA0$)CfĿysomgbcgptrfVD4()*)'&! $&).8?JU`isy{vojc\TOF@<:950-,)'&(+'$"#)*$ #&2FdyncXXZ[`bdacgmt~ż¥ùtkb\VPJEGJOWbpyxvqmntwvronmjhc`_`^YL8,(,8HVanvzj_ZRRUY_accacdefggiiigda_\[\XY]^ZW[n½tPBGVfb[UNH=.$(C`ʺtddoy{z~þ}ytnjfb`]]^^agtsX6-)),1>JX_ku{{|xtpjhggio{ǼĽ{medehqz}{uuvuvw~±}~ӿ}v}|gZ[`cmx}}xz|zyuqw|~}|}~{wohaZVNHD>8563-)'+/39>EIIE>7*%%#%$"#&-;F`vkQ0*+(((% "&)+1;CMXblu~}|xshaVNJFC<70-*)('(" !'163-!!"$1Gf}une\UX\bjpuvøqg^WSNE@BFJQZeqy}|}wmjnstpllkihca]\WOB/$$*6HWboyue\YSTWZ^aaa]^`acdefjkigda_]]ZZ_a^\`u»rL:6@LIE?:6/$!9Tuǿο~lkt~zwy{}ľ{unc`^]]^__\\h{^7,&'*0. $<`´~zvupjjov~xiVD7,*()*(#$(+,3>CHNT\eknr{{xuxwoptpljijihdb]YRH;)!&5HUamxqc[YVVY\```_Z[\^_`aeiljhfc`_^[\adb_dxnH2(09771-,(! 4Mnqoyŷytvxzž|yrk\[[[[]_`ZXhd9,#"&/9EYanw~~}ywqmjiijoy¶xtqwpihilkjihilotvx͸ztkds~zzxzvpfabeggmtrz~~}zzxyyz|zyyz~{||zwojd]VQKGD><:4,&%&)(337BE?82# +2:KZqmR90))/=<975=GR`jh^U@5-&*-%!);Vwytvof_YSW\^m}re^[ZYPRZa^\oĻtb[WUPJA>@AEIOSVWW\flpsrpmpu|ºtnlpkgilkf^]YSH<1% !*9FUes|~m`]bZ\abb`\[YYY[]`_^fihfcabca^`cdaah~jE,"!$(*))$!#&-1%#&0;FVerwz||ywtpoopru{Ǿrknrsnrpljiijlĺ{xrl{~}zwþ~}zxwyvxzxwvx{z|{zvpje^ZSMJFB?=7/)(('',+0:=:51($!$/7@R`ul]E3*$&'*4>BA?5336=@7+(8Qr˶nK7,'!&%%Ch|ywwwx}oXF90+/31+'&&%$',257;AHS]gpxyupbZUSRQPNT]iuoYI;-,,!)0C]}}vqnkd\XSQW_n~vnd[VTTSTTXYTUm¹o\VRPLG?<<=BGKOQRMPTZ^abdeglnrxҹyvtmhhjiga\VOC8.$ $-:IWdr||l_]b^`efe`\YWWYZ\][\accbacefa^_ccbckkP5#"*./0037>ELaw{ȷ~|xtot°}wmhfa__ddbdggYl¸iE;3/.3@LXdnqux|ytrprux{~~{zyxxyļ}y´Ľſ~{xxxyuwxvutwxzzzyuojf_[XSOJFDB=6/,*(&)'*276773.)$ +7?HZi}ƷmUH9,'" #(,++#$&)/1)"9\ʩ{U>2.)&$ "#-/*##$<_~|||ycO?614860,)(((,07;>AFMT\elwzunlkkkktt_K955*/8Kfyqjfc]XQPQUakĺ|xtqqqqqvtrk`azùlUMLIGC=:8;?DIKNNKKLMQUX[]``][_irȤzvxpigggfb\TK>3+%",3@NYhuxj_^bcehhga[WTVVY\[XW\^___bdeb__cdcel~}}}zp_E)#4:87BOYbjkmrwxspqv|ľ´Ĺ~{xvvvuvxvtuuxyyyxtqkha]ZWSPMJFB<61.*%)&'-46;@;83*"#0=GQaqǶeI=4.*#$#$')(#!#'(*/2,"*HrвaH<4/.*'$#$&'*68421C_kYE;37;952*)('-29<@CIMTZciskWC@C=5?Snuld^[RNKPWbrŽ{ǾüyfMHED@=8458>BEGILMJHJLMRWVZXRLO[fu}ƣwqwqkhged`\SG:0+('4;GT^kxtjbacijlliaZUTTXZ[YTSWXWW[_acebacecfl{~yz|{vjR6&/AMPV]goss{ķ~˲|tpvϿƳ}vmfcgnrvztlfge^ovVKHHFAFQ[bggimoosrtyú|sy{{zyz}Ǻľ~zwuuuwxzwuuvxxxvuspkhd_\[YWTQKGA;61+'+%%)/3\׾v\J?7110-**-21EPSSPZnƽq_I=76::85-+*).49=@CILQX`gqƺnYFEKGDNcy~qh_WRHGLVdsƼn^LFDA?;6426;>@ACHGDBDDBFMPSQLFHT_iq||uqnkjgc`[YOC5-++,9?IT^jv}~slhhinnnlg_XSUVY[[XQNKLMOV\bdhedggcfjxþ{vwyxlXB7=K]bjt}|~ÿȻ׾|plwȺ~xslfhq|~||{z{_PKRTMMQ[bfffhgdnmowxs}|ywy}|ywýž|xuttyz{ywvwxwwutqokjgcb`_^\XRLF@;50++%$&*.8CMNLB4+*-/5FT]fwǹzU95:FPQQK>4,((*+.//2;@@Yqǩq]OF<==:76;@Jbpuxst¹teQC87:;;<41//17;8503899;=DE@=>>;>HLNNJEJRZ_fp{wljihe`]XUK?2,,/2=<:86/153239BF>6875;GOOONLOSY[air|uigec_[[XUK@5026:DIQZblu|yuwxxwyvsnh`[WZ\`b_VKD;88?JU\^cbglmjilzÿztopqtxzzupooqtxz}{|ywvvx{}{tj\OOVft~yѰzx{{~yonw~}ʼ~{wzw{~yvqmlmw½ſ|n^W_^SNSXZYWY^^[b_alúij{zujjq{qqv»|xvvwyywvstuwuurqnmlomkjkjhf^XPID@=96/,++.7CLQSK<224=ESaiqȸjPOVi}ujb^\\^][`o~ızwzzl[J:5;?BE<98559=@CDFILQW^xƶ~oaXd{vi[TNKIRYh|ƾp]UQK=8578764.13/,/5?B8..,,5DRSSSTUWZ]_bistjeb^ZXYYWOB967>BJQXahqzxw{{}{}yuoib]Z[_cd`WJB>:6:DMRS]^flpmmo{vpjmlortsnkghkortuuurnlkmqsuu{||{yzz|}~}sdVRXiyѼҾnjjuzyqqy}ykxʸqklosyyxvwyzupljlwйxl\X_ZKGQSSRQU^baheen¶Ÿ{uulry{|yyxuropomikxÿ}yvsxyvsoortsspqoopoonnmlkjb^YSPLGB=611118BMMNG@;;@ACHJIFA>?BGHGGLMNT_v°kcm~xri_SKDHRWfz|vh[SMF=4122233333.++/3<9;2*($2O`c_\_WRZVY^gswj]\\W\c_aYLB>?FJQXbhjqzvsz}{|yrg`]^^eie_XMD;858?EGHP]hjmtxw{xtmf_^_dgfeeddeffffikmkheddcdjlswz{zyxsposvxwz{}{|kZRR_sűracnwz||{}|ynmt~ʺzvxtibbmga^age^\if\gtyïyh]USMEEHHHIMW_XOMWlƺĵ¶|}sy}~z|xx~zxvyuussrsprrqmifjo}¾{vrtwuqnpruutrrqppqqppponmfb]YWQMID<8764;AHJNIB?AES\gns}ŷojv¿~iZJCDEHMPPMHCBGILJMOOOVavsr~wnf\QICCKUdp}xxocTJFB;5/../012242.++,0659/'# 3Soztd\SPV[[^esxi]\[U]ief^RHEHNRW^gkms{xv|~}yrga__cimie[QF:735<@BAJWcglu||¾}wrle_YVW]^`^`^_aaa`acefedcaa__ceilmmmnmmklnruvz{}~o^TRZm³}siahqwz|}~lk}{romg`_cYROVgmbPLX^amuy~˲p_RKF?><::BKSQJDF[|ɾʵ~wyzvronorrqoqptvvsnhc_lwſ}wqsvuspqsuutsrrrrssstssrqkhda^ZVQMEA=:8<@AFMKEBHO^dmtyǻxvºĽøscRIHIMTTTQLHFHIOOQRPPUawʻxldXNFA?CN[ktvt~sh[RF?<95/+*+,-//00/.,,,/417/%5WnYOOT`^_drzk^][Wbqpph^TRU[^afnqst|z{xqgcbcjpsnh^SG;8679>>=EQ]cju~xpje^XSPQWXZY[Z\\^^]]_a`bcdca]\]^_`_``c`dfiknsvz|vdVQVgyȷuh_`cfqzz~ùsmc^ZUORVWVa|jLR`r}tpƮkRC:6875/5@D@>Cnüͷyxzwspquyxsqrtuvxwvtlbcnźº{upqsssssuwwvtssssstuvvuutolihfc]ZUPJD@<>>=;====AIS[frzsic]WQLMPTVXXZZ\]_`__`abdgjiga_\[YYWXZ^[bhkmpw|l\TTan|ǵ~o]URYfoy}ľykbVOLHEDCEVzڴe^qvmzͺ}\?/,497(&-4:NhŽӾ{wtvy||xvvwyyzwz}vmdjwļyqnopqttttuwutssssstuvwwwvsqonmjgb][UNFCB=:>DEBFPYimrw|î~ĵľp^QMKPX[\YUPLKLRSWXSNT`x~wk]RC=<@BCIOY\biv¿yk\RLD=8431,'&'(),...00/0..0071'.QeYURUW]dnxxkfb\h{}woifgknpsy|~~tmggiktxxph^TIEDBAA?><=BJT_m|tne^XRNJMOSSTUWY\^abbacdehkmmjeb[ZXWVX[`bgmquy{lc[`gs~}|~ѿ{hVRT^mxĽxi[NDBDEA97WФ~r̬v{rJ*"*3.2Nzȱu{wzλ|}}}{||~{uw|ypgiorqvԾžzpllmnrrrquusrsqssstuwxxxxvtttsrnkef`VNJG?98<>AHU]morw|ƶ|}~udWPLPX\\\YTOMMPUZ[VRWd}¹~wodVL=::?B@ACEDGM\op_RHD?930-+)&$&'((,,...-.--1281'#Arzm_UOS[bhkmmnosyunf^g{ytpnpuvx|}smjlnpxzwmf\UKHGGEC@=<:67]ܸǘstd9!,Oyƽ̷tzv|ʾ}sryyqjhhe^eǽ~|{{{|һſ|skjklnponrsrqqpqqqrtvwxzzywwxzzvrmpk_VRND9469ANZbpqtxƹ¾{k^UOSZ\^_[WROPPU^a\W_mþ|vof\OE@::?A?==8548H_vµygUG><830,))(&#%%&%((+**+++,0381'.T{m\MQW\^[YVZ^fr~vkagy}{xwx}}tportu{{vkc\VOKLNLID@?;:=FP_u}zuplgb^[VQLMMOOOORRY]befgijjjhgfeccaabdflqu~skfnxqigqɻ{kZ]adfjnot{oXPD95:>=4T֧ljij[4 +4^ʺǿʸv{}~ǽtr{|tmig`Wa·|vplifdcefjnqsstйujhhjmnkjqqponopprsuwyz||{{{}~zxtwqe\XTH8116BR`gstvyȾÿ¾pcZSU\]_`\WSPQPW`c`]dr}xph`WJ@B<;@C@=<;703D\uǿu`M>6610-)'('%%%$%%%&((('()+/47/& + 9`xdNQVYXSNJOU`p|qbfw{~|{z~~vsswyy}|vjb\XRPQSQMHCC;7:ALYo|xtnlheb_]YSMOPPPPPQSZ_dhjknnnkheddcdghjnqx}yoinwz~phr~Ƹp^PUWTPPQOX_imusicXB8:CI?V{ڲjeyzx}ɪ|KX͸ƶtz{x|~|xvvoeqyvurmf`]ZXVTTVWYY[\_do̶wlecehhhkmnmkjlortvy{{z{|{|}xmc_WL<,'/AUfpwvw~ŽþĿÿyh]XX\\_ca]WSQS[diebiw~vpg]WQHDBAAC@=@GAEHHTds}rYC5/1+%#%&'%""#####$%))&!!(14/(" +Cc~lZROURF@CJTfwzpotz{~~|vvx}zqi^YTUWZYULC><97:BOez{vsnhec_]`ba\UROONLNPQW[cilnpqpmifeggijlqw{yslntv{~xwhWH<:741./.6:@DGNYeþ_D4FOMYsŹŻsdiv|zseiu£w?:̹źz|~z|}Ȱ}wsomjd_WPHC<6000159>?NU`inwͶymfabccdhjkljijmqswz||||~}}~}qhcZN;,&/CVhqxwzſÿ~ma[Z\\`cb\WTSU[ejjhp||pjcYQJFA?<=DLW^eiq|sXB5--&! !###%&%%&&&&'))&!!'//*! "6Qj}~raVOOK@=BMXjzzuuy}xy{{qj`\VY[\\XPGA=:59>Kax|vomgb]ca`cge`XQONMKLNPV[cimortrnjgfhhjnqv{~ywtrnoqv~͹fTF6+&%$$%&()#%))+1:EU`gmӻeGNQW_tн;jXXadb\W^l{Ƕh>=aıýŷ~}{{ƶ}Ծ|qmjijf`XOJC<4+"!#4=JRTWi{ʳſ}pg`][Z]cghihgijmtv{}}~~vnf[N9*%/DXkuzz|½ƾþtg_]]`cfd`YUUU\fmmmu}wlg_TKFFEC><@CIS[kupS=1+)"%''&&&''&((&""&-*% +=OantqfZPMF?AHP[m{{y{}zpjba]`abb^TKF>:67<=BQd~yuqmibZUJMYdnoi`VSRQTWZ\]`egikootux{~~|yrmifb`_agkmnnnnoqrrpgca`adhjlgir}Ƕp:#  + FѠkcjx༚ƻı~{xwyo_K;3.+8DUlͿȹƶ~|{żslmu~¾~{{xqkh`YQG:+  +  *4IU_bl{l\LAAGQW]adfghnpstx{|rkaRB5-1BXkyýƿ¸{mc^eilljdbb[^gpvz~wtolibYNIMPOJHFM_qǾ}unkmolkjr|fC+!#'&'(()('$!   !% ''+7HR\`b^YTTT^bgmv}~}vnkjmmllnle[RMJEB@@DO_w{urqnkd\UILXepqme_[YVWXZ[]`dhknttvx||zwuroifcb^]^aglqrwx|~}xusssuvxtsvxz~˽rP*  CQLIKbpƽܿȳ~wvxxwm]MB96?JYjϺΰȵ~üľ|njp|Ƚze_`deeddd]UA9'  + )5GTOQezqm»|m\J=>DLT[`cdghknprvywmf^N=607H^p{ſ|nc^dfjlhebc]_gpw{|vph`[^WOPWXQJMLUg}ʻ{riglniejpxc@( #%%&%&'&&#"  !$"$-2) ('*6HR]ada[Z[\]ahot{~{|~xpljmnklnlg]TNKHECBBL[lx|xtrssoiaZKOYeprnfea\ZXXYZ]`ejnrxzxzxuonkgebcbaabfmtx{}zvsnls{~V3 +9|sFD;1DHYsɿæ͸yxwuwtgZOGFGS\oТ˸|zxqrz½hLGOSY_`^XLA/% +!   +*8EHN[ccc]MR{r]H;8>IPX^_`beimrux{zqe[RG>34@Qfw~Ŀsf`dgkopmgc^aekrx|ytple]XPQINZXOPIPar׾~umkkgeghr}a<" + + #%%#!!"! "! %*6CE9( $(-5GV`egf`ZY[Y]biot}spx}tpllkkklopkbZUQNJFGJLPbejpv}|wvwywwti[PTZfquuma^][XX\_bdioux{{|{||{xuspnkihhjhghlqw~{m_Z]bjtüqH'   ?|ѾQ- #)%4I_x׹Ŵxrppppmh_SOW`hwéمjʺzmmq{zľytv{ȿZ=;GX\`]XN?2  +!$$$$#  ):FQXYVJD6>h½u`K=:AIQY\\]`cimsvx|wrh]UKB925AUhx~uhbcfjlomgd_`cjqv}zuqmicZUQPILURKOOYkķxnkjfdekr}úa<  "##!!! '1=MQE5$#&*2;KWbfjga\Z[X\afnt}tmq||tnkjjilmqpld]XUQLIIJMNVZ^bjqx}|yxz{z{wm`UV\grvslb`^[YY\_cflsy}~|{{zxurponmlmnqorrv|~lZLIL\gxügD&1J|ëS. !'5FYnɿǣzplpqqqnh__jv~׷ߏpĻǻqefmx~z°yuxǭR6HT]filic^\]X[afnt}ykiou|tnlllkoosrnf`[WSPMMMOOPTVZaglo||}||{{{|~~}|xnbVW]hqvrkdb`\YY\^dipx~~||{yvsqqppqtwyx{|mUB75JYm~x_C(!(@X[:,'&&)/5@M]gvƻܵη~qjpqtuutosͦ󬈓ɼxj_bhuzǼz{ͯR8@S]]YM?.  +!#$'%((&'(% 1ILGF:4%,Xſ|iVHFLQW]]ZWX[ciry}~~wsf]TMG<422;Nbs}|¾ſ}neccginonmfdbhow~xpmifb\UPKKEHSST]bqʽuihikptzg>  "3H_h_Q>89CP[ejoopmf`^]Y\aels|mdejy}{tommnmqqtsogb\XTPOOONOOQSUZ_dgnooprvz|~zoaUV\gqvsleb`\YX[]ejr{~}{yxwwxy|pW>/'Rfu}|y¿¼qfddfgmopqkfbgmxyljfb]WNICFEOahlv|ɾxmcdjpzmE$ 1F_mg[PJLXfpx{ywvqic_^[]adkq{vheflqv{{tonopprrusohc]XURQQOMLMOPQTY\`bdfiov|zo`TV^irwungca^[Z]_hmu}~t[B/$5=Mas|vhP4 +&3=C@a÷hSIC<<73,(&$&5APgʾܺĶyquyz}Ο|ϔü½|qh_W]dq||xɼǸqE+,9BB=2'"&)--,2:8/"  0=DD?-/TſqbUTY\chg_WRQRYahorw{}}zuoib\TH@?=3017DWix~{pvžtieedfkoqsohbemw}yjfc^YSID@GMa~ƻxmfir{vQ2"0Hdwwlhehuyqhb^^_bdioxsmhdhlorwzsooqrstsvtpic_WWURSQNKKKLNPTY[^bgmu~zn`UU]isyxqifebaadgptz}~~{bG1%04=L`s|s]@ + $3@JQWwøqa[TKC;4,&',6F`{ϸӻvzҥƿzqibZTZbmx|xȿľa:##,21-&   +!&*,0-*/72'  +/798+0Vwg[Y`cjoofZRNIOU\`dimnomid_YUNB<>;216>I]my}joüxlgfdejnsvrjbdlv~yvhea[VME?ELXvʿzsv\?," " (5Nnwmfaaaccglt{vohhmoqsy~zspprtuwxxvrkfbZXWVTSOLJKMMORUY`enxzk]TV]ju|{unllkjkos{}gO8++-0;Nbs}~~}||{yy}pV5  +.?MZasƼvjf_UH?4-&!!'4Jbyڽûy}׵ŌƵwogb]TMU\jv}þürP/%('% %*--0-'*/* &***#+Uÿ{k_^dgntsi]RNEINQUX^bbca^[WRPK>8=;238AM`qz~}|hiy{oigdfinswukabjt~||yvqgd_ZRJB;KSbdI7.##"  !! ! !"&% "$$&&/AIYs½nWH@3-&#"#""!" &'#.*)),--,/6E`}vnhghfbdjrxvrrtx{yvsrsvwyzzwske`]\[XWSOOMNOPRTVYjsufYPS_nz}yvwxxz~u[>-('(-7DUdfrzzwwvux|aF-  '<:<>?ADJQVZfdee_YWYcky||}lcdr}ľzojecipvx|xqkjnw~{yxwwurrrpgaPYWMI@=Fiźɾ¿}od[G6& ',-*+-++-+((+..05>E[mú~rkcbadjmpsy~zywuuvxy}}~{voie`_]ZVTQRQROMOQUZdo~teWW]ft~|x~~~|{}y]F2(!1@`mvwvx|}z|wU0 + 1E[kw}ɽynhedd^VND<3/'*-1678;>:6472)"".>QdmiX@(  I|vssu|~oaQGA?>94678=CLYeow{}tjfdls||}{mjpx¼¾»}qldchoux{|wnilu½{xvvttqnmmha\LWRID@EUyƼȿÿ~o_I81-.-001-,)(&(09=CL]j¼zsd^[^ejot}Ʒzywvwxz{}}~{vokgca_\XUSRSQOMLOTYbo~~sdWV\iw}{~{yxxzz}~oV=,(9Yjwzzz||xz~uQ0  + "6Masvojgd`XQLIC@/-,,.-,,-24,,23;GMMGB>>:3-)&" !&2CUiznU>.&$$" ?n¾{yy|sfXNGC@942349@M`uwpqw~}{y~¿Ȼrlecjpuwy{yqlnu»zxvusqmjhfc\WOXPEBEQg»iUH@:<962/+)*1Xjy~|vnfc_\ZUL?3,& ':Of|ž¼ųx}ǽĴwmf_`^_`cfjnny~zrlgnwýījG9988;GRbnqkdaUQIECBAAELXkt]I<52-,++,/362120*" !CyȽqdWKD>9560115Fc¿~wogciotv||{wttxʽztsqpnlhc`]ZTORTKAFPe~̿¿ž~`TKHFFOZrĽuljkmdTQYdinsx{ɷxyz{|~|wrmjfc`\XVUVWVVSRRTX[gz{n_QSZgsz||~zrkhhls{xK0&B[w~~}ywwww|hK5# $@[lxʼ}wqjc^[RF<4.% (7Jaǿĸ½ͻvyʿʿyod[TSUX[_dhp|wpjucA79:<=O[nz~yspmh^YXZ]`ejun]PJF;97647:<@@B@6*6mʾwi\OGB<:=5216EeŽ||xpgcflqs}|{xvwz˽wrpnmkkga^[XRLOQH@FSgžĵʮzpmmq}üwlmwyjPEHW]hrw{dz~xyz{}}}ytolfc`[XVUVY[YVVUUWZfx{o_RX_jtyzy|xpjhhns{Y>)#&?Xq}~{{zzz}y^F8-&B\mw}¦zy|ribYPHA=6-% #1GfĻ÷˽Ʒyx̿znYPKJKOQVZ^clzxrôrV<8>ACFWfx|~|wx|xeZZSMGCCCFHPNPSM9(-etj[NHD@>;63;Kfʿɾxx}ĺ~rhcabipuwxyz{òunjklkfc_]ZVOILIHKLVj}ҽǶɻthphE58Gajv|zij~yyyz||}{wspjea][ZYY_\WTTTUXWfv|nd]]cowyvuv~~}tmknry~mXE>/ "/K]q{~{|xfR:&"0J`ikrzͿzvlbaXLGF;.#-Kcy÷ƹƾǷȿn\JFFA54?Xeqtppz~ý½kQ<;DHKO`n}rqjea[WTSUXXX\VC1&/fzp`QJFB?<84;Kc¸ÿźvty|~˼tha``ekrsvwy|пzqiffhfda^]ZVOJHHMSX\htȽ¿ɺľͼ±shp||a<+/Mir}}Ź}zzzzz|~}{wsqkgc^][ZY_\WSSRSVWfw{pfadit||yyz{uqptw~sbXG55@Tdv}~s[H<;BQ_efkrtvuj[URE7-# 3Hb¹ȹǶñ}mUB;80%'2`|zmltƼ~zycL:?LSW[jwzslhefdce_L9,/g¾xeUMHEC=96:EZw~vrsuvuvy~~~|Ҽuhc`^cioqux{}ɸzrib``b``^]\XUOKFHR^fgfhŵŮؼ{widkvuY5)2_z}}ú}zyyzzz|~}zvsqnje`^\[Z_\WRQQSUZhz{qiejpz~}}|yxy|zm[EDN_n}mbVSQTWW]byʴtzqgaSC8,"%9Okʺ{uzƶεȹym^N<3/'!-n¿qhv~Ⱦ}ysqv||]H:CT]bgs~|xvusphU@/0h¿{iXQLIIA<8;ANew}~ytrtrppuwvvx{zvsuwy}}vvyνxld__bhmoux{IJyrjc][]^_\[[[WSNLIMWhpmc_Ϸͽ̮ũ}txue__ffO20@u}xvuvwyz||yurpokfa_][[_\VQPOQS[j{zqnjsz{|~~~{gTOVlwrbRJGFLQmөvw|}sgWG9+%!"/=TqɽĴƺznd^RJ;4.&!+aɰoinsz|snn|ſ~vrruywZD8CVbjoyzq^F2!7mm\TPNNGB?=?FVcy{|¿zxxrpospklpvtroprwz}|z{}|xtuzſ|nfa_agkouy}ɾtkd_Z[]^_[\ZYVQNMOR]mtnbYíɺǿucZYXG3:Rʾ|xsrqruy{~~zwsqonjea_][[]\VQPQRT^l}zrqr~~}}z|~~~¿wf_ct}v\KFDHNg潒yrpx|m\J7/) #*3D`|Ƚ¸ƽ}qf\VVOG>:2( &9d˯{qfjstvxz~}yxsiibWSZtº|spporv~uXB7AWfqy{hO7)!BwtdZWSQNIECBBLVlw~z|vqoqnkoz|tqruvttttutuyrjd`cfkovz~·}ne_ZY[^`a]][WSQPPVYeqvl_UɶĻȿʻ׺o^TTH9Gdǹzwsrqsw{}}xuqomkgc_]\[Z\YUQQRSVbn~zuw{}}}z|~~}{|}ľvnmyhTJHNUmȦqmvp\G92*$%+.4FdĺĸǻͶweni`WPOSTMG@6(3V~i^[X\dgjnrx|}xrnligdbaZNPI>2;ThwuY?2'%O{j`[VSQOLIHELSgu{x{~½xrsuwvqrqrspoqw|wmfbchkouz~xi`[WX[`bc`_\WQOPRY^juvj[Q«̾Ŀ̱Ƹ{dUWPFTs~{xwwy|{vromlgc_\[[ZZ\YUQRTVXeq}x}~¼º~w|wbVT\f|ԽlTE=65:;831222452(.(1`½}vrmhcfefgjkjiruxz}sYE7UqpdG0$Bm¾~tj_XWZ[XQLMOVf~{ux}ձwhdejpv¹¿vi^\ahlrvvy~zn^UTTY`efe]WTUSTW]`_lznPELĽwWNg˵dz´ž̵qkkuƻ̧}zywtsqookgcbdeb`__\[XY\_erzy޺uǹ»¾s`\cns{phktǽ¶~vuȷ࿒^RKTcklkilbI71.+)2G^s±rX<6+ +Bv}wtmf`[XWWWVUTZ^bgklllqvww}{nXD507Ke}w{sU8:Xsiadcc^XRQQT_t|wzȪ{rty{nb_`eiprsty~pjjf_VVZahkif`[UUUSW\iimo]HGWƶfTXu¯v\U\Żž½°Ш~Ҭ}{z{{{{{zyxwxxskecdgikmooqtu{z⻋użľ̽ý½¿{jZW]enwǽһznknuƾԯ\bppjpxfZ[[V_juvnfo|tt|sV2 + +  + +2ü~zumh`_ZWUTQPPT\fpvxwrh[UZ_]TF7+/=Pal_gviJGbyneghe`[WURUas}x|ýͺ~oc_`choqqrv|ugcddb_`cippkf^XTTTRV[jfd_NAJ^Źs`e|ǻxhdqɹƿ¹°¯|ծ~zyxwz{||}|zzz{|vmfdfkmprtuvw}xtuẋvȿŵ~odfotzŻêypkmw˿Ζiiwuqx}nimlgnx~refpu\dyhG&     9žzuogc`[YWVTRV\gu}xiUIHHD>:/(,4:@EEQgrWUkƿtkljgd`[XWYbq~y~¿ŹǺýtf`abfnpppsz|l_[\`begjpuskeYTQSUVZamd^VICRgƭ|Ŀȿ~rlqÿƿϾ|ج~}}|zyvvvw{|}~~}{z{|{vnighnoqrsssv}ypnp{ÿṌxʾǽxlow{}ŽDZ}xsqmjmtĽݦwr|~~vuzzsszxjhmyQOgwpaH, +   !$Oƾ~{woje`_][[XZ_jzlTC<72//**.1,'%0?[yn[^sĿ{romkhda]ZZcqz~vgbbaempooqx}{~tcVPRY^eglrvsjbYTRTVX\cg^VPHGUiƹȿʴbTkοxtlqz~xvwrvtjn}~|ب~{{zxwuvwx}~}{|{yupmmmqqqonnmpxwpnow~y}½ຐ~ʾþsqtx{ɶummkiimx급{{yvx}xpq~YMTUQH8& # ,@jƺ}uqjfecbbYY^hvqWC6.)')&+11&"5Tvplqtvg_g}źºwpolieb][X_n~zǻtfab`eknompv{wvz}|o]PHJQ[cekquqg_\WTUTUZaZSJFBCPaȽűvW?TҾ˴ƴ{f[War~ogfh`gdZgx{}||~~֥}}zzywvuvyz~|{{vtqqqqponmjggjq~zrnnqvx|ÿ޻°˾}uyͼ|tlnkiio|ĺē~yx|utzhUN?;6-! & 4Pzɸ}zvplkllka\]alu~~ueTD7,&').31).KmsZPW^_]ao˽~xklnou¾{rojge`\[U[fx}{½¾}pe`\]`fjmprv}{utpnryxjZJ=6BQaekomg\VOLMRXXRKOF@???FOhq~ŸsKEHdƵŲԶx^JL[uq`_^ZWTSWgzvqnu~zyxvv{Ӡ||zsv{~|}~||yvwxvrnnhghfabgnyrkhhmqww~¸¿ٿĽ°Ƽʿ{uw{srnlrʲب}o}|xx{~nXH40,& ! %9_ɿ{uplnpro`\\_hpv{}xoeZNB;20..0+%,GesWJMQX]iyƽthc]__`dlv{}uqlgda_\UYeu~{x~žż·ykb\Y\^cgkoqty~~xtrolovvkYI94@Q^ciljaVPHGFIORMHE>:563.' (7Jby¿q]QSWbfpui\UPONYZ[\]`dgjox{ulkjji__eq~z}ϼȲ¼znf`cceinprsuz}wrnjdcionfUB9>IV]dgcZPLJKMQW[]^`\Z]``]YOQRQMJIIHQ_jvӻm__p¿̸Ȳq_V\gu|tnquwx{yn^_`jykjv}qlmqvz~~|{|Ř{yz{}~|xusrqpnlhc^ZVTUUTSUV`elqsnf^PF?>?>@BFEGHHRgz̦ʽǿĻ~yxww|ƺĽ͹wqnps|ܵyy~wryxslho|v`MIMA9."%$2Gn}}|{yyxyy|~m^MB?8/&!&0=Slžyj]U[bhehv~xslhe^TMLNQRVY\`aacdfejtwomlllcbfpͺѻ»vlfccdhmrrtw|ztpib`dprn_L><@MV^a]VQNPSX\bfkntqqqtxxwhjmmib\Y]_ccfp~ɪ~mb^iϿ{̽zgWcfilqplhjoy}acjxÓnhq{~zrhcdgqu}ś}zxz~|xuqpnlhc\WTRSSXWUSPNJKLLIE?90,,14112/111,-8DWp¿Ѫż|uuvustϼþª~||wuurtvϨov{rvphcenz|o`QFCD@:.""'2Bb~~~{n^PI?4+&(-5Ha}{jaXSZcfcepxphcc`[WSNHEGKNOTV^bcdedb_akr{yronmlddgqóȷ}wutmhhlruyz~}vph__botpbQC<9DKVYXUSTY_glqtz}|vqmlkԹvdQOgƿʽsoŹudWmmjeinqrswjhoɟ}ruz~|vngb`_nrzǞýyxwx|}ytslhd[TPSTX\\XTOIB1/+*'$ (----+()%#;SnӬ·Ĺû{}}urz®ſƾѷ|yvsv}zz}ܾql{{w|uulcafnrsreVNG@::B=6,#%'-:ERpþ{l\RF=6--.1AYv»|k]YUQXadisz~ypgb_[\__[WRNKHHHHGSX`effedb^`iklz|tromkddisǸļznmrw}~{sh``cnpk^PE<4>HRWWX\`lv~skh~ǰrXDI\½̷qmƻtlsslgn{Ȳ}vqmhmqx~ȟü||zz{~}xuojd[UX_ehh`RF>4, &&%')&$# +  (7Vpֲź}qpµ}syй¸ˮzwxyxv{}|}ƾ˫poyxsu}|tpjcbdfc`\SJHD?<=CA?90&!$&+.6AEJV`crsbWKEA3100=Tq~o_UWVSYbgso_VYUY\eec]YVSOKHDAPW^dedb`dbejg`fswſ|wronldflwƻлͽƯzprxwnddhpogXNG=3?HRXZ]djÿaqϹgF57lÿĪxtüwyrmxªxnpw|ȟ~xwyzvuph_]alvuscK:, # #!8QfڵýǸr`UjǺwyɤĿµȬsqu{~{yy}¼ǡzcrxpptvpjgdb`\VQNJFHGDDHDFGB:/&! #%#%*/=CP\cgqxwtuy}vi`VPL?847EWqǺh]SPRUakww[WQW^`Y[abhkhb^WQ\`diigdbceigfdfgjyºxvsnjklhlzͳ{xŷƻtx}{qs{}zp]LB=6:FU\afq{ý}~ȼrXC]ϻƿtmsϼĖ|yvqhagpurpbM<- "%"#$$ .;[u߸̾lbftϵ»{tv|}~ܸxcjlmsmmhec`_\XTLHHGHHLNOPOJC;64-,-368?GOZitzxoxĻ{ph]VRG?;=J\uøxaSKLOP\iſpYTW][W]jq{|vmgjkmmljhgefghffgfeoùvsqnknrouŸվzz||˰¬}|u_LD>9BEJOU\dnyiO6/5?HNͼ}||}zvyzrmqyûзo\W[_`^ZYZ\VQNFBQeó¶ȳӽɳu|n^[fr˾w¸ɵ|w˹ü}mc^UPJK^qz|t|twvsrt{˼yĿ}||zyyxxxxxxy|~~~}|xxxyxy~wl`UJGKNTVV]eljgfc_[VTRQPNNPTZ^cabbb^XSJECBB<3)#$(%$@bƿļ|zwy}|uprx²z{qkknmlnzɾ̿¾ÿթ{O."#"#(,+($#$)069247KpƹĿ͸ȱмu_^dlsð{e[[euƽ}nhtƴyuvz|}fWOPOHCEOXbfjihlzx||iZUNU[cp~l`\NF@<>ELNMex̺u{~|xwvuuuvvvvvvwwwwyyz{}saWNBBK[fpu~}{wurqoid_cabcfeda]bd^RJIJFC@?:3.*$!Oºϵºtoqvz}vruvtportz~ů~zywvf]YYYXWYlſɻ¿¿гL**3:<>80 "*2:?EIMRX`nucPHGLQƿ¹k]RPVXPF@=:5.+,,?f־ϵһźϽx\\agjsͿm[UYer}żsikzƽ}uqpqsuwwzyeTKDIKE=BDKn|pjvȷ|~k[VQGFP[k{xpjfcbdded`eibVOQTNLIFC;5.!?s½ƾ٭uopsvwtx~ppokihloy~ƽxwsq\XWXVTW_zȾ¾ɾ˽վ]- (489:3)(1:ABGJNS\is|ľhRGEIPúúֹo[RUVMB<73.***(5^ǾǷºö˷vYX^_^cxǶ{cSRZfozûre`fzshgjpxz{ywz{uhYMGGLPNIGMTVZccbadgnry|wsut\JBGVgv}gJ70$0467<@Kr{^VoĴ~vbTSSIIU^r|vpijhkjiknmidb`]]ZWPH?4''1Yûöݬɿwpqw~}qlkv|kkifffjlz|uqnlYXYYUU_l˿þȿɪt6%3655,'2*' #,(0E^othhʺvntzv_OMPLO[p}vmaTG891;nɿvqv|l[Xaloncdfdegmru|źxuogcba`^\`qƸxvxʽɿüĵѥZ49,( (2=BDJPRVZcjmu˿ePB;99ɾŻĽ|tvſĽzٻf\UOE;41/.*$DrɿſƺûdLIKLINax^QLQ[cnxvg[TWi{ƽ}jQQU_mtsnlloqojc_^[XWXYWVUX[_bcddd``cmpppurYG?I[izi@./.)%&1Gcoqilɹwnlyyrwxuzq\MNOMR]rǿ~qaS@>/2cĽȽ{rls|kYRXbgfeffedgknu}utwuomkiiiejzuppv}~¾Ž޸m(04*$ )4C6!$6NjppmtƸwnixzprqlorxlXJMPNS`uÿo`NH68eüĹwmen~mXMPX^agghgefint}woow~{zz{x{ƽvlnpstwxplkjgpǿý͇C+2+$ + !-5:=BIQVY^djrx}l`SJB>:7Ĺ¹ǾvviXOJ8/&"%%!1YҾ~y}þȾvZECFIKLXfqSLNXbipxĽ˻}vh[QQ^l̼n\QLNSTVZ]_Y[aefedchfda^[XXYYYYZZ[YYWUVZ_abnwnQ<6AUcn}QBLP@%+>Xqqqtĵxps}|yrtquz}|gTHLNMR`wýwhROAEoŽujcj}p[NLRY_egghfhknu~rqxŹ|tssqopw~¾|{yuokkllmnopstrg\TRTTNSjƾľ٠f'*3,' $/367:ȼĿ÷ºƻrf\J8& %$! *Cmз}mbdn~zrpuz~~ĵs[HHKRUTTZmuUMNYbjszzqjhnu̸plpzwh]V]q¥qeYUWZ]^^^^``WXXVRRUYgmofWOT^`^[YVWYZ_^^[\^`ciovuplmpussq]@-+:LXanxhMCG=*&:Pbsz}zp{ŽuuaRJMNJRay¼q`XFFoȾжǵrmilqx{zuodVJGLQ[^dhlpuy}δ{rmkhsxpnjfjjjmnmkhjjkmooppfe^UJA;;601Ec|rtʬP,,.,( +).,3@LSY^belqy{}|vnc\YWXVOJFDDEFB=:űƾ˾ſxǻzcM2# "!&=iʳrehw~{xspqruuwy}ĺmZLKPXZXUXfzYONVais{|od]`fq¬{l`^hҲrd_YX[WY[^`beb^_`]WUWZeijaUPW`ca]ZYZ[\``bcdeghinspkhkonkkkX:)):LXbq{zU<<6(,JducTU`nyºys\OHLOKTdzsb[IJrǵ®yvxonmnnqsutsl_PGFITY`fnu{}~Ūztogitnfb_XRSXZZ[\^_```__]]`]ZWSMHE>89EYjx}¸ջ_4*('% + -.)5GU[`dgkqv||~}uohbZMHHIJIJIFEDDDC>;ȱüĺ}¹w\>( !8gİqj~uouxwtpnnqqux¿ƿhWOPU]c^YYcz}XOLT_ht|zj^]alô}lbbrǦf]]ZZ^RSX\bdfbdgig`\\]edb[TSY`dc^[Z[\^^adfhilmjoroigkqkgihV8%';OZevʯ_>40)0RovUB9BOZgw¸|rYMHMONVh|ſvWTHNvкп~pnqjnpnlmpqwyuhVIEFQV`hpx~vu~Ż|tidlx{xyüubYVRKIJPQPRY^[[YYWUSSVSSUZZWVMIFNXclrƽؽg7($" #/-'5K\bfiknuz||}|~|slc[UQI=9;=>ADFFCCBA@=:ε˿ŹuzywyY6& 0aµwsɭsny|urxooopsssqzɾȽþ¶vhZW]cebabffo{\NLU_hutjijr}q\\nƮybY[``]OSXZ[`fjglrrlgeeeda[UW]ejgc^[ZYZ\\_eopohhklifhlqkffh[<&#?TcjsϽqB6-1;OplN@98219:87:>?><:8889ǰþ̽žymdenyyu_F-(Zμsx|jjpoonnoqszȾʿþĹrdVZ_dfedfjbi{|\QOXbiutpsyza_qӻzl`Y]_^YVY^^_chkjnpnidcefe`[X\cjlic^YWUURSW`jppmcfigeglqnjllY:#!AVelwĬVD:;CQl}q~pQD>;:8:AKS_l~xaNEBHOR]j~ļv[OM]qԽʹ´{qhdghihd^bjfUST\ejr~|wvvz³|ytkedhlszwwu\NGDB=;=CKQUUUTONMNOPNH@?FOZ_efryluЊ\=. + &#/Rn{|uv}~yvrmh`XLE><>AA<33863147767677:;įļżƿ{x{tmf_XY^r}xkijr~|raPB3##Qɷ~r׸jafegedfkprzʿĿļýƽh[P\`cbbceh^dsx\RS[biu{t{x{ùb^sfb_^ba^Z\]bbccgikllhb_`cdb^\\ahmjgaZUQONJJMT^fhh`accadjnklqnX8#!>RcmxƴiYMJMUiyvixoULCC>722:AMXiw·|{wsttgVGCDJQTaosYNKTaqԺyqhceijhc_gryd[[_goyysprxȺvka^afpxuntzgTGDDBA;=CJPSSROLKIJMOMKEDHS[aemyus|ƿةyP8#  %,Qp~{z~|ytoibZPF>778>ACA=<<83/121123469:ʵ¼tsz}skd^][[^dq~rjdbittm[OI@2.'!&Np~Ιrc[Z\\\`ionsȿƿʿ{cYPY[_aaabd`aly}pVPS[biw{xyzzxc_uèk_`begdc`]_bdddechihc_[[[^]]]bfijgd^XSONMLKKNTZ]^_acbabfjhlrnX8$"7I\jtɽ|h[XX\kxwu|iYSJLKF>=EMTYcku}Ļ~xqj_\VQSXQJCAFOX[ixn\NFKXlϼunfcchigbbo}vgeglvqkiq}°~lfbdhfhhmgo{xk\KB@@AA<>CIOQQPKIGGHJMMLIIMV_djs{|ǼǗa<%"(!*Ml|}|wof`XPJC;:89;>@A??>;61-./.00/0145¿Ϳs|¼һѻ¹¯yoq|}rkid_adgowwdUW]ZM9/0.%('$%K|ɶxiϠvbXTRQRXailp|ļȿʿyd_XVY]``a__daeluunePLOZck|}xtrv|ph{̺mc`addecdc^`cefedbbbba]XUTWW[`eeda`]YTQOOOOMKKOSVYddedbcdehouoY:%.@UfqzǬxicdfsxgZSLOVUPPV]_adelt~zwsle]UMIA<505<@?CBFU]er|h\OFJ]xƯynidcilifdgvİwjinyziderʻžzheekjb]Xa`o~ndecUIA?@?>=?DINPNMHEDCEGKKIIJR[cinu|¾ƽ۫k<&!*&!1Niwyqh\RIA=:95;:;<>=>==;83.,.021/--,--¿ǭ{Ʀ®wvzustolmpugTTWTG4,..(--* !Dqʾ{uěxcZSJGIOSYgqϺ¼Ǽvhhf`_aba`^\ea^^eheaPJLWeqƯzū{^]^]\[\\]^__bgjigb\]][YURMQV\aba][ZXURQQRSQPNNPTX[ffeeeddblrxpZ=&*<>DHLLJIDA@@ADEHEIOU^dglmtĿ»ߴn9'&),,9Ugs{zpg\QI@83246577:<:;=?<961/023752.,*)(Ͼܾ¾yz~~{|}˭lWV\\UF?><4882$9`ɿηvj\PJNRVZj̭tnsrrnida`^]aZTTZ`bcXNMYgv¼̹qZWYURPSUUV[\`djifbZXVUTPOMSX^^[XWWUTQPOQRTTSRQRTX]deeeeedbkrvqaG/ '9Shonuɻxkc[[XZZYZ^bmnsuwz}ungbabchlpstvsrpljfdddca`^\[[Z[]`dhkjjjiiiiiihgeb_[YURLD;4/-,*,09BMWTNN_p|{hPJFOkȷxf]]_dwrhjp}xliu|seSVb|±ƻwle_]ZSPOPXciga]ZSLHECA?<:<@DGGFC?<;;<=BDCJRY`cddcitýױk6*!$)01=T^eg^UME=71//246468:;<=@C@=734578<962.++*˸ӿĿ||qv~۽tYU`dbXRQK@CB8) /RƲqb]`gjkz¤fbn}¹rrzzzofa``a[TNNU]dh^SNZj{ýšүo]RTOKKOQQOTW\ahhc_ZWRNNNONVY]\WSUXUSQPOQSTZYXVUUX\bbcdegfdgnurgR:*#6Qhnimvodfgf`\Z\]cfinswyvvyzod^[][Z]_dhjfdc_\VRONNLLKJJKKKLNSX]```aabccd^^]\[YWVSQMF>85323:CMWalbXWh|¿Ŀ|lSJAJhѾҼt`WZ`dhaY\j{ȝoekofYLQbƼȼvb\YZXSQOQW]]]_\RKECBB?<98:>@DCA>=9679==?BEE@:678;:50---Ȥûſ|nt}~riuş{e\isumih`QQI=1(! &Ipĸӻoow}~~ʥjVDD[xxlm||th]\aZSJGUiw}se[al{ýֿϥyi]HFECDHIJIOPUWYXVUOOPPQQRQVY\\YUSRRSSQPPSUY[]\ZWVZ`cdffea_ekrtshP:13B]not|ź|keikgdcba`ceknqrqpmot|uhddecaacgjka]\VSOLJIGEEEGJKJKMPTX[]^]^`bcbaba^[YWUURSSPIC?=@BIR`jqvr\\uÿ¾mXJ@LlͻĿt`Y]\YYWY_l޵mb`e_P>LeƽȾ}seb`bjqnc[\_ejlf]MCBFF?8326;@@>=:41//147=FO[`a^\[\bilrĿƼͦpB)!! '+,.58?;70)&'(%(-/2358<>AAACFGCCB?=;>?A@>;:865ϭűûyprzyzxqgetȦtmyve_UI=1*! <]ľpYE>9;MhĽwnadryzvk_[^WSORd{ylmtֿ̝pd]IBA??CEGFIJNOPPPOLMPRUUVVWXZZXUSSUVUTQQRTUX[[YWVV^adefcb`agowys^L88F]oszľuhbfeb`bbaabdgjjjjheghot{}wtrnomlklje`^ZVSPPPNLLLNRRSRVW\^ddgeffjhiegdc_^Z[Y[Z]XTLJGGIQ\hqvxs_d}{|}}s_OCOnòÿſte]ZWTSXan{幐reab\L@Pkú|wy{xy|tnlpwyqfRGCFF>64359<:9640-,,028>>>?>>>ٹսº̽wrpwumb]]dvͱwpeXI>3+$+EiƸhQD7:>CK_yþ~pcTWciqqrtmaZYTTWbxÿ¦Ì`[ZF@>;:=?@?@ACDFGJKJMRUZ\]\XYZXUSRSUUUSOMMNNRWYXUSU[_adedcb_cktpbGCJ]qzƽ{mfcc_]\`aa`abddedb_]_\acflpsww}~|zwtplheba^ZWUUVUTVVXZ[[[^`dgklnlllnmlihed`_\\[ZZ\YUOMKHKQ\goqqo`k~zxmmljmr{{gWJTrȽſļ~og]RQVcrݷymfe]KEXvü½tp|_QKKH?965565310.,*)),05;@JRVVTROPW]ZY_r|nmxɨuG)"# !$$!  ((,.049=@BDEDDGHHEB@><==9;>?ABCDŨý·~yvqu|qcUQXfwӽ~rdUF:/'!2SwþμtcVOMGKMKN]u¿ürcOLRUY\emnf\YWZboʰѴxONUEC>968999;<>ADHKMNOU[_``_\[[XTQOORSSPLHFFINTWWTRRY[``bbcaccfn{|t\UUar}Ŀtjgdb[UV\_`______\ZWVXUZYY]`cgjpy}yqjdba_][ZXWYYYYZ]]^_`behloqpnmmmljgdb`^[ZYYUWYWSOLKHJOYekkjh`n}wutpkf`\^diknxo^R^|Ľsg`SEQg~uoncNK_}ĽsrͼtdWRLD=:5541-+)((&%%)-4:@HNPNLKGJPTPKM\p|saRTfyŨ{H) #& ##!*,./15;>?CDEDDHGDA><<::978:;>??@շȲĽ~yuopvyxiZNNYhuĭzn^N@4+"$>ažzm\PJJLPKGDL]rͽ|vtuxƿ|nUKFACIWhsnf`^bkyҼƢiEHRFF@;64555:;?CHMQTQTY\^^][\\[UPMKLMOOMIDA@CHOSSQOPVY\]_^__gfcfnz||pkejs}zmgfd_VNQX\]\[\XVVSQOPRTWWUWXZ\cir|ypjc][ZYXYXWXYZZZ[ZZ_`adgkmoonllkjgd`_][YXWWWY[ZVRPOKKR\jppoiev~uqpqxpg]WUXZ]_gs~td[hüvdVRC>ABDCCEEC?>=?>;899;:::;;ɮͺƻuohkklpsoj^SLOZft~ufVF7-%.LžǶsrtrdXNHHKKF?:=Mcy¨}j_XUTT]tŽ}cRH9:@Pfvvoihmw˵ֹ`ADNIF@:42356<>CHMRUWTVWXXVSRWWURNJHHKMPOKFBACHMPQONPUXYXZZ[\feb^dov{}vruzzpfddb\UPRWZZYWWPOMKKJLPW[[ZYXWX_enwyqkd[YYYYY[[[[]^][ZY^^`behkmomlkkjgd`_][YXXXWY[ZWSPPLLQ_nwwvspyqjhgoh`WTSUVVX_l}ofbcfgiikpx|}}}xh^meTGC>BeƸ{jOOj½̻m]OC<9630,&! !"'-5==>;87ANn{xsqrmdYN;0;NauP) (+(%# #&'+-03459:<=@ABADDD@>?CB@<=<=;;:::ּ~oe`ba\[][YVPLR[gu|n_O>1)"#AEIMPSSRRQPOMJHILNMIFDDFJMNJFB@DHLOONNQTUUVWWXX]ab]_gpyzvzvohdcfda[WX[[YUSRNLIIIKPT^bdec_[Z^dlv~voie^[[\^__`bcddc`][]]_adgikljihhgdb_^\ZYXWWUWYWTPMLKIO^o|}{wmfcUPKHIKNOVX`q~hXNJOMNPX`hlnoqx{i^kļpWE:;CRpļ~{kOLl¾½ýɰybPC;720.("%-6=@EJKKFC=733224>?@CCB?=?EEB=::<;<;==őξ{iZVXXPMMMMQONT]iztcP?2.&  6aͽ˨xdTFE:8=GKIB9:@Nat˫r\MHIJIJYyǸĻ|{wwi\J<>McvvneszŭΜmP=:CF@;3/059EHKMMMNQUUUUUUVVV]c_^enw~xzqddb`bdfda^\_]XTQOQNLLMOSYagknle`\^emt}unjfbbcdefeeijkkifa_^^`begkkigfefdc_^\\YXVWVXY\YWQPOLMRauvlfVTPQUX[\X]gxjUHCDA@DO[adfgjs~i[fºüsdM=29Lax|vwjQJn¼lWH?;1.-(# %,4<=@AEMUYYbovyyxʮwc[^bb`\fŷȺy|q~wgZCAMfxwh[iºìZA;:9<356534:@=@CB?=>A@BCDB=8479;5/+-27=@AAƿżõ}iQ@8?DD@@DGTPQW_i{¾w`I6+-*)($"$7b½ֳjPCAEHKPVYakvӽyprtropw¾Żuqtx~naMLVm~}rfsȵ˼÷UABA>;32127=BD=<<=>?>>?@@?=94225:>@?=<=@B?<989?ADGLNPRYYWUUVXWTY_cgiloz}wqpng\WTUVXYYZ]a_``_\[[[[XWVVY]ajqvzyqidabfks|xnhe_]^^[Z[[\[[\_`abceggghkmiigeca`_ZYXVVVWXWYZ[YVSQLPVby}xvvvtoqxm^VSVXYXY\_aado|l`f˿~vl\NA@BOf}}smmpriXIMxȽýԿiVLD511-)&&)-,**.103(/563211225:<<:==LWagoö~wm`OC6-,5FXm¿b1'1/*&$%&'&$())&%!!!*+25964345567889;<<==951('(*06<>ܿ¾ýùƹwfP@25:?AACESTY`go~w`K9/-(&$!$:gɽƮz]GCEIMOQTalzӾmimxjbahz}szοsE6>DB><735:79=@@=>><:741/-29<;:;===><:9:;?@CEJMQS\\[ZYWWWZZ]`beinvzof_YX[YSSRVTTSRVY][\\[ZZZ[WWWXZ^cfimpsxwqmihfjqz{ohda_\ZXTPOPPPRUY_adfhhghikjigeca`_YYXXYZ[[VX[]\YURMQU`v||ɮtjdjnld^^aadky}pflķĵ|pcTGKNWg{{{wrqtupdelrq`M?OwƹǼĬt_QG<6655200+,*+,//0*4860*(/28;:87<@GJOWdzŷ|rbO@5./:LauĿƵi7+1-*''%#$'(...,*'&'*,147653220012468;>?<864*% "*16ɪ˻vgSB017>CDDFSYdnsx~fO=3-'"'>nľǷӾkQHCFHJLO\gwóľ|lhnxvvzxƶ¾̟m<+8HMME@;9;>?=A>;;=@@@<;8520.-,3:<:9=;:;<=?@DHLNRZ\][]ZXV]]][_`fnv}tj_XNKLNMOQUQOMNPVXXWURPQTVSSUUX\`ca`bfnomjfdadlu{rlhgd_\XUPLIGGIMT[_bdffedefgfec`^\[WWXXYZ[\UWZ[YUQNQSV]r̵uwxupnqtqvsmv´wj]QJQYfwzwpigjliZ_musaOFYyĹz}ʴgVIC>==>=74..-,+**)&273*$'/79635=DDBGM\sɹ~|wp`M>4-/=Qdxʸk:.4/)((&##(,0121-++*./25755320.--/235;@@=8890) #&㻜~¹vhSC1/6>CBCHXeu|¼kUB6,& (BuĹø}eUFDEGLPZfvɾ¼{lksxƹ֯G-4DPSFEC>968;CCB?;;?B8641/...07=?<;>BCB@?=>>>>>@BGJMQVY[\^]\Y_]\Z]bip~~zwoeVJDFJMQUPMJILOSURPJECDIMPQSSUWYZYVUX_ccb_\Y\clv~ɽ|uonhc`]ZWSJGGHLRY]bdfgeddeedb`][YXUVWWXYYYVWYXVQLJRUW^n»λ}zy²÷{ncYTOQ[kyzpfbdfdV[jtscWVe~üvqv~~rlмp\NKECCCB<87630*'$"!&01-$!*46415=A@?AHSh|˽|uqleWE80+/?Ufwκj;/83*((&#$),.0221.//2124553210-,+-/13:AA@<;<5-%ڰȹvhS@306@B?DLcsºmVA6,%)DxƯmVONORXbkzûƿxmoyǽӻ_=4:?@>>@=869<@AB>869>2210000059>?>=?BCBAACBA?@BBDGJNQSVY[^^^]]\\Z`enw{zxriQGAFNRVYKJHKOTUUOKE?=>DHRQSTTUSUURQQTUUVZZYY_iuyrkc^^^\XOKJJMSY]dgijigghdca^\YWVTUUVUUTSVVVTQLHFSVY^mĸyocZSPLQXfo{{}}yqgbba\RS^klb`ek}Ϻvw~ug^wпyfZSOMKKHDA?>;4+$!#%-/*"'14316;==4+%*DużƮmca_`hpv¹vmrʴqZK=4548:;;;;88653223-./012348:;=====?>?BFHFDGGGHKNPSUXZ[__`_[[\]ckv}z{xqcMDCMVWVUHHKPW[ZXRQNJGHKNVVXYYYVWUTRNLJKMRTTQT]k}sh_Z[\[XRPONRW\_ehklkjjjfec`]ZXWUUUUSQONPONKIFDBPVZ`pĽ½ƾѿvnbWPIEADIQU^mzvsx{ytpqplhe^WOKTbg`bkrʻtw~sa[nwi^USRPMJIKDD@8.%#"$-/+#"(1543469:==;>Pfvld]TH:/+(0F_s¡pC6:2,'$$$$$#$(,/369851100000/-++*((*/36:><9632-'! ̩~¼ǵwkUC87?HHEPb{ǼxaL;2+% *CmϽĽurmlsx~voxõʯrWD3026=@=80.*,/0-)*,.13566998:<<;:<@NUZ`qŽŻμoeYNJB;6/269?Qcruphhnqmdeiopmh^SMHO^dacm~ûshlyqaZh{ızkaXONOLHFHKIIF>3*&!%/1/'"&+265333::>=79Kcyukd^UH:.,)2JgyŦuH89/,&##%%# "&+047;;30/...//--++*'&(//16<;73530,' ۼŸøxiWKABKWVQVf½s_L=7+$ (=a~Ļ巜ϴvpw}Ž;üvr}ǿ˺ëeQ?22789;4,)//'"&)*-27;;;:9767888:=AEIIMMNMNMORVZ_`abcba^WTZgszvic^MRXXUQJ?:@HPY`cbb``cba`_ca`cfgcac]QID@>;:<;87AN_v¾r_SRUWWUSRSW\^_aceedcdecccb`^]\WWVTRNKIGD@:66:?FMVatö¶ϵue\TJC:2,& );O`da[`dc\VZflon`RRFEKV_ep}ľzsilx~{t{{zvtv}ynf[`wȼvi_XQLBBDCBBHLGFB=82.%''-1/*%$'*/1100.59?=89FRtrhc^Q@3,,7OoЬxM9644-'""#$! #(-37::1,+*)*+,.,)(('()..+.352../122+#αx|ϼ°yl]TMO[ff]`jveRC;1*# (<[xþ͘wyҸ|u|}vsĽžɺֽ{cJ<522662..*&#%*+.169;;:9888877:=ADGJKMPOOOPSY\abeefedb][an||l]ZZ_bd\OD9-*,6BP^hjhedeggfffeehlliecYK?;97679856?M\r~k\XXXWVSQRUY\\^_``^]^`````_^]\YYXWTQNLJGB=:9:<>ER_jxüvw~xnnoollnuz|{phbY_r´tg]QHB>;6547:>>>;=GSoķznjg[J;03?WuΧsI:=@@7,$!""!$(-3799.,(&''**-,*()()*--+-22/*&'+/31-)Ը}suxȶԿ|yyzzrf^Zamzxlgjup_LA70&""/A\w¾loz¹ƻytt¾üͻвvT<.+.572*#"%%,,-/269;::;;:866:,%;Q`hieccgihfeehkolfa\PA40-./120/1:6:EWvºüϹvc\RHA<842&,>NVTOOLIGFOch]XOA946>M]n{qqrrqrsw|xthaaY^ovk\OGA=9::842,*.4763:9;=??@?58<<70(""$(**'&%07?BABJUj}Ƚ|xwmZH8;Ib}ɞkE:GPTD2%!"# $(-3685,'$!"#&&+*))*)*-,--/1/*' !&+1454£{vssvͽ|vssuyulddm|xkfi|{pmsnYJ;2)$#+8Kf¾•|˸ſ·ú~vryſ~r}ƹå~X:,'/62$!'&,,,,-058:<>><977:<=@BDFGLKJIMSY]fgjjlkjghkt~m[Xi|iM6% +%;Q]c_^\_ab^^_bfhd[TLC5)'&&'**)(*3BNYqĴyja\VYVUSTVY\^^\XUUWZ\\]]]\[Z[[[[[[[[\WQOOLD>8;BSs»ſľm[SIA977760)#")8GUXWPLGCFIQghVNI:0/18EVo½z}}{uf`c^`nǷrc[ULCA?@ACEEB:3-,-145226:?BFFBDIGA6-&$$')'%"",4>DGHNTbwĹmXOjz~zieibbpȷvgWLHE?;>?ACBAA<7441..240049=@CEORUSL@6-*()(%!&/:EKNOS^pjDN^r»ٸZ@@TfhO5'!!%$&*-..-,%# "%()))+,,-.01110+'"!'.1Ƴ|vqs~ǵymkgfiooh_cqqhoxuh\V\~{{nT82,-4AUiйǧĶ¿Żwv¿ſzyu}w][msspøǞmB%#&(! "%&+,,)&'-18;99<<==>?@DEKKKNSW]`hilnoonlu~th`bsȻxdL5*:GPYVTUSNURONJC83&##.8J\uwk``]^YWV[^^^][XWXZ\\[ZYWUTSSTUWY[]][ZZ[XRKFDELa{ƾ¾~tlbXOLD;77:=?>:8;FRajkcWMHJU^cj^JE?0&,369Ihø~nijcds̻tjZQG=:775>BEGD?;725<<7/0.2257:<=>RX][TK?61-*'#",7BLPPRZkȾzKUhxկWBCTcbH0&# $'(+,,*'%"!$')()*+,,.-1110.)&##+.ٴ{uv}slicadjh_VXguwxl\RKLUo|ĿsT73/3=>?CDJKNQVZ^ailnprqqnzwkacq}bC* &7JZXTUVQQKE?90(" .AQ\e^aqwpowrf^^]YTRX\[\\ZXVWXZZZYXWVURQQQQSTUTUVWWVTPOKGDPez}}¿»~re[TQMH@;<@DDGB>@IWitwjXNJR^ikeRCA8)#*159Hiľ|ohgabtt_ULGC;78>CQW_c`[XTJIIF@9524345665:MV[^YSI?81+% )4BLRSTVfxƺQ]o~ѨxVGFQZT:'#$ #+*,,*&! #%()++,,-+.,000-*&%## #(*꽩}{ɪ|rogb_bhf[PO`zoXLC?ES]q¼ĴtR9538BQg{ƽӮyzɿu{z|~û}}~km|vfcr|ĻpOJcѰV4$*+# #+01,)&,01587448?@A@?ABFHUY\bfjnoprtuvwvt~qe`jĹlK+'4J^^XWXUNI@60'"-?Vqqbmujdh{ymba`\WUY]ZZ[YWSSRTVVYZYZZVTQONNOMJMPQQSSRWRH>APcnyolr}zvyþû}{rcXSSNGB=?EJLLG?>FUgs}lXLJRbli]G<=5&#,5:=Orǿznhd^arq[HAFEFBAHT_ltuj\RLGC?98898546FNUZZUOI?71("'0:HT[[[Zhy·ɳZfvŽˡqQFDJOF-!#+,..+&!%'),..//////211.)&$#+% "%'˞|˩mde_^_a\UOQazv_LFIIFLU_s»нaH@:;BJXt¿μȱ⽗wzÿ|mgxpYNTbpy{zX-.JRfɝT"!""#! ""##'*.0651./279ADDCDN\ioy{xz||sk]]zƽvbL57EU[Y]^aOB3,+(""!"JmͶ`[guyqjlhd`^`_^ZTPOPLNRW\^][^]ZWSNHFHGGGHJLNPLIDEEJM]v}zxuuqqvtfa`aSE7-.8HUPJDAAH]on]H>BP\]]O?50-))3L[gfagp{eD"(BFV|ĝT##"### !!"%(,.1/-+.169@BEFHP^j}zqe]fx^HO[___]YI8)&(%!3K\bi͙g\dq}ztqojgeca`\VPMMMNQU\^a_b`]YVQKIHGFFGHJKOKFB?>AFVp}zy||~pgc`MA0)+6IYTNFA@HXgcS?5;HSUTF90--+/9CLXm¿Ż}rkdacgg[PG>9:92.07418EGHHB;75:;K`~net~üt}Ѻ[;7?>6$!&%')&'(,.--*!!&'+..,+(**+-,4886861/*$ !"#!РtlwѪkUSYacYMHN^vhVIGIIFNDTl»ѽbHGCEKScͺƫå|w~Ŀȹyy}¹vlgsʵren{kC/6@SE6/8I[gbVTYg}}V=&,@DNgX$(&$%%%#! !"%(**)((+.35<>CFJP[dqzwmbewľb]`bb\QF8+%2Ebo`hkuxtpjhgcbc`\WSPPPPUZ^bab`_[YUQOLKIHHHIILID@=;>ASl~tr|rf^J=0(-9L][SJEDKXc[J:5;HPRNA4-*,,29BL^wøzrlga[YSJC;54SfrnYNTf{~kL7%(17@QcxZ.,*&&''%" "%'%$$&),037>ADVk¿xqrxl\G<.,1>Rgj`WPOQ]cUH=;BNSRJ>0*),-26@Nfÿļvmkg^SNGEC?9:ESq¹}fQ@6;200+&*4DKUXM>9=>`˱onƼ{˫W@?DC?-++..+++)(*,-.+("$$'*% (16;>=<72+'%%%ǝ迗j``ffVHDDUo|hVF=98DHKOSTUV\izvjch˵i\TA) $;[ӧyighlt{sjgeecfgfa[WRQOPTZ]`bbaaa^\ZXXVUSQONKIGEEEGJYkunjlus]C8.19BWnuph`\ZbgYNGJPUVRE9-(),,26CVpſż~tjgaVMFEA?>AJ^sjSC5+(040-/?I[rviWMMgǚwj»Ǣ{UFEFD@32331/.,*)),,,)&!"!$'! + + !+17;@;962/,--ųݹsfgeVICBRl~~uj[K;0**0@Pg~ӽhT]]_bck˲ʲˮ|wy{xuxŽ}kWH927Ec}xssy~ɻzohne:!"-A\laEBFGIKLKIKS^q{pfdoϿ|bPC0 &AhǺ{nkmms~ynhcdadffc\VQOLNQWY[^___^][[[ZYXXVTSLKJIHJLO[h{ymb]dy~bF928@EZo{yunebimcXVY\\TK:0'%)-.3=Nbž{mtü}yoie]PGAA;;BNbl\@.);PVRNMTpsntسzƚvWKKHC@7::5100-+*))*('$"!!$! +  %+2:8:<;830.ϼŶԦkfcSGBCSlvrplf_UG90('-<]vӿo[cdgjgn¾ѷѿչzuntv~ķq]I;9,##*6Soymeeho{½uxldcmk9 -BPE/+4GUK/ ' %'0NWH:2+%%(*&!#%(,,./6:6011.)(((('$#" "#! ".38>>8/(%íĦ湑nd`READUnxpmkgb]SG=4/4Ans`deijglպŪvsors{~üzre[TKA:/$ %*3Kfwsyynk`[\ait}ÿeg»{na\`k}d1 #(*(3, +  :F<22+$#'($!#'),,,.8:<@ACAAGFHHD@FP]r{ndfoópQ8# + (FvĿ~plhros}ynfa\^_da[TNKHJLOPPSTUUVVTSTUVWWVTSNMKJHGHJS\l~}~~{yzyxvsmdZNJVeoZOIPTR^r{wpy}sihgdV@0  )028Wjº~}uojgheYI=:9CXvǽ|[KhêʨիͿÏoWSTKC?>A?5/01/)(''(&#!"!%%%#  #/5<=5(ɹʮ̡yjbRFDCWu~tomnmpi^UMNR[sac_]`biz|俏̽~~yunotz}ľzcPIA?JPI>7761*)4K_py}vnmkcc]ZY[`egqj[Q_~~{ung_`fmtuX+   +   )1/'.*(#"#%%!#&%$&,34:??>??CFHPTK>?KVn~n_iɿ_A, $Bp¿|w{uqohlppyzmg___`_ZTMOONLJJLNPPNNNNNQPOPQQOMKHEDEDEFLXkxwwutspoiibUGCKTlt\ZZ^__eo{z}ypgd^SB0!$+-4Bc|uqmgdfe\K;3?QoĽyhι㽝ֹôq[UTLA;?=:50-,-('%%%$! #$)*+)& #.:>7'þͲֳveSE@BWt~}}xsswsa[USUXczÿwzȠʼzqruxyiXG8+)/:B>1,/1466:DWgzypmkd`]_^][YV`nvdNRstlighioxZ-"#     + +  $$)'%"""#$ $&&%'.6=AAA@ACGMOW\RBCLcx}qfr̾V4" .Wüxqtojg_ior{{ofdbc`[UQPROLJJKMMMNNNNNPOOOPPNLKIFCCA@@GRdz|x|xtrrqplkjbb]SF>AERfx}l`bfjmmv{ztk^WN?0$+1AGOTZ^`enw{snleaaed_UKDMZp\M_pp`\_gtd6""  + +   !$ $#$$%%$$! #&&'*08DGECBDHMUW^bYOPXs|wwrnȴqF& >rȾǾpdiheaZirxzrlhge_YUUTSOLLLLNNOPPRRRONNOOKKKIFDC?=GWn}{wtonjjfc^][XVPJC;1,3:BIS^bbakw{~~trmXJ>0#  ",5CXmſ{rmhfd]\XRLQcvج۶ôľкoWLC:7870-/10*$%#"%%%#! "!%&&# + "0:CJν¼u\[bw¨vhSM>3)#&.=?EUj|~|yxvsokhgb_ZXVUQKFA;3.+4DRgy|yvvsplhfc^[VRPOLGB=60-)2?MWbjmow}zzwngeebRD7) $06CZs¿~zz||rmjfacVOOVbr~ýμԻյdzͶlRGA7230+(*++)%$$%%(('%$  !)ĿiNHCOblӳoM8'  6Rjϲ\A4D_ƽ|gUTWbt~{wsuйvqpoqw~ҹ[0.AQf|½~od`]_efbWJ@9:Ha{ýnF@Ghìm]K7)"    !#!!"#"##$%$*.26=EMTW\]^^acjifel|~shbi{ǻZ?-! .OyĹjE;P`nsv~}ulc^][XSOONNOQRTUXXWURRRQLJHGC@><:;;@Nbv}|yuqpnjeeb_ZVQMKDDA<6.($)2AOZbhloqsmnu{|}qgbcdaZMB9/("#-7>Pj~upox|soke^]RJLXfy¾ĽȱԶ޽ɸƭcLC@9312/+)'&%$$%%(***(#!   nqeLFCL]cw~ľ}\3!%   '4OvԿqVLWpºpcfn{þ|yupsٻ||usllotzʦnGRsxjcc]cnupbQD??H_vſaB.?e}}}ʼ|pW:.   !!#&&%$#!"$&()))(,258?HPUWWWVX[_ehhjt}vkdcoiG0- #5Tx÷ĴgFA\p~rv{|qfc_^[URPPQQRTUVXXVTQRQOKKKHC?=:876;I`r}|xzwrmkhb^b_ZWQLIF==>92(&/=IORV\fjg_`inkth_^ad^SF>82.*(()4=F]{~wsx~|spkd[UKGKWjǼǾ°ʰŢǤɽȻпz[C>?94040.)# "$$%%(*)'%!!"$%###"s{_RIOZepw׿zT3!%#! ",=_ŵxu{þIJuzĿ~sppla`lķ˷|{ʿwmhimrw|ױs}ǿuj_XY^ipoh\TJDEPd}¾ûhG8:Je{tbaxv_J3#  +  5;@? *!+&'(+,-,+*035:AFJNVSSUTSXaeflyytiefpuS8(! ,?[xbEMyswx}vnhec`\WSQTUUVVWVVRRQPPOKKGHE@<978:9BXmv{|xurplhd`_ZYURNIDA;950,&!(3>DEIR]ipronq|}rjge[NA;61+%"#.2=Rkwpmha[QG?@QjȻȷķܮвŽ»̵rYFB@845,/* ')##$#$''&)%$!!$%$$%&%$#"!! {ž}wsia_fpw~pP9!"%(+/-'+)&#""%&$$]ma0"'&0*++,/00/047:@DHLMVTUVTSW`cgt~uogghrgH2% !3E^vpRXttvy}skgfa]YUTTTVVVUUTRQQQOMIHIHD@;97878AVity}Ŀº~zvtsolhfa^[XWTQLHB?93/*'%##.6?DGLS^qy|}~zmgcXJ>93-($"$07D[vvmic_YMG@?I^x¹߿ȴº˲mWFFHA;:/1/%!(("#"!#$'''&&""$$%$%%%%%%%%$# b{̾~rhgknrt{{ßuI+#!(&!")/2254062.***,,-#)GaʰŽǺ{z{~ĬǰȽuliikoqv¼½{k`Z]_abbcfj`UIDH[xļe@)&/RYYJ76SuubP@0&$"MX1**2/20012235:>AFJLOOWVXYVSX`cmzoifgkvuX<* + "7J`s~nPT{rnru|xmidb]ZXUTRSSTSRRSQPPOKGDBB=9634646@Rfpu{}{|}x|wsponlieb^[YXUROKFB=5.(!!"'+7>FJOV_grw~yj_YNB940,'&%*5>Ohtjd_\XKGA=CSl}ûɿöӿŷȽȬnXJKPIB=9=:2/2/) #'*++)'""#$%%$&')*,-.10/-+)''\w˸|~vnmr}~mc]^gq~ź›sM/$-2/***1889840-++0+('$*;X}ѼĶǻxuswĹƶļ{smjjlor}ĸsf_aab_]`hmdXLCDVv»dD0*25;;>Id}ztzwm\J<71( #^őX9.135433679:BDJMQQQPWWYXURX`iwvjbdhozgI1"  &7I_m}xq{}~mqngoqx~slga_][YTSSSUTSRUSQPOLGB<951/.0137AQcotx{yzz{{~Ϲls}xsolkjjifb^[XWSROLHD>;1)"$-4BGNRX`lprv~o^VOF83/+(''*09CYu~yyyyz}pe_ZXVNG@=DShu½ûҷǧoZLKPLD?>BB=:95/ !$)-00-)$ #$$$#$%'),/0233333332e~Ǵ~mg_YROUbloniefny¶ÔeB+"!!+24123:3.+11477/)'")8Swɿ~¿~{yuwïzrmklnqw|Ⱦqidbc`^`beaXOJL^}ÿoO<(%,?Vk{~ƵtutbSOG=3,# !% 9qnjX6(188779;?AIKNQTTSTVVYWUT[fu}rf_ckt}xZ='  +7GZfv{}ymnnjek~̸haknty}ukedb_\VTUUVUUTVTSRPMHC951-,,/229AO_muz{yyyvtux͚rr|{yvtokhffgeda][WUTPOLHD@:7-$*5=IMRV]fpstvubRKHA5-('%&*.4=Kd{|~vj^XVVTRH??K[jqvĿåúɦgWGGMNJGEIJD>92+! "%+031-)$  ""#$$$##"#%(+-/011245678jĸrfWPG@BNZcfsuĸ̻i?( &$)37:;?BGHFCGJIEEFGFD=7347:=;6/+&%(9So~}Ľ~~¾žuyɴ}tolkmpsw{¹~rgedcba^]]YVYap̿jN:49Ol|{շ{wqge\RG=4*#!"%) / +'W罂L(2;;<>ACFHOPRTVVVVWWXXVWboyoe^dlwmN1 /:FT_nyplhle\^rǿ¸̶f_hkpu{|pifec_YVXXXWVUVTSRPLIC92/-,.143:BJYjt{~|||yslejqw}ռqnz~zvsmomkgecbb`^\XUSPNJIGB?950'$!!(3?FLNQV]fnprt{wlYJEC?4*%%&',3=FLLLRTQLD:1+%#$(,131-)'%$##$&%%$%#$##$%'(*++/02469;;l|ƹumbWQWcpxǽмrJ1)%)-27>ADHMPPQQS]b^UOPPMKF@=qn36>@CFJLOPQRSTUVYYXYZZX\k{|xpgbenz|_@&  1?GPYgxr`^eg\Xiľhbefkqw~skhgf`\XZYXWTTTRQPPMIB60,)),/43:@FTfsz{~}~|wnfWY\^dlu{{vz}{wtnmjhfda_\XVSOLIGEDB?<82.*""$)23*%$'+1:CTb}xtlaUPOTVXMCAIT[^m}~ûɳƯ̿ԱzL<644;BEFSTQNE<2-)''(,03/,))))(('''%$%"$"$"""####)*,/2579jyƷwlmxŸֵiP6-00/.:@EGJMRS[]cky}r\[YTOJECEE@7/,//1247=ES_bkpny¶|ɹ~{xvtu`nǽ¾~uokklmprw|xrzķmfbdfe_XSXf{ún`djquuy~ῗ~}~z}xkaYNB;702.('+*$(O~ӎB?BDIMQTUVTSUTWXZ[ZZ\\Z_s~ytmhcdnx~~}qT5  0BHNTbr~}iRSbaWWuĴldbdhotywmjjhb^[[YYWTSRPONOLHA0*(%&(,24:>BOcryz}}~}wlbNNLMQXaisvyyx|su|yywsqtqllkjgd_[XROMHFC@>>;:60,'$!&.8@IMQRUZ_fmq{vgSB:;6-)%&(-6AJ`pwqi_SNMSWWOFACIQVl}pc[Zfvrechjs˴»˞]),-.14:;=IJIGB90,,*))-./-+)+,,,+*('&$$"#"%"! $%(+.145Zq·»|{wI<13KWacjc]f{ͺ}ºп{~wnmkgViѺ¼{snkmnplotwy|son|Ǵnb^ekkfa\et¼Ŀ~oppvogms~ͪvole\TKE@81-*&()#*QtښeMTIKTTWZUQOPQUWXXWXZ\dq{unhdbdlswxxz|fE* !2>LOQ`involpjTJOPLO^˶Ǹp``agmtytnjidc^^]YVQPOLIFDB?8,%# !#',08;@J\lxzzwxytg\MG@>?GOT[_dgilrvzzzqa[o{yjf|pihntrligghgcZRLFCBA?=;9555/)$",6@HPUYZ\ahnsxrbN>532/,-049@LZoĿ¾yqmcXQPSTSUJA@AEKRky~l[JBAGR\oj\TIDDNfĿú¹ȾH&6BB;60+16:;<;4,(**('(-+*)*,..,+&'(''%))&$"  "&+0467Rduilqw|jWC915;>??&  0@MOQZ]`glkh[HGKKEJcƺój^`cfkquz|{rljeb]]\ZWTPMJEDA><6*$! &)069BDILQSVX]`caa[SYtnkdmȵukhgeagd_^[WUPFA>;:654220+% ".;FOV[`chmrw~~n[E2*)(',069>FTczǿÿ~sjd\TOPSVUUJACIQW\flsph^]^OGELV\bfhso`]fnnkiv;|üغF1H\\O@3,*.5;?93+%%%$$(-.+(()+,,+()*)''()'$"! !!#%(+/245BPmÿûrb[TQX[TKGA9888:;@@CEHJLIDBG[|ydb]rĿurlcb^ZXYZXRFA=9743220.(")5BKSX\bhorsxvfP5$/9?BDL^nſ}tibXSNMQVZYVKBDKSZ_dfcQ;038@BPhy{unb`gtzvifbfvskwý͹wx|ưŻ۾R&JPMKBH^s}oQLXXRMWqtu}{iQM^`cgmrwz~vvsojkic\SMKGC@>;95/-*)*+.3;===F[mysuuuuof`[VLC?<;:7789:;<=>:56Fdnbb_xе|jg`\[\YNIC>;975420.(#(2FHKTfyyqh_WNJHMTZ[\WOFDBDMSdgcM1&GXivuvtrrleab]WPLHGC;98888875418QswhccfĴxe[ZYOKDB@=;:841.+$! !/7CLQSUT]ckllnv{lZD/%$.6>EIO\p{vvutsvwyz|||zzunf_XSMHGHMW]^]XSME:7AK^`ZF*#07Nl}l_E76FX[XSNal^L@3&0XǺͿʞxm`y³Ⱥ٧a)412>X{Ȼ~V@<*#&'*)'$%(,.120010.,,,-----,+**+,-$%8eľ~p]XYajnoomjkopklmw׵׾ɳqlkiprx~yto_`u˾~xx{|xroieedb`lg`l˴xrmidb_Z]]ehiimnvx|{sx}wwpsϻ̻pjZSSUOD?JNI>+"%'4GQJ<1++7UovhW;BD3!:eƽɿٵqa^v~uxǻq:#'8[ɪiW0!&,2*'$ %*,0232320..//.-,*)(''(*+)"1^Ǿyl`Z[dmoqstpqw}|}~ܸ³᱉}{x~xe`s~wv|yof`[TSac_kþxиuqmiebaYTU`eghjlsruz~˹¸ztriqþʳưp_TNJEHORc{x]L>>B@BEGLPQOLWcyyrfYK>51*,/39BLRZdnstuy{taH2 + %8FR\[K8O}p_LOQU_jrxyxhbdidZ^g]aedfq}ohgimtx}tgflomh`XTOJFC@<=@BDCBDFIHJJGN\ku~|vpligfigda_[XSLFD@@>:737;In|mbYXrִkejdVSQNKE?9641.,*--4;HS[`ehpsuuwy}|mcUKC80;G>9, '@PvqfaYVtǜ~utpecb`[SLD@=:75669@GQ[aejmrssrttuy}uj^SJ;0=K@8;E[u|wqi`\\ZVTQONNJIKKKLNMQRV^ceb[RD7110132*!$##% 1OwZ?(#((!Goլ}getƨƚ`80<\ϱkF"!(/,(!#',1468753331/-*&%$$%'*,'$7_ɿ~ysfcdfnw}~~ծϿ׻tn~vvx{|~|jZQJNT~õxnfӶxtojec_XSLQ[befihjns˿uqskixŝvhemzv[MMW`cjmh]W[_iu}rfWI9) #&+17@HP\hpsx}xhTC. *:L]jnfYkobWNMPT]fjgc\]]\UNPVmyxnfglrrvx{~vnmmlic]WRPQNMLR\_`bba_\YX[env}yrlhhhhhec`_\VVVUPJE?:?I\|i]_bp۷}vojf_\YVRNIHSYagjknoruxvslhhsx~zoaSG8./68:BPf~{uoih^\XTPMKKHGGGFKQUWX[clool_O<113/*("$&&8Y̸jF'%+,()PyvrľǷrH/8Za;#(026/#!+279;;8:>=:531++**+,01'(=f½wy~zsnkkpyϧι̹zwrwtrvwy|x^QOOrwh^_|ٺ{vpjgb^XNGIQXY^cgkpr}žzttowƲ~nbbksx~{ngimuzmaQC2! #)09@LVemrv|ym[H:) ->Ga|lacen˩~zvqlfbbjmqroollqtxwrlefpu{~ufVI8,+07:4-% "$0Ej¤pM/).-/1Vƾ|}ŽȺgI2(HlôpI/'1373) &.49?AB?>;:54210///(Drþ{upltzutrqvƚϷùrxsĿzqlqsuw{üt`RHdvhYQWv¼ྚ}xrkga^WLDDFHIQZ]bhhqyvyvrv{uj]M?.#*18HS_jsy}wnaQA4% 0AWl{}vrf[QOLKOTWWTSONMIFKTzkdejmotw|}umheefffeeddddgkosvusmgfbgxyroeecb`][YWVUSOKD?C@Khynfhgkའ}{{{{ysomksuzzvqlluy{~{n]O=.*+4>L\o~xsoeb^YTQOMMMOPORUY\`goz}o_TOI>6)$ """"'8SyѿxX;/-+/4Yɽxuƽv`I3%%,ZźU6" ()01) $*19=<>?@@AACB><96420%Mxnifgtysx}{y{wtyʽyӿʽzhxwtº~pfmmoqw{mVB\|obSIPn½޺ztlhb]UQGDA<=FQVY]_gw~{{~yʺrf_[gx¼yrk\M?. $+17FO\hszxnbUH:0#  +2EZptg]UQLHHLMNKIFDEGHPZvg__djnsx}{qhcdiloqsqqrpptwxxyvplignwsklieb^[YQPNLIGB@G?KovnlkhmȦ}zxw||~zwsw|vhVD2)(4BSbt{vrkhd_ZVTRQRTVUWZ\adku~znd`ZPG93.*($"!#$!!",3EaƶiM<1+,1YǸ̺~iJ=,&4e®`='#)' %-26677:>BEHGECB?<:#V|yzxrhaaetshgpz}~~~||~̸|iƯ|ɼs_sytȿodhklmpuy~|^F[~qbODHa~|tܺ}vnic]WMDB?97@IUUW^kz~zvvw|¿̹xng[SQVg}û}vnhZK<-!%+26EMZgqy~yocWJ?5.!  4H[r~qf\WSMGEEGHF?<>DJNYcsf]_djnty~xlfhmsz~{||yxxxvtmkx{xurnid^ZXTSQONMKHKCPstmkihky̫|{s_K:+%6FWhz{uqqnid`][YVWYZ[[^`fjouz}upold^RKC90(""&+*+.:CYtǹydQ?403[´{zųlE, ,9nϺqL3'%##'! + + $))**+19:8DOXlŮzhWJDBgùԾrrt~Ǭf:$3>uȱmVE<3 !  $)58?EJLMM>u~~~}ysiZNS^s}ldjv}yx}|xuvԼv\ɿzwizɼyjdgffijnrzv~rfZclrslr¹zZ_ή~yrkeaXF>>@>:669:?K`t}}üǨm]SPRZgw´wldWI:-!$*/59EIQ[ejmi^TI>83/,! 4I[ourxmcZXTNHDFFFC<>GUbiqxtz{z{qiaaeejrw{}tqt|~z~}ztniedbcbaceifjemym`\\`djֺu_K6)5DWl{wuronifdcb__^^^agkqrwvutxz|xxz}tgZQKGGKRW]eoxη{ne`^{Ơ}yxyuoqӳ\6 #7Du˵xiY=%  + %.8AEIJ&N~~ufTFM[o}pio|~wu{vstֿx\·~~v{m_dbcdgiow}~~{rpzospf]T`}jtղ|vpjdaYKCBEB81,*.8CXq¼¿xŽľѶiZbbjpx³~th_PD5)"'-28;BFMV\ac_TH?61.,+  + 3GWkol|yma[YTOHFFGGDBCN^kry~dgedqvng_`bcgoty|yvxñ{tpmmpqqqtxz{wu{~|m]VV[^^|žھú~fR:-4CWn~|yvpnmifddda`_^^bhltvyywvy|~{x}{piecaelryսywuçyzȽ}{yz{wuqkgck|Ŝg9 0Enƶ~bD1-* "-9?CDDenYJDKWl}zuw~}xx¯yvxؽp̻żxg`[bfabkqxľm]WYdtq]Vatٸztnic_VGDHF?6.(%.8DNeǿÿxu}Ĭnooqswzpe\H;,# '/8<@CGLRSSRMA<862.(## + $8ES[fiqwi^XVTLDBDHIGEPW[gwzs\VRWguz}rrnhc___]`glrv{}~}{}˺}{z{~~pXX]VPmóĺ||k[@/7AUv~}yyyonkhfdba`bccceilwy||z{z}§ƽpeoǽ~zwvuvzxogfd`aafyƮxB + +';d|}eL<1#$+057TqrbSD=I\p~wx|{w{Óøʿ~~c\X_d`biquǿr_VV\~ʹplpupjiwۯxphc`_XKEC=4-*)6AYoɽrpyٺyuuxwz~wl`UF9,#&07<>DFHIJHGA510/0/*(" &6AMW`clwh^WTSLDBGKLKRYZW]jnjPNPXekifljfb`^]\Y_fkosww{}{yп|gaYMGdſĴvwraH84>Sy}yyypnlhgdcbbdeefhlpwz~y~ȲǾylsü{yxzz}{xtoic_ac_`_fyĜa) + 2Sk̹kZH8-   +  "$&)g||hXM?5F`u}{ur|ôȞ{}~|zk`W[`bciru~ŸxbWWrťƽundWUbt~}tٰ¿zrkd`]XPC=:5139?^ný~ruɭ{{~~ƿ~yreWN?3'(09=@DDDC@=<8.+,-.-*'!  )5=HOWWfyjaXTSMGEJOQPY\YQQ\ceUTRV]`][b^[Z[\ZXU[bilnpruy}yĶ{p[IF\ö|pp}wfL<0:S~}zxwqomjfdbbdfhijmswz}zɺҽty~{z}~|rkgd`\YZ^bacag{̺L %6G_z~ɵubQA4/15COYeu̶¿ys}Ժĺ~|zvn`QE6)")29>@DB@=<;:63/..,*%!  !+4;EKONc|oe[WTPLKOQTTUYXQPXdhi`WOOUZ\[VRTY[YUSW]`bejnrv{ĺ|v|~fOOUx»Ĺzkhq{xdI7,<\}{zxsqoligedfhjkmpwz~ȿƶw}}~~{z~}{srohcaa`]]_`cfkll|ĥh4  $?Rhruvtt|Ϳ}i^WVVUWVP@4*%#$-32.'"|ZEFE=F\rrgséȪžu\NPZisotyĵtefhjjco³ɿ|smkjjc[OO]yưǿ¿sq½èȿ|zvqgYJ?." %-4:?@?><;:;<9610-(%"  (28HGIMhukc\XWSRSUVXW\_^]ahmul_ROR[`XSPSY\YSRSWYY]ennsx|wceynWURsǿnfiqwbF5*Bh~}||{srqnljihijlnquz~x~xy|{~{y{~~|plifdccdghgcejrts}޼I&  + 1=N]iplhnwulif`_ZME?5+##'.4750,{nSADHEM\q}ynwƬ̷ľžĿ}eRLUcnosx}ʼո̷~ķɾĭ¸}ot¸ſʰý{yskaSD8, #)06;??=;:989:60*&$#""!'04HDIYy{rib^]]Z[[^_bgkllihgpolfa_bbYUTVYXVSSVYWUX_hkotx|}ui[b{r\V[vznmqx~taH:-Dl}~~wuurpnmmmnpqtw|}{˾{|xt~~~|{z}wpmlkhfhproggnvwwߺ.  (%.4+ !'+17Jivmfddecdfijnortri^Z]fmqoifcZYYYWVTRW[`^YWZ`fjosw|~}xutpomlllnqsuvuurmg_h{eXbxy{||{vl]LA4Dc¼}~yxxusqporstuwz{ru|{uqirDz¨|||zyzzmpzvwwrpqvywnkqxvwܼ7+3FMQXXD5% '1;GV]`gkoqvƽm_VTRKEDB?71+ *7@Eq`[VQKKVduĬʽijþ¾~wx~m_Z\`osy}}|̸ʶ¸¾sfƿȾӿ~}{zwuvqi_TG;0( !'+06:=><:72-(% #  )488?7LvzpihijlklquussurhYQJVckje`]]\\YVSOOX`fe]WVYafkpty~}zytyvtrppoojigec_^afkmooppodlĩq^_p|ung]RMCI[x¹|}|zxutsruvwxz|yzytqrnxյи{xvtsrwqem{}|~x}tosyuuؿwo~hE'!+-1;GOY\\]ahrxо{i[WQUKGGIE>6.+&&*.11mXSKCCKW]sоľȼþ»~{~yk^Y[grxvw|}{ɵùɿ½ȾʴĿÿynw̾~zy~~}zz{ursvpmfXH:3/   '+,3:=:961)! + + +#(  +':8A9197P|vrrqqqrsvxv{zsqqaNGIT`eb_^X[_]UOKJV\ehbVTWZ_dilqzwsux|zutsssrusnjd^Z\fprruz{sj{Ȼsa_qżyqiiid^YON[p}{z~~}}xsvz}ϻ׿zroop|zmr~|ttz}wvĦoK/<720+'-9CKOSW^ehw{ƸzjcYSQTRPLLL?<82+'$"|teN?0),8L[r˹ļŶ˻»|}qcZ[grwvvz{w¿ijþžƾ¯ʼȷüľs|þ¿ɷ}wuz~}{y~yrpqqlf^O@4-)  &+-28=92.'  "" BYPK<69Ce~xtutuuvwy{{{{}q`RLLXbecaZ[^\WPHCMRXZTMMSU\cgkov{{~~~ytlfaer}{qɶwbftùwlcbghfbVS^lx~~~}|¾~wttt|}ru}xvzztu~ƻпxS35BLRXaehkpt}|tnko|rĶ~z||~~|l^^ehhd]]eknkmpx|żů}|{zvvxx|~~{~~zyս}gP;2%/9BJOSUX[^bjvv`ZWWWWVRVPIA80'$~rpqhY7"'.2D[rЯǹż¶þveadknruwwu}íùǿɶſýԿIJ{tw~}~}{uojhfaXL=/% %((+//,# +  " + 'esW75}}ywyt||`4*7MfyƮɽȺ¸xpifejquxzwzɴ}ɾǿýüҾѾzvx}}z}}~||yspjfa[RI?3*!  + + $'(('"   +(69*)Rzxuwyz}vdWOXfoj^YV\XSUVQE;-)*++*.5@IU[\\`cinw~rȨm[Yhy~wodZ[p}xfUQRVX\cpzϿ~}}unlqy~|{G#,L\hk{~޵ɿ»}vuyudZaklnpnpt|̼uƺ¼ǻɹȺڶۼĴzwz{zsnhdb^UJ81.+'! +    + "#%&(+++% + -Vywx|~|w~wlc_`bXZ\XNFA@@??8'(%9=:EMLNQJEX[Vfaihmu{yspgddmzÿ~_Xp{~ϱkgtloyzz{fUNP[_X[a]agmuûvaP?999:<=4147DeĿǼ̸qkmnlkkv~{{ħy3 #9KSSNMYc`^cjkorxyobXNFDGLO~slqucKD?DP^inwz˾¼}usx~ui`cgcdjlov~θúȻɿƸѿξս˺½xvwxqjb_^YSJ81,'#  +&(  $'+,--+%  +?n|{||~}x{xtld__`bXNLPOE9F=83+!!$5A=@WUa_dak}zxlhmx~ľ}f]chlnoliewv{xvx|z}û{kWNQ[^XW^Y[][\cnvn^D7,+/124.*+16Ddø³sieefinw}y}^6 .>EJMEPXUSVZ\_cjpw}yh_TLHGJLzsw}{o^RKHIOW`jqsv|~ttw}wpkjd]_hkpy}ïòǿ˻ؽôп̸пxsstnh`\ZVQG6,($! /1%  "'/0/-+%  V~xrrpkf`]^dYMILNH?B=;81%#9BUv{ž{bV]u~nd[WUSSRPMWlywww|yy~ƬyoYPRX[UVYRPKE>>FMWZcoy{cQ:1,/5778217@HUpƽ¼uf^Z]fotw|zvtn]#!-3=>63231-.156=FOU`j|o^OGCGKKKKLNV^dmºŽubZW[cjlnw}~~}{qnnqy; #,517?@@?ACIJMPSY^cjortwxxvqjc\VQNN}{}wi_]bgid^XSRUY\]^cikqv|Ȼ{{|raWZfgqzwpoory}ʹº}Ѹxlڱ}ʼܸķ~rmlkgc_XPF9*!*41  +"&&&(/-.+)#  3rzlnomf^WUT`g\I@KVSM?+!4C_|ۡwZfzu_Pe~ɽᵁmytc^SMKMMMKNQ[bkt~}{wlgaPBDDEFJMPT\`cfjmnorojfc`_\|m`ipuvrh`YSTXYYZ_dgmrw}ƽ~~~weYX]eoz~tpmhijmtz}~~|y{vsv͹xxzsħwno”tktɼҼǸ|~ymfheb^VKC7("$*.'  !'**)))*+**# FxlmnjcZTSX^_XPKLOXI:8LkxxˍQFRRIC=Sepζɸýk{~qbXROOOPQPONNWct~ͫvqwrf[N=)',!! "16E\tz|}|{necciihku}pfn|´T* %.36;B>?@AAACFLQSY_dhjnnnmnonnx{oc\QORRVX^bdilqy~û}~ui_]aks|tle`_``bglsvxwyvqqxyvlltҼ{kizxrmzôqiqr{yqrءpZ\gtǽо񽙔˻~}maeb]WOHD<*" &(&"%(! +#%$&%$&*+,&*]vjklg`XTSXZXSOLLLQPWkxn^Rskbײ|YRYWS5/)#)KɥýyorfZTSRQRVXSQOVcuоnhlmbS:, $+$(&&%"!&&+9JYhu~x{zpjhjjqtvy||zojyt@  "*.5=;<=>=<;9.:bh~cPEm~feߦN*A}ŹuR84NЗkŹumwwutlfbbcZYY_ixƫof_RUV?73(!,:/#-,.53:8673//42) $(>Vs}{|rjdkv~~{~}{¿w. + '-289<877:;;>BHMPTW[agmqsyndZRNUWZ[^_[W[]^`gnv{Ǵ}z~|fZRNPUUSQOONIDDHNLLPUXY[[___^abdcblʵ{xqZRH@BUx{et~hejrƗmB5AUlĻº̼έp^XVVTRQSL?3,&"#085' *.242+%  +  + !Qud]\YOOSPOI=>B3CEHJMQX]eik{pg`ZU\_`_`a]XX\]_fnv{Ŀʼ}z~~~{vcZMJJHCB@@A?>?DHKJNPRQSSVVWVVW[^cx¯|sou|gRFFE?:Da~ú{y}ǝeG01>Kjƽȳ俧±vc[VUUVX\[QE9/(!&/.!  + ''(('$"! + +ewbZXVMNSOLB69DIb—[R`hry|X"#1103-#&;VrдpOIױƾ|Ϸzsoic][[_fpzѳn`YTNYkltwöec^TLPZ]XPEBLRNNTND6,(#"3Mmxvx|}z{|ytrtutv~|vrld`aizqq¿V' +  $'*-03467:<>@CGKOV[bfhyphdacdc_``[VWYZ\cjtyyþ}|}}vtuvsy~}m`OIFB<9689:;>BFIIKJKKKJMLNOMMU^nĻvnnwrYE?DJHB?OaͼoB-%337><=B>\{ֵʟĺʬ{vʹ{vsqme]Z^ckt|ɦc]\citô{oRNXagna`ktrtxpcUH=3%.Jh{vprt{yqle_^chnw}{zwsmgb[XW`ozj5 + + "(,.035:<>?GINSZ_dfxpjigiie`__ZVUVVY_hsy~x¾~öylilnnrwy|}|ymaQKID=:4467:=ADGFGFFFDDFDFHEHUd~umhnyzk[F4'/=GKIQZyI( 3>Hqȿ½|{}ÿñ¥ŸtbUKMWbq||sdR=-!  +$# &,*!#&& 7v^SQPFDC:1B<.SuBKnp̼Y7/7Yjnfkxtjg\UWPA53-6CUm룇׶ȵ~wtrroha^`hnw~v`ai|N=?Mbvu}{l_N;-"*BY~vsqqsz{rjdfjs{zwusmhaYQMMTe{|uA   !&(+/48<=?BGLRW[]tmkmmnkga__ZWQSSU]erxz¶|z~ƿ̾{kfhlinqsvuttj_RPPLD?76668:>?EEBBAA>>?=@AAEZrƻ~|togcfqzzwkZK>- .AMTanv|ӽ\2/@Sɾ~xv|¿̶ĺhXMOYdtoZF9,%!! +#-/--,+.1353&!"$&(,/3,# >s[PLI?><1,5YɨuD;L[dhu}uoocM8)7Soʾ˴~zusqqokg`cjoyưnahuͷw<)#-KnĻoYJ1#'6f}yxxwvyzvsrng^WNFEHZq}O  + + #(/259;?DJNRTslkmmnkf^[[WTOPOSZcpw~}ǻŹywx¼rkjkjjmrusoph`VX\XMG>:7668<<>>=<;;::;7;>@GbĶ}wpmgc\RNQUQNC4+&)7EYwȸc<&.Ee}wt~ѻú}|n\RV_fqwh]F9.*  !*6@EEGDEFFGE@2147:;=;B;3+% +GoYJC?688/-$FZPpɭcEHbzt\E- -0XȧҺ|yvtpnklkegjoyƿ{ggq|xpmmqȟN 7^ȹpaC,"Clzy}}zvusrmd[TKBDKc}])  + +  $)-048?DGIqigiikgaYVVSPMNMOWbmu}~žɻ~xuƿzqmmkilrutooiaY]d_SJB=85579;;:9666567573,+&#!+:YлzE(#"1Ku|vsžľú|{sbX^ffmz{cQE>1!44' .Cfȴz|Λc=,'#/Eh}}tmv~ghtĿ¿ĹĻ{}vmloqy}qjisžuqdO>80&=fgO:,,0/140,gҤھcX_rǼ`>#.gŪ{~~zxruywurqqmkmow~aHNZl`FGO\b`pZ4 '(%,a¬zeZB%)[|{}zz{xrpuzrdYQNOLEKYsxkYB6\}x{xtqwzy{¿¾Ƨzrpszķ|dPG>2%*Qu]F826<=<:FIoֽ^BLp˹sW9.%Ny߬y{|z{yxvqprtx}T-#9Q[jrhQ0 (8EOPONG<,)'.3/#:tĠT1! +8^~~|~{usnhlwy{|vk[LHP\c\QRYszͿJ0+!*;H\nù?    wja[XUPIB:4115=EQYaejnt{~zzÛxkmyϽp_YWTQT]kt}u_POhwsolheiqttpi\OA9hžjY83YҿfF!6œ{yrq|Ӭ~}}~|ztttvze= 1@JOLC8$ *,.)$.;>6&.]Ҿ|[9 )".Jxwyyvqoruogbb\W[j~zzxubPCL[lpcSPTu|}uiixƐI/501-&%'*,//7CP\mB +  +wjaZVPIC=3/.15CJU]_afks{~{{ƿЫki|˹{~{vru{n]Zpqokkkipwxurh[K>44:HED<' + %.Ek´v_J93.($)1?P[mz}s\\_dgilsѠf:')3AUyž{trlu»{{}}|{xxwxwwwwvw}ѩ{twz{ǺlWNE8.5^xUC?>CJLE.!9g¶rR7 , "++7f{wtslllifddc_WTUOFO_}}xrwz}}~}mXJEVfwtaPKQtuqsqzm]NJRal۱`=A:82*)++&!$$%',7FPǿF   xkaZSNGA:2./5;FOY[[\`ejtxww}¼ɦŶtr{nlnppqv{yslaTG=537A==9&   %6U|ȼs^LLIC5,*)')/9CPdywsxxtn^[\`a`citʜc7#&5Jeɾ{sol~»{ukifc`[UPKKJIIGFEGFFHHJKPYgkpy{ө~x{|{ÿn[RH;08buSDCDIOOG<;73210.+(&&""$&)+-4>GFM^_co֯x{{xr`VK?1:epPFFIOUUI=Lj.4WļƽoLFf㵒}xxxz}vP1'+)!)0*+49CNMJHC<2 *AHI?-',/,$"'* %5*'Ot}xpmloromkkmrsplaWVYRHPdy}vtsnfbft~xl[MOZiv{kQBGRxpYLC8:-#SHHCFC@<:7662.*&&%# )5CYrýúJ  +  tiaYSMHA9437:AQRONLKLOZ\`hknzǹ}{yeXI>97;AIFIH4 ;GVl޾|wvyƽ{f[N@8;`gFKORVZXK=LeK^ξhH\ð}}}zyymP:.5;3,+/53/27BFE@AGIEJJLNOMIF<6+ '"#/:@4<<, '024Khriljijnt|{xuvz}ymfdc[SYdw}|siekz}paRKTbmmk^L>CR~jN8/$!'U݅POJHKMKJJIE>82,)&%$ "*McǾýQ+& $" + ui_XQKJC<88:>EPPMHECEGPRW_cep~µ÷|w^N=68:AGLIIE/ ,Ggͻymlhmmmjjhmr~üp`]bia^[XUY_mr|̸jE47AWuȾxtx½ut}xh[JC9+    + !&)+)&,8HYuǵ~~zus|~~|{żneYK>=_{eHLSXZ[YM?J}\Sl{YW}ȴԨ}~~zyziP=5:=4-/59947ETmL2' !$$7ksZff][YWWXVRLF@83-*($#*9PeuȸO.-&"  !  + + + +vi_WPJJD>:;<@GLKE>::<@HLQX[^gr¼ɶǾgUA87;BHQNKC, (./.5A[yů~{srpw|Ƚ~xj`[YVVYejrw|®[:-5Cbĸuu~ykl{rcSG<6/'!!!  !# (.<^̺|{}~{rnv{~{{}~}{|xqhYFB`zbKMW\\YULBLeObŽiWb᭝|{}eOC?CE835:?>88>JID;;?CDAEJMONLIILJD8-%" ,74.*('%! &.@cǿN1.' !!"!  vh\UPJGA=99;>CEC<535:@INSWY]cjry~{w~ô˿q\NFBFMTQQG2'1DC<=ABB@=@EHKLNQQOIFD;752.&    &3EMSYZ^acfjlkliktŹ}txĹr_RQXVXVO?/).3?JRY_fmο~Ĵs\RSQOMQT[alwmA&$6N~ŷ}~}}ztn|Ѱ}mvrb\N@4+&$! $%$#+05:7/,*!$%%2.+,034/0.,%%'+Fjʴzx{|}~tkknsy{xx{~{z|~ɿtZPi~~{]GS]_ZQLHBMkjN^ºnW\ߧâ~|yxXDA>CGA7:AHF@AF<<>BEFILQSUPJEA?;AB??DFC=:4,# +$3Op}zzzwmmolhcdd^YYZVQYf|~}xplka\TOOWoq]PIKQ^c4$'!&234007GTZ_dck~kWQRRTVYWUQKC;641/-,,,+!%2HZnyJ.' !!"!!  + rdXQLGD@;9644712.,1:ENU[`_acb_^YURSZiwȼxigj]Y^__ZMB;;AMW]eow|̾zsx|}ɿu[NMLJIQTY^hr~d86R~z{z{{}}zwrjh{ݴ~pz~kXLF<5-% ,:IT[]VJ<:;=@??=<72.*'$+8<3) #7Vҽ}y{z{{xkejmrusuy}}}þiZo~}~t[JU[\TMHDBFV]]t}^QdǏԶ¾vqr|qR><7;BA;=BHFAAG=;=BDCCEKLMKDABCJMJA?FHD?<83,$  + +Pz~{ywwkaYSKFP_w~toli]UOMP_vjVJJWkþk7(-)!*-20,+17E[p~oWKFBDJRQRRPLFD?;74412.* #+4HhîwE+ !####!  scUMFAA=950,*,*+)+3=JR\bfdef`\SLBAIYopot̾sghgfb[TLHP[cgoz|ohffcZ^my}¾~bRNLKKPRX\dnx~W,<]}yyvxvyx{tsmhi㿇v}}p^QKF@4*  -D`suWLGGHKLIF<>=3&+,.45/&!!*DgƲ~yxxx{}m[deikkow|~~}{~¾{gu~|{z{jZTUYWPHFC>FHTgeQZuétfdlzkN><42:>>?CGE?AEB>?BB?@CEFGECCFLQTODAFE=@=963.($ + +'Lywj`YOKUgy}tqni[PIM\mtfbnút>';GD;9=@DJLIKPTbrw]L>46>HHLOPPNMJEA??<95/'""$  -;^zĮx?!!"# + + ÿuaRHB==950,&!"'(')2>JSbhkhggaZPH?@Mdƹn`nɳqnkec^WRZelotǿɳ|kXE<636JjûlZSOOPMPV[cmx|y|tJ#!Djѿ~zxvuuuvtqpnjrÿΒ}uxupcQB>AF>0.]ɻxKB;9:>@@=9BH='  +JB7.,:`λzvuuy{~pS_`cdejsy}{ywx}οqy~}|zzyyzzzz{}xcZ^UXTMGE@3/6;BBDEB=1*! +"LVXRZuñyvux{}~u^^XYZYYfv~~{uty|~¾~x~||}|zyzzyzz|~qZU`TYYRKHB>EFQgŸmVQ[pܾýp`TScwz_G;:42:;?ADCB?==@@BCEFHGABEHHHHHHIHD?<;;;;:9630.%'++*(*# /Hszwplp||zzuph]NHUqɿW1'.?Yp{~y]E6017:@FKPSUTPKKMJG>431/*'#! %6FTj|wM*   + p_O?88520,%''-9BFJPZ[\_[RPSbq̬ulmqzſvjb_`jsxzÿʾ~yrh]RJFD<:F^uſnb\WUVX[_bfjorrx`3#Lȴ~zuqommnomjilr˔||hV8-2;GW^S=0 AޱX=872+$0=<0&(/==>@A:) +Ti{˺xvvy{|||bWQRURR_n|{ysqtwy|{}{{}}zyyxxwxy|}qYWaY^^XQMGAFHQeøpWMRhķմƼ|j[NQ_uw`E9945::=>BA>;99;;>@BDEECBFFGHGFFFFA=89:;;;:8542+-//0,.(1Jvſ}{{zwvsmgYQP\tķd=/6Id}kQ<31/39AIMQRTNIIKKF=310/*($# #,JqJ$""  +  m\L=650//*%"!  )9GNPSRRT^hozήrlr|žĴofgksz~ķ{usmjhjidVJI[p|ld`][[^`dfgjmpuz~W-)Vðzsw{}tpmjijklieem}ŚsbZJDB?NZ`ihYLC:3, "FuQ5/-&-9>KXS=-).8+&4D?( %!.Hexwxz{zy|kOIHLIGUg}|~|}wxupoqsuvz}~zy{||{yuvvuvwz{~~~{o[Ycbhgb\VNFHIQeľtYHG_ϱtdVMN_ss^B676697:;?=;865558:>ADDECFFFEDBBBB=9667:<<<<:864676523."6MwȻzyxurmhcUU[izĸtN;;Mi|`F6.(*2>;83569;<==<:9:;<:7571(':Px¶}zyxsoie`RZhvµ[A:GdpU=0#%-9HQTQQJA<>?<6.,,,,)((%$"!*Q~{\HB:)    hSC6.-+.1/164/67;=<;EOixŤƼ}zvî̴īĹ¹Ϻ|x{~Ƿ~tolms}vu{{rifc]YY\`ejmptwx|pJ#:jɵsjcb``bgklpqprsttsojjgijmmkegxײ|a[o}]HA=:3%#/9:$2+#Bbsnjki\B)$"":cʺ}wwyzyvsvz|MCBGB=Mgnjmnppqohefffgmxƹzyy|}~|yttsrssuvyy{|~wuxunfflu{|xtocRGCNaz¾ƶ}nc^ZTPMMPRblx{[GCV͹ž}qjaXQTbvpZ=14227257784200/0159>BCDBDBB><9:;<863588:=>>=>=??@>:885,!)Wd|WB4&   }cN@5/.2797:A>6568:7=M^οŻts}ʨpgw̾yyȵĿȽzlfbciw|}¾woigc\XXZ_ejnqtwuy}hE !Atnf\\XVWZ_bjjllmnopligghjmolhj|ϲjfcA2$ #'.8(2WukaYbpkM/  #&Rɸ|vvwxxtruy~QEBF@;Mjh`dgjiljb_^]]`gq˾~{yy}~|zvutsttvwxxyz{{~{vuwvsqsw|nYC?K]vȴ{vuwx{ųfTK?ADHOTY[bglpxbNEOv̹IJwnhaYTVbupV>44/-3033653.--//138??>?>@@A>;9972'-@Rxǻº|z~~}uofa`]oһjG38MmtZD--5BU^]VQC7.,-,&!!#%'('''('%#''!);Z}xaH/  +  w]J?7338=>:=C@4+*1?K^xų¹uf\a{ɲ_\|ypqzp\w|~ztld`ftƹľ³~ria[Y`qtnigc]YZ]bgkklnqqtxz_>(I~˻|lc[YURRVZ\fghiihklheddfilnmjk}Ⱦɱ}pw|x_F5%# " -G^ma\V`qqX> +  !(%Gr̻zvuuwvsqtx~SE@D<7LmcV]aecfd\XVUSX`l|è|{z{}{zxvuvvxxxxyz{{{ywwxzz~xaA;GYpq`RKIITX`j{iXRQW`n}tihumUBFjʸÿtlhb[VWcsnS>66,'/./021/,+*.-//49>?>>>=<75323421125<>@ACBA@CCC?<:<<7+1CVzɽƼ}zy~~~vnea`m~ѻsO34EakR@>CRdmh_PA3(%%$!"#$%''%  + $-1)  rYG?978:>?8:?:+0/9Oiôɿv~|yumbTIQsϵȷw]cyt~weloniddb`WY`pýzlg\TS\psmihe_\]aeikiiikmov~sW:/Uŵ}ld_^WSQTWYbdgghfhjfedefimoomnɽĭnguwd]ikYO@5/# <\ls``^fsr_K!$! #).&;Wv˼{vttutsprw}QB=@83Jl_QW]a^a_WQPLJPXevī|{{|}{zywvuwxyyyyyzzywzyz{~hB:DSixmbSD9254;BLYlԹxkgbhti`ku[A>bɶ}sljf_ZZbrkQ>97+%-.-.1/-*)'.---15<>=<=<9642/1210026>ABEEDCDDEC@=<>>8.7I\ÿ|zyxoe``xѽ~Z62=Usw^PMR`szujPA2'""! !&'(& !!'*&,Ytna_B5'  u^J=974630110');Vu¸vzzywpg__WSN:Grɰμrtrbiôqhdfgji_]do~ǺǸocVLIYvùrlfa_aehllljigedeow}yiP6!;7301/..,('(*++-.2477;98643432/--158;?CEHHIGGCFFEA@?<32:MlIJ{{}|wmbclͽd>00A[svf_l{sVE3&!!" $'%"! #$&%$2JajeU>&  + ¿v]KA=823/-))@Wq˻ôzzsnf_WVZZWO8Gqǹzsy~xom{Ļtd^ade_^`biţƷpcTGCUtŹokeaachkonljgec`fp{raM8(0Lrĺumlkc[TRQPY\begiijihgfgikmmnrʿsH5@Zf]A:>P^_afc^O?.$  #I]^[owwgYF(  7IC4%% !&-13Rp˻||||ytmehr˸lH1)3Jau~xtxYH5'#$$"#%&$#! +  ,I^fSA,  + ¿w]I@9.&% &,''DhѾȻȹyxmaVMIOY^\V?Owýy{ysmmrvukeh¾åk]\^`\\[VTbr̩|m[JDVuųvkgdccgknrqnjhfechp|yj\D4+6X÷snpnhaZVSRWY^acegieeeegjlnmosɹ}Y:08A@=J]imlkl`R<.'&&$$/."CX]]lw}jXC-,GVRH5, '/0-ABK]uǹvtwvrqoqv{{aH320+Es[IBDVIHHB?:77?KZiwîyxx{~}}|~}ɾuN5-8SqycTX]em|{ndWRYrʫ~tkoqpmns}cLVsԽ{pbZ^lpVG?GSTNE50,)-.-+++*,.13422223344200159=>DDEBA??>CDCA?>@@44;Plı~|wrmjgmwʶvO2 %@FFB?<;;;?@BA><<:0/8Khʺytmgfhr|̶W6!7Rj||aQ<.+-.-# %&%  *@KOI<+! ~p]I3##(/6Beŧ|vmgZNE;7CTejiQ^ǿpcY^^Z]c_SPcrfbcfgc_]^djoorruqkfghe]WY\XPJnˤ̿|f\e¼kccegjmoqqnkijmrrms}sgdSF?ADB>;8789=@CC?:85,.7Jh¼zukabkx͸b@$"2KctyaQ?4132.&$!"(&$ + +  +"$%)6AKI@/  rZ>#"?cɿӹ~vo]QHB819512?HVdq{äxwtxy}}~|{zzzzz{z|}ʷX>13Lr^IL]hpqtpg_[[egkkkuysuxȻoZ]ʴ}}~~|{{{{{|||||||xsrppswwxustu~vl`UPWensyzfODDVozuncWI=863/53211/1255677788:89:=>@??=<988:;BDFD?941./9Lj|ui^ao̹pK,"+=Thv^SF=<;73,+)$"%,,& +   "1=GHB1$#"jM4"0Frŵĉ~{{wq^RIC7-9L{xxq\OLKLQWWTVWcinojedebejjhedca]WVW[adnkjjllkjiea_aa\VUv伐ǽ|qpqmhjnqtttsmjfdhpz}uxxihm{rdgͻ}ztrnheb`_diorsuvvrqrsttttzywyu_ml]SSgpx}xpjeddXZTKGNVYZQNZl~sle`_`gm{~|zy{~l\k¾¿wwvvwpquy}}|z~}Z6,-2V‹B3B@;=<;94101=@?@ACEGGD>60,-/2:Kh~{ug\bwϿ{U3!"3MezyaYOJJHA<8:72*%%% */.(  +/>FIB1&(' z[@22Cg|~x~vtvvrbVLF8-9M~ùaQMMGEKUTOQZ\ajqttrqrsqi[MD@70(!"&,16:DR_gigffecbcefcqܹ˾~sqnolorvxwvurnihkt~xztdeoxrjoɹ}zwsnkfeechlrvxwxwvuvvvvuu{xuw~mrxnc`sw{~wswx{źxhuvwvvvoptwzyxu{~}vP..?Px|D9<3023243235;ER_kszȩ~jlovwyxwtrpsqomnquxy{ϽU>6>=<9999;=?BEILPX[ZXWXUMD7.('&).3>QmĵwmgkwȺjE,$0Leuzwnfcdc_ZVURNIA930.-0550' +  + %7DQND3(%#hUKYzh[SSPHEKSYYSXcfac]hux}{uljr}|ti^F2%$;Zƾŵ]IDGOLMOTZ`deigjmqqkeR@.! +  (.9EZbnndY`k`s}uyyr{~zxqqprw|tvmekxqoɻ|zsonmjjiiknsvyy{}{{|}~~~}|}zidpʹڽ|yyvsjlonnmoouz~{]J/@uH+2@551-,1327BQ_jqy«~mngmnnppojhjiggijoqsuy|͹lRFRsxund^_bgjks}ɷumxɿ|y{xusttsruuuuuuuwwpms}yqd[VMC>;:;?EO\kxxtngcVPJC>;99ACGFC?>?=>@CHOW`gmoib_ZTOC4*&#"$/;MhxmjqwS8*2Lev{}wpossnkfda^XPGA:858::2+ &:EQMD4'%"kchɲrbVOTXUUZdfbZ[]SDF@KY^elid`[^iwzxqeT>)(;VȷN>CJORUY\_cjnnkjlmgZN>)  + +DXkj^X]calx֮¹|x~us}{uuvywqxulpynp{xrnmlkjjklosuvwy{}|}~{{{~pceuĴȱ}yyvsklkjihijqtz|~|}~wiT-GúV,,;20-+*0236AP]iqw̹pnikijllifcedcbeglnqsvzʷpWKW{zuux|}z~ǶwnnȻ{xyvsqqrqpppqqrssv|shmxwi[L<2<6,))+4>HTbp{|wrc]TIB=;UͶ}H=IRUY]aaaekpolhhdUB1,?SXY[XQ^anѡwxvv|{wy{ro{}uxnsǽzurnnlkjjjlnrtuvz{~}~{{|e_hyȽɻ}yvvsmmkgcceelptxyy{|}qjV/JŞY(&2'&%%(+027BO]hpwŭrolkjlkligcbaa`cgknqquxǸv[ISuƸwlq¶~zwwtpooponmmnoqrsuxxƬ}qryyok]L=3+"!'$,:LYhrz{qh\QGB@@KQVYXVUUVX[^eq}teWJH@4-+(#"/Lvŷtlm~;z]A9F]v~~wqha\XSPNJD=5)&$%'''&")=IRLC5*#t~ο|zvsvps{bI5(,34691-+.6AJRVNR_X8-8=LoʰuGBRXZ^`a`abgnqlfaVB*   +"0@Ub[KRR`|͚»|w|z{}{{{}nn~}~szǻ~yspmmkiihhjmprsuy{|}~~~{z||z|heo~ɹ}yuusnmkfb_abilptvwz|ymdR3CƦH$%/'#"$')-08CQ]hqx̿vopmllmljhedcbadhloqquyŹfPRrĶȸtewƴ}zxvspnoonmmmnprstvsv͹|iXM=.&/@Santzzqe[QJHIRY`dfeffjorvywhXJ<930-*%&8ZƾrmqĻpP=ETo}~}woicc_\WQIB:0.-.01/-&",?IQJA7+"oϿypsz}zzd5'$(&&)!""*/048-9Z]?5EEUglKOZ[]\\[[]`fioh^O?* + !"!"! + *H\[PFBNf~ȿŕ~~~}~~on~~zǷ}vqomkihgggjlopqtx||}~~~~}}{y{}{xuv|}ʼ}wssrmmlgb^__bejoptvy}sobS87VڧuP0#)/0+')*)*1;GS]hqzʸzqsnmmmljifgfdegioprtw|~y|Ļz_]rŽϾŹr_yŹ||ywuromnnmlmmnpqrsurt}cN6' "%% 1EWhx{~xof]WUW^dkprsvw|vjYK5441-))-Feƿrpy½]DALdu|{vqlgfa\TLE?54346531'""2DLQG@7-"kӼ|vor{z=+##  !!1_kNJ^[hmնeT_c^bVTUV[`egf\K5! $()++(&# +/AOVE:BQ^ܺwwx|sozz{~|uomjhffeeejlmoqrwz}~~~~}{yz}|yss|ǿǼ}vpqqkkkgb]]\\_ehkorv{||ulthZ>19n̋O0"",/5/*-/,-3?JU`iqzɵ~qurpoonlkijhighjoqsw{ytwľngv®¸r^{|v~{xvurommnmlmmnopqqsqo÷gR4$!%'!%:Zp}woifddmqvz|~}sgVH8:93+)0=Ng˾zstgJ?CVm~{{tqjhfaWMGB:7667740&!):KQPF@9/! !!|iʪpmos}N7+'/ctXXnmmlױc]ljceSNNQYadg]R; +  !',./-,-+#! +'@VL:=DIqԳ{vvw{vsxxvǿȸzsnifddcdcdjlnnprwz~}{wxztqwֿϾ}tqppiijfa\YXX]bfhlosrrrutsnhypeE/0`w8'112+(-.-08BMXblt{Ưqwvvsrqronkljhiloptx}wuywoxѶúþs\}~ju~}|yvtqomoonmomnnnoopnjʲp\K7+,.-.0=><0 (=[u|ytrqry}zodSCBC?7--:JRgwvpzƶwswȷsSBALeyyx{urjjgbXOID<;::;:73'#,=LSOE=9- ! """"#""! nlɫshm|dA1,$ :XabffgnfyҬioplf\LLNS\d^VK8 %*/168:<;85061($""!0LGCD9Gh̦||~fn;}|}wͿų}xusmd```abdegknopruy~~~}zszpyyxxyĬýþwtpnjifc_ZUTTZ]`baa`hkeeondcmooP8C|ӆR3&4-! $*18CP\gqy|y}wuvvusrqpponmoopqsyy{~Ĺtlsów_wysc{}|zzuqoppqppopoopsrkitczynZI:44>WnkmcM4"?[ts`RLMZZ@-4CNXZipirǼ~uqrímUHIQcsz{xptmf_ZTOJCEDABA=41%$4DORKE=7,#!!!!"""""!!! nkβ{mizeOA-)," /Jemmomki\sڨ~hqtm`NIJRU^`WN5"  !"',28;>=@CEEB?;:51.-)%!! 1@IVB7Gq~gQTu}~ɳĺzvtrlb^^^_bbdgjnoppuw~}}}~}yxyzoy{yyz|xtonfeb_[WQRVZ]_`^\[`aXXcd_aqooQ7>mwO8,4/($#%%)-4;GR_hrzȼq{w|wwwwvtstrrqonnnoosv||sy¼upmsʶ{oihlt~phu{frrot~oc|}{{xtnmnnoqppqppqqpjih^pǽxdZSYeriE#!:YuweYW`kfI58AGKN_rv·~rmrȱeOKQ`pxz~vpmjd^YSMHFGHDDD@92'  8JSTF@:1( !!!""$$$$$#$$##niͶstzĵt^IBD?0*&),.38N`ty{{vocVlԠ|ltseS=DLW\_YK<  !'&)05;ADEFINRSQNIA>=;93-(& +OSPC=6/(  !####%%$$%%%$##ljʶxvЫnda_]RJFGMQUYcmx}xngZj~tteSG:FS`d_P8'  '//430.66679>CDHQZcjpzνdx~xpvrttutttsrpnllloqruy{qir~xxnjq}ɽ{lcYQMIMXaeaacnn`wgWT[cxsf{wspmlnnoprqqppnljhjnlcVǽ}dK.&6Rt}wsv||pYKRZa_]kŽ{ph~¸ue`ft~|yvpjhgeb[VRPQSSKGB90% "3CKKD?:4.'##$$$&&&(%&%%&%$$lhٱ|psz޷ty|vtslimqsuwotx}ymjdky}znP>BEMZfeXB' "*4AIQX]afiegjmonnka\VPLE?:3+&$$ @^h_bΪjB("P~sw}}ǻjdy}zurpniecabbbeefehkmnoqw}zurhn|~z||zyzqv|v~}~Ĵr}yvqneda^ZXVWWYXVTQONLMHIY_\`orrS@JteJF=>EJPQSU\bgnz͸k`y~xotprrqprqqplkjkmquww|{wqrpx¹}ndk|¼wk_TNOQOTYbgu~|k_u}aSRRShyg{wrnonopprttrqplkijl|{bFt¶|kP<4$,Jn}|~~}q]Xbp}zɿ~wolþypox~ywvsmheffc\XVV[]XOF;/"!2AGE?:83-($" $%&&)))+)+***)((kgѾpny侇t~|{z{phfhi~uo^>4ERW`f\H2 "&*3@RYcinrx~~|{xyy{|rjaXRLEA<5.*(('#CVXOX̦Ũb: 0Rqp_Yix}dY]{}~ytqpnjgedcbbecdcfimnnnw~xtrhl}yvx{yxxhbbksrsu{wy~}xz~͵ckomw}{xspfda]YVUVXZXVSPNMJLHKZ]Z]mrtYLZ}nTLBFDGBCFMV[ZXW]adlyɳ_Ztypuqpppoonpnjihhlpvz{ojkuy¾|g\cxvfXRUUTU[bjxxgdwtXJJII_}i{uomopppprtvtrpkihjoe>iı}cM.!!(Jj}zvsr|wgcoƻ}}ztsxƹ~y~~xvvtmiegfb\Z[]dbXJ=2"'>JHA:5/*&"! %&)'*++,..--.-,,kfͭtnux}sfcefuxfXG6:O[ce`K4$"/5=GSahsw}zqf^VNIC>9300.),5PTKAK}λɻ~]6 )>C=@YoueXS]|}ytqpnkhfedddcccccglmlmv|vqpjjzvruzwvwiXLR]erzvx{|voov}˧fcr~{xtqkid_[XWWYZXVRPONMOJLZ]Z]lotaZfzj\QDJHGJILT^a_ZY\_aiy~]Olzsxsppooononjhhhlpvyvc_kz~Ĵ|bS[qte\]Y]eouw|oadunM==?C]kysmknpnnoqtuutqkhglr~j;[{reVE6'4,+'$"%')*&&'()**+))(''%%${kСt_eafwNj~rpjdonT7+9QbhggQ,!"*3BP_ipxvjaZVTKD@;8jojaOƘvћr[:  #/Pn}wks~jXSQKN`}}yusrolmigdbb``^_begjjowysrrmmzoonu{yl\H@Lg}}xxwgbfknlb[gvrrϧ£~|yvnkgeb`\[[ZXVUTQPPOPT]`_[jhklo}x|j`WKLRNNQW`fhd_YVVZdwѲv\E_{ztwsqnnnonlmkkiknrt|zoaU[jνaPO]qy|xlb]cuz{~|}odZUYwganzunijosrpnnswsqmjfhnslKDX{|kVI=1%" #-9Kcu}ri]ROMRX\Z^dgovzyy~}~Ǿyztw¸|xupprqrpokaS>' + + )->BJLD;2-*&##&*-/-,+)('''$$# ! tɱjYdeoNj~xtmdm~kQ3.AZfkc]E) $$15>HS_hnt}}tj^VPMIECA?>CIPLxy^YsӘ}oX5 +$$0Trvkyyl^QLMFGXu˹}ytsromlkgdc`_^]_aegjlpyyrrqptzmnqjkbRISl~}y{xyvcY[acd]V`lghzɵµ~}zwqnkhfc_^^]ZYXVSQRQPSX\]^kjmqv|h\UMMQKMQYbkmg`WRTWcwֱrZE`|}vytronomnlnljijlnpxyysj`X`qĵgRMUis~yvrmhb^[gtzkUTV[epv{yuv~qf\RMPi]9,%,=bmysnkjmpommmpqonifdhotpNAOºxtz|kUE:4,$17DTfw}wi[SRUXXTTXahossu{~|zzwxyyyz{|wtsv{Ķȼ{}|Ⱦzvtqqtx|xqjRA- + !.5?BIIA7.('"!"'+/0/----,,,'%$"!rd[el{È{~{ofjx{hJ15Phlj^M4%"'+/7;>DLT[ahpz|re[SMKGEFKMLQWZYliAkԣmU1  %$2Vuyqwm`XSLGG@@Ooؿ}xsqqomljfcc``_^_bfjmorz~xrstzɸwmi^fh^SZrxyvy~xzw`RPTU\YRX_Y]oxu~{xurpmkheba`[ZYWVTTTRQRV\bljnvgXSMOQGKNXcmnh_SMOUbyޭlXEa|y{tronnmlknmkhhhhkrqmhb]\f{qVJN]jt}vpib_\\[`jw~wpf^Z\aigis{oe[QJFFYpnP8.%);`l}}xrnkjkmkkkkihgfcbcirxwS=@rľxljmm_SD:69:8L[qwf^\][VLHIRZahjnuzyvqlggggceffeefhggjpzǻŹ|ĺtrslns}|n]>,   %6=ABGG>5-'%! $'*+,--.//-,''&#! Ȥ{ddjijw{rghqwvaF5CcuocZA*'-25:9:9?JXbsylda]ZOB;:?HV`ejmohb[SPOSUUWXVTRUW]_is}~}~roqffmxw_I*  *Uup_W>,/9CKI@?=1+=cis~|yurnjifebccc_[XY\_gq|]:*WÿƸscYSIFA?I\u{rl`[UOC6004?Q_gigdWNE>;@=;72-,**)+,-/25776410+)((&&%%˽wYRat|ټ~{soopoWHIdqc[IҪs_tolM)  3]|wssrpw||urtqkYNBADFFD84?YuȞ|yz{x}xspooljfdb`_^^`acfkotvx|wx¡qaa`^fx|zptvmjiflhff`_m}qhdcgyzyz{{zz{yporu~~}{vsqomkgd`]ZXVTPMNPPMJMYcmeix·qYWSRTM?@IT\^XOHAANdИlWH>]y~~wtpmjifgpqle]TONPSW\eo}Ȯ`H=DAJV^dglox}p__[SLJZtîlM8=MW]ixzoh\UPMMI@:79>=;BD7/Ac~fjz||yuqmkjeca`_^\ZX[_emvc@)Mtº|hZRMLKMUkvxwnk[TLF<203;G[kspjaNF<3/4;?JNQQMLPW_hs~Żоyw~yjcaUQQXXL2 $*5CF@<<:863//-013569<>A??<;711/-+)('ůn]bn{Œ}xrpoUJPnvme`WVYYVUQTW[^`abkaVJ@FNXXSLG>@MglTB9Yu}}wtoligdflnh`TKDBBJT^kxŮ`E7<8>IOTV\`irlZ]ULIO\o|~~|um]VNA.$3M]ahsxrie]TJFGE?:65978EK?4Ccwa`r}{zwtqnmleeb_[Z[\]aflsy|iI,Ee¾jYQQTXZar{p`X`uuqbZPKEADJS]n{zqfQH<3/39>FLRSRSYaowȾ~|ǶwuztcYSC>;=;.  + &-27>GGC;97542.--..00027:<:;::975533333çhep|ɒyrrUNVr{xrrpkihd_]_cgjkkkrcRF<:DQhmUNMRZdltwtqonmjlrw}}~r: %Q|{ywy{~Ӹlt\J8& !+Dl{slbXPkuyqklnlk^RKFCCB0)2IeǪtmvxnqpmnookgcba`^^_abdhlqtxy|~|wtxߢn_djow}{tnpku|rk]Ve~|p~wonoqrssrsz}~~~~~~|zutronkgd`]YWTRONNORTUY_bc^eymafb\[T?<>IVdtŰbE6857?DHJNSZev~iXRJDGPX][[RC1'$$!$>^hhkqrkc^^SE>>><957977GOE;Jgwcap}|xuqnnnged_ZX[^bflqw{{nQ1@\ĿgTLMT[^_mk^OA>Jf{pf]YUV]eltzoYOC735;?CJSWVYcm}û~{~˹urx}p]LA1*&%# $',3:>BGGE=:75431///-,)')0222345689:;>?ACΞ{bj͖xuwQIXy~w~xndcejlkiecjd^ZSNMShy[VQQRTX]_abgoy{|vzvpG,7bwuuttvz|òh80'5Jm~wph^\\rwukeinqoh[PF=:4-'2Pxîoksqiflqqjfegcba`aabafffkpqrpy||unp~Ü{go{xuwwrjnunqrl]Qbusqrpuvffjmkjjmojryζ~||~~~}zzyrmknmjeb^ZWUSRQPPQU\_`]\YhzhjjYY[L>657:8796;EVsМ}hWC3Rp|y{wrtxyvrmga^^[WQH@9;>K^qñaL?110346;CHCQi~}k]PR948/5711-%"*.*!%BnrmlcSGEHF<6798:=709FKHERi}wkdn}xsrqrpkif`[[`emry}~|pN6:Ox~]I@GP^gjkpxvum^K<40);^xxywuvy{xh[NF>8787?EFHRcr}~ľ}}~~rk|}z|wcA"  + &#/7>?@GG>@@C?725974,$! #&,2:BEFEA̞}dhzˑvsraY`uzxxqomif`YUSTW]bb]_csig`ZSOLMMKU_gpz}zyomJ9Iq~}vttrsuy{~ջ\?"4Otyn_X\clone^_deoiea^TH:2=Zórgnoiciomjffgccabbbdbfgihilpszywuv~ѵ~rqxomiowrs{pgpvqmihm~|wjgcaekib]p͹|{~}|~}{yxsnlonjfb_[XVTSRSTUY_ab`\Yeyi`ZZXKB96651.25;?FTgzƿsVB2/*+,15=@?H[p}n`]aB0,$./01,'&*4=HOQIKc}mdVE9?A?71469@B;15CMPMYi}qemz}xrpprrkjfcabfkruz}}}qP69Io{}}{\F8BM\^YTRWVXTK?1-*(;^~~rh\TNEBD?CILR\mx{{}}}}Ĺrjx|zx}xa<  "+18@FHJLH@<883/+(&$" $.7AFKǦrnt|ʼn}upmqmknqsxvocWKC=;;FWeidfj}|zpf[QJHFKV_bcjy||vgaJG^~{ytrqpqswy}Ԟj1 2Z}jVP]lorqha`dghks{vbNSkƿxdinibglkiffhedccccfdfhjigjpxytsxǥgfrdcbjwrqzxnhhn}tindbZY`fa^^Ȼz|~}}}{xtommljgc_[XWUTSVWX[]bdc^Yc{oY\`WMF?<><5259?I[y{xpYE=Vntppnlqtuvsmf_YTPLGB??EO]oaA0,%"$*/56>@Lczvix^?2.<=@@;79EVcs}zvl_QE=;<:21467?B;36DPVP[i~tafr~vqoorqjjhghjoswx{{z|~qS86Agqqqv[C0:GWXL=67?AA>81/.3Dd~}umgaXSURTY^gp~}ɼ}~{|~ɾsjqyzuyyf@  + &,)0;BHOOLIC:.&# "5EMʹyyݼtwrnwuofdmv~ueSE;88CM`nwv[GCWmpkmlkptutsmg^WRLHCBDGNXgw̸c?.+"&,.-9:BYu~s~]NN_afe_Z[fwúm^QGB99644322ORD4,,787789:=EUl|yrjgjkknt|z}}|~~~}{}~sfiuztvxgB" + .9;=?CEDA81(# $6@±~ټn~}wrpni_^isy~~r`TONPW`oz{tsu}wqnghklot}xk]e{wuqonmnprt{Ԩq9CvxcOK^qvqj`XV_hsȵoflpbfhggeghfdddffhhhegkrupljr}ټX>DUX\VXefdn}zqlkls}aLPQKEFSf}xx~~~~~~{wuspnkgfb_[YXVVUVYYZ\^`ah`cre\QBB3/3;?;:>@GSg؎euuZHFVhlgknlprsssniaYQJHDFJR[dqʴ^<.*!"&((32:Rp{xjj{}}ìu_L>9767993..?JPRPSV[Wk}ideuxtssuuqnnopsuuvvtrrrvy|{ypY?7=aigeosqsqu{ueO4 #1DH?3,+0//28@HNXbt{tux}~~ǻ|zz}{z|||qabm|ztvyr^>! (,-.2?ID861)   + $|u|Ɍqv|}ufd`]alu|{piggips}|yx{|nv~yvtpomlnorsx`!Cpzn_QObrwpjaYXakxŷzihoefgggfgeddcddfihjfekuvphiwѳ[:4NaOI\ɸxv~}}|{yvutpmieca^ZXWVVUTW[Z[Z\^i`bmv]E78$ '/545;>GVoчanoWHITbgckmjnprrqnh`XPJHGLR\gq}ɰY:-)!!$&,-5Jbx~ůzaK=8656:;4-.>JSVSPU\nsd^k{ytstwvrnnorsrqqrqnnosw{{zqZ?8?\fe_dfdhjmrx}wfWA*&3:71.././4>LU[^dpz}wz¿ŷ|xy}~zyz|}ǿr^\ds~zvxwlY=%!%!*9:4.5?4! +  +ͻucWW[fnwܞypp~w|~uga^cnw|zy|}}{{vsrpomlmnqru|ՖU,ActeZUXkwniihddlxiaifhhghgfedccddfihlihlssoirӻsB*+JWWV\[^imv}tplhegrnUP:6P|tƹ|u}||zxvrrsokfdb`]YWVUUTSX]]\Z[[f^_h`>4.#(')/9FXtƁZcdPIJM\a_imjknmnlkf`XNIKLR[fqǯwV<-)!$$'.GPUYTY`kx~yx{xuzƵͿyuw{{xvwyĿs`Y[fszzxz|}~scL:149<5,-0>94/)#   $(.2464697) +һ~ywxdSQS^iwlhw|ovspfcn}~}yurqpomlmoqstxȖkW>5I]x~o^VV_p};iZeihihhgfdcbbacefgljjlmnnmzɽO.(>PVUXWZdks|utnjfb^arjW_H9W÷~w~}{{xwtqrsokeca_\XVVUTSRV]^\ZY[b[]f}`<3)$3BVv|T[[MJJIW__hlhhjkiihe_WPKMRYboyűuW@0'"!")2CYr¾ȳ}_H<94--5976=CLTX\fzŮiSWiy~uqprwuoijlqrolkklnnpvyuW;7@YfdYVRSYZ\bhlqvz}}~snaN8$  *3<><;WzuHOOEJSNVX[ghaaaa__^\[XPQU\esʿ{_G9,"!+)%8Qo_D730-06;@GVgsͪu`QQaqwzvqnnpvtlihhghhhklqswz{`B6;P]e^SMONLIKR\dimqsssuzyr`UG1 + "6MYTNF?<8645;FZwztrw}olnxŪzx|{vurrtx}˽qfbbfovzzwy|}dD' 8R`Z]fnux}~~`A Ͷztwjcbenx dVYhQ[~}vw|zx}̻þ|sx}yuqnmmnopopqtwzȿ­}wg]V[hw¼lH[bhhhhieeccddeghhovrfbn}̺W6>ABFILQW]bgmsuwz~|{~}zzxtojeb___`ftslYFLqý{xz}{{|tpkgfca`_^ZXVUTSRSSVZ[ZZ^Va~tO+#!,DM\yħzeSJRfqtqmjkntsjffffghimpwz}{aD79L[fbUOOMF@BGPX_bfjkkmpmdPF6! 6O^YPE;;64/04=Rpwyutzskjqzк~uru|zvtprsw{}}}piedjouvtwy{}Ϻ^8  Feunmsz}cC Կwkeqgaf}ʮYC?F_`]TM_{zz~|wzûþw{~}zwspmlnoqqqpsvxzƼо}raYV`tȽzKY^dfiiifgeeddfggekmh`dwzz̦nE=?DMONKKVZ]bgkopwvuuwwtqqqpnjgdb``abkzpW<%)[Ʒ~yz}}}~tpkfeca``_[XVVTSURRUY\[XZS^ʯ_4,*&"!* ˸~qlkNLp˶gKIV\E=DGNdv~}uwɾ̴ƿ}yxusomjinoqrpqtvx{ſͱ~y}xm_WZiȻWX\afjjihigfgfgggee`\^m~ww{ֺU56APWPIEOQSX]bhlsqpnnlihkjjigeca``bfn{}d@'.Jz׼ôyy}|||tplgfc````[YVVUSWTSVZ][YXPWvһmG52-&(.+',HT\^abeisulgfghlrtx~t\J@>CVeg^WSL<40/1467=AC@@>8..>INMLOTUOHDBDNctxqsvwuldgo|z|{yy{uqsuy๒}y|vtv||snptqonllmnqqqy̷~pc]^ekilpsvy|ܬj;"! '?g~Y8 ȷîqG?cdKVxtX][Waarvw±ywy}yvssqoljihmnpqprtwx{Ǯ~~re]W]t¾¾a]^dkjkmkjijhggdh]T`vnӴ7/2CPPKLIHEHQ\hppoolgcbbba`^\[ZY]^adfp{ypmj_gqż~|vrqqomjea^ca\YWWTSVWWUTTWY[NPcƳ|N;38=8155AY~ͱeLEPTENUYYbaVRID@BFGKWgsw}дeJ6,'%"# %8FDSw|{|}}{wtssxx}_C:4-',4H^ĭjOFOS>LTVV]\RMFCCEKNR^n{~étW?2*'"!%"9GEOptptmlid_[\]jksZ?73-(+4?B<7:=I`og`gposz|wnkjeflo|}skflsqlnyμyooVIW`\]jhghnpkho}{}rjdb`[[X\dqҳİW+"SW7 ظzndUHAF]ŴWTaivx¿xoe^[]dihhfpox~vwwwxxwtttqmkkpmnlkmlmmitȚvttia]ZUdſhLfqchinxtnorpjb\cu}wznwпpO=8J^\VSTUPQbt}~{slie`_]][YXXX^]^[ZZZZTbb\UOgľxu{|{tutrpmkiea^ZYXTSRVXWTTZ\UTZiǸvTAHX^dpwЯmXMFGDABGHEA???CLS\bfpӿ[C-$"(8DHMT`o}pc_^^^^fogE0(*-039CXvͺ~rcTMGHIORTUVZ^bfjnptw}{iUJLR\eoreM8-#!#&''#! +  +#/9=A=;DOenhemtpqxy}tmjgccj}tjabfnrsu}Ⱦc[UU\`deginpm`W^zԺ÷y~{}tlhe`[VV[bn|̔fC00[];  ԾaI:CUz˘XS_kv|{wqi^[\afnw}sszxrqqqsvvssqnihhlnrtqllptty»ˬv}tdZTQXmĽó«qWdkbhovxmirxoaZVkttyylzȠsK>@CLYW^_UHJ]n}wokif`_^[YYWVV[]^\ZUTROVQKM[Ǿzsw{~uvtqnjhgeb^ZYWUSSVXXUUXWOR\lbS[mxѮmYMHGE>=CDB?==?BJQ[agq~ȨdI3(# )7@CFJO[k}}wqnmmq{~]A0,.348?Ni̺}rdVJDDEKNRTTX]adinotv|ygSJKRZenqcL6+ "&*(%&&"  +  1Bauҿwrieksnmpmjc_^\[Z^qv{|zvqmoosy}~zx};\KQRIW\fjg__k~̱zxy~{smif`YTV^eltթZ@W^> +ƣl``p͔XQYgwztna`adjpyzwronnprtsqnjgdceosvurrtw}}ƿ³ٻ{|wfULL_{Ĺd`dckuwqijwxfYUZtqgq~zmqʚmBAND>KV`cVIM^h~{umjkhb__\ZWXWVW[]^[WRPWOB=Moɿ|pqxzutroljhfeb]ZYWUSTVWXXVUSCL]sž|qzʨhULHHD:8>><::;?AGNY`hsͯmQ:.'" )3;==>HMWj|yykQ://279@L`}̺|reXJCAAFJORSX^`ejnptuzyfTJMT\cmqdM7*#())0,%  + $+($.H^ʽŭ~dwqgirtutj_[XXXZY\cfmqw|{ww|yw~ɰsqk\___XOLUl㺬wvwzysmie`ZRYbfilxəgk[;#! y{þƳЙgZVcw~yxyqpnlhgpv||~ztqmllnomjgdcddgnstwz{{yzwþٻҮwn~y}yhTHMj»½x\_govrokoulYS\tkcqkc}¿ɾɫvDCVOADOWZTOS]_xwsmjjid`_]ZWVUUUY^^YTNIR@16Vʿsqstssrolhgeca][YXVTTUVWXWTNAPfŸؾaOIGGC62687679@ELPRX^bgjnquuywdTMQYaempeO9*!"'*&!  />EJ]~¹ĵcQqkvujjhghlmmstvy~zw|ŲnfYG8:Op¼Ŀ߲~u{ywqkhd_WSZehgit}´ƇW8$" +klpu{ϣ}gS[s}}ww}tnqq~}w{}wsnllllgda`cfhkortw|}|{~xzγžkm|uyvfSIVvcalntmprrm\TbtlhqyzafǺƺI;KZWOGJMOPSXYosuplkjfba_\YWWVWZ]\ULE@A..Co|wrnnoooliedca][YXVUSSRTWWUKEWpĺȷ̯qVGCBEA2.121358:9;?JWes}ӻiSF=1("%(,.1552656?5Egvmiknnmidbc`][ZXWUTRPRUXSKO`u̽ð}bG;:<@>.*-../376214@Pap{ìwcVL>2())+*-/0+*+,,7HV\ac\X[ced`WUZ\RH?4) !)/14>\ĸ|ztk_OC835;AFOT[bgimooprv}}paTPV_cdilcN9* -DC=. + "1Kp˾Ŀ¶qFR–{jlr~}||x}}οĢ~fcsĮűyu~|wmfb_ZWU\bddgowؙxR8)#  +  Z[]`djnow}ɿ̽}U^jr|{zvpgeegjp~qtywtsrpooic_accdswzsoq{付շo|~{xkUMPfͿ|nodmkmk^JJj{tyseYfעoE6^pSICENLFM\^lxwqkigfda^\ZXWVZ\[WPIEJIdykehlnmidaa`][ZYWUUOMOTVRJZi|Ի̽ιqT<214;8,(+*+-160,(,6GZlx}~˷sh\K=2)+*'&))$#&&$'4?GMOJEGMMJJA>CH@6-%&.14Fi÷|ytlbNB6025;BKSZ`dhllklnrx}~ym_TRW_bafi`M8) ,:?C6$.>VrŸ¯|fE`ʛojjs~~|~|w|{~βƭɿ{nvxmd_][YY\bddhms{{zwtw{|z⻆pM5-) + +  NSY[[^cinqy̿cW_jzudYYXQT`_XS[o}rxzwxzusvwrsqnjecacqtumhm~պТ}|raRPVjĻvf``jbYKJcöy~xgXXtϺ|[YVWMMHRLFJM`oqrnkmonlhd`_^^\^ZZZYTSU^jÿqehjkliecb_\YYVSQRSMNSNKQ^nɵʵŲdF0+1550%"%&(+/1+"!/BUhw~|{};~ucL;5+&$!"##!!(05?BC?;86500//472& (/9RyĿywtlbQB4.-169JPW\aeilkjkovz{|zxn_UW^cgdeg`M5" #1>;9447Y¾zxtjaPA4,),28ELRX^afhffhkruwwvum^VX_decfg^J6' "&04;FTfzŹŽtM]ٱzmfmzztnknrtrmpw~}y}wpruzǹ|xmggilmrsqjc`ekt}xrpoou~wztns|}zcJ;71*!NMKNSX[\`bgpuzºܰjbdr}}y[LBFLUbpuzkUOS_iu{wrpnkh\\dn~|wϵpѰ{~zuwobSIJ[nʽʲp[NMOYg{usvvl`XgºŽ̼f@<>IKb~p^xwrmlqronjfdfffebed^QN^m~zlnqnic__`^[ZZXUSNVTSSGBKdpôǽ\@*#$#%/1)!$4G[oy~{{ƺu`D91'&*,+'%# + )7Fe˼|ztj]NA5+%%,4?FMTY]adcbdgnqssrph[VYbedcee[I9, #*1;H[q¿ľsVr׶kbk||unmqvyv{zsq{siegr}ȿľǹutƺxnjmqvw~{qc^agr{xrqqrz}tpnxneftxx}}wxxp[F:<92+'%&(%#"##!QPMNPUY][]aimq{Ӹ低ta_kx}zyzfNGYqq\Ybm~þ}xsqppm_VXm~vҸ~Ƶ|vpndVIDLbw̿[IPThkjjosrjgg|¼żüгU68BCaybywrllrsopmigiikjghg_SP^o¶}uoiedb^\`^[Y[YWUPXWSRIHSltз{qrĸ]D/('# )(# +-?Tlx}}|z|ŽtPD:."#%!  -?Osȴ~zshZNC7)%.;BJPVY\]_^_chkoolleYU\fifaac]M<- $+?Vm}ÿýhϵmdl{~~}wvz{srv~zk]V[i~rjuɻ|xz~vomqvz{tf]`dox~urqoot}ztltldhu{mhu}wommgVF?A?92.../-,*+,(!KNRSQPPRVX^filt~ϲř{_Xbow|~zvnlXMSo{gcm|yrkd``m}߾yslaYNHHQdu|jp˿[GYoriilnljqzýƽӶu@:<7Uzrdwwsmmssqrokjmmoomifb[W]eŽ~}o`Z`eb^]][Z\[YWTZVQQMQb{ͼ\B@Jiü¸dK6.*!$*(" + %8Mgtz}}|||{{ŵ]OA3(!    +&6I\Ű~zrfWOD8)%5=FMQUXY[Z[_ehkkggaXYahiia^a_R@-"(4@Pkuîxfahsz~yvz|wmc`bkvʻsdkźzqkmu~}upmrwz|z~}tg__bioyutpnqolot{z{vlnnpklnledqzyvic`_^SIEHGB;776675212.'!BGLQTTRRSV]egiow~DZͤ]S[iqvymecRIRk~xe[YWqrkb^euϻyi`Yiz}~ճż}|{{{{ulfWPJLS[emv||xn]m̿_Mdlihiio|¿ƽґ\B4+>XW\swxtqstrrqnmnpqpqkggc^^_}Ͽú~~mYSX``\]][Z]\[XXZQMRRZlX>.%-9flUC8/#!27/   2Gbpx{zyyz||ŰmXG80'  + + ")3CXkñ~ypdUNB6)08AHLPQRVTVZ_cegab^YZcjijb_c`SB3(*;Srzϵwh`bgv|{x{xk__pȿ»w_lľ~tlglvzsnnqvz{vwtlc]\^`ahr~tlhfgknlousvvsqigqxskimmhu|qkji\TSWWSMLPOKEBA@@?=<;;70*eYLINVYXORZceejqw|ɾԮ^OVemr{~z`]`M<=OURB.#/6@L]sƼƿpipu~hdlƻ}wwvwwunbZOHFO[abbfnmd[[}rnjhmr{ƾȾ㳆S4(1<=Onx|wvxwusonoqrqrmkkhbaaq}}z~{h\WVVT\]\[^]\Z[YOLSV^meA #7KzxcRJA3(" (23) +.F^nwzyyz{~~fOA7/   + ,5BSi|}xocVJ=2' *2;AGKKLQNPTY^`_Z\ZW\ehffeff^PF;;Nm¾}̼{okkotx|}|{|ywvsvĿĿhl}Ŀ|tnorzuokmsvz}yukb[YYXYVY_nz~ukb_]]beglsz{rtwrmgjqvsnpstnwyrifd`YROSURMMRRPLJHIIFEDCD@<6~U?AMTTKOXadcfmrw|¹ݸdSXdko|}~sVX_K/(!" +?WuĹæoupdfk~«ʿ¼~~}zwxuvvsi\SLEDP_d`Zaf^OI^÷vojjq{Źȼ׮j?4645Qo{{wxxspomoqrqomllhcdgi̹ÿz|{w}{~o^TRRZZYZ\^][[ZMLUX^kxW0",Iho`ZRG<6-)(#*?Whrwxvz~ϸw\KB8%  + + + +7DRe{Ÿ~wncVF:/)#"+4Ke~{xssqonoprrlsrjca_Y`||wmq{|}k[VVTUVZ^`aa_XUUX_lx~P+ !2C[sȼt`SIB>6&  (9Raknpr{ͰjXL?1# + + + +  ,@LYg{ʿwk]SA6+'$*5Q^kyüxj]Q?4*&" &08<@BDBABEHGJJJLR^gjh]ULGPg̭˵t`WVV[bjmonnqv|oitvʻ{~|{{{|}wnffilg\RLJIFCJKNNKIEDEGFHMRWZa`[TQPX[adijkjoopnoopmjghefddaa_a`a``]][VTUTTSSSSRPNKHFDƨ{UJNZ][WV\cejmrw{ǥi`bccfo|vj]A)'1BGINQXp򮍮_ҽɾ}qiecgltyƾ}~{zwoke]XRMJGQYVKEMXD8>k˿ùd^befnʿ˜{o[IP_n~~utrqpqsttsplkllcYZr¾ogkuzyxzgYMLOQVZae^[XWXe~H 4I^q~xy|ʼoXE7.&  #2HXchlpx}ίyeXMFC8 + !.Qcozzj[M:/&# +$,47;=>=;=AAABCFIOX`gf\OEH_¿Ʈȸvqnrvvzzxx|Ρkjo{̿{~~xqoqqgZPHB?;9<>ABA>===>>?CIMNXVTOMOWY^_dgimprustuuspmlikiiffcfdfdfcd`YYZ[ZZYYWWWUROLKȢw[QVY\YVW]bilpsvzŪpa_`adjx{o_D3:H]ghkp}ʧpqmllklpty}~ywshc[TPLJIHEEJPME?7Deĵ¿~^^ehhqزbOYjtyxvusvvxvuomovwoc]qÿrhhrxwtz~scOLKHJPY^]ZWTXez=!8N[l~zleacpsYC2' +  !1DS_ekouz־xfZRUM7%&&#&#*5BgvŶ|l[J9,%   &-2459778;=<=;AHMU\_]VNN`ƶĻڸpbhvĵ~~|qcUIA<8767::;;::89;=@DHHQPNKKNVWYX]bglpswwxxxvtrnlllkihgfgghggfd[Z\]]\[[[[[YWTRQžw_QSWZ[]`dfilnpty}dz}e^\ahmv{pdNDQc|ьyvývuzyursv}ú|{vrmb]UNKIIINB=FNH9-6cʽr_ejoqzʫcNYk{xwwwzy|zxrquzzsjk{»zpkqwuqorx}qc]ULHIPV[VRRXgtA0ATcgozwk[QGFP`o|ŭwZB/$   .AOX`hnuzȶvcXXZQ@;2.3*# "& $'-5ALY}ƹ}mXG7)!"(-/0422479895>HOUWVPQP_y¸ǻ¿þƿ~bdpx~ʾ{l]OC<:833576766447;?BEDMKIIILTUROT[agnptvxyyywtpppponmljjkkkjjf]Z[[[[[[^]]\ZXVT{VONQZ]beefjlnrw{˽qb\bipwwpk\Ziѵiųzy|õ|yvpjeZVOKIJIIJEEC;0/5VϿzxwyzwmensx}ÿٿyj|}zwwwy|~~~{wwywrpl|xuzppqqmhiow~}xoaVQSW[RLR_qsK1E_jmgef`TG=34:ESdt|ɲy[@- + +=JS\dlv|l^YcaTNB9=6/)%"""%*08?KYgvǺ~nXF4&"(,-.-.044253BCBIHHGGKTUOLOV^eimpquvxxwwqqqqpponklllkjif^ZZXXXYX^\^[ZXVUѺycOLU[_adegikovzȱ~j_agmu~{pnvquĽޙiŦͿ|yvrnga\SPLJJKKHBDH?*%?a|rnhhhmnnkjvzӼ}xuuvz}~|~}ulot}Ⱦrk}ulkkifjlpry|ofbb\PHUj}t]J[oql^RJC;3-+-3:I[kt˵{[@-  ):GNVbmxȽyfgli_]RFB>>;6/*),:DPZaoǹ~oYF1"&)*'()+/0./7?FP[]UJJWtüʿſȻëoddovuxõ{jXH@<<221///.-.15;AEFCJIHIHKSTPLOU^diknoruvwyxsssssrqpnnnmlkie_ZYTTUWW\[\[ZXWV¤]QW^acceghkovzйqb`fjs|~}thm~t̲ʽyurmjd[UNLIIJKJGAEG=-2`þpgc_^bgikkl{δϴ}vstvz}~wms~pǼpfzvjfhfgkomnsvqo[LEVsvk]krodVG9/+)()06;K^mw̷}]B."  '9DJS_nzŵowumef^NGFHIE>88=M[gpvǹ}oYF/ $()$#%(,+),:?EP\aZMEXz¾ùſƽɸt_Wenpt|ǹ¶r_NDA@743//,,+/18>DGHEJHJIHKRUUQRY`gjjlnqsuwwwsstttsrroonnljif`\XUTTWW\ZZZYWUUԾr]Y\]cfjlnoqs~îmdcenv~}}}|slynʳǽwroh^XTSEIKLKKKIA;97;853/,*---1:BGJJFOLJJMQUYXX\_cdcdiiknortupppppommoonmkigeXXXWWUUTUUVUUTRQqaadiikjnqvz{ʴthb`hp}}z|}{utmûtokbZSOMHKNONLICA85Ff·{kaXSTZa^akonv缒stqqs{|qpttɺĵveko\TWchiqngmyxouwxjHHZx~cfe[MC4&%#(-9H[n}ʶyW?* +  %2AHRew´lfope^SUgr]K7&#%"!#!$4>DO[b`YYvùÿeXU]^gwļŷnVE=<<:740..0/3+   &5CJUi{~ɾsy}ohgpr`N;) $%"-3?PWY^bmþ¸¾¬\MYXaq»ĶuXE>;@=:6201224>GNRRPPMLKLPTXX]bgigebaacdgjklnmlhhfhghghgfcbadec]ZWTPQPPOOOOOuaehmrtsplssvz~Ϻwi]dly~~}|}{vƽqkd_\ZXWTOJJJIJJ3Fnǹ}wk\OMRW_ekghihkzԝ|{zz~ppsuz{{zssyz~rp}zfYYfdfolbfrr[`iuqKUmaZC8-$ +4EMRRPPLKJKNRVVZ`dee`^\[]adggjnljffeggjjlkkhgfhhe`\XTQRONLLKLMۼrllmqstsprpqu{}k`fmxzz||ȼ¾tnfa_]YWYTRSOGEE6eqjef\TX`ejnnihihm}ઃv}nnpqvx~x}~~xt||l][efhpj^dqrcditvL]y~~TG2( !/7?Obw}X?0&#  +)8EO\o~|}ǭӱ~˹ʿ}tdUC0  )-&$<86;BFGFCBBBEJNRUSRQOMLJKKOTY]`acfjknqtvwy{|{{ytlf_ZWTOHB?>@Aɪqkjkilcahoonrwнwrjnv}|uu|}tp|üıŹ~wkea[RRjskgfcgjrzzvsuumkry~Ⱦǩtry{x~|z{ȼy|whZ\VaqqbafdjfcbcrUatiqywxO'# !%04,!!&4G^vδbD2% ;@EHIFDA@ADJOVVVROKHHGGIKQV[]^`egkotwyz}skd\XUOH@;:<=ھxgdfdffchqtouy~·|orru{zw~~{vsyÿĿ~laZWVhunnpqv~ztuxvwuuwǡķļlgdmny}~wpphpx~̿~z}zwldY\[cf`chfg`\^`lhgivzl~`@&/;5)!)6E[uĩaA+ !1R[]pwqzz׼ͼŸ}utqkcXJ:+ $*(" 426>Md|~ŷżÿd>büſsS>3'$'+/9AA?3# (4@VoŹzfdp}~nH)%%-gztsxŽþXmµ¾sVB8%##&-7CDC?FKKIFCBDIMSV[[RNJEC@>>:;=>@DIMU\dlosyqaXPJGB7.,Ӻp`^bbdglonkkloqrsuyx}ý}|{|vppv|{z{{zýƻ÷º}zxurohfccmuoeOKWy|ux꾥ڽeimuotuwutstwx{Ĺojtz{p^UOSVV_mlfa^[]hvrtxz<-:==9-(0;PjþӤzmpͰu^WYMTkwϾ÷{rlhfc]QB3'  @s{rmksǿ¾Ŀ¾ļ͟szľsXF;)%%(-8DDECHJHEBABDJOTX[ZRKF@=:8877779=CGOV_gkqw|xdXPID?4*&Կwfdcacioqqolknprrrur|Ŵ}usx~wtvwxzŸö|yvsnkea[[dopmbaq|wyة˿γx\^cpox{~~|yxx¹xmepzxe]SSRQ[ijda\XWat~S'%3764-#&,6LiվcTajƺ}rjhfc_SC4( + +  +@{~vlcafǷ˰žþÿrYG<-)*,1;EFECGGFB??ACIOTXZYOJD>8533455458>BHOZafltz~kYOE?;/%!Ĥpjfbchmooqmknoqpopr¿Ƶ}}vtttvu{Ķſ~{xtplhb[X]gotxyÿvx׾½óc\Ygmy}{{z~y}tnakw}lh[UROYgheb]VS[kvoR2#+794-(" %*3If×sb\rȼtkgfebUF7+    A|ym^UVüþƿ¾oXF<20/26>DEDBEDA><>ABIOSW[YNHB:6100344447;@95$ $'/EeݶjqukghfeXH8+   +  + !C{zn\QOķ¾ǽ֬žþmVF;43358=CB@@CC>:;=?BINRVYWLFA8410023444589>ENV[bjq|nWG93-%DZywolprnnrrqstutop}ÿƳ{z|{xyĹ}ytpa]XPKNZeγֱ±Ħӽȭt`luxz}|zx{|}u·Ƽwl[bo}tsdZSP[ijihaURVafoy`UUWdL=+&9G<0/ $&-Dd廒x~wlihhh\K:-"  &Dwzm[PN}ʻƽ㲏ľkUE;64479=A?>?DB<8:>>BHNTVXXMF?8311002344566=BLRY`fnv||hUD6/)#ƫvrtumjmqsoowqkvǷz~{zx}˽ÿʿɿxpk\\TSODBRjѯ¼ÿإ߸ݱmhtv||wrox~{wqt]\jtxxzm[PR[cjipfPLXb^eaZNJMRRPKIKE4$ %1FcÃĵzpjebg_SB2$-4H}sdZXzϾ¿þźèǼ{bSE77468;?@?=<>><:;:<@FKORUWQKE?<7424225546;;?HPYahoy~l_H=1(# vqpntzxrqztnxůʺx{z}{y{qnmjhjijnvʾǽĿzsnb\TUVE=HlҲӠ֬֨}qwwy}|wsrzyǻle|c]jw{w|p_SPW_egmdQLYc_b`YNKNQS^[WUH5%! ".Fc|魢Ķ|ridah`TD3& +:ACO}xledtʼÿĹɰĻs]OD8878:=>A?<8;;98::;?FKQSXZTMGA=:834104435;;@JTZafiruy|o[N?5*$;zsmjryxss{xs~ӳλ|xrv|}~óvj`WNGFCA>=;::>CHNfȶżʿ}ytpi`X]`NBHrӹþ¶Λͧ̍xsptwy{}|zyy}y{j^wn_hx~x{sdXRRW]_e`OKXa^]YTLIMQVhic\K4$!#$$!!.Eb~ucyʻŹ~sjd^e^UG6(,AWZRW}¾~vrppļ¿½˸zmXLA7;9:<>AB>868878899=EIPSY[UQKDA=:53003336<=CMU[`dgqrsuxz{|}zyun^K?2*!˾wjgmpvwyzvׯԿuwwvxy{~|ȱn^VRME@=;941/,*'&%$(9Mgºƽ}{ywspe]W]`MGQzŻȘw~ᾨĻհ֝omqsx|{{~|wxþ¯tg{{eds}uri^UQSUX\XLJU^]YUMFBGPXmqmbL7)%!'..+# $/D`}՘»ƻvjb\`]XL=,  B[ji\\}¿ſ}}s̿¿¾ľļ¿kXJ?6;9=>@AA=63554678:>DJNRWYVQLHE@;93013448?BGMSY_dhnmnnnnnmmid]VJ=2&"j\ZivywӪı|}~rnjmruxy~~ıiXNFDGHEB?=82/)((&%" #&3>IUlž~|ywvspm]UORN=B[žǺ¿ſȝz{ү濪ݭmnnt{~{}xþ~r|l`k|nnld\TQOSWVMMV^^\TH?9@AB@;52432477B@=;61+&" !""! # '-14Ca}ļ˽}{yxvsnj_WPMB4Dkɺ׷۴fipr||{w½ſzxyuccumljf_YSMRVUPQX^a_UI=43@OmqjW@1)%(1;90$"#$/Ecסίʿǿ|qe]VWWQB01hv}zki}¾ºƽҺlaUJC??>@CDB@:5020/147<>CEIKPRSPLHEA;73//114;CGILNRU[`ZYVTSSMIGB82/,'#ƿüs_Vclsx}|ʦʴvyqdeiltwxx}ѻ¯kUMIKLF?=::850+%"$).26EWnƽ~Ž~}{vpkcZPMB8M{˾þஙڹ̻ںcgsqv}xs˼vz}kbm{tphb_[UNPRSPQW\`XOG>64ARdh]J90+&18=6+"!%''(0Fescäsi_WVSK=-  F}|{wlkǾɽ¼ſɾżðꯑqc[TKDABBEGGFB<3//-,-039;@BFIORQNJGC@950,,//29BHJNOONOPNJHFGE>;72,)'&"Ƽôlb]bajz~ǥη|qtyh]akpvxxyſ´t\IB;9@CA>:5652.)%""+013=Xuȿyy~yrj^RHGB9R¾ǩαµƕhlvmny|z}}~tuĸ¼÷xqdhuzrf_\YUNKLONNRWYJDA@<;GYacZI=9627991% $,-,+3Hdŗ뼟vkcZWQG9+  YstknþſŽľ¼ĺīը򮁉zl^YRI@>CEGJJHD>2-,+)*-.68=AEIOROMHFC@:71.-036>GIMRSPKGDB=98960*&#!  źνed_VZip}̽rkje[TTer}}}ưйnYL@7./258;<:200/,+(%!  #'"&2MhĽ~wu|ǻxog^TI?B8Jû˾˩߲Ǿѥzjumjs}|vpy}vqǿɿƭ~|kgoysg_]]YNILMJLOOE=428@DNYe]N@988<>6+'.(&&7Sfw͸`ͽ¼}qh_VLD7( *jxtfavǼ¼»¼ż̿ʹ䴂vsj^RH>;FS]_WH<669=:0$',*02:UiszϽԾļujaVKB4' 0# (Szo[Vjwoptþÿŷɱƿٳ԰͖y~pcVMB:67DHLMPPH0++,-0/0259>?AAB?;62-%*&$)')9Qu{ſ~tou~ɿ~|yqjaSLG;=Pzȷ·˩ڬ}Reropywpy{}}||}~}q}ƺ˻}siole][[XNEEIKPPJB9437@LX`ZO>526>A7( $ .67EVj~ֹƷѽ߽ûwn^QD9- Cgtb\kƮ{oeddxÿűç¼ûб|g[PHA::=EJMOQQI=.$! $*28=?DEGJMPRV[_dghjlpy~~xpdZLA3(  ƹuc¸p`U;>m¼Ǥpe]PHN^lv÷^I;3-)&$"%(,3:@BFIJKGB<5/'*#()(3Rq}qkryɺ~|yumg_PHI67Wɹȿ迆Oammoyysw{}|{{|~~rwɿ}xnkjb[XXUOEBBHMLF?:77;EQ]d_SC87<@@5&&-4BCHKQV[clqy|yl^RA/# ör\ʿsjbJTȥme^SOWgry}~riitİrN7+*'##*4=DGLQRQKE=4.(("!!()+=aÿzmgluĶ|zuqicZOEH7;iͽ¾ɼҬӗZbfgnxzww{}|{z{}}uqwƳô|rlibXUVUQF?;@DC<6036:FT`e_UD<<==;, %.>x؞洢ļyn]PC8)#Rmy}wpkp{м̻ünhcYlǾ½Źýſڸwպuz|iXNE=668GKPPQPH;+!!'07=?BCFLS[epzpbM7& µwdż}{u_nȣmfaWV_jrsxyy{jXTYeƾhXF0'$!"%+46662-  +(Lًs߰⹟Žyo_RF;, 768GLQQRNF:* #!'18?ACEINXdp|rZA- Ķ~p{Þn|ɣoif\\emrmsvw{˸ÿmXJHR^t_GBA2)$"&(+.3W÷ý¾¾ٸzܿpxgZ_ksuww|}|zyz|}~yoqʺ}tpodZUX[WJ;0/.'&*.7CIHC;2-,,&   -cwzпΣžǿ{q`TH=-  &Q|wm`\gĢƺuqk[iŸƇodeyzeSJE>8:Giμþ¼Ŀڸy|貂]lÓbJ\mqv{}}|{zyyy}qmƵìyzs`UUY_`I9-*(! *.,1>B@95,'-/%  2ϓz㧦ίѩõĺm_ZRC0  +Mi~zl]`p~̲μ½¹}fv½ò½ɿȕadvzhZRH;26;IKQQPME8* "$)2:>CFJNTaqøhR<' Ĵ}|lq¹zsuΪvoh^[`eg^dltwz||ĸjQE=6AUkx}wv{yraXMD@>@?6531,+,.,69:GKOVZRJA:0*%+&)/,#!'.*$&;Wgki||g`O?[{y}zyuojf\QG8?XҾثȋfRjңlP\jpuy{|||{zyx|}~ywĴƳ}}tbUV[a_P>/*'$/314>A@=8,%)+" + DǛʳ̿Ǿ~qf^UI8*   &^u}s`YbsŶӹϽü|zſǽƜjm{|sfXQH<46CFJOVctǻpXB,! Ĺvy|~{sgh~ux{tpzϬyrnd`__^]aipstwx~¹xcVF8?MfpqjeebZRLB<8789773.)'),/9==GKUfe[M>60+%!%)))-')+2G^lquv^VG8Uy{yzzxqkgf`WH7@kƽ̿ҜۡfROkzVZhouuyz{||{zy{{{|}~|}ϸǸtbWX\ca[G6,'%" +4:88?A??:.&'(  +hѺ~rqtstzxstsյ֭οvneZNA5( 9s~lYVk۾ïųĴȽ½¿¼~ŪvxtlbWPG=68>IMQPPNF8,!#'+288410752,&%&(0:ABHHZtvkWD942.#!+.11%)0:LapyoVM>1Ns~|zzvnfeeb]SCN~¾÷ľɺʼ̟^^j~ˉ\[dmutvxz|}|{z}}|||~нǸtdZ\cigeQ>0,)((/8?=;=?@A@7211%  +AغtdTA9:==GWjxlij񭣕רºwtj^TJ?3% + )Iv_Uc{|ڶִ̻ӱͿĻǽȼſt~Ȼݮyoh`VNH@:::76.(+2442(*0;L^o{iND4&Ch{yuleefd_^ZiíඋҾſǽȶľ¿ʬ۩|m|Ҽ٘g]bkutvvxz|}}}̾dzvh_djpmjWB2-.-+3=D@<=<@FKIHGB4$ VХwVIJLGBAABDEKR[_\TLFFTu̎ΫߺvypcYQG;.%7V~l\^kp۾ᦍźݺ¼˾ƻĿtŽ̭˦vkf_WNID>@DKQTTTRH:.$$),26:AGKKTey¶u]E. íqp{vvwusuyzbTPNVj|}uhp{~||~а}qoqohb``bgjllnpv{ɡyc^bcmusjfgmkifd^XRHD?:631/231/,*+-29@FF@Tzx[FDDCE>89@DEB879CSevycG=+7Z{{wtmeegd`_mҫʐcbyŸþǽĮyʶÿsbckttutvxz}s|̽ƲxmhlrvpiWB2+-,+6?DB<88=LUY[[P>-  +aͮcH43;:@FKMMNPR[dhcVJ@:852057997669>@BHF@VkRMOPNLJKQW\XMGGQbru`E8"*Lpxtrmiigb\`wƤztupx緁cuݼƻžżþýԷϚǰڱjekutustuy}xu|ξȺ}tqswxpcS>-(*+(3:@>6//5FQX[ZM8& + oԳvW>>GF?;@EOUZZZ[`bcb_]\[YRLLRbīǾʵƿ||sh[QKA3*'#&8Yu~~obiʴꯉѾẝ辯пۺȾĿ{羓½rg`bZSNJFDGQUYXYVL@-#!&+49>@EGHRe{¹qX>( îolsyyz}mb]bl}}uouzzxvw{бupssjeeachiihiluyӲvqe[Zajr{qmlonhb]RMIECC@@DGKMLKKLMJIMLF_{^Y\]`]][\ad^VOOZiyoY?3!@g~vqqnjkjc\byⴈyzmŹϪҺýͬٻϷʫꬳwnqvssppqtz}µzxxxwm^O;*%('",177/'(/>HORMA,   ~ɳiM9-2:;?FIKPW^`^^cehfca_]YTNE9;RkիݿŻzn`WUN>2,&+Adz{y~o`vȿޗ~ȭݢ׵̼¾Ŀys–th`c[TPNIHITWZ\\[SD/"%*39?ADEHRf|qW>) þwrx~ĭneceo{{sntwy|}wsuͰxursnhdgdehkikqtx~è{k_YdyusnmomgaZSNNNMT^\^_bbbabfaaa[Wqvfbdmifdejon`Z\bp~}aJ:'7W~ztrssonmf_XtػΦęxީʨոqUTi˼þüľêʡкתzusmgggjov}q}ͶƭzrlcRB2($!$++&#'.:<=;2$   ;ݼY7)/@D<5/'#!"&(&%,20-(" + OmK5,+;BC?:?EISX`fkprsqtvtwyvqsqlaUKCABDM\ixÚ»ɽú~|{unjkdO>/)<^zvy~vjhoqkfba_^yij|gz˱ϽɱžߪѸȸ̾v{Ľָvj_ZZVSPOMVZ]`cc[K6$"(/28?A@GUi|úqY@)ɸɶthekgdbenw~~~z{|~~}|yx||vqt~̱zwsrnhffdfjkjmqwzӳ}vm`cryzutrrtsoke`]^admrvurpqqtw||yqnx¾ynjoqv}~vuzrW?. Bm|z}{vonmhaZenvШ}÷\_zrS>Gþſ½ǿİ㴈ƹ歞uoe`bceimqx}úӲg̾ҴxmbVH8-&#!"$'(*05.&  !jȴQ)$.5@>>EHJMQ\bluz|yneXJCF>51/4?KfְİҤŸ~xrmmgQ9(+Fiuv{}zqeaed^ZWVPKg}q⦆ƭɽĢ쾙´ȼԻνǹwĿͫ{sj^[ZXVTSRZ\aabaYG4$$,07?BAGTfyĿpX@*ưupigeglsvwsppqsutsstxyuqtʹ|vrrnhffdfjljnry|ַzsiYYhppxutsttqqiecdimrvxwxy|~|orŴulqu~iO7( 9bx~~{tmlmha\dkozسzozȞrNueR»ºȿſģϮþ񹣭uk`]acdfimpuz؟dĿϷymaRG8.('&$!%''*-37;6) (ŸtS, 1;==851008@=GWlؽvŻ¾|vpohQ6$-Ortuxzztkfdda`_VG=Oƪ|˝źï쪎޽Ǩ軤ͺű}{¾ܨyrl_\\\[[\[bdecc_UD3""*-4=ABGRbtkS<(˼Ծ|ojhgjmongdddhjkllosvspvζ~vrrqjffdehljmqz~r›rmcQThuu|ywsttsspmjjpvx{~txʾ{rv{z_G0! 2Zr~|xrmnmf^\ettyἍ‚‘bp쿃__ֹfýſƿĽçػxh_\_bbdfikpu|oƳʺynbTI:0-,+*'+--/28;A<.   ?Ýk:)'8?C?;@Q\UIEHLQV`m}{xre\KEB@>878+($&5Vϣ꾕ĴӽҤ޹÷wqmfO3%4Wu~yvvx|ywmlifcYI=Dyѹ|ʯ¶żs襚¿֧Ҥɸÿxݞpvpmcabbceggnnmid`SC1"&+2<@@ENZm|v`K7$wlgfgfd^[Y[]`cdfimrrpwιwqrqkegefjmlos|~cd{ʿѢjh^OXr|wsrsuxyzww}ưyxmT?) + ,Sjz~yvroqoe[Tdwx{Ó|͎ɚdnea~o¾¿Ľ̩ũ˦h_\`abbeghlou~vдɽyneWL=3/..,).23447=A?3   + eŒ`.!%4BJHGJQQI=65689?Nbqxo`YSOF9-*0-+')4FNnТÜսrYh칝˼ѾzpjbI1,Abwyt|yx{}smh`WPQzƟ~w칝ķqߧIJլâ̯ŵ|wܠo~tplgghknsvw}|xqjcTB0!%'/9>?CJSaq~teO>.Ĭ}kdaa[VSQRTX[_^bhnoqyϺvpqqkehegkonqu}\I`贊jg`S_|{uposx̷{{ļui`I5" &Ldu}zxvtvpaUPcxw{߷ǖyВo|ΰYiwĽǿż翝ȟzδ۵la^abbbfghjmrw}|ͲijzofXL>3/.-*'-387337=@7& +  + $Eeq`5(5DNQRPIDDB?ABA;68CM`ly~wqj`TMD90.0/.)#Iͫ᫒ֳ῎D+:Zzмòɷ{oh]C24Mkxwp}yz~vpkfaRiʬwຮʭqۭҸ߶֮Ӽõxzݮ~{spmloqvz{pfWC0!#&.7==AFLXdpux||{wttvxyz}~zslaR@3& ׸uhb^XRNKKNSUYX]dlnrzϺupqqkeifhlporv~yW6L̲șmlbVd}}ytnns}һ}yyƿtg]S=-#H`s{yzyxyq^PNcwsyĒ}ѕyħaj{|Űw]ʿžƜʠ뵒x~翢qebeddeghhilptx{ٸ®ȵzpfYL=3..,'$+3:73/29<4&  VoO=0$"+3:BJSWRC?ITVbc_SC88;FUdlx|slhd]PC=;8:<:6.(""$(8[sˊѤȡȶќX0#@gܯɽͲ}ofY>0:Vpywqyx}}vofc:Fpzֵp֩аʞɟǤöſw}ǿ㷼߻zuomquy}uiYF0!#&-6<<@CGQ]fjlponieceghhklmh`ZSE6)   ༈ggfYIGHMRSPOW]aehrڳ~ytreghiihhjpsw{rE):Ӡݙ{ijnotzyyy{|ztv{ȮŻ~nmn\?0$ 8Vmy|svwvun_SRalv~Uh֢בҜts{lqqֿwXǵŻǿſ¹{αuzѣҦuekk^dj]eehjntwxֺŵĵvkcM>2+'% !&+.///1;?5  [w_E*'1;BDEOQTTTY_etsndXJB>OU`m{{o`RH@<;94-,./0/-)# !1LaȬդߪ|ХuF%(NֱΞͬ´m^\=5Ggzztr}yx{xoheFE^t}׹ɫӷῤܻmvȼþȱֲ{vqr{|m]H2# %+18==BGNSUSQSOIEDDGGJNPKHEA83/'ѡzldVLIIILLJKU[aeit}wrabdfffgiosy}e5#zѤpq~srrnvz}~zsv{ɯŸ|i^eiV5'4Rhv}}}y{yuqiYOIXiј>V߰ؔܨy£ko؇Է}ɀWnͺüžƞܷŐ}Ѥ⤷٭velrghmafeeilort|à˺ǹpd^K8-($!!',-,.?@3 +Kqjjf[D) *4@HKOSWY]bgnqqpoi`YRPVX`muhYJA3../,% )+-,+'!,Odrë涏՜~|a@8Ir̪⦵۶sd^G@Sn|xz}}}|{{~wnhfRIW}пynﹴӺóѽ̮̲wPCLƸ绥ӷ}vss~~p_K2$ ',39>ACEHLKFB<81./034/22.+*%%! ¿ܹyi\SPNLHGIMTZafjvē~wp__adefhlru|[( +aԜis}zusx~xrtzpZOX_F" ,Hapyz}}}{tndSGBPcÃ1JĎڗ}ְol讍Թԓb`̸ȹˮ٩Ѧʡⸯ{knupllgfedfiloqx}ϷĻ˾~h[WF2)$ $+2520C?. >~\]c]F*$.9GRX^`cdinsuuvsqj`WQPWW]ll]QF@@:6994.-'')--)"!C[]kijԠ㻌øãظ{ntɱ치Ƨ}l`JH\qzwty}}zzx|yuplj\ORkþtpӺӽע˔kHHGIvҾľ۱ǹ’zzuv|o^J4' "(.4:>DEFGGC=9.+%%'+./244.+)&! ¿ִqb[VSOIHLRTZadlv鹋{sn^_bfikmpv{~PR~r|vpw~xnqyͽkSDHJ0  %@Zkux}zy||upbM>;I]Â=T؞՚ƅŁqӥ~ϜoYoȷį}ҬϹxsxskjkgedefijnsy}~źz`SQD1($" ,-07>?94>6$]{kvsZ0" (4CR]empolkmkgbheb[QIFDOQ[j~dTMJFHA;AFGDB2,)**'0ITbuǾﺘ彑͝ήڧtaJNartpqyztlnsuvuspfYTbqyʺºűƶ޻󼒤竗୉rKOLDqͻ}þӿȵ˓xyxuhZG5("" #*/5=@CDEGGD?:1-*+/3688:80-+("  + զg_YUPJINSSY`clvܫyvro^achknqty}nBA~tohos{}wpry|ts{}~˻|iSA<8   7Qesw|~wrvyvqaH43GbʌWoﯕƗʋ٬֔wғǮlR`ƹ½حᩖ੸ҷ˾̸urkglgecdegfipv{|ǹv[OPD3(%"!-.3:@?712)  \vgrhL)!"$.>M[gpy}xne]VLEGFHFDCEGKUanÿ`NGIIECHU^`\YA8/*($!>Rah{ؼǯܪߠmyǽظ̶ȧzzxനzcRYo|zuwvneeov{}|xoaUVnxuζ벩бܷ׺ѩ䴞ǜک[38@tŹuƸ̷ՙ|~zneVF6+%#"$+08>BDCEGHEA<1.-/4:?@BD?71.)"#! +  Ŝ{f[WQLKNQUZagmyܡwuvtq`acimosvz}^:1k‹yxqrsy|ystzvnc^dqxqqz~x|}ʼqbR?5. /Iapuy{}ulputn_E.3MrΑhDzʓŽ଄~󰖊~ῥiaN[źʺՠˏɸtqlfkgdbabbcdkpux{ƾǴtZPQG4+'"!(-39<:3-#   + ^znl[=&!%&"*7IZeoy|n_QF>8=>@BEHNS\dovϲcNFGI>ANajjdaME8.(!>V\ZoԾǪzqܾњר~f[d{z}~xqiku~}o`MF[}sŬ廳´ӥٶدۼ謕ˬ{YTYƷý~l~˷ާ~~~}}tlcVH7,%"!%,29ACEDFFFC>90015=EKNTUQF=6.'   rd]VRQPQW^eip|וmptusabfjpsvx}tL4$)WẮwtuy|z{~~sf]]fjmmkip}w{~˾{fXI80* 'B\msuv{~}vkoqnhYB+/JqɑsСȘǕ|󽝄}ockZdʼϾџyv䆌͵˿uqqffda_]^^^`fkpsw}DZpYSUH80-&#(/6<:5.)  #pxmV;//0,)1>Qbmt|scUNJJQQSTW\bfsw}ԹmXOMM<=BLNMKMOJ@6+#$AZe^mַ˸߲ƑڡΪwwЮơ}qĦjdn~}{{n\D6Kxz潸ɶvܺƵȺơͼĻtcz巏~{zxu{ume_SG8,%" %+39ACEDEDEA<8128@LW^b`a\PC<1("  Шzme`][WU]cjotʇ_cjoqdfgmquy|^6'&+$L|vw|}yj\YZ[_ccht{wzzyxw{phVH=0.* +  ;Ugnorx|wnomf_R>(#=av٦{ǚ֞zª{wpgi|lpļż⹳ϧy~Ӵ͡urqd`a^\]\]\_bimqt{ȲnZUWJA93+" !',4;>8-$ +={i\K?FLA2*4CVhry~zlb^cgbbdgmt|Լzf[XWYOGB>1(!!7Zqmr֯޹⭶ٷƖҵ\v𝋣ҵrw⺮pqz~zz~vcD.?o蹄z嶭ív}׾ͱԼͳҴĽ¿ƻn]v~|wtrpprrmfaZQD7+"  &-39ACCCCEFB=904:FUckpuvpdXLA7'#¾Ѻtfgf]\ehknpx̅ES]gfohegntzrB+!*.8Ew}vp{yw~}yxl]]Z]fr|uj`pfRA3*&"%% + + + /H]hkpuy~|tph]O?,,Wľ~过̧֛wž{`cn~z|ŵyм|vmZ`YY[ZZY[^dgims{¼ù}eSLPNA:70)&(/8?B<5+  5~ibYG?R`VD85CZmxzyyxqrvwy}ԿumnpqfUA638=DMRI=4+5Reoڪͽ׶͕뵹雝ξ՘LwӮ߽{뺞yprw}}udK;Ej׶þ¾ٽ޾w봽µղýĺj^tտơþ}ytrmmkkjjigghghfaYOD1&! #).49@CCBCC?:52.3>L]n{th^N;2% + ʼuqpkgijlos{{;JUacrlefnu{h8 #+7GTvʷtinuuuy~y{{rbahtqe\lhRA3    '@Ubhmty~~xrgZJ8$ +)Ulvҙཪ޺ʫ_j{~~ƶ±ҮqeSUTVZ[[[]_eilou}ĺ;gUOPNF>:0'$',5>A;2'  LeXOGCK\dU?4BZn|vlppoqy{ywrh]QJEEDFMSQK?.)E[qƸåס껻ꠐĿǺםWѤƙz¡x||tgRDKiǬзͮ螄笰׷ЭǬ¾¼øe\s¾ڶ¼}zupidb``aaabc``ba\UL@/%!  $*/49?AAACA>841.6ASh{yn\I8,  ÿpnnkigjnszp3GT`crohhpxvV(  -9634?A@=;759AO`up[H;+" + + ˲¹yttojkmq{e,DTabspjjnxlI) + !Xqfmcj|swz{qqr{rqurvnWH?8+  +   8M^epv|}~xti^N9#1o̧dVpˠįȰò׼sb]XY]dfda``cinqq{wz{||֪ݹ˽ȳ˶mTNBEKT\`dhjjlnqtxйyib_XJ6) + + +0j|zna_NHFKX`\SJVgwп}pjggd`_agjeS=0&-/5Ghȧ˽羢筫ܻρvg٢}Ƈvfj~}qh`]WWkѮz|̡ܳ᭜ϐδֹշ⸲ȼ¾eT[s~̾ߟ½ſzqhbbbfhihec\ZZ\^_bfhhe`UJ=6/+%#"##"%'+026>@?>:87;APawt`M?0'! ÿ¶ûҿslqnmpyc)>Qadrokkov{Y5   +=n_heisrv|{yuuxztrsl`[doxxrtmmvwlS7&&)%     +,EV`kuy{z|xnbWG1@ʛoJMyzvá谚ʹygZS_hdVMQYpyoilwȹϦϩƞnVNCJPY`bdfemoqsuy~|jc_UF/   + Apa_@@Nbj[OLKWgxҿ||}z}mTA;145=;769ANawwcNA5.(# ƩʼɵŹvvsopyָ`$8K_fsllkou~lG&  + ?\]efjruz~|vv}~~~|vlbXOMNEHFF[{yttkfgcP7  #  + +  +"<:87;AN^qs`OC941*&$$"""!ϰ״]`|˳Сu{Կ}xrryز]4G^frlnlov~{`9  +;yڟdU^[Zgrxyunr|ma]_daYQSX[[]bZRLGCFKRa\M_ytvlb[S5$&&  7IT`mrssszzni\N>" Kӫms̮Է]U`d\TMNS^n~taPLS]]qϾ{Ɨۿ`CCLZbhkmmqrtvwy~͸{lfe_O1   S{ztogVWamriYPOT^kzͺǬƿ~dOFMFCLSbЗ{쳛ªÜ㼰Ɛ˭ͼ[^ܼ垎~ge{vjfgYJ\|ʜm{ϲ󭈛ď㱟ÿνӢ̷ŴȶqKGXoyƿ¿öxpi]MB<:@ELW_ehihffda`bffjljbSC;861--//-,,0258=@CCB@?<:9@DO\m}}jXND;860+*)(*()$$! üѽȗ`8<]oгӥmoؼ{wuzԕQ&'Ccmbmrppw{jO1 + + 5WeDYX^`jsxqlr}ePKRYTLEFHHJOVZYVUUZ\hkm^]wqpgVON0"  &;K_lomosx~{tmaUM4Vǭֺ{ฒ}սoVW^ZZ_UV]j}|j^XVXUd˴oivǩՠgPGQ_flopoutuvy{}}ؾm`hpjT6  !owtywiZ`oug`ppUR\mѶƦɻdMGKBHXae~󬇙ֶ๩ǵČͤĪΑjkѵ⟔}be{vupdZZfsکp{өܥֶÍĬø͸˫ǶѼҸfFKZl}ո˱ÿȼ{nf\QD=98@GPYckibljg^YY^eijknhWD=>=844330002257:;AAA@@>>>=CKXesxk]UJE@;9754..0--))&&##þ³sRBHfzϳߐUT|ïzxƁH$(A`mafkosv{~~xp]C(   0FUml@KO[bhouwss{zdUU^gg_ZYWQLNelty}mgvnj`RKK6$ +  + +4G]jmjlnty~}upk_QH.Wȳå{{Ӱԭnb[\^\_ffjs~Ŀ~ph^X\qƻծrsʢt]LU`imqttuvvwz{}~ִj]hrp\<#  + %z}~|y~uhelpfkgP\pϻͽƾdLBC?Ocij~ϴǴȻϱśժǼŸؘٝjsѰԜ|df{xrt~{}{wk`\cm‡zxq̭Ηݼưóǰ´̶־d>K[jzɭۻſý}umf^VMEA@@GMU[cjhemlg`ZZ`flkmpk\JCDB;878853345579;=>>>=>>><@EOZdmrsssog]SMC@;96542455420.-**(&$"! ľµ؉OHN^ѻX:Kyvi< &<\m_^aovssy~}qcN3   +5FMYbesޏTGK]jgirzzrsy|ueZ`lvwspstsvzrlwlbZNKJD.    + +)>Xgiggjsuwwuqmh\K@$^¾ȵɜ`KXcb]_lwȾ}uiekþʼîȩlR[ekptwzxxxxz{}~ֱg^jtsaA(   +xny|uv{shfgdamhM[qƹeM@7=<965578998;;<<===<=@DJOVXYXXVRMHE=;98875389986421/.-+)'&%Ŀ̿oGK`ǺhJB_Ž|x_3!2Si[ZXlvqmu}}|kY>$  ,3DGTabf~XO\jgdlwypnsvvpc_fu}up~{j]TMLKG5 +   +5Q`ecehqrpppmie\G6 +!iŰbD@Xgc^kźxglȹdz{V^fmqty|zzzz||~~ãlfpyveF0"  + +3riv{tpqkbihgbk{]MYqҿzw}ϲʼfM@38Wnsgjt͠DZʰ˄ݺڣÚ߽~xego~wu|}smhYNCBCW`]kcSgrذǫķ޼ʷďɻZ*F_docHhߨڌüzogda\UNJJNUZ_gmprvtruslifffirkkoqgYOMJFCCDCB><:777899::<==>>>?@ACEFGHHHGFEDC>=<===:8<>=<:8653310.,+*ĿȿcMZŷcG=Póѽҙe6(G`UVVjtplry||hQ4    .=<:8754320/.-Ǽwc_zĽ˳XGCSìԻƛ}E 9PJVZeloopuy|~ydJ,  + +.@U_nuj^gxزx^Ubpkfdejrvuutonszspr~xxzaTRVRF7,   + +  1ET_eiljgghgc^V<%,ĿȾˬeG;CSZaiͮs]OcõɾU]dimpuxzz{|~~Ѵxhkx}|nQ;.%    4x~}wpmt|~y]S^qzfW^vvgewy`QH;=Oci_Y[ahνǭʢʃǧʡv}y}l]PJB;62/-%'#9>3>=A:=Ow׵͹Ӧª˟|׮˯W)>VevvG>jɷǽm[RPSTTNGGMU[acoz|{{vsvuopsqhbTMN_noc[WUPNOPONMIFB>==>====??@@BBCCBA@@DDBBBCDDDCBBEECBCAA@><:987654211˲sjlܸοxRQ[t˲ˮY(,@?Sdcdptpqwy|}|~v`F%   +,?R]gkd\^]g}qbZhstl^]kyyy{}{z}{~{rpWLSYTD.'    +  + +  4I[ejhfbced_YO4 3Ź¾cQHEQ`ajgEB\|ʾ˿T\djmorvxyz|~˾wegt{~sS>2) + + .X{zqsxf[dsq\KMX_ce_]UUpżn[QLDGTaaYY_PYoؼޠ̢Ԕݯس’Ĵ׵vngZMEA>==<865CLcaPbjF0(+ATc͜ǻԹѯ{Φ໡Z,9PiuF1Vs˽͹ڽľzfVLIKKJD?AJRZ^bnvvtsonsqnptpd[<7=<;;98766ÿħkawĜǽ֥gINhļÿj1%36Pf^_pxqovwx{zzr^C$  +1BYenqphaVHP}e`\mv{q\Zn~|~~~}}Żp~lQIU`YE.+'$  + +  +'@Vbhda_^`^XRG-8ļĴmHLRR[hkyªyL4E`ŸӿƹPYbgjnrswxyz~Ѽ}ghsw{uUA5,   (Ak}~qvnahs}n[KDC@BFKOMQpŻ}fUOLGK\eaY^gW]ilx○̜زïܠ˫೗ݧƿtb[YRJJIIMQQKFGU]pjZmzW8+!!)5U~׼۱ܹȺթjʣž^15LlxM-I_zûؾ˥s_RHFFE=97:DOUYaiqokkjjnmlqupcW-(1Lkxrk`_[YZ[]^[XRNKJKLPOONMLLKPQQONLIJOPPPQQSSVSOMNQQPLKLJIFECCAB@?=><ɯqmsٷsG[oy|{tlc]TU[begkmorrigo{}vcIFZjeXC8//& +    + + + 0DRYdZV\\PGE2! =ͼɹʼV?JZ\]v|×nE6;cøݿʱYTZegpvrsvz{}}~wotrt|t[I<.    +  #Z{pox|~p`hvzniZG<:>ACFENfzÿrULOHIO`loljk\Zbjl{Ƕնɴ٥誇}ٶЭþ¼~n_XTRQSX\]]_`\UV[`YG=J`SRK?BPWVUNMZrоþǿɨ}֢ըe7;0   $6DNSSUYXK;1' +Aѿ˶ʼtSJR]dgǥU<5Nsø̲^V[eiqvoqty{}}Ͻwkorw|qUE=3'   +  Erqmpz~j`itxodXQNLIELFMalvkMINGISjxzuqp\[cox黩Шҿ͛ȣ˹Ľu]WTVVWY^hkifdb[SW`\G/'09PWXPPWWRA7..6Lv˳𿨩˛ܵa;@Mb]903EZi{ϮƳǕ»{n_VTNF?>3015>GPVV]`YW]cekit~~yeIøȮƺļZSg^\s~ø`8.?`͹Ƶؼufbcgsylorvy{|μ੆kdivxe]I9.#  + +*P{|meaht~hY`m}ztrqrrnrwxvv|Y;?I?Pe~ywttĴɪ¹Þ¹|zsgYNFACFKNMP^mtkYJHR\ad\D&4FSOC@BFMIML4-Xû˵ؽܶZ/;JXhmV:BSqvaK71CRQVby־Ǟyi[QNNI>527;<<:>FMWVQNNVakoo|y^<# 2Z{{susokltyyxurppqtvwyz|{|{yyxxxxxxwvvwz}|{~~{wutspnnnljhfed¿̼uʯ͸oTEGE۾ikһȢ\/ 0I^afoqkiijjpsobH*  + + ;exrmehjg``ekwgaklebejuufX`frraT7    +  (?HKC=5' +BĤļɺǹUTlcb¾tH5=Vxƶºѿҷpd^aqznoqvxz{~~٭h_ishUE:/& +  -UhPSYestaX`pijorvx{}s|tU978:EFMNIFNZaZMABMW\lV?2% + '@XZJ@?EA>FRG'BĶקƽΦ컣X,9L[cU- !E\dlkaVB6AJIMVkzΩþo^QFDGD;20:ABBBELQTRLIJR]fpo|sY9#5Ywvvsolmu}}}zyxxy{{|}|{ywtsrpnljj¿θvp깄^OD;D[אYcѹǴe8(?T\bhljfefglkdU9 +    %Go{vjmokdcjoxieggbabelxud``jq{wdH.  (5?B=. #KʨĻëa`lehĩ\DEVoٿǽȳ{ma`pzppsvwxx{|~}|{zz{y{~աu[\f_G>;6+  .UyyaQORZbd\P[fumWV_lssmifmuz{|yfO;>IG\s}tzճ侪Զɲȳ°̾|y}}nWD:8BHIJPTPHIKQUX[bjll`F6;7!*JZWPNOL>=CF7#Mɹø޿ƭƬ]/3APU@.BFR^_]K848;BHMZtӱxcSJ?=@A:47;ACHLQX]]WSSTW_fop|sdN38Tn||zwtonqx~~}|~{{xwttq¿ƭon͈S02E\ֻlH|߷ϺźrA 4HU]afebcabgeXH, + +  /Pwzzvtqooqpoigeedcaaejosz{eZ`muzyY@,    !1;8' + + #NЮľϻ˸}tolkkoòpXU^lvؽȿʶ|lerznsuwwvuwx|}|zxvxyvqʾΤzfcVIB=4&  +   -Tw}^SHEJLMIYhzoWGOZjqme]YVOM[sgSJADQUdywrxǿʿĶvilRB=BOZRLKMMHHHLVainne^H94BMA- "8N\`b`WI@;>:,/]ɻŻǟؿϴi?33>D8(")7;9H]ggaRGFJMLNTj޿ýo[J@759<98==BELT\adc^[^^]_dhjuscWG3)DUhw{{tqtx|}ľ}imz}xqlKCU{ٸ׷~]Y̪˹̽|I  +?OZ[`daa_`b`Q?& +   8Z}yttxwqhhijgfigahikknwsc_ky~ͻkP;     + +  %33"Lг̷Իt]kniq~ƿiafquֽҹuktwluvxwusuu{zyxtsuu|sե~jUVK=+ +    4Sgs}vdNCFMSUWf{yof`jy|_OZhnw|zYHGDIV`l~}y{xrz~ſzgľx_E:;DSaVG;8;@DHPV]\WL;/:8;MaaL5% -ALPNGD?996- !Flü˻ͲɺʻʮؾuV=07@>BMMKNI?Ok|ws|ƿӳkSB9/.39:=BDFJOZ`eea[Z]^ZXY_`kkZOE5#(@W_k{}urv|·~qvrS>:;90FoߺйR]ίƿ~P* #2ESY_ca_\Z\VH5  + %9`}yvrlmlonliifcdhov}|wsndgx˵kG   +    + %)# ++Tھñ׳o^bjr{ĽwcgusyúǽѴurrrvuutvvwuwrx{|ym{}ʻʹ٨cXR?$   + ++?]wq[MNVXUVdwyvxh][\_k{{n[HDM\dgv~womoryξxîxkQE;8>LX`U>01459BIHE>6,%$.D[isugRA1&&-4>D?<897."8LhüȽǨέwZ=6H`qv{{tgbl}Ľ}eN;.%&.:?AGHHKQ]bb^TW[[ZVQOQTZ]XPE>uîƾh\dmyľunrmZŸ̽}nr}yx{|yvsrx~yrpo{´ɽ\<&%" +   #=Uspb[V_hx{uyznvqms}lfbhs}zy}ƺ̲ÿƺyf\M6 -CRVS?4153( "%-;M\s|qaK;0&  !7{ƿĿþ±ԻͶ}ly|k]X_dhiutqlc]ZYlpqpnkbZVTT\gprržľvgTC0$ *:CFGEEHVfldZHGDC@<;8<@GORUVUgmwvilƸлc@gѳëZ6& !7DLPSPNIC>6'  +,93+    IϹƮgciq|¾xmoiM˿ɹji}zz}~{wpsw~|qrҰϽʎYA'  +   ".?hufZciwļ}pnls}˿ɿ÷vzv||pY7  +2AGI90,,*"$,8ALZl{}kXE4(!)^ÿÿŒøñukxZB66:@FLT^f[^^^][VSVZ`hprtwԮvj_O@0"&7BEEB@FUjncVA>:654437;AIPV\_ot}~qebqҽȱԍ:,mԽĿǮ[7( +2@EJOKID;5,   +1CVzͻ{z~zwvz~}yrsmnwvh`cgny|na_aefgqŭfSJA3#   + +  +TÿƳÝxjgms}xmmfKŸ̻ͻmfu}|~|xtxwz{nuǭ߽վץaW@    "#%,;hmkmy~ƾtonou}ȷĶect}a<# #1785* %)9EWdms{~m\I8+  'Ct~nƴӼstpk]azýzcUIF@:78>CRSTTWX[_[cjjhkwսýugZQD5-%6@CB>=CShlbT?931023225:BIQY^jpy}o`TZzûýf49u~V?`şŽ̲\9+ ,:@EJEC>5-$  "6H[~}~|{zwupslkkha\\ahsz}xmc\`edeuǾͶye[L<'  +[ȹнֿkmjouþ|pnePʾ¶|mr~|{xvykx˽ŶĿucQ?)$4Iqwx}}}|δzmmnpt{¿ønWgֿ[9'  (,+.%(3=MYiy|m[K=,(" + +$#*WĻž×r^WODFUuĸuaL;/%$OMMPSYeolrvoiqŸ}o^NC5)''7?A@98@Pbg_S@92/1220-037?FMQ`gqz~wy{{qeYOSn¾όZdŖY6T̡Ż̶^;-  +(49?E?>9/& +  ';M_ª}~ytonmojg`\\YVV_jt{xsj[\^^f|íнvgWB, `÷ôԸ^lpty½xrdXúȸýx~wt{q±Ͼ`IdU + )>Y{|rkgo{v~xpw{}¼ĿºgXsºb7 #(('+'#%,;HOX_ivrdVJ=4) $!JƼ˴٫tVB:0*=Xutg[NHGB@EKUgyǹ}p\H9+!  ,:?>>78?L[`\TA93./0.,+.028>DHX`ksw{~¿^_chmu{~yweZRPQYu½ŷ͵q^f?Xϡźϻb?2!  %05;A;:6,  + + *ATdο~~{qklmfgaYW\YSS\it||u`]\_lŰǰxgQ7  +  c˺ϹϲvVkux~½vf]Ⱦ͸ľ|zwu{˹z[1/!! &3Ke}obTTV\htxtysyvvyùƾͿnc|h? + #%()*+16AMW[Y[`jywkbUJE9+  GĻƸƕodU:(#(Fg}ŷWQORZe{ƱǶ{p\E5(  .;>=?77>IUZWRA91...+),,036;ADT\hptvz~¿HKOTY_glntvvwwnbVPMNSb~ʻϨշq}úĂS\v›kB/ +!*3;>83,% + 6KZp{uokkhc_[ZZ]`gr|~ldabqʲŲ}cG+ + + ,º¦iPonxoniպʾʿútw{|ȿοŽŪtG& 4F]wȹ~w\K>7=GIIGUbu}v|ûqntdM9-" !(29AHJOXbfikopt{yn^OF?8/% + +@ɴ̿žx^I;6'5Rmyv_SZxλȵżykeZL?1($"$*17:;;;<=DLQOIEB=840,()*,/5AGS]mûָyO˫ƍPEßťpF.&,47/,(# +  +0G[hµ|yuqmmnqv}tqtҸ|^A)    +#aںϿԿªz`krzukvſú˺~yt÷˿Ƞk< +"3Klʼ~|~}|raSHEKXfk˼dML=*(-#  &+.7BLT[\^befrv{}{~}ztld[TPKG@80" (hyƼ¿εoQDE+%&,%'LdcJ3-:Q̺ǷþȤ÷YGHJLG<0##+6:<=?CHMNLKKID;2.,)(*.3:AFPVaglnptRSRPPQVZ[[]]\VKA6ٵǼȲǿnrpwrh{úǹøϾ~xvûר}T   .Inʾ{z{|z|rdXUWar¼þÿɾcJHC864" + +(.2;GKU^`cfiiuz}|~{ysmg`[XPMJC9+  J`ljozſùԵvU<15<0/35-"%1K_X9/>Ytƴ˴R<9@IIC;/%!*059?EHJLMLLJGA92-&'+/4;@CJQ[chkmq~WZZSKKT]XUTURJ?72DHJJJIEDDC>6/$&,28=BCEKU]begkv}[__YPNT\QKHHF=414=K[grýԓIoӧiX˯Y^wxŮW8 + + #+/91& +  #8Tiw̽ɻμ̸mW:+ +  p;ɿǰʭohWX]bd^SE<;Rm}~~nbktis̾ƿþy|{Ȼe! !(9Uw¸}||uj`][[XVRMGCNHIUcmv}þƸqSKFH?$ +(-1?CA9.#%).6>EHMQVZ[\\aglpru{]^^]WTRQIA=?>5/07>L[gv}\Ӥ`PbҺybQ`ȶdB$ !+1+& +  )@at̽¹jE2"  +s¾ºƧuhFEEFE?5)!Ltij´sdlŹ¼t}wǾ\ '.=ZwĿxxyreXPMIDA>:43658@GNWawŽývZTWN@%  */1962.' %/:CFHGDBAAA<60'$&(0;HNVVVSOKJNPX_eoz¾TRRVXSJ@E<8;:5148?M[jwû؂oo”ǰ}.CcjYNSYn˼oL+   + 0Gk~˼ǿĸƶzM9& + + wŽħoAA==;81*"GWZ͟Y@=IS\izr\f}ʾƽľ|eizȽ֋? + %7Rk}{zp[I>;5/+*'#%03689852*%""*8JTVTOG>736AJT]kzPJAGRJBFD@<:962195 >o|m06khE )9Xvu`^tɽ̾ſs[k}Ŀ¼Ե{- +2C\l{wrX<1/)##%%(,3J_ie[F9>1.9EISZV_WMGEDB>,% 0IƷƿw^m¿īè⹡ʿļL/"#%$#"-14,)*/5AM^p>7,1?<7?=<721465@HR\i{㮹Ʋà}x|[DD|ȸȯb?' +"2E[wÿɿȼnT=-    CȼմɩgKDQYE6+'BGKY[RQT3@GOTUSctr}qm^\yƷ¼ehoz½°ؚ7 '.=AFPfql\D3731?QXfomhaSKIIEB4+.?ʲİ\Xcgjm{ܷպ|K2%$&$$+8AFC=82.)&*0:AFJIE?=82,&%0(# +  # ( !"'*?RWcd[heXƹ²ſ}mcnÿ»ǶU# &8ZwxoS2(&" " #'-39?EP_m}ѾƿtY; ,=DJMLLLUaimonmkeZOD@CFSo~wbE6956FYdr|zngYPMMJF>2  +  !(2gźśgLFIJHVeĿdzΪ|ΨļuL5'$%# ,7?DDE@8, $.4?EFEB@80&!"+380,%#)17BBJFKhlRɽȺкvcpȻ­ŀW^C$+YȽ}tX7++$  !"(.5>J]qйȺyY8.AKRTRPSX`dgfggjdZLB=;?QqjL>E>?M]bltqf`VPNOOOI9'!%&$$&Kïzw{ž̬zM:;?;BPmۧ¿qO9)### !(19BHH>0""'16<>?=4+#)-*'""(05?L]rnB3/6==>?>;T\dhpºĻĸӻʬW8!    +,G]jtx¾uY>+ +D;ʾϼiC/ !(-,*N^U>%#%(%&',.19EN?:/0*9diQ³Կ·{pǺɮϺǮfOD:Db{y_@4.'!#,9J`wмȻǼxV4 3GSXXSQRUWVWZ^agbZOGA>AQsoSENHGR[X\`\URMKMRVWRD0:aſO34>@?F_ſȽۜνˮnO;) %&"#.:CF?4'!%,/34-$""'%#!#'.49CQbuS;427BFA>CZbjkrüǵʹa>#   '>Xjt{yο¼hL:,  YŻ¼Ѿ~YB#!  + "496+Brp@#/02229BJD5&%2ekUƶҾű̶ɼ}xmuŝ}fLD3* (:Mdz¿ֻrP0%9MY\YRLGHGHJNV\cb`YTOLNXxrWKTLIOQGFHCCDEHLSZ[ZM8   +").?RpĺT66AHCDW{ŷ~ݬrhͮ|ѱxeK9'$&!%08;73.'!!'*$!"!#&*/5;EVhzڨs]K94BH>?LainosϽÿιlE& + + ",@Yp|˿w[I:& +$tźǽĴúrX/031& $K]I9?F=:Hsa (/<93.++.26)$(4lp_ͼƾüǿ˼ŷٹq[T@6( ,@Tl~ƿԾ;ʵ³mK- /BU_^WLD<>><=@HLY[_]\YVXdyaW`ZUTO@::5;=BGNTZ]]R@& .<@CO`jw|X=:BIC@Po½ǹulqؓjyǴum|̭û|gTD7'""  %(,-//,% $(-26:AN]n~㽔aC4AG=@RfnrsvͼǺȸɽǿƺѽvM* +(,,-05=K_v¾ļiWH4 +=˹Ŀǹʾm8@MSM>.!"-0-*Q©l\EAiՇ)!*03478:4*  (5osgоӾگ|idPE6-)**)! !! !$#0D[rȽź¾伢³gF- 7J]daVH?<<;64379LRX\[ZWYmmemnfdZG>=8:?DJOUZ\[SE.%D[mszƹzT>8>D<:Edtas٧jfpW`p}æiSC=2&  $',/.)#!%+06;>BKXgt¿˾P.BG@KXrwywzĿūY: 5Nad^[]_cisººjUA-![ŴջºëSFJ`j\QMPFC3+%"@࿐tZ@Fۓ@24@GCED82& + )GGLQTSTY]VI4!:sʼ~ZHDEFIGFGRk¾~pf_vɔpqyyhIPZdM9),&"   $)++)("$)%,5MXuz~~ɿȾȯbB   %:e|v~ƾwdS;(  +0vʹϭǷkZQYbbcgeWJ20:CdɣrPH\ҒNECNXURK;&  2Ltzxô¾ʶ¸zkbUOKHD?98=BIICS]v}Ƚ˶lJ' )HftbD.  Bť˹ûɲp[NR]gjh\L2:VhIJsJ[̙aLFMXXUF1   Aczvx¶û񺍏ykd[UROKFAAHNTSLFNU_hvʵvgn|uvػǿÿ¾|hN4 &@LXYXY`kstl_YZ^^akrqljhk~vg]kotrojjknnpqnc`^[RF4)+?W{pT;5=GMOVTQLQ`qz}uod^X@JrڪmIEhdMVwiTF8)'  +  %()% #&:AMXchlpsy}¿E1D\ewȾͻyU0  (6G^syzƽpO6!   VǿȼҼвr[U\]WOJC0Dizώc}էxNAK]bZF* Rvypy¹²ȿ鳆wibYSPNHCCCIORUQMX_fnwȿ¯úëh_qxmjrıûÿÿuj]I,"&BMYZX\hwxyshdehgipurlkpxtaot|~~{lea_RB20=Tj_ny~hK1+4>GLRTMCAPdsy~|unf`ZWT>Hr˿e@^{qhvs`XSG;(#  #!$'.39?[anzЗS:H^l{ȿa9&5Rcheabxolikpnjgw|\B,   +9nľֽ¿»un_MB@;+Abm򻐤⸉KCUt~qT2 + + $`tqĿ¿ľÿ⬁{oh^VRLG??AEIMQTT^elr|øѴӼfX`zyuj\`{º¾½smlbD,&*-BNZ[[_kz~}~~yy{{xru~l{}kb\`TG??DHNUZ_hknuھɶqKMe{led[KS¾ľsfgeQ<322BMX[\amxzuopyx~~lb\]VPKPSLG>CJQQOSY]VSXdjjfd`ZW[akqx{~uprv}o^QVA/#!#+4;;6.2D\jmsxz{}}yurrtvutrnjdb^\[ZG:6@ejW}wf^XOA71+&!  + *16:@DLSarº鿃]JRqͼvD%'>Uz|neiv~{~wlYMHUgr¾ƿybL6$ +  2ƿҼ~ptwr͞cKK]aV<# +Dyh¸zǿ۩sf[TMHCCFNT[bjpwtruíҹ^?Imrfe_VJRĿ¿p\UUQG?98DLUY[`ktxng^Y\fwy~xqpimqtv}}lc^[UQNTTC3-2:CD=<>?63/+&'/20)%.DWbejlopprtutuvy}~}}~|{yvrpnmnpqpmljgedcbdYA.+;jnyk_XMB72/,(#"'*.8HVftŽȒiKQwĤ{L(.D`vrglyxuz|theo~m`]G?\~srtlht|ɸÿ¯~mTFEOUQGABKSX[^di{xng[OC;43:77==8585;HT]dty||se_[RMOG?EKGFNX_aZQILP\kwztpoihfiotxvqfZM<'%5A?6466- '1$ -63.19:1#1CLPSUYYZZWUTVX\^`aeb`]\]`bcfghjkmmnooppqqqkkjjkjjjmmnpqrttuokdQ:8DuՑ{ųm]M@5*"%'&)+(!!(/;BP`tѐW`xнzknuvpieilpstngc^`ensme`it|~zyvsnotwqbWTYblwżļn[L=) )Ǻüɼ¹ĸør^NGIJgtxƺ˿ƶٿpĔ{v~xtutw{àŤnT@[{w\PLdľſývc[dhX@9?=FRY]^\\amusrofYV[`cb_\^^_`]WRYcVX\__[^fejjd^Y\]^SNC=IX\OV\`aelrwtuwwv{wspnmnqsutqpohaYG<4-'%)(%/:<4%':FIJNPRRQNNMNPRRSVVUUSQSUVY[^adfhhhijklmpnjifdddeehikmoqtstpmlaN@@_鮌ó{pYD61+&#%'$"$'#$.>LanܢefwzxlZOYepsi]S^rxf[\a_bbcm|}viWPPKVcpüoZG0   AμĬǾzĵýҷrʗ}t}}~~ȷջ޵~{|}qZKHm}ttP5GnȾĿ¾zlciiU<7@?GRZ_^XUYcjihe`W\fqyxvsvvy{}yxz~urspj^XZ`ed[TS[^_VWRJMSRKTYVQQ\emklnlilrvtqnpx{rponprroqnid_XOG91*&!!&'#+56.%6@AEGIJKKGFEGIJLLMLMLLMMOPQTX\_`a`abdfghjiec`]\^`a`acejlmlrmllh]QIWeɬthR;,(&&(--' *5@Oewtmwío_OV_hnle`n~rXOV`WUPScyzn\PLLT`kx{ÿÿhQ:) !`ųη»º¸Ӿƾǿǿ¼ϰy˘|s|{ӾҸث}rwyvvvn\KJUz|qhH)Q~¼ºznec^O<:CGLSZ`^UOTZ_^]]^\fq~ywz{|ztdXT^ecWOQ[^b[a`WUUSMW\WLEINTTZ_^ZY]^][VVZafqu|}xoklnppkge^XRKE?92*%$),''+,$-79>ADFGFEC@>BDFHJJIJKKLMMNMORUXWVUXX[\^^__][XVUWYZZ[]_bdgffioonh\PQF~­nYG5%#+12-$&1G]m{辂ttųrkiimjhhksx|}yo^RPUX^^[]ixz{n\P\ahmstne~¿s]H5#;ϾζӾƿ˿ηǼʽķõ´༊œ{s~xw˨ӾϠus{xpohYIHVk~rR?4dʬɺƽsmf`THBFHPQTZ_]TKNQUTTV\`ozwolrxsjhlttprqu|zn_XZdcUMP[^g^dg`_bbckneTB869;AHICBFHHIGGILPTY^floppnklmomf_WPF@:64.,#! &/+&$$(6:7>@DDEFEA<:>AEEGIHIKLMLLLKKLMNMLMNOOQQQTTSRQPPORSTUVY[_`_U`mpqm^KA6aɨzeK=/""*662(!,EUq̓{sʺvc_fl{yxxy|}|uk`ZUPLKX]a`hu~}ylepswwxularyƽ¾hVB-S̺ҼĻȾƸɻͼ˼¶ͫ}俏yt~}zzŽǘxughZE9Hfzo76Kr}¾zeqм¾xjkolXJOWUXUTW[ZQIJMPPOQY`nv{scYY`mmhc`a\SZ\ftxn^VS`aTLP[\d[ekgehjnuxo[B1)+-4;?:<@BDEDDDHKIMU^chkifa_`baYSHA91.*(#   +-*%$#$&/9<:?BEFGFGB;8<@CCDDEGIKLJIHFFEEFEDEEGGGGGGGHHHIJJLLMNORTVWWHTaejobL81Iuաx\D6)!"(210117EVyמtŸleinmrzrgabfi_OFGFPURVg~rmruxztilpv}ļѽ̾¾ŻzhU@/%%'$dIJûýǶɼº°ʺϼɹ˞è߼{tzy~~ʸǘo^_L2+Hrol$0bx{u˸NRvƿ¾ǿ~nclwzaR\ec^XSTWVMEJLPQOOU\bgh]J@CJitxsjaSEBDSelbRGKY^PHPX[\Xeqlfgd_hol]I91-/5=AADJHJJGGHLOJPX`eijiTNIJMLFB;5/*&"   + '.-(&,--/6:;>@BDDED@<:=@@@@A?AEFGFCBBA@?>>??@???>>==@ACBCCDEFGIJLLMLCKPO[jdO7-6]桀sTB1&"%'%$&%+AA<73/*&"  "$%&%$&(,1489;>?@???@BB@>AAAAA?>==<=:<<;;;:;=>>;977>978755:?CEDDCCDGAAGRUL>%%0bͨfH5,(%!!).>PezͤŻ}ndkyynov|}yocWU`heXNMSOKD@IXbbQNHCCHQXa\Z`kokeppmijrɿÿȸ׾þqda^UHBQȺĽôüȡxjżóƹ˷Ȼ˽ر{u|~|vxwʧͶáw_LJ;)1c~\F3O~}w~¡hKIYqÿzjZY\eiijheZUQOOKE?BIJIILMKOJFCJ]pxbIDEGOSSPIQPGGPPJRX_bfg^QA=:;>BDD=<;=ADEEFFCCEHIIFGJNRSROKE?<;:51,)'%$%&''%$'-/235799:9=@BB@?@A@@???>>><<;:9877;<>=:766:5578559DIKJHGHHLHGJPOG;-2?CHLMKIIC<9762/,+**+,.030,'" "" !%'+,01367767:?@?????@AB>=<;9866;<=<9778:76AESX[ZXVVVVVW[][SLFOXq~eM=/""2BOxԦŶxtuuxzsfbWE54CU``c`ULJMNVTME>@HP[abZNMWbXSMNWaddlic\Zaq¯¸庺ŽzjfsƽβĿ¾ʺ̲úþѾƿIJ;ͿŽη˺ξљmr|}aWԽ˳¤sdRC5&+Myg34~qj{b]]g½¾}lZLJRYaf_VMHEDFEB>DIJGGIE@E9&$ &5CMUXLMMKMMIBKMT[`\PD;4-*.7BIZajmh\QJA:2**+/0==ADIIHE=840000/00//02445430-*&%&'(***('**++,***1133565459<<<<=>=<<=>@BC@?>=<;:9;<=;9778<9:@GJPYelppljkicemqtspmkw}}hW@7--=Vn}ңzsttz~}vfZVM?14DUa_b\VUXYT\^]UHEKVnmg\RS\fhbYX]fkkiha[W[hyɻ{įÿúwwûʰÿȹľĿ˷ǽտνǸƻxӖdnfZ˳κ񶙑~oaRB0(;`~jZ1>xpr^Odqv{}}}ľƿý~m[MFHJRYWPHCAADB>:BEFFGIBBILGA;>?BIR^ioqswywoc\TME:8575=;>?CBB@40-*)+./22234655555540.-,---,.1344422/.,134323223578767865557:=>==<;;:999::9656:;89AMXcr|y}m\PBAFMc΢ʻzpkiny~zmZLBEEDHNQSS\]Z`hh_`bec[SV]uoeYRUalph_\ahpqmjg_XW`l}̻Ǫ{rnpp|}öĿʱĿżͿͺû̹ſ̽Ǵt՘fvpfѹ출q`N:)0Rr}~y[L>W~rvbJYuxyz¼ýüm[I@;8>GHE>;:BDEGIB:G=,  ")5@GLMNJJJE97;?@BFE@=<;;::875445787459<>>?>?@CDCCA@=9657896400/-++),.34532.,)(&'&'$#"%&''2DYi|q_Z[kʢ}kc`bemlaN?5AKW]_[PIH^jd`flle\_nxtf^SRND?H[lvmb\\`eimnlg^YY`gwտǝ~lhe`fpx|xɳ۽ɾŮƾɳиĿƼͼöƲżɻuƏn̲_90*Otwq`A8`xh_cmC3Hryvuzƶp]F:." &&+3=A<96;>BHKC9G<)%4DKG@HA?A=866552489=AEGFFFDC@><<;:999:;9<@B?@CIJIIHHJNOONLHFB><89;64..,+((%)*000-,&$-D[mwmpxøud^]__`\VQKFMU]][\^baxx^Q`lia]an|~m]PW]UOTgy{pgabiqqpoodWQT`p˥mmoknxtxѹϽºȷƸƽɳľѴ˱ƽƵʽ|wիvյǴڻW?;IkwuaP:@k~vmdVD3+0^zwxteN=,$0:=:87;=?HNH>@Wrz}|rg[Uc`]TRQY]glvsnghksssqld\WRLE@=94025;AFKRUYTOJJIFACA?=<;<9621//*'&+-.+.)%!/EZm~þ滤l_]_`cif`ZXXab^WV\fnhto[T^heaags|zlbY`d^TVfu{ti`_bgmmprri[TWdo~ѹ|turoqopĻƹɺ˻ijýźºѳνĺ¶ſȽƹ¼v|~֩˷Ͳk^hn\JA\yg_S:' )Kzuk̿vhR?.!&188769:;BIHBMHF:#!1;;33=A91+$!2JRXVKND=>=C[s||yn_USUWXWSPPSV`fkjebeinorrpje_\UOFA93.37=CKT]bb\WSRQLIHFFEEFHINQX^cfghklmprqnkhfb_[VPLEEA=85210,)*.11//*&#!2DXkzĽݱɺtc^_agkqqjdaegcZOPZfnhibXUZ_`chouurjeahkdXWbounb[\afjkquuk^WZgn|ʬvogrʰϪǾʾ˽¾ŹÿǺ½κȳx}ɺýĻ·ɱ|w|yͿӣ¼Ҹ|Ƭ_NUv[Q=8sulǼzlUD1$)1685999I^twwpaODGLQSUUSQQQUZ^^[\agkmstuplgc]XOI@9469?EMXchiea[YVRONMMLLNOP^ahnswyzxy}~xsqoljgb]YROKE@;8663/0242/,&" "(5FVfuƼ٪ñkbaabmmpsne]\[[WSUY[\ZXVYXUX]gmrpkefgnrtj^\ft|rgcfloqmsvwm`\^bkxѾxkf{Ѫǰż¿¶ʼǿ¿ƶɶ¸ǿɮ~~̜Ľ̬ȩȾrivz[B()\~|o[G5&  %0686;>==AJNWZd_PQ]^ghkmole]FI[iaYULI>54?PeturlaSJGHMORQQNLJJMSTUW]ahipqrmjea]\VSKHCBBGJPYcipojgc_ZVXWUTUVXYgjqw|zyxutrnifb_[SNHEBC>;9:74/+#%.\~˻|q^L8' + '17859?@>=CHRbwubalovz{utvrkV_tycOICB;57E]pwwof^ZVQMJIKHIEDABEMOSRXY^`fhkhfca`a_]ZZXZZZY[`gjvvusmhdb_]\\_ademov{~}|zvtpmib\VSPNIFCC?93,#  (5BQ\dhn}ƼנľŻ|mc^ZXXONUVQKM`dfa^ZVSVZftsfafruvqlkrytiiv~|}|smjhd`bf^`cq¾ðþƻƸŵùʷµëɵȻƱ¿ͻyМ˥ƿԽƿsE7iƶ|qcO<)  *38835;?=9<@Jluq~u|kSKE?<:>SkwvteVPRVURPOMKKIGDAEKOQRSUVY]adfgfhijjijlnqpnjhfilvxzytokh___`dgkmsu{|zupjfbaZWSQOJB;/&#)0=JV_bciuĿқȿø}l_VQNNEBFEAJWkqwrnmnotv}}roux|~wnmx}{maYXZ\bebZSbƹı˿ĹɺϿƺӿͿľǷűĿɹѽƩq½Ļļ~Ԯµ]/"8]~ǿ}rdQ=*  &178314<=8;?FhpWOJ;>@F]uznh^QMPTTSXWVVWVROHJLNOQSUYXZ]`cegiklmnsy~}ytqqrx|}yvtljjilmpqxz~zwtsmid_ZQF>0' "',5@IRY]_agt͘½ʿ|hWLFDIB@?97I_uvwzzw~gUIGMU\cdRFYt|ַɷ˿ʹȷȻơͽı̿ƾ̾ɿʵĽܹm䶙ž۲ȸ¾÷ŻG"4`{{|ɿyiWB-   "-37402;>;>DK_iTMC9=BI`vvea^[[]\YWYZY[\[TOMLKLMQTWa^`^`bdfehklpw~~~zwwvvz{wqg`QE8-"! !'*2;JSX^bdhmzֵѼƾ屺Ɩ¼ǹp^K?@IQJFB>?SjsU?6ObomfZ]bca]YX\__^[WSRMKIJMRWZ`afhjjfeggghnu|}|~uiVE80,("$+27;@Q[ckoorxǫƳȹֻ۰Ö¼ót`QD?GQ^VOMMTkbI=<=<<;929gŰϷĖ¶ùмκȻžŵǸԽ|uϠȵܹþƹĿ׸ug~xy¼ubO=%  $-,,157:BGGKSawue]XSM;7;J]ijd]aefc]XV]^_][XTPNLLKOTXZ`chmopmlmlkklpuwzl[I>30,'#! !%+3:?BHUamrtrt{ɱʻúսղ޿±hSFAEQ[fZQRXeĸpYKD;2.+/1:Yïȸš~zùɾɺ»׿ŻôĸʹŸߺf~켈ï߿ż˼βto{úveS?&   !)(,279:@BDILS]o{i[UUTQA99CVcfdcfjkf^XUZ]]^\ZYWUTRSSUXZ`djqvyxxvuronnmnux|raPE962.+***-29AHMPU^kvvojovԹȲ˿˽оǵۼkUJIKT\`TLR^n¿¸u_RJA71.1:CXvۼĞȾ÷Żʿþ־ſŽúƽ̺¸؝q|vk뾭Ǻ̾sqȻyhWB*   $#*4:;:>@@GJLMVjwmaVQONKD;8@Qafdhkonh_XTXY[]^^^^]\\[[ZYZ_dkt{~zvqmhhhkpw}udTJ@=:74455<@HPW\_chx|tgbmy}}ӷDZҾÿ˿Ļ׹Ŀ¶vbYRPPQUMKXhwȿw`TNIB><>GJLGGPevvja^YVSNJEB:7ARchgkmomg`ZWYZ[^abbcefdcb_\[^birzxqlhbeinrwz|vgYOIGDA@@@AKPX`fjlprl\]m|xu~ֹdzž͸Ѳÿſ|mdYMDCDBJ]pgXRMIGEEIRbq|ʳʫº³ò¶ƿźοпƽǿнľӳܽ~ջȢ忼ƾʪ}p_K0 +  )4<;89<=FILF@@GP]hni`YUNNPUXVPHA;56BVfliikmkfa^[Z[]`behijkmlhd_]Z_emv|urhhhhjmprw|ynbZXURONNOPZ_gotwxy{gUXl|zuvų®ȸij̾ıˬþżzmeXG;76:KcxsaYRKIFHLScvĥoirϿʺȼü¹ǻŻ½ͥƳУխ¼Ϳ¥szӼ¿tdP5   "!)5;:68;>GHIFA<99;DHF@>?FEDCA;5217:758<:HOUZUK?5*'2F_mnjfffdbbdd_^abfjnpoqstpjdaWXZaky{slgfhjhnuz}zvrpmjhghhot{~aMP`ju}Ĩ͵κĺ̻Ըν¿ɻwjaWG8/03=Rk~rbZWSOJITg}~whY_qyidY[ivztsȼǽüýμƿռùƿ¿ʱſ㵍ڳͻǽ{~³}lW=% !&%$-266338=??@DHHEB@CGJLOQPUUUTME<4%(6Mgttoghhggghgha_aekmoqqrvvqmla\Z]bkz|tolifllnry|wtux{}}WHSQUh|ϽؽжθǻvgZN>0-/5>Pfzzjc`_VOLUixjZZfnhb[]fklltøƽ;ǿɻɲwrrȵ˾ɾ;øپѰ­λݿ}{ʾp[A*$)+(,045238;679=DINPSWY\^_a`\WRKC=84//6Kcqtnjkmmmoonighgghnprqtvwtrqid_]^cp}|wsnkllmpu|}}zRALOXkȵűžʸ˸dz̰Ǽn^O>214;@Pcu¾rfbc]UOXp{oe^_ingehhb`fuȽǽп˿Ŵнt]X_}ƽ÷ùŹټ}ƭǶԼw{t]E/(00+.26421351259@HS[aeghijljaYLA7343823C[mrqrrvwuuuvmnqoihlqqtvxyyyxrld^YZfs}~xtmlklou{}tI4BOf{½ҿ̶ĺIJɲؽ˫ƾ{gVF:6:@EQas¼wbXWUOLZwyuojp{vsqlb^fx¶ǽƽȳȲĻͶrWUcŸͰ˼пå{̮¹ɵvyƽu`H2! +22-/4874.+)-/46:AMV_bcdeddb]SF91-13:10)=[~ԿɾһӾǵҶͭžp^N?88FLTbvĿ|\LJGCH^yy~zusnltӼҿƱȻɳsZ^rϿ߼ø˻ܽxxϯɾ}}¹vbK5#!*24//4:;90)#'+146:BIRSTVUTSRQI?50/23;308I[eglsz|{y{vqqqmiovzz{|uj]UYatvsmhghklsvd5&AhȻ־ҿٽĹҽжҴ¾ŽxdTE<9IPYfz`KHGFSnɼƺ{uwy}͸Ÿ¿±Ǻ²lUd{ķϲǺݽɩnͮžƾǻygQ:$#%,3887;>?=4-%"&+/369=EGGGHGFC@=843246>:79BLUXir~|yyundjt|x{}th\YZcp}unjikllowX2/NvƹοºǼչʿ̺Ƴʴ׾ǿ¹tbTD<:HQ]kĸiRNQQ`Ľ}|Ŷ˾ĺƶždRgǺܽĺʺŸߪϲη¼űʾÿ|lW?'')/7ADIIFC=5-(&$%(.133:<==<;996542358:=<=<>BJNcn|zm`eqzxy~{vjb^Zdtwpnooilt}{\GOpοпŽ;Ӷ÷ƸѿâŽkXK=66GQ]lùoXSTVdǫĽaQk¶»ñèĸƶŸɕǪҵƯĸ̶ʽ}p_I2",568AJP]WPF=5-(.*((,..,0133221010225:<>8;?@>BINZdryxvy~xmjw~z{xlfgls}vsssglt~kdvнͻϲʺ̿ʴּÿȿtaDBD5:I]mľy[TZVj̿˿ǫǹɷŪ_SlȻ֯{ϿȾúϥ~ǥ¡ðοĸѸĸÿÿtcRE>EEOPIRchhi^G;:7/0,,,--)')((('*+,.06;>@A?8;?BEJNRZ`ghkljch}}wxupjhq~zpcdjplgsvxnpsou{wuzvɻǺƸδͻѻ̽¢sQFE97I`t»_UVXnźȼ˪ǺūĦc[y÷ŸŲĽż鸣wu»Ŀ¼˵ƸĿ{rh`[Zafoi^iupgeZG=><3310/0-*%"  !%&/28>BDEB;;AEKPV\biljkie\Hk~}{}l\UWWOGMOV]YS]m}wqsmpzvuxz{{|{l¼̼ȼµʰмվǻã¿ÿfPJA9Lf}¼ǷiYU_züö˧ɻһhfͿ~žµٳԻſ¿þԘ_ǻƾİʺÿ{ustvwswd^TE?@>98632/,($"$049?DGHE?AFKQX^dkqssrqmfP{~}s\C67=>=9730+'!!&(37=BGIKIGHLQW]disy~uκznnYF/'0=HKKJKH<-(*4G_{yvhdpx||usuy}ƶ̷ȹ־ѽƦĿļͳlWQJUo¼üzxuttpszyb[o˺Ǹɬļ¸Ʋžǥs|õưڻگ־l5[β}~Ľw^OICBDD@?=830*$! !$*-5;@GKLNMOORV[agmx~Ἣd[U[SD1,4CMPQNJB3#%={|ldmrt}}{{|įιɹͼӺƾȾ̺Ƨǿþü{^URWp{yƽzpkcYSIJQZhzycap̷ηɱżȿǸͬ}ŻŽƸ̼ܾġ[,P{ͯ}u[LFBDDCB@=94/*$ "%+18=EJNPRQUUZ\`fmryѰmig8:CW_O?9ALUUTOH>2&(prinont~ϽҾʽʿʹͻз־ƽôƧǿ¾¼l^[Zn½wdZUX`jū|tminpuz|iltʶɻȳƽĻѴʽúԽijſ寙ǪݧL$AlίſârYICACDBA?=93/*!!"'-2:?GMRSTSXY]_dkrxyٰùUS~]*8JfhWF=DP[]SKC:3-'#*sxorpjnyտdzɺʽ̼ϻ̳йŦǾ¿xib[lüp\PB>BJV_rͷrwxʸȷǷȿȴǾļԻºοþΡг€ώB %5m±ί}ƸrYHAADCA@@=84.(""! $(/5=BHNTUUUYZ]aemv|{ׯ̶oLNl8HYuiYB7:HTXOG>50.+''%:}svqikr{һ̸ҾɻҾɯ͵ʿõ¥Ľýÿlii{Ŀy|w{ѺԽ¯ҾýȸŻìĺǸ˿Ǵô۹־Чr4g~[nɹϴøɺpTG@=BFJKA=72,'" !"&-48BFKNTVYWUV\djsz}ɛ̺p[=Wz[KXUSC;3(%"Euysqpqy̺ҽijȺŷؾ¨ƱɻżijpivδĭǷλǹ̻ȼɴĹ̿ðƶȺٲޟOY|`Spy̲ľ˼ȻqSJFEGGEBEB<4.)!!"#%)/6:AFKPSVYXWV[ahqw{ļdP?UsU7GdcBDCBLSTF<0!Y|qoqlrzկӽųƸñ¨ҽϾξϾҿļľӷuk»ԼƸλ˿ɴ˿ǷȴǷǽҽ¶ƺǼйľ辠ٲ׼؊.PsnΰþsXPKIJIFDC?;62.)&$&')/4:?DGKQTX\YZX[`govz}|P;ATiM2BeX4<<0:KUK?0"'svrtadimtܬɳƵűªι˵нº¿ذ~yӿ¯˿ʶĭõ½ÿ̿ɿýŰޥԤ๯s $=ɬcbв»ĽrbULGILOOCA<850+((*-/5;?CGJMSWZ]\^\^bhov{~޴zphE2EU_I3>^}~G*32,7JLG;," 4|zeeddgq}߿dzεƵϹ־ȶȷͿϼȾѦûǽĸ̾ӽþγŲɾƹϷ¾ҕӹ̪ٹ̚O  +# XUFvϱ||ºǻwjZRNNOOPHC@;6/*&./48>AFHKNPSX\_]`^aelsz«r`edb\F9KWXF5:Ra_B2304CKAB4'"'F~ypgcdjmu|­ѱԹɻǵҺóƿÿ¿ϻƼͥǾĺ¹θдƹʾĻƑůθźŮh, +7v_M]ZQB@UZMA68NPLC;5/;FECF4()+T~tnmopvz̰ԯؿüøлƻѰĺ۴ɵÿѹĭÿľ¼̪IJƸ൒i]ͅ8' .n5Bӯywwepdz~|m_][XPF<337;ABBA=?CHKMNMQQRRUW\\]_eowf5AZRB:B`]?54:SNIA;51:B?GL9.4$4ZӶӰŮƿĺӼƼٽĿŬƳѾʲļƶοͳҸƟԿhYp[  & &ies뿋i_lmpĹ{~иud_ZVRJD=<=?B@==BDJNQQQPQQRQSUXY\`hr{ôf,7UM:8Hi]6+0;WPN<676>C@DI5-8(9]ӺϮîþæĺȷĻÿ˻ɵӹ˼½۾Ӷճf[k1 :hդvUVYqɽ{|¼μȾ}ph^UQRRQMIC?=>BFJMOQRTULNOOPTZ^`cjt}ı|kl6?SH79Hwd"+AGSI803Q@.2G{d!'?K[R:-/~l''F_zsF'*+*;~r1&.KdwF'-;INJ940,)8\{ǬȬùȽĤȽþ¹̿϶¿̶ǨȷŸƮqdr~՛~َԽ+ +%9CY̽¶{utvxz||rw{{Ѹúļ}wwurnha\Z^^][ZZ[\]^elxĻ~gi]1.aU*C=/->ws914L`|oB(2<=;5IlϴҴ¼ȽťýǻĻ̼}ò¿ιü¾ʩͿʿҺq}Ⲃ}ܼЋ@ + +$(B÷~zƲxrmioxysswov}ȶƺȷƿyrrsuwtnh`bedbaeimt~uQHgi4&UK#<7,1Hjo=79IWoc<,8=:9EPe[8.<<7LM*#J>!2'%AZbXEBLJHOL<5769H@ #2('Fb]READGGHG;;=8798B4//4Vy¹¸ŭ¿ĺ;û¶~}ɷŹ¾Źȸû´őǻ٩tЗؐu}w&  -eҮ~mSKʻƯȹnWGITpˈmüſȽ{ҽ`L@63-#QG%$2'(Jg[QIB>FLC?7;A8455?5% .Khv~̿ǴĭþĹüĿ}}~úýôōǫݬ}‘қJ  0r`IHśe[ҼdWkɲnZJXt{ľ澌Y.220-+XM($0$&GcVMH?6AJ?<0295377>9%-Iaxwu~ͼíþù»ȷÿµɷسÛͬ١zm" ,sۺvSTͨϱs^F;32E]̲}~|ÿ»ʑnP'020+*XW/$-!"@WPG>2.7@@D,%,.4<>;9*%;Vrxqu¿žý»¾ȿûǿýԽǽʹ¾Ŧ־ڵxI  + *pݩǪtT," )*-2zθᰣwZD-0--(0g_2$-# 8HTO:.24=QT5#%(2AH8658IjrqxĽüؿ¾Žż¾ºĻ˴¾ǶŽ˼۶ڣxнҋ&  /s¦nTH=,/,,6@?3'Sźا½qS<1.)..8vg6&/(%4>][;.>7>ikG.)%-CR;6ENSvvptyĽ׾üƽſƿǼį½žǼͪµƫٴڞpǵ֫^  "  + 5wȴgO;+*3269:?IK>-BBA>;:=EKGACLH:>Mǵ鵢utbG0$!#%%&)/24301B]{௜yeC9BA9/34!5qo2(0-,'/c]0!A44njVA.2O`JFVXMbų}ƽIJÿ¬ÿÿĽȯ¾Ǽ¾ٱ}{Ƽݡ2 +  + 8|γt]I8./>BGHJMPW[_WMHLIB6>tİĮ¿Ļsc[ZWRIDBCCBABABBEFHSW\ahq|벀vbTlkH64142 3lk4(.)%#_W+ >71\qp]@17M\IJNHBUŶɿŵíº¾ŸλþſĽɯͿ{ľƿúּ}a  7{͒na[C9359=DKDIPT\`gmsm^OFCCBC?N{ƥȾjRFKR`bdjptuvqrqmikrvsoeYPR^hy|ȌhhS9JJ1)+5MD432/ee7-.*%]Q*#?<1GXrb;19EPDGA68L{̽±¿¸Ҹ¿íúýȷþǿþſԼ¾Ⱦɿıypt'   5z٨lhsp\IEGKLKLMRX`ekouw~qcYPGEFEC>a˸םûufTMVemqyxuty{z}sieeea`j{ūd23=.&$5UI300+[Z:2//+YP3,AA34=j_44?AI?D5&1Gzӻ̿ķѹĻ­ùĽ¾Ŀóÿûſͷƛoqŷʮyz~řwkϙC +   4x̲vvmjhc]VQM_fqy|~~pilbPEF=F;VޞķwQFBSt{p]STcw|m"52"6]L0+0"(PO=7/20NK>4:A6')XQ/7EDH<=++E{ӵ˱ɾǷ¼úºµſ˼Ŀ½½˴Ǡyʠt\Zfrٮr?  +  +2wĜ{{}pmjebfjmqyvtwgG=CGF,?{䮢µqXLFN_xtf]_jvxݯ^ -/:fN+'3()HJC<-21:BI;.8:&$A=,6DCD5.#(Bvݶʾý¾ÿùӿêſŽteafxܺ{˼ֹU + +   1vϧupsxzzw_HWy|nKWǬĿ~cOHcr¾vg^_o~~~xВP1+!$.)/@tR&$;70CGNF08: !5YD+G73!).482*&4ZpĴϾ¿Ƽǽųƺ{zŷɺDzß[Do٫_  &lDzn`ZyƿĴj\cyýfQMPtzywW7GO:,1GvW-.53<9A]G472-".OC!:=:.# '066+)&"&0CXtõrƵʾôƼؿ¿Ⱦůɽɼzu|ǻȲȩmRtH   +  )pϻu]^}xĻyjhxǹ~eOCYi~}trٱwTOw\54604,DfM2561#:A/#&'465.&&/9U`cYJLd}ʿ̷bE³̷ÿŻƼջ˿Űʿ~vx̹Ÿ¾ɹóѳƾξɻm0  + +    6ʽþr]_ϻҞxkɢn`pýnE92Mgm~nqʼtM9ISPD=Qu]735/4*@cK-088(&>?.#""*0+ @Xo{}{ѭ_Qź¿ƹ½¶Ƽӹž˿ŷʾxvzű¿ɿǼǾ»ÿ1  + + + +  9̸iVf˳ōeɜvd`}ĭ[9)2BS{gbȷmM=FOVL?Np[72307-AdL-/6<47G1!#+9J^msxyrɴhu¿¿ļżѷʾƼǿ~vrxмǻ¼½µȿɾĵ` + + ;ùxdPa}~f|qkgsſ²u@,')N_U;ChX72439.CeP622;= *F3(6GMJFEZuůn~̽ɹýκż϶Ⱦɽ}sw}IJƱ˾ǿſªͻ~. +  + + + ?IJǾwi^[k~ldqkgfinoprr{z_coU<'';Xl˾ZB22B_X8?`U97958*9]P>7-7BE9 +!*0222CZxѶtiĶ˿ɲżε¿ǽ̻ȼyyҽȸÿÿιžéн̹ݩI  + + +  EȮŽqg[Vj|iZUUc^YY[[UQP^m{񵃅xrS_vlN,C̷uTH4,:]_@J[T<;<76%-QLB<,6G.C< $%%$ "2AYlos´»ĴĶɲĿɲ¼óò½ºѸĶȻq"  +  + + +   +Gžʽút_^`f{pfhgdaaaaa]\a`_YUUZ]dϸݹvǶtYNdƸa0!+ȻkP:807Q^UKXFIA@I2%GMP6 >MO,.2 &(&%()&2G_mwھʾúĺűɺļÿɱ»̾Ⱦʼƿɿ黥ƶиľّE  + +   KѵǶmdpz~yqe\afea]^adb_[WQHASavʼ֝yϰvZGPsùj9' (źkPA@9?WbVHIHVG9A2$ 8LY9)[zrI.C5$&2BP[ipqopvŻ̼пʿ˳ɻƾÿȯ¾üϼžɽֻۼg  + +   RֻЪήžzqrz~mYeqnc\_g\[blvxpiJ;.Eny涕ſҬaCA^—uH5 .ŹoTIGEK[bWE9E[H6B8*&/RkA3yʹA/E:,);~pREASqղźʳŷ¾ƯļҾŵƶļ»Ļʷоۿ͹ѰN + + + + + + +W㺨ǹĿĽ{xz|d^p{l\grncYZ^TV^isyxuaN4-:DYxro۾ɽЮtP?R} ZE ;ƻu[PRVZ]^XI2B[F6H?.0(WuD5~Ϩ_*(541 %6Qcx_C.'*@d̩ľſ÷»η´ǼþƭŽϾ˻øƾǷ¹׾¸εּ?  + + +  [̦ܬû½tt{iYXgspcfjljd[TNGKOU\ensuq_M>2=ZҾd^ºԳdCCkkO"Gɿ|eX\gfUUYL.HfK0=<72 OnC5ji9"(::"=`}ubA%)4Opȼ·ǾѽóĹǿ½īƾ¾ɵվĻ½ɿϸƼ¾жҩt/ + + + `ոѮ㸰}jemygcis|~vosnkkmgYMHJLNT^lwziK1/LȺ\c힢߷WAUȿxO'VĦf^\jeLMZQ0QuT'*5A5D]GATov~e;.AA'$ +  + +  hӱҞ׼žvsrmjhe_eqvcZZd\X^ii]PVX^i}l]?I_u׻¡ҿШdObIFʨ~aTDMP@TmbKM^K28:A;".8P[4%2J]vlU`S@:;2)$! %0;ALuòĴɹ}þžͿɳ¾ɹƿɽҽʺǾ{-   +   +jն֝񱙚vrortrkd\lszqbTSX_^bipogadknv`>BkܭбԴrLS~ɿ˭}C+[˾r^M=8=@N]`IJHKK=6A:B.%Sf94ARgztdRNB-$.9(7@TF6KXH>&,@\rz~{cC(.fϵķƿĹúǼű}˾ҾôÿɶٺݽJ +  + rۻߖyxtvqmdTD==BJRW]i|åʫhB.Nʯ̫Ȧckw¸þҾcYijֹydOF@412.*(?kp<"6G^N88?JK)(5OafviA"  #Wû¸¼žø¸ȼƲʽĿ÷Ųľ̾ɷҹ~6 +  + s۽͞|vyz{obQ=/(*5ANZajrzvx|ǿ{[34Y|ӥĥ~awƾʽƽws|ŧov鹘Ӵv˺^NE@329;1)7^f:$7MfS:+-NY2,0AP[qwQ.  EqҾżľʿdzɽɾÿ·Ŀijľ̺ȺȻݩe' + +   r۾ߵ㽧wtwwtdQ>/% "*5DOY`eibely}é÷s; .O}RgףϼsVvº˽fJE\xȽpSLVi̪ܛ𵇑־{թ;ZLHA10;C701JV<*5Mk[G-'S\1,,7GXoz]< 6WuĬĽĻ¸þóüdz¿¾ſȼÿ;¶ļǾȼȿ֜M + +   p¨ϵг|qmnmeSB4-)'(&+2:CMUY\`is|~swĥ~@NԦϼtUzƽ~svIJϰډτەpǵy\SQH0'3<85-8IB42GiaU0HF !(9OeroeUC-1G`{ȽĽ¾ĵƿƲ~Ŀɽ˾žƻǿ¿ȿƺϑ<  +   + nªǶܾ~peaa^RA4./11/(&%)2@NUfmu{|`d|{}=Gxǰĝcȷżüӹʹ⌅ދ܈ch^YYL-&/65,/DH;1Bjg`4:/,BTYUQKE:+  0@RožƿµűĻþ¿ù¿ſĹѿ°˶#  +  kê~}llfUW^NF6))/43/#,;Pc|ySXqejlH,#7Iּʷƣûſҵ吁ɈƍqѬTVv\E6 #"00.(5RU;>O[M/ )230/29>9+  ";:KkǻſĶƲн¾Ϳÿź·¾¿ξ̾IJֿg    + k˼}un]\^SSVF@1)'-0-'")3@Sexz}X\ugd~nS5()",lʡҐÿõʲ樝鳗Փz̢SVq\H:&*)/-+'2NT<057- "!"(4BE=3';MPMVfxYQehhzcrm;2& %C_ehr}үξøfRJ]X]]RB,')23-+%"$!$ +*#!/=JMMQRC)/1/+3IZsX/:wŰŻƽź¸ȷžzÿ½οÿξIJ¶Ž½͡E  + + + + +   gΪ~zsh^WULGOMC@:0,$#$$" !(/?ORKUefNF\japkdlj  +)4GrƳxcjdqjm'8]ӽǺԷ|ɯX6GTUO(1;1%&&'#  !#&*/*&'-9CH_OEKWXK?>UR>Ik̶¥ɬķȾɾμ¶}NRPNLNPQ_fr½˿ÿŽɿ½ɲսȹŶǿҽɾʵz!   + + +  + + kϡxtj]QLMHRpk@0.()#"!#$4ED=G[zgC1&5_knoee%19^ˮտɴ˥zܳoY/?OTT..;2(% $!#**),-+0,'%'*./KU`bYPRZZ|yRMnʱǭŹɾſμô~%4HVh}ĸʻɻ¼¼ľвĻ¾žѽo + + + +  + +ḅ|xri_QFDT]mjcJ3'&%"$%497CXtyX0"!W|tifw"  8Fa󹠭Φտµֲҳu^WIC>=U\7.72'! #59973037.,*-0, 8XsnWM\n`[oȹƺǻʾ˺ôx"0DXsĿ¸»¿¾ϱ|}Ļ¿üǼй_ + + +  + hŔxuqi\MAASalaQ9(#! #(-+$*6;;G]nqP, @ͫsxs) + #9C[ȭϵɽִ¼ԽrZU^VG@V]=#'/)  +#6;<8349@IFA:9CD7 +#%##'438ALPOPTTQevzj]kmƸ³Ƽ³¶ʿ%%(+))0>Sh~}vqqv|ĿԬP    +#0,7t}sf]SIELeuiP:+$$(/07?HR]kuv^?*# &;ER}媐ʻ͵ˠ϶Ϧpr{_9))JH)  +.=C;/'3BQUK@9:GMUbq|mqtg|čdg|Ľ¿÷º½ƾ3357429EWj}wqqsw~ÿ½øѾ̟:    %7;Q~}{m_WPNQ[pyfI1'&*2<=JZhuŷq`I8/(@;9?J\mùз¿tnqxyĶϵwcQJGD>:8bŖ+ +    + ,BMm}}~xfXQLQXdwqR<8?JT_hv÷~o_NB- .??EkվʿҳÜ庳Ågsd;)%D9-!%**% +?ZpzatΦj^ؼ;ļ̾ǿ½DDBAAEJScrþ̾ƻxqu~üƻ’pD-$'.;qٯn* +  +   "6Tw|z|}~~~saSKLXdkv}uoxȾnYH;3-+')'/vԻ׭X    ++Qxž|||~|yshaYfz}voifZZ[^```^]\ZY\_\V[b``krpt}sr{򸛢Ӻ׻ŽӟǨţϲϾwonkkhJ)&$ %/* %KjZZn{z~s`kuxлĺƽǼ~|gikmosw}Ŀпκÿþurqw`@8)!!'DɾĿŌB    + +  +&=k½{wsjecet~tb[TKB70*&%&'+---++'$',+('1003##"9ջn    + +  +&;bʸ~~xrgSJ[trgjaMC331/1211341-+*&  + + +  #'"(Kr֖߰x@?uкδŴhW]D1#",1.,.$ &Tb;H{h;$=gn_XSIL^b]]ZY\bghlv|̿zwvzz{|||~ʿŸ|z}jkmpvwz}|ºƼɽÿܽulf^UOMMQY^ehp{ƿúþrçqQ=1%%#CӪS  +  + + + +  !0Ksɸ|~}slg`RKZpv`POD0(#&*(%#')&))'&&$  +  + +  +   %ASv▆ȨnPaŹįw_\jX7%"&&)/*,( F[DTvjJ.'"!$*;[}te_VUQTac^b\TRU\biuzʿ{zx{~Ǻ;vzĿqprtxy||ùǹƳſƮ|pkd^VUVY_fjpwüľ{i~ֹu]K.FEYjhXG:&(69Ldlabi`ea]_ZSZNFBIV^fqzu|ƺz{}żȵ}rrsttuy{~ƹ̽¾͸ysmib`bdgkot|üþpaxб_ME=/,,!%7iԻک\#    #8Tx˽|xxy}xrldVONLKMRcbXQOA0.((%$*+*'(%"  +    + %09IXjֱ°ukĶ˫qַnͽxrwntrWB0' %3Tx`#(6N^_YM< (418MWXcsqqgZSF>D<56BS`gp{|ívntÿsrruy|¹ŷ¾ÿĪzsokjkjlmqu~wf\tǥvRBA?311"-N˽Ŷʼn8 +  +  2Mm÷|yvxz~|xrkc\OGGIKIGUYW[]L<;4,"%.30/.,*&&&&%$$#  +   +12'"$3jΖźyɯοs콐}ʑlz̾{wraXJ>4*"%1az/%;LOG<, #".GW\dkidVKLG=A;42=P`my¶Ϳ}tp{¿rrqsx{~¿|wy}ٺѻxrrqrppptyŻp[XsθgLA@A<57':kǽпҪe  #Eeǽ~zwvy{}|~|xuoic\RF>AHMLFSUSY]L<=8,/9@@???89EMKEXJ859/'2;80 &1>FE@>;8>::7510.-)$ !"#"%'$   $--174)(7vǺȪۧdzqhejkks|kL:7GxW/+"   +)@6"AhD'+3BSctļǺ|zſ¾ɽzvw¼rruzƿù·ĽíüȷźhQKG`_HDB9@OK60Vǯϛ1  +  *H}|vsrsuur}ywpbZWSI<6@KJ@AH]H+.3-/'582!%3@GD?=<:?;97741-'$"# "&(++.13/*#  &05856;4&6]züƽZbӸϷlJRSDE=)#"  $0!#)#+KjoT9%4=FUhǶ}¼ƶ|xpquzƿźεüϼƿ̴ŷtTHAC\ypTCCD=ANG:=fɳx$ +  !$7Xxqomlkr{~{tme[RKD44AJC66=\L13901(262#'6CJHCAA?;9643/+'$ #(.2678::84/'$  !.& + "1(-95APWL==EVI4:A:;0165(*7DMKGEEC:9631,%  %.6=AD?>976/% + $27931584?YnxÿÌPMkľĹzgTDDC'  -?KJ=0'8/5KNY`ZD$ #'4J]i|ƽ}¼xpqv{¾ήĺþðĶsW@98D]m]PHHGCFMKOsb  !.Mr{wussqkmilxxnkqc[ZN>74129@??2?IJK?9??5".:GQQMLJGB?<961+&&0AH>+&";fǵl6.=9BNg_5&1:?@Pcmwô½yulou{Ǽ軱ɾú;þ{gOA@;DF]sv`_[SNPV\Ucݻ,   + (=]~|zw}sb]gXKC<<84/,*%%0=HRVTL@8/+%   *9Lbrֹþü½бƚcƺlXTTZb_bilpqUZçv8)65>QlY. $+)(.DOTazyknt{ý̿ɾȹ·wgXF<<>ME\{}{shmj_WY]^YkחZ   + 1Ljƿz}yuxrfeh[J:04BLL@4'"&.3   %. '8' "/E_v˿ºw^Z]u~wiXsQQg½~=(44@JWbc`^\WNKJHEB=:<6/(&$##')19DPY]WQC1  + (;,!(')4DTlǻĿƼ\N[dd`X@Yįy0#=;:16?A3 "#>zǺû|utw{|zxy~~z}}yurmifgfgkruxyvtqmkfc`]ZTLGEED?<>BMdµɾµƼϼƽźxyveUMIEFJLHH_{|onnlg]RKGCcϹV  +  0QtwdQE>- +32$&-6AHKME@<9-)?IWbeffd_YWVTQJDB?:50002113:CNYae_YL9& !)=;.*189>JbsƷpH=Mea^Ѱ|NC^Dz}1$BA:,*,2.#  ,TǺºzxy{~zqlebeedcaaa]\ZVTRQRTWXVSRMGCA><;9740-,-.))-5Ecϴ̿͹ȽŹrkw|eZQONJLOQTSevuklg^[]XNLPι™< !5Y}ypYLC9(!% !*5:>A;;97*)@HWdgjlmkhggd_YROIDA@CEIHDFJS[eknjdXF1"##,BHABJU[cpʶiA2>d{ZZvbGPqŶ0&GE9, #*& A{Ĺÿ}{zz~}zvmf]Z\^__aa`^\[XXTRQPOKG@@:4/----//...)'*+/6CVv´ıȾʷȼúsjvzi]WTUVTTV[bdjslejfYYhi[[d¿o%  8_vkd[RG0 + "$%'.165)*AGVcknuwvvtusqic`ZXVW[`cc``bekntvrlbQ<)*)4O\]fvij\GImuVVf~hTQh|,#GD77& && %]ù¿}zxy||yukf]Z\bgklllihedd`^\YVQKF@93-,-/0659><2,-8@KXnǵǺ{u{{}Ľ}k^^ZZ\][Z]`nprvoksuehxxecqŽߠE + +8_yume_^ihT+ "*54'+@FTckry}}|}~~}yusrrruxz|yzxxwyz}|ysiZG2# *55Df|¿ǸxttWSVn_Y[kq&?<2>2)$## B·|ywy{{yvid]\_emttsrqnmmlgfeda^ZUMHA;;<>ADCHNJ<46ENYf{³IJŹɿ~}vs~Ƽzlcbda_bb_^blz~||kl|˻ʃ&  + ;`ysoh]]`z}h1! +76)+>FTcjpx~~xpbR?.%$%'3<>U}ĽϿvYPOifhwh$320:50+!$$!"l·{xxy{wthb]Z]dlrrrrppnnnmliihgcb[WPLLNORVRTZVH>DR\cný˿öȽzttz}|skimlifhgdejx}~|znwھҬa %@c~~z{~}|{wtqpomkmqtxz}zzwl^ag{w=  !1><+*NwDZøŶpRTnz{tO')1)/2-(&$&" Kǹvz{yxzxqeYSWZ[clliihhgghilmnnlllppmjhged`aaba__[V\hzֲÿǵƼĻovɿ¼~|zvrprux}rlmntttxB   *:Rnzwwzztia]^]cinsw|~wnd^ZYWgnuv{ucgfV>+"    @nj?-/5@GQ^gnt{yuqj`^`v{rnaUMHS{ǰĽ»vPMmytnK#$,/23,$#  $_³ʼ½u{|||}{tdVQTWYajjihgggiijknnnljlqspnkhgf``__^^_[TYi|ȽÿϿȿin|ytpnqsyyx{}¾˾Ӆ) +.A]yytuwytj_ZX\aejnsx|~zuojecaflqrt{~f`[Q@/$ +  + F~p5%19EHR^gmsy~~~}|}|{{xqlgc_``ju|s|qe\S]ǰɿ¾ȼ˵{PFczoiK($-00)"#"!%7xʲ˽¿»w||tdWPU[\dliihghhjjkkmmmljlttsqnjhga_\YXX\[V[k~ۿô·¸Ľ{]jĿ~ytrsvzwx~øռs$  +!/Fbzzsxwuqg_[Y]^bfkotyz|wwvsqonnmfikijpy{th[N<%  )M~i0'/8LLV`glpuxyzzz{yutqlhfeeeeafr}|vof`iŵ¸ξ\L_{miO0$ %),)%&&%"*Sȫ}˾¼{~~zueVPV]`gnkiiihijkiikkkjkmsvuqokigd_YSRU[]\aożþ»½ƽźüpUc|wtuwzvw||zz~~ƽĺ̜X #5Lfx}w|xrle_]]]]_bhntytz|xrkfba```a``fpwweXN9# +  +%:]s\5./6PRZdijmqswyyzzwrpiijknpmhYQRUZ_fnxw|~wyyuqlwƼƿʽع}dWcyliT7+ &-,()&##"7|Ȫshh|ÿ̾û||{{ztcUMU]`gnkiihggiiffiiijkmsutqmjgdc_ZVUY`aeitĵƼȽźϿžƸ~cP\ſ~yvuw}}tuvqppuutstwz~{|9   +%>Ulv|~||wphc`_^\YZ^emtxwxxy~zsmga]\][[]`dnvvbWQ@(% + +  0QtiO<4/:OV^fjkkoruyyzyurnehmpuytlTE<::;DOZ]elroh`qy}ywɿ¹Ѿʻӣd[YfwnjV?0 )0/*(#!Lʰtd\gw½½y||xwyzvaSKS]cinkihgfeeeccdefgknrtrplieb`^__cfjkloyȬпǺóǺſպ˹ĽnVGSľ~ywx}vsoighssqomnsupĿ̾ԸڲW& +   +)E\pwx{}{vqlhb_^\YWWZbkrwzxsptzyyxwuqnlf`^bgkqxy`SUK0!"  "Ck\B7.6HNW_gklmqtuvxxvspnjnqu|~rcULKHBDJW]fjf]YWep{}}Ż¦gLOXj{rm[E7#"+0.)(%!  5i°{ieekÿüwxwtuyzxbTLU`djoihfecbbbaabcegimpqpmkgba[^chnprrot~ã¨ƨ͸˶w\H>K|ļ}z{|xpgdj|}yuqortsȿȿƯД5+   !*G_swvvzvqlifc`[XXTSV`iqvvvsonoqrwx|~|vurlgkopsww[NYV='#  #,S~Q70(;SLV^glnoswuuwwuromosvyyi\Z\YMFHPW]XK@BHUfu|Ժ_GP]s{vsbL>(").,)*)(-)Mȵ|l`^rý̿}rttruyyudWP[ipmghedcb`__\]^`acdggiheeeeedcgpyyvsrvȿέϳĢ~ʽ­º{gRA8HiĻ|{{wpgekƾɼp! ,(   !,Hgtoqsw~rjeec\WVPSWX[_ku~|wqkga_^ahknjdd^_aiu|{ty^T\U:(%!#.PpnK)'6AHNWaghjovwsrqpoppqnrv|~zskdcgfaWKA>;877:>BUbpzɹպ̿saftzqh\H. $,.041***c¥kair}{vstzžpqrqtxxsdXT]kolffdc`_]]\[\\]]]^_cdcbccdeiimt||wurv~͵̸dtúwkWC61Dd~}uqjbchƺνܓO&"  #-Heqmnqv|ofdcbZWVRTXWY\eoz~{vnieea^][YYZ\cglt}yyZMXY>! (HmzxZ=%)9CJQT^egipwxrqpooprtyzz|~{wqjknmh\NC:2,)-3:?S_myȢ~wpfS6 %*.3.&'!7vԾtlk|ø~~}xxy~~Žlorpruvrg\Zcnojda`_^]\YYYYXXXXXY`a``bcdfkmqv{yspot|ʫǿµ\kƿĨƿ}rfYF6-+>`}oh`YX]x¸ŷl+   &/Fbmgkprwkdab`ZUUUVYVWX^es{~vpoqd`[VRRUXfnw}wZJTT>" $%(;ed@/%-=GMTS[cehovxqpooqtwx}|xwwwvsqrwwsh\R;1'&,7CJT^kwû~ztdE)"-51)#%HŮyhox¼Ĺ~}}y}ľgmqopstog`_gnkfb__]\[ZXWWWVVVVUW^_^^`cfhilpqtqigjpyɩþ¼߾ϗúϛּŻnbUJ;.*,=[l_VMJMm|pop|ºɿ״اN" (2D^gbgmoshb_`_YUSTUWWVX[`mt{}zrlha`_\\ZZ\js{~t\NPPA/%!!&%+4=QstP/(*5AJOSS[ccflstoooptw{~}ytpppnl_afhhc\VLC<79@HQU]gsĽ}sW:"$/-(!,X̲yzw{ýø~ľ¾ahnnnopmgbchlgb`_^^][[XXVVVWVWXY]___acffdknkjg`^dn{ͫȿʿǃŸ˾zoaVLB7,,0=V~ſfWMFCF_qwoha_qĽͮr6!"*4C[`]ekmpd_]`]VSQQRUUUWZ\gkqvxsf^`__`abdhry|{z|sZHMXS@.'!&'"-*AYmzx^?..5>FKNQV]dbcgmmlmorw{~|xrlhd_[RTY\^\YTVVRKECHPTYdsȾӼ~lU@/ #"%;lͲzowľø}ü½[blkklljfabghc`___^^\\YYXXXYYZZ\`a__`bbdbhkda`ZW_l~ȜǾҢŽı{л˾xj^YPHC8..29Qvſy[JD?>BMdw|ywxwvrϼ˿=%$.5CW[Ybiknc]]^\UONNNRUWYZZ\]co|}vpmifgkqxz~~|z|tU?LgnS4()&&+'&/>Xy}`C.57>FLMNOX_d``beghjosx{}~wrkb\RJFHKQTVSNHGILIHHPWSW`tκuf?'  &,Nηwelƿķ{¼þU_iihhifcabee^[_^`^^\\\Z\[[[ZZX[ac__^]^`_fg]XYTS[mߺǾКüоɼyl_VTMIF:0,15KnľmJ83216?Shs{˴лg"%! %/6CUYV`jjmb^\^[TMLLMQSVXYXUV[fu~ywvw{{~}{z|kR?Ki|q[C*#(&$.6SbxmH3/;>DHNQRQX^c_^`ccbfmsxzzyrmd[UOGCCHRXZRI@@;9;BJSYOT^vٲǴо\@!  -^Τnksƹz½Q\fgfefdb``cb[\_^^]\\Z\Y^]][ZYVX_`_^]\]\Za_UQTRR\sĽ䵼Κ·ϗ꯳ŹxkaXPNHFC8-(-2Hkľb>*#"!%5H\k|ͲʮΣH"!$$! %-7BTTR_hhh_[[]\UNKMMORVVVUZVUX_ly|tpx{{zzz{y_RGKa}].#"8BRQYaS84>?AFJPVVTV]a^\]ba\cjqvxwtsne_\XUT_gt~wi_RE73;CHIMQ_yǹc<  *eǪsieqƿķw}[\^bedcab_]\]^`__^]ZYY\[\\]][VRPZXWXZ]\YZZSHJQOOUk¸ԙԏɽsfZQNIFD?70,&"1IlW..Nku̽»ǹY9 " !%-5CYYPXcb^YZZYVSTUNMLLOQUUTWVTRV^f}vrutzyvz|n[RGQcj͗&#8NN@78@ADHOSWYZYXWZ]```aeiostttmnnnmifdotgZLB:6:ECUj|¿ܼjN. + (pˮr^^hþ}uyb`b`a`^\\[Z\^`aa^][YXXYYZZZZVUSPQQSZ`edaWRH@FRPOZpŽǾƶ͐Ж׮ȾwiYNEB<@>:2,(##4Lq¼wN'%?Zjv¹Ͼޜ@!#!%+3BZ\PSZZXVWYXXUUUNLKKMOSSRSURNPW^oxxrpusxysxzkWOFQdiУ6)%'-;:87=EJJGHJMRUVXXWUVW\^___chkqrsrqqqomjgfknvraI96@GVj±u_E3+8}ocep|~swda_ZWUSSTUX\^`ab`^[YWWVVWWVUSSSRPPU^eifbSK?:COMK[týýüǏčĴ¹zl\MA954==82+(%%7QwýgC  *CYepuĹ²y' ##)0A[`TQRSTSUYYZWUSNKKKLORSRSSPMLPT\dlpnkjmrrwwqvwjULDRdfϱ\9$!-!'4@FMUUNRSUWWWXWUTVX\_``_cgjopqptsspomihcbbfpypT?;CKIJ`|ú¿ęǘĊ򼴮ºrj]M?4/-.884.))&(]g[RHFOQSVY[YWROLJJKMPQNNMKIGFEHIMOVZbhmmtsmoqcRD>Td\ѫb+7B('7N\SNVcfeedcb_\\XXWZ^bccghkmnoooppoqqqrsnh^TJDBBLQVWUNGJfoвŷ|n`[\dr¾è|{/-*()2@J^aec^ZXY\[WUTTUTVURRSUWW\\_cb^SJABCB@>>Jl˷Ȣܹߴʹȷž½~seWH>5.)''*-,&"&+AamB*  -P}û̽ǿC )(##:Xd]THCMQSUWZYWRNKJJJMPOMKKHHFEEFFHLPV]dklroikl_RB>VdX|z9>G:=ES[TQ[hmggiffc`^\[Z\adedjjllnnnnllloqqstywk]M>4.4:@ISUNNh|˽оŴĿҿj_ZZbls~¿ζĿ}vz~}~~+)&#%2CP^beb[VVXYXVVVUVWWVUUUVXWUV[acaYRD@<:987Do²깙ұӫȻwndWI>70,((()'$%,Dd¾jA+  "Rɵޅ!#'$3Q^[TGAJQRRUYZXSNKJIJKMLKHGEFGFGEFFJMSX\jlongii[Q@>XcSw؏JBFINOMNS[bggffhggdbaa`_`cfffjjkkkkkkkkkloprt}}vhWF91/5@IV]VUh⽾øջĽȵ}k`VU\djwÿҽžz{}|yxxy{~.,($&2EU^aeaYTUXVUUUVXXYYWWWWXYWRSY`dd]WI>31343@q뻟Ի}tkbXJ>81-*(''%"&0Gg¿¼¿hA- Uɹ˲b  # !".IXWRD>HOQPSXZXTOKJGIILJKGDDDFHGEDFHMORWhkomdfhYR@=XcQuWDDNXUJERdhaZcdefedbadbabegggiihgigggiijkmoprsdRGBAHPU]a[Yhǵ¶̮xhWQTW[dp~¿ι~~~ƿ|{z{}1,$!$2COZ\^ZUQQSVWWWVWYWVYXVX]^ZVW]ehdXN<2+-013Cvù쿥ƯǸɴȪļƾxl^RJE>7/)%""#! !3MmgC2&  uйù;x9 +!!!$EOWQ:;DOMMT\\WSOLJGIIJIFDDDB@@?CCGJMNPV_gkjgc^YKADW[W~|I=FKRKIT]\YZ`acefffeaddbejgadcbbeghiknqrrpprz||tj^VTXQW^^cddiп¾иm[\_WZ^bfq}μ~||}~}~.)"#.?JUXZXURSUVWWWWXYZWYXTW]_\[[]a_XJ?2+(-369LŻ򽖗þƿ|ocVJB<64,'" ,>TužŽjG6)   +  +$ȼѽO# #!$!$FR[S99>NKKS[[XUOLJGIHIHFCBA>>>>>@EFIILQ]dhjhe^XIBHX[ZПc?<<>?>@DDGILO\bgllh_UDFLW\`ƌR?MU[[VQQTV][XVUWZ\]__]aaa\\[[\]aegmpuxz{~}}ztmkkbahlhmwϿŴIJ}fcdhfbZSRVYdhtý|zwwvvxz #/=ITWXXWXXYXXXYZ[\]^^ZWX[WPKIIHD<1(%$(18=E^þڵ˿ɵ˽~tgYMD;0)$")1=Ll¾ƿrS<+&"   _ŽļŹ(     (WmnX406KJIQY\ZXQLJGGFHFC?><-)' 1ԼҼŻڟ`'  +c~{]4.4GGIR[]ZXQNJGFFFEB??=?CGJCEGJMPRV^eknnh]R=JOOWkϩuPPWZTQQRRKLMOPPQOSSUVYVVWVWWVX]cinpvyz{~{sg^Y]`kogp̺ɵôjdccefeb^\YSNPV[bluǾþ(8JV^][\\ZZWXXYZY[]^]^[YWRD5#%).02210/0238Ff¾ƿлƻ}kXOF<0+)%   #**.:LbrvW@0+(  + Eѳҳжz; -klA54CEIT]^YVQNJGFEFCB?>@AEIMEFGJOTW[ekrrlcZP@OQIVuܱNMR^c]PGCEGHIHGFJIMRSPQUVWUSRT[akpwz{{|~}wpf^XX^mrn|˻̼ñ}fddbehhe`ZVTMKORT[`gjosx{ž(8LY][YZ[\ZWWWXYY[]^\[YVSN?0!#'+,.001/..-4HlµǿŶmT?3+   %16;K`wźzZD4-* \ƺĬȱɲW#  ,jW?1ADIV__YTQNJGFEFCCA@ACDHIGJLPTY_akryui]TOHVSIZ޺mZSdocPEEDDDDBBAB@FLMILSUVTNHFLRbiqwzzy{~zsnha\ZV\mvwʼȶDzzeceffgeb]WRUPPSUTRRQRVY^dkopy}{{þ¼(:LZ\ZYY]\ZWWWXYZ\^_\ZVRRMA1(*,+*+.-1--,-7MtɽϴǹĻɵ`C*    0?FO`uŽ}\F72+"j˺ɼҽȾݥ= ' ++hhE->BHW``XTSQLIFCCBBBCDDEGGOQTX^bhlqy}veVPLL\VJ^ңtOQ`]YZKGFA?>@A::?GHEHPTTPH>g|^XTQJD@><=??>=?DHLIGEC@@@GLSUUUWW^WNKOQPRTap}ϼüɾҽnkphgea]XTRPRWZ^][WUTQOOMNMVX]ciptw{yxurolkfcdm}!!%5JTYUWZ\WUU[]`bba^\]]^a`YNB2+'&&&*//3118@\ƻŮY/ + +  (/6AUdnv¼gC41*$'  Z¶л̲2 ,l|[@3?HQW\`]^\VQKEA=?BEHIJLOW]gouxzzxukaVE@DSd`Qfǒ_Jaym_[ULC=::9:9769>@CBBBA>=<=@DDCACDGB=>DIKMSbsʷ½tpvmiea[XUSSSW[^^^\XUROKIGFFFINRX[]eebb_][[YVV_o!"$4HRXTUYZVUU[]acc`\Z\]_cc]RF4+%" !(..302=HdþĽƳ`5  '/6;82432/..03115;ADISbwƵȿƼĨwsyojd^YUSRRSWYZ[][XUPKFB><;;;;>BFHJIHGGEEGGCBIYn!##$3GQWSUXZWVW[^acb_[XZ[^bc^SH6,#&./2/2APo̼ǿ¿ƶ¾ɷk@% +!(/6?EKR\kxžiD41+&+& =̷dzӴ΍B +  $[mE7FSLYk`cb[XPJEBBDGIMPQVW_fmrtttqkfXF@KPg]Xe˜jV^[^`[QE<8850,,/46*.7>B@<80/,($" '&).8>=:89:=<976664458538G_{"$$$4GQXSUXZXXZ\^`ba^[X[\]ab]TI8,%#,02/5H[{Ƹ¼ƾŸ˻pG/# #&+15;AHOTZ_hviC3/)&,( KʯθôƲL! OO7<3/*% $*28?FPjϷɯ{x}soe_WUUUWVWXZZXW\YTQLHEDA?=9877630.,*))*/*',8Po!##$3GPXSTWZXY[\]_``^\[^]]^^ZRG:/)$"+144?Vkȼ½ľķʼwO7." %&/0147>BGKQY^dgls}iC2.(&.*$a̼׽Īȳ½ق  +C^?3Ok}ʴ}omq}Ž¿ʽ\E?539FR_m˯ƴ˱y~ywrmifffeehihda\VTQNKHGGGHHGD@;620,*)(*+*% (=\t!+BRUOPUYWY]a]YY]_\YXQIDC@;3.161)#$-7@Vtlceg{ȿs{ǿ~i`\X[bdb[VUYafmrykF/-0*,.#p϶˽˸ȳߕ4)lUBOLMbdfeea\WUTTTUXZ^adimnoonmf`^QG_o]Dm٣pNORSVVH@976/*))&# "&&&+*-142/1:=BN`p~Ѹɸ̱{y|zxuromkooopolhe`[UOKJJIIJIIFC>:7620-,,,-$"*9Yv!-CRVPRWZXY\_[YZ^_\XQJA<:83,.296,##*;Jaxf`irþ¼|tw}xmfbafgd`\\aiotykF0.2,/2!5Ŀĺ˷üž֬^ "iôvPCHSbdgffca]YWWVX[^adgjmnonmjf]UPVdcOJ{ΙjSEEOVLB9781*&*'$##&&&)((,0214AHPax±ǹ˰}{||ywvsuuvtsolg`\VROMMNPPPOMHC@>:640//.0&#'/CX^cghhfebaZZ[[]adgjmonnkigfZNVhiUHYaCCS[LA99:3+&+(%##%%%&%$&+.17@L[sξǽȰ~~|}{{yuqlic^YWSRSTXYWURMIEB>973//.2*()0>[u%6IRWVY[^\ZY^]]^^ZTOG@6/+)(%)077/&$*DZvvej}c\[^n{}sleceefejpx~±mJ412+.2Pν¾ô̓A + +  XNFXYbegigfed]\^^_dfimoonmjgcb^T_reORnܵ_SWTC?===5-,.*&$%%'%"!#%(*,2=QhŮ~ysnkda_[ZZ[[___[XTNJFB>9530/2+()/Bb{';MRWW[[^^\Yaa`_[TLFB<4,(&&$(+0.)%'1G_zocvžwl^RZfvóytmggfhknu}ŲoL51/&)-N~˽IJĿΓ[(   LwXUT_ceffgffa^_`behknoonmifa\ccknYQjs^G?>AB<314/,'$&%&%!!%(*+(,C\{Į{upkgedba`abeecb_YSOHD?<84323,&&/Gm)@PRVX[Y\_^Zcba]VME@<81+&$$%(((%##)5Hd|mcǽhQLSaq÷~wogilov{ƳoL60-"%*ižƻƾǻ]%$  AqWU^acefefea`bbcfiloponkhd`ZfrueP\~Ψ_LHGD=5591-)%&&&$!$'+,+'*GdĮ}wrniihhhhiikkigb]WQJGB>;87450)&2Ox*CSRVXZWZ_`\bb_ZRIB>851,'%%&*)&$ ")6Kiqc~ĺlUHLS`q½~tijoszdznL60,!%+eƿȺ͜B +  !#$"  8yºZS_bcdefgfb`aaegjknonmjhda\dxx]RjڷiZLB=7792.*%&&%&%&(*.-,0JhĮysqkjkkllmnoonif_YTMGD@<;:794.-:Y+EURUWYUX_a]``^XPHB?763/+(()+*&$ "(4Lmpb{mXLMPYixsllrw|dzlK60-"'-aмɽǺÿ> +!"$&*+& 0p\Q`cedffgfbaaaegijnnomjfea\_wx[UtֺhN@=:862/*&&%%%(&(),.06NlŮzurkilkmnoosqplga\VLID@><=:;863A_Ƶ޶qsž}ɲphqyĩZ9' "##$&!! +  *Np¿vk\K4% '3>GW[]^^]\]^YSRW\[ZVTPPQTTUWYXY`oz~uvx||~ƿ̿_;-19>CZp{o`k{v_C3-09BWkվgF5;Zy~zxwxzy{ym\QOP_q~wqokhddehhhkmr{¿hO@H[xxeQB?DGKD0(4VojH.2UqxhWC2)))-2:?EHJIIIIJKKLIIEB>:7523233434320.-*'**.5EZny}}~~}~{wpoi`aimlgbi}~`:%  + 2BWnxog^Zagp}~uh`TPNI>3&%%&%'2>KSUOE=4.Ϳ۴rvȿ|é~|nhouĹ|V8%!""""!  + +  +,Rt¿vl_M8(! '3>HVZ^```__]YRRW[[YWTQQRTUVVYXX`nx|}~{yxurpt}~}|aC89=>AUgkaZbn|t`N:.*,3;Ob~ɼuWDD[v}ywwxyxxthXOMO^p~yspliedegggikpx}¿bOCPh{hVLJKME4"")BYwlM5& + 5VrwhVA/('(+/5:@CFFFGHIJIIHFC?<8651212232311/,+)&)*.5DZmy}|}}~|}yvpplhjonjecox^QM># +2GVh|zph_]cir~yqd[OJID91%#$$$'1>LSVPE<3,ǿձy~̾|{˿wtjfmr{rP4$!  +3Z|¾wmaQ>/# %3?ISY^acccd]ZSRUYYYXURRSVWWVYYX`mvy|vqheb_`gs{{y{n^KCBA??L[nzxkZOJRVaqkWOFLSZcdXI=3)$!"(0EXss[S`s~zxwwwxwuobRLMO^p~{urmjfeffeefgkswy}þqTLK_}½n[RPNG<,%9UupTA6-&$#=[sveT?.'&''*.28:755400000212/.,*)'$'*.5DYmx|{||}{|}wsmmkloqjb`g{oB$)9Sfr|rjdafks~vm`WKDC>6/$$$&&)4AOVYSH=4,ήϿv|ʹzq}kabiov~gJ3$!  + + + !>1-2F`utcQ<,%&&%&(+/47<>BFGEB@?=853234././/000,,*('&#&+.5DYlw{y{{{zz~}{soifdfhh_XYkX3$',/=FYqrjgfimuynbXKC?;4.&&'*)-9FV\`YLA6-̰çwðrl{uc^_flrx|q]G4&!   + + )Go~vpg\M?,  + + + !1@LRX]bdggg^ZVRQRTUVTQQSVWXX[[[bmuw~yrmjib`^]`fmr}|zuqt}Ƶo\OHFEEC@?@??8CR]ZG,+FMDAHQ[de]I7$ '2CRiŻxsw}{yvuttuvtrmeYPT[bp{tqkgffdb`_bhjjovy|yýiD8Fdr\GCBF?- !>`|s`WVUTVF@AQfx{p^N:+#&'%#$%),06:>BCB><:8410023.....///++*('%#&+.5DXkwzxyyzxy|~||}wolgc^^`]WS]u|X<16?IYbsqijllmu~ug\OD>92.)+,..2>KZbe]OC7-Խæzpkzl]Y\bhnsu}~~~||yxpeWE6*$  + 3Sz|upk`SG3% +  +  .@NTX\_acde`]WROOPRTQONQTUUUXZ[bmuvzytnhimpxxwxwxxwyxtonuĻµ{bI7-,5798:>=;1;IUUI6)%)(2EI?=@M]hkcM:+# '/ANawĶ~{|yvusrqrtuqnh_SNUan|xtnjhfdc^]_bddhoruz}~~{ÿ}V54LqnMD@EB2",Hd{q`[^ceiZSP\m{~wl[J7)$&'&$##%'*138<=<97431//011-....///,,*)('$'+.4CXkvyvxxxvwz}~zy||}{tmgf`[[ZVUWt~wn]H;8@Q`nwphkooqw}jaTJC=74123559ER^fi`RE7-÷ǷwƼjesq_USU]cknot~}{zywupng_SH;1& + + + +  + +  #=^yspldXM:*   -AOWZ[\^`aca_YRMLLNROLLOQRRPTVW_krtomidckzxtolovýyxɾyaG0%$*155:>;5+4ALQPLHEGBCKG96>Maovp]L4)""#$&+:ESfwü~}ywsqpopqsvojbWKGP_q|wplihec][\``aellptwxyz|~~~{y}~½kF+5W|o]NJC4)(3Lh}n_[ciovh`\gt~~|sgWG5)%()(&$##%'*-14663200///000.....0/0--,**)&)+.4CXjuyuvvwuvy|}~xvxxy||yrje`[ZZXTW_{laPD::BM_p{lfkqttyrj_UOID@??@BADP]elpgXJ;0ĺ~rȼw]XgvraSLKNX`gjjnx{yywsrlid]TI>5)    'Ce}xspmg\Q@/! +  +    .BPZ\[[[^`ac_YRLKKLPMJILOPPLPSU]hprdb^\aqvqkioy~|{kdYMMVf}ļ|eL5)(&.45:=9/)/:DLTY^[^UOOD3//?SdkiYIB6,,..,-40&*6FTijQ@50,.17:;970-1;EO[ehbXOG=3*)9N\eg_TGD?:64336=GQ^q·~{xvuvpnlmoqpqie^M;6FZjyztplkif_^^]]^__bdhlpqrqttttttttspmq|¿}wvK,,AhǼdO@3((0I]mmeZ[kvzsnlry}{ywm`OA0$"&**++)'#"%%%&(*+,./01210/010/..---,+***)-.05CVitxvvuvvwyz{|~~}}|||{zyvutuwwrkb\SYUTRJK]olZI93CT_l|z~{hbhr}~}wqjd`]VXZZZ`hn{}{tgWICvc\nzcRMQXcb]TIEGLSX\adhmt}{wtrokie_XTPKC:0)  +  + !9Z~ztqmi`XK>0$ +    3FU^_]YUV[^`_\WPKKLNKGGGGFDBBDJQVWUMOT_pugckox~xvuyuTB0%!/BXyxkiXI83CVcrzzygaiu|vpjg^^_`dksy|o`SKwhajwyi^YWX`a`[TNNOTW\_behl{}{vtrnif`[USOKD<5-$ + + + + -Hiztolic^TH7(  +'8JVab^YUTWY]\[YUPONNLIGFEB@;;=AGIIEBJXj}rdcnty|uwzp]?/ '3BWm}reXK>515<@@:4.-,,,**2>FA9/&%).9Ndrtqhab_YUOKHGFHLQZk}}}{xuqomonllmlkja\SH@EXmy|xromljiddb_^]]\]^adfhghljhfffhicaaizxy}Z2!/Gn~}ÿdD.% +=KV]Y[htzysoswyz}~zurhYG7+""',-.-+($$!!"$&(*+01234321//.---,-..-,-,+.*-4CVhqtstuwwwwwyz{|{zyxvvvvtsqoqqrqjaWQFLJF=4=YyxnlXD51CWfv{wzyfakzyrmgdcfmwxi\TķǾ{|{vokmpqpkd^\Z]_bceeht{~yuqmgc_\VSOJC>:1'  + + 3Rw¿{tnkhge\O=-! + + + + + + + !/@Q^bb_ZUTUVXXYYWUSQPNLIHEB>67:<@L_uudety}}v{v\I3(# #)0>Qdotl`WL@979@JOOIA;6562(!$,034.(&,3DZq||wpjkid_YTPMRRQRYev~}|{wsonlkpnlllkig_XNIHQeyytpmkmkjgeb`\[ZYYZ\_bcddfea_]_ab[Z\gz|twĿtP,%9RvqlnwjL9,  #0?NXVVcqxxrnqvwxz}xrnfUB4)#$)..//-*'%!"#%'*+,12345432/0//./..///./.,/(,3AUfprqstxwwvuwxyzyxvussssqpnlnopme[QJ@GG@7.?c}tmUKUckjd^XVWYTG848AISSLFGHTi}{uyxwrnhda`\XUYbox~{z{xsmkjjlomllljgf^ULINZn~uqlkklkjhfb_[YXWVVX\_bddca]YYZ[\VVZg{Ŀ~wqsyþnG*)BZ{td_dn}hRC1! !)5EPMM\mxsminsuwz~zwpkdS@3*%&*./00/-*(%%&'),-.2335554311111111001110-0'*1?SdnqprswwvutvwwwvtrqppponlkjmmnjbWLD@DC=1(>hwlO4+0H`lwzuuzhbm|zqhb[YYbp~vicºþzqnljiigfntw}~zungada\VOID@?7-%   &?e¼¹~xplkmqe[J7% + + ->N]hfgd_ZVVUSRSW[]^\VUQOJD;4,.1479<=HVlngtz|~zzhQ:+" $*///+% "(/:DGB@<2+5D`l||y|n^VWfrzoigeu}yvnib]^cjq»}|{wuxupkiijklkjjkiec\QHGO^oÿzpmigijkjigc`\YWVUTVX[^`a_]ZVVUVVTUZiÿzuttyžhC'+G^~tc^_h|scOA2#  (0?JGHXjtoifkpsux|~}zvpi^O<1+''+./111/-,(()*+-./1334543222222323122332/1()/:9=:7APm{uf^^kvtmipz|umfefjmyzwwvsprrpnljiigffghfc`WKABL[ivývlifegijikieb_\YYVVVWXYZ[\ZXUSRQPQS[lzwx{hA&,Kcxe\X]t~ugR?5)!/:GPLLYfmlfchmpruz}~|zvoiZJ90+'&)-.02220/++++,-..122444321211232313445301()-9M`mrqqqsssuuwwwvuronjjiiigeddeeaYMB<650,%>IMKR^o}vjddirz~{vrory}tliiklu}vsuspmloqqolhfdddfffa_UH<>IWcm}tkgddehijmkhda^\[YXWVVVVVYXVTROMLNQ\o½|ww|kD'.NiuaUKMb}}pou{w]G50% #6IV[US[cflfcglnpsy|~|zyvohUF6/+(%',-/23332,,++,---013443211000122212555300))*7K_msrqpqqstvwxwwurnmgggfecba_``]UJ?8.+&'$"Au~shJ@44KboynnxyobWNIHNSY_ciqv{zxqjc_^ŰϺƿypnljijmmmmoqstuttqojhfdb[URNIF:5.)%$  +*Gjͽî{pqw}zvv}xeJ3# &0=IWblooplhlnle_[[[XSRW_dffghgdZL>65667:AMTdq{u{n^RLE93589;:9758=HT`jqu`SNRQHJTlvk^W[bhieaac^enx~|rlkmor~zskjlkd_ghijlkgeeeegif_YOC9:CP_kx}tdccehkmljjihd`ZYXXTTSTUWWRPSRMHHIP`wyw~g?/4Suxqt}~zdPB@O`rsnhdirzkU?2%*=SZ^ZW[`bc`bejimrux{wtrmeUE71/,)*,,.02210-,,,,-./44554322232222225556520/&&'4H[jnoqqqoqsvxwvvtqlheeb_[Z[[[ZWQH=2,*"#&#*Mv}um[J:44CYm}wkdly~vnaTKJMRRYadcaacc_ZWUURP¦Ľ|rponlokkjkkmpqrqpolhffda\VRNID;70+(%#  4Ps˺ټu^TVYv~zznS:* $)/7CR]mw|zwqjcihgb\ZZ[XVVX\`bcfffc\QD>44447ANWborfYOJD;79<=;::=?KTcq~shf]PLTkxm`YU\dgeb][W\ckpuxx|wpnopu}wwqljmmgcddfhkjgfegfiicZRJ@:=FRalz|teedgknonlkjhfa\\ZZWUSTUVVROQPKGEIRd|~xx¾kD6=Zy{pgho{zcNA=HVbca_`gut_F8+&$&6I\cgc]^^^^\^dgikpuxz||}~vrph^M>0,,,,,--/12321--,,-../3455544332321222455532//%%&2G[iooqqpooruwwvvtpkgba^[WVVWUSPI?4+%%"!"$2Vz}uneUD624CVixug^cn{zmf[PIJPWcceed`\XPMHGHIJJֿù{²ursrqthgegghjkmllkigedca[WRNIE<80,(%"!!  )>Z~ʽsvzvpqsǚoM;41Ii¿~~x^E2""#%(-6>IWhr{tjbfec_ZZZ[[\\\\]_cca_]XQHB65338BNW_ixudYOHFA;8@BA<9=FNftr^RTm|qe^W^goqka[UW[_cfhikr}|tqnnt}{rsnjgiigeabcfijggdghki`SHB<;ALXfpzreefhmppolljigd`^\ZXUSRSTTPNPNIFDJVjyv|rK?If{sh\Z\tiVJFLTXZ]_fqzgMA5127FWfnsohb\XVUW_dfgltvz{{{{|~upldWE6*')*+-,,.02210.----./03455554422321121344421..&%%0EZipoqqpnprtxvutsoie^\XUSRQQOKF=3)" (Be|smibP@116CSct|rcWYaqz~ytfaXOKOW^okgfd^SKB?<GWe}oZVn}tibbitsg_]]]^``_^dks{yrliou~}qqnjhfgggcddehiffbfhlh]MA;9=HT`lwwpddfjmqpokkkihfda^]ZWTRQRSNMOOIEDM\rzuvÿzUMWqypdUNNfwvg`]^b_ekr{}lRE990%%(*+-,,.01210...../003455665532321121233410-.&%$.CXioqqqpooquwvutrnhd\YTQOMKKHD=3)! 1Ss}vmkkdQA.19FR`q||xo`RPUgoxzyxupfbZQMQY`nmllh_TKCAADMV^cŴµѹú{yxwwxiecbbbbbdefgffcc`]YVSNHE>;40,(!!'())(&#"! ,8Qnskq}DzpYKFD[sŸtT<)")?]¿x^G1#$$%%%%#! #'+.08CNYhwyqjea]XVUVWW[[ZWW[_]XROMIC=/027>HQUbcflu{oaXTNIIGB@CGJKN\p~d\r|ulgnvxkhdaaa^\Z[^cjt~}tkginvqnlifeeimhgfeggdd`dfieYH;67@N\gt~tocceimpomkkjigfed`^\YVSRRSOMPQMHHRc{zurw¬\T]t~xqj\LC@Sf{yvuxqxqWG:;AIWflw{n^PLKPX_aejnquz|~ytpl`O:,#$(**++,-00100//../0113456666633332232233410-/(&$-AVgnqrqpnnqtvussqngc\WRNLJGDC=5+""(Ad}yohmqjVE04--+*+,,*'"#"#&*.16=IT_lzxqid]WSRQQTVUSQQRTMIBBCB<7,-/7BNX]edfku}ug\NKIHIIHHKRX_fuicv{unku~qmiggec^^\[Z]eovvlfehp|vihfa]^dijhgeffdc_bbc_RA515AR`ly}rmddfjmpmlhhhffeeea_][XVSRSPOSUQNNYj|vsqyĿƬ^RTfsrke^XM?62AToy]K;;CLYgkxs`QJILT[^diknsx{ysrl^L1% %*,***,,.00/./0//00123456777754543444344421.0+'$,?Tdlqrqpooqstsrrqnhd]WPKHEA=84,%$5Uutiepzq\J36<851,&#$(/551*'!!$)2@OkþrXDIZqwsyzleafki\O?;2*#(;[waI:2113441.'&&&(-148@LXbo|uncZVTQPVTQNMMKJB?7549FTahghkr}vng\RGGINSWZZhlry|rnnllw~j_c{|xuqox~rollopkfeca][]aguz}{tkd`aivxvqf\X\chfddeedc``^\UH8--3@Ramzxolghilopnlffeeddedaa_]ZXVTTRRWZWUU`q}wtrr|¾ü~XHBNXWSMHD=2+(3Eb~iS?>EP]imyxcRJHIOUZahjnsvz|~}unleT@'#+-+*+,,.////000001233456777766665555455532/1.)%*=962-)$#"(1793,'!! !!(09JYvǶmYC5:I_u{wwnfbp~hPFFC7*! #/Gm~hRA42259962*)')*/367?KXbn{~vja[XTSZWQNNMIEEBAIRXUQHB=?IXfmhkpzzysg_YQHLNT[clruxm`TMIHDFP_\QQ^~~{wutrz{rqorvxsnlkgc^[[]elquvoga\\cpx|wf^_ddbbadeddb`[WNA2&*0?R`l{vnljjknqqnledccbdeecb`^\YVVURTY\[YYevzvtrs~¿zT>4:CAA;762*%#+=ZyrYCAHS_lo{{dRHFFKRW_gjmruwy{|{|}wohd\J5"+.,*++-.///.01000123345678887777666655564201/*%*:O_hprqpnoqsponoolhe^VKEA<5/"!$Kutjj}kX968BO_o}}xsssqrrqpne`\\XSH@?=@C@;;@CIMNS[`eiid]UQPQWRLMPSRQMKHGIIJIƵyrʸ{topsvyĿ|wjgeb_][[Z[[ZXXY[VUWWSPJIA?;852.*& %%+6;6/-''$$%&#!-8?GXi°qS<3-09H]ntpi_]Z\dh^QBFSkvS9-'# )' )5Wv]H=518>=950-**+/479>HS`n{zohc``^\WUUTQNJOU^jrnebTMLM[ijjnw{upof]ULDFKKYfnvteZL?6323*-5<97H`}|~~rnptx||yvvsle_XSPSZ_cfda]VW\cks{tc]\db`bfgb^]\UMB7.)+4CR`pspupruvtqmjfdbbdedaa`_]ZYZ\ZWX[\YZ]jz~zupprwvO6,)-110.)&&),2C]xxdPIN]n|}{aOIJJHHO_llnqqopuzz{|{{~znb[R>).1.-,-/12311.00123445567789977765666777754244(!)9HXehoqmlpplmllmonhc\RGB;/'$ $Zunuy]?==CO`q~~ytqliea^\ZVSJCEHJB:38==:9;?EEFGJNSW]`a_]]`dfZMJOWWUWSNHC>>=ȹzʶ̿½ykhfc`]]\XYYXUUWWUUVUROJHB@=:640-)#!!&176110/,,**'&#)5@HQ`qɹl]E2+%)+3>JSSPB@>AHK@3,8Mj`A1+(&"! "$//(#&/Mv|bO@:5;A@;752/./58;=AJS^iv}~wqonjhcacba_bis}{i]UOWb_kpzztojgbZRKD@DKWgxrfPH<3.,,+//34/0Fa~rmru{~~{xuoic\VSORTVWWUSQSUW[ajp~©qhgidaadfca\YQH>4-).7FUbr¿rputvyzwrmjedceefda_^\\[Z]^ZWV[[Z\^kx}{wqnoqvwZ?,#'/10/0159<@OdyjTMUdzeQJLOMMR_ilnnmloswzxdSF2"-/.--.012321/0123445556788998887677778775424/&'7FUaelomkmmhkjjkmkd`XND=5+$"/awryzbFGKPWcs~wrnkb]XTPNKIIC>>AA<536::758==??ACGKPVZ\^_cgmtka]aefeda]XSMLJʼ˽Žƾ¼zligca^]\WXWUSSSTUUUTQNJICA=;9620+&!,3458:961/,,+*1>JQZk|îlTG5(" !(/564)('*11'0OphF2,)()'$! "%04/(%(BhmZH?;?FD@<763248AJTl}{mcTPLIIIIIQOMF;6-#3a|yu|{hPSY_aguwohd_UOJDA?>>A?<;;:855888547;899;=AEHPTWZ]biotrnkknopnmkhc]ZWɻźʸyomidb_]\YYWURQQRTTTSPMIHCA><;841.*$)04;ABA>71-.1/7DQYcsbD8,&! %))'#"#%**#7\|ðmJ6.)))(%# #$&24/-,?_yfPFAEIIEB:9657:>AEIMSZclryxgW[ddbl}ukb\VSE?HSais{Ƶsealidabba`\VI?6111>GR_ly}uty}ulgeefiifa\ZYVVYZ]^]YVYXWX\gs}{ywuqkgknwt[;)/=HGHNU\^^chloquz{zyy}v^SZnbOUYXRQWaffecbcgntŬgK:3)+/331003223222233445566667789::;:;:9:::99996535+%):M\`dghhijkgghigd_[QF9/$!!!%$:`~|xv}|~qYZ`ilow}sh^WQJE>97788===<9787666422484567;=@BIMPRTW\cilmmmnorqssrokgeŻ}spkhc_[ZZZXVSQPRSSRQOLIHDA>=<:740,&#%+2A@?Kcr[OFHLLJIA?<;=;:40*%#!!&-8CMQPI>8;@CLZhoxнuL0*-7A@@:/%  #*-,AVsfRD:3,//-)),.0ERWZV[kĿ|fXKKOQQQLKGDEFJLKMQU[bjosǾzbNQ^btwqh^UME>88?MZhzur}~vqvvwxzzxwrstpjhhh_SNMI@?FDEB=8;CKKR\hpx~rgbbcb`]ZYUNB7228GIHGCACGJHKS\gr{se___]ZXXYUNC:68?DNT_hq{Ľ¼xqmnprtqh\REA?DMVZZ[YZ^\XUVcs}zvurpsronkgb^eiov}~q_OJLV^ipqsvz|wpeXT^mshk{üeQOTU\\TT]`\RPJENrҾ\A7:EFC<;??<:86432246888888777889:;;;;;;::;:;;;;8765)*")>LKLPVVTTYTVXWRKHF7.$&!5T}}z{tjl{{y|xha[TLE?:8655556510//0/./00/123220346888969;<=@BJSZ`eilkljlopqpnowwĿ}ungb_\\ZVQNNOQQONKJHGJHFEFEBA<80+)(&&%"!#&*6AKQVOCCUhomkg_VPLJJLJGLXelw{smkilmjebdfeqvsqibgs¾wfVQUY\_XUROMNPRRTVWZ`fiuȽveZf}{uogZNEA>AHPSSXWY^^YWXfu~zvtpnqpljhd`\dgkrwzzxx{~~|iVMNYcptqptx|yuoc^hztkl|vXD@BPY[UX^_U@GMNVtʺjK62:AA<57?A=:96532346767666766799:;;;;;::999:;::9865%)$$6CDELTSLHJKOPOIC?>:1&"-@Z}{ztmp}}ss~|ztrsme\TLFB?><655522005311330///02452101357767579:99;AOW^gpuwxuwy{zzxxɺu|~~|wzþ{unfa[]\XRNMNNMKJIIIJIIIIHGFE@=8520,,)%"&()3>NRSOGDEIVapyydLDOdx~}zupjfghfho}vnjls~o`ZZ[]`_\YTQPSVWTUWWX^dm|ɹogo}wpjd[QH>9=EIUfs|r^V\k}||}}||ursspmnopppqqqqojggimm]YL@:2:S_`YVXPHOHIMVbq}tg^UVURYa_b[PGCFMS\eouy½ù{xvv{}wpfZND?<@GNONPZ_\[^^\j{~xusqonmjigd_YTY]dhjnoqtvwwwwz|~{xwwyzr^QKQ`knouyy{}|xsu{~ss}o\F57CRY^`ab\UD>CNVhƶ{iQ>6422<;7567;<:::9877777644455346788999;:;;:9888877777-0,!%.3<=CKLD>>IC8102,$ +" %*8L_j}|}{vrrtsopvzzurv|xplosuqfXLD@?@A@<7740.,++/2565530.001223235533345666789:;@KT]hs|­ǻ{}}ytvtxxuw}¾zric[\\XSPOPOMLJJIJJKKKKKJIHC@<8631.,(&)))2<>FJKINV\[Z^`am~|yurookjjhfb`[URRW\adfikoprrqrtvyxwvttttz|~|}xcSKM[imouwvvxyyy|~poruvq`OE:27DPW]_bda\R<;OZexjZLB6/12336655478:999:88877654344645688898::;;:97777777778891""&15EOZhuªƾxvz}}}wqm{ľvkdZ[[XUSSSQONMLLLLOOOPNNMLIFB?<:631-**)).6AJQPJIQYhr~ʺvhZXbrwnkltynebcglhfc^YWYZ^\\\XUY`jz{xskaYNF?::?KWbjs{}{}q`PNZo~zvrljed`aegghjklmnoopnmjhffgeXVK=4/>\hRHFKRPPUbtqi`XVVT`oqsmd\Y^dhnt|ſǿ~}~vl]QD@?@EHGEIPVVX_ehuzwqnlkighf`\XTOKLQV[^adglmoonnprsuvwvtrqtuvwxyyytuwz}~iTIIUahnsvusuw{~{zy~tni`WF9/035>JQX_bgmlh[VOM`ˣwYNG?2/.05854.01334447878788887654568688:9998:::::97677777778<<2# %+/,))-306MhmS4".2)"+30-.13/4Ljwtyr`XUVY]c\Y\ZTRWuUB32444334/.-+**)+14455422///000000/.../012345667;>HTbsī~uw}~}}~zru¿yld[[YYWVUTSQPNMMMMOPQRRQPOMJGDB?;852/+)'+08BKMHKT_ryƱxrh^]etxompsuvonxuoorz~¾tjeejomkhd^[[\`__^WSW]iy{wtofYQE@<=@GR]eipux~|j]PR_t~zslecaa_adhiihkklmnnommkjggebVUK=3,=]rRIGJQOPVaqxple]ZXVdw||voifjnsv|żxm^RIFFGIJHEEINQU_hp|}zvpmkjhgeb[VSNIGKOUY\`cgknpqppqruwz}|zvtsrpppqstosy|q\OIPX`hpuwstw{~~zxtpjfb_\ZZam}}soeQB.%")4=BJPQRTRPNQZiwzpielx~~xnf`_cdeffhhikkjlkkkkijhhfedaXWN@2%,FttgVLDHMSY\\]_aciqvxzxoid[h}~{|Ļtj_UQSSRPNJFA@AFKVguzxutmjhged^\YUSPKHKNRUX\`djmqtttvw{|}~}|yxsrpqtx|s]TPU^gowy{}{paRH?CIPYbhmqx|wsgR>*+-4=ELPS[dkt|~zl[dsWC;=951.+)+*+,.-,,/0111012320./1579;<===<=<<==<;::9999999:=831( .jʫeXyu<$#:OTOD8?YoxomhflxxU7*.51+-Aa̡nH2'$!!"&)***+**,--./022//..-,+*)*))(*+,..//01232103@Reuĭz¿~~~~~zszĸrg\YWWXXURTSRQOPPPPQSUVWVVUSRQOLFB=@<2*)&%'*-4@QcoͿusplijsvh^ZWU][asý{wy~ÿzoimrqrrplgccadgf]VZcp|vpkea\ULECBFPVVTUNHCDM^oy|sopz~~vkb\[aefggfghjjiiihggffdcbba`YWN@1 3Vz}dTBFKPQNJHKPXdpzxqi^h{¾ĿǾ}qj`YWXYYVQNLD?=AGQcu{vsqnhecb`_\ZYYWTPMNPSVW[_bjnsvwxy{}}{zyxxxxxxzj]TW]cfluz|n[KA?IWep|xreP?+.2346:;BLT\dkjfQ`kykZG<8864331/--.-.*)('()+.....--.0/,*+.258:<=>>>><====<;:9999998:>:760! + !QoO-#"6HMJA27QhwxojkfflxvR8',LtśmF.% !#$''''&%(*))*,-.---,*)(((''&&''))**,-...-+),6EUcr{űľ~}}ulvɿ}xurpprvz~¶vk\ZVVXXURTSRRPOPPQRTVXYXXWVTSRNID>C?4,+(%$%'0AUit˽wponkjsxrpnmspu{y|tmotrtutokgecfih_X^fsxrkf_YUPGAJHLU\\[ZWOFEM_r|ytrv~si^YYaeghhghiiigfeeddcb`__``_ZVL?0%;_{o\CFJMKF?;@FRbq~~ul_gyýź|pjb\\^`a]XSQE>;@EOas}ytqljea`^[ZZZZ[[XTPRTWXY\adkpuy{|~~{xwwxy~scY[^_`bqy}o[JBJVhx|riZF6%*,'" )1;BJPOHHNYjs`PC=;83/32200021,)&""#%',-,,++**-,*()+0388;=>?>?=>>>>=<;9999998995472%" Al_4+%%3AFE@05NcpogghdejunJ(7pϯT4'%$ !! !#$##!!&&%%')******('%$&%$$$$%&&''()+++)'')2>LWdmvzzyz{ï~žzûzsmhecaabdegiklqvֿ~o`XRSTSTVRRQONNQUTVY[ZYZ[XWVTROMLGGA82/)&$)@XoȽvqnpwwrrtqtxyvplhfjmlb[^gvyrmc]VPLJHGLOSZ\]bibcb_blux}wnnq|~~sdXUVbb`bdfggddbba``_^`a\VVZ_ZNE;+-A_yvcQIEJE937>>>>==<<;9999:;<<6413028WI* 4^lG803339FG;7DTZXXZaeefqsD%PǧzR7*$   "$$"""$"#%''&$###"!"##$!#%'&'))$$&*.7ALW]bgilmn;ſǴ}zqld[SKDA<<<=AGLO^ep{׿scZRRQOQTQSQONNQSUWZ\[[[]YZWVTPNLHHD<73,(#)A[svrqv~~{utvtx{|xsmjhjnme]aivxpk]YRLFFFGKLQX\_hpz~~~xrngdeq~}~teYVXa`__accccbaa``__^^_ZVVY]TI=4'$4Mev~uiXLDD>306?K[kw}{truz¼ĻxnfbehlmiaXRJD<:=GXhy}wqkica[WTRPOVWZade`\XWVWX\_ahmtz~}zxz}~yqhb_]^en~vnllsz\D4(  + &N~nRD98:7112452,&!!#&)(#!'&$"  &%" !%*-358<>?>>>>>===<<:::::;<=76232(2NrX+ .WsH6***)/9A6.7DIGIRZ_bfo}hFMr̪xM- ! #$%%#""""""""" "$%$%&'()*+-18AMQUY]adeõźԼ|{zvnf[VOE=2)#$+/@KX`bgyԼÿzk_TQMJLPOQPONNOQVX[][\]_]\ZYWSPNJKGA=92+!)B]vž{z}|ywwx{|wqnjkonf`dmw{tkfYVMGBAEJONS\ckw~|~{tlfba^ZZgz|z|~~q`VTX_]\\\^][]\\[[\[\[[\WSTXZOD8.%)9IZhkh\PEA:34;DP`nw|||}zyyþĿxpkilnrsof]WNF?:$ + +R]<06:743331.(" %*-+$$#!"!#&).16:>?????>>>===<<::;;<><>8532IoŴW*,S~}N7%!"!%.:/')1678ENV^dn{uýЫvE! +""#!!!!"#"! !##""$%(*,..15;CFIMPVZ_ʻ}|ǽȭzvqfUG>:3,'  )8FOYk|ӹrfXOHDEJMMOOMMNOVYZ]\]_a``_\YVSRKMJFD@5.*E`zý~{~}xw|{uqkknnhbgoy}wplfbZUKB=@JRWVZeq~~}~}vk_XUUXVYdr{zvvwyz||jXOOT\[XXWXWUTTSTTUUUWXXVSRUVMA5+%!$,4?NXZ[QHD>9=EJR_ksxz||~}¾üvqnortwwska[SJA< +->Ojb3$09=<952.+(&""#$&'&&  $&).4;>???>????>>><;:9::;?CEHLSY\Ǹ|wu|üüŨ}ri_O:,&! + +-=L\kqrӹþyl\OC=@EHKNOMMMMUXZ[[^`bccb_\YWUOOMJGC8-.Kf~{}yvzwmlkmhdip{}tmhebbYQE<9@MWXX]k}ƹz}|zz{|{{yumbXSQPPU\djnqrttsswzeRHKQYXUTTTSPMNMOOPQRUUUSRQSRJ@3)&$#').DR_mszzy|}{}{wsmhca][UQOLHG?FQ_hic]YXZ[`dhknquxx{|~~~urnkkkjh_ZZcjptyyi7! Ra(!.:77851-($#"!!!#%' !!! !$&*18???>???::99899:=C@;:;Txǽ{T10OkaD+#""&.;83-++++2CGJMLMLNRUVYY[_beedb_[YWQPLIGD8-!6Snĺ}z|{w~{omlmifjq}zqidb`_UK@9;CNTSU]oĶ{}{yxxwuske]WRQPOHP[acfjorqppu~ybNFHOTSPOPPONKKKMNPQRSRQQPPPOE=3++* $#&2@GVWTPHBACPUZahpy~ÿĹ~wttvxz}|yoe_ZRJEADP\hottuyzywvtrle_\WURQNKFD?@@?@@@<;:999::5==;?AQmrI+&.E_tfK1&""&1AFE=62/+3:DQ`o~}mX9 +    !"!!&,1541/039BJRX]_Ƚ{tv~´|yqkbWH9+" +-;VcmpzwdSA65:>CHMNNMNPSTUWZ]affeb_\YXRQKGEB6*#")A\uǾ|ywwxwz~{{|xx}¿}xspnojils~|}wpib]XUPG?>CKNORT_w̽}|zyxupmaYPMOQNJELV^cgknqrsuzu`KBDKNMKKLMKIHHIJKMNPQPONOONLC>7355'! #/=GTWXTKFGHQU[agmty~yxwzz|~yqga\VPJEFNYdhllotussttpkc\WSRRRPMFB:@M^jokgfgfffilmorvyz~~{zvtux|xqmlkknruvy}{Q5  &gɷJ "+.+&%"%(($" !)('$"$',169=?@@AAAAA>=<<;;;<4<:88:AKWhwɓdH<2%    !#$$# "*.11+$ &1=LV]adùwsy¿¹pklruttuuneQG5! +  + +.?Vb]_s{wzhTA438<@GMNNNNNPRSUX\aeedc`^[ZURLFD@4*''/Gd{¸zqjgfffdfqzusvwtv~¿¹z~vrpqmlouxtxtnh`XPLOHBENTQMUYfð~|zxtni_VKINPKEEJR]gnpprtx|r[F=?FKJHGHHHFCBDGILMNPONNNNLJB?;9>?0!+??@@BBCAA?>=<<=8>:0% '3BTaaZUPG;9;BN]lu˓U'! +     "%&&%#!"$*.1.',=N[dhiȹ{|½nTR[biorpj^R<1 +#$ 5ERU[hppoiY^pZC315DRRNSQ\qȫ{xrkbYQOMIGGFNYcjorty{qWC76;>ABA?>>?=>@BEGJKOMLLLKHC;;>FON<(!)9HVZ_]VQPRNRX\afmqw~{su¾ú~~vle`YSOOPQQ\\^`ehjlnopniaYSSWVTROE918FWgqrrnonljjlorty}|}~n]UUY]cmtyxT+  + + +([]1 %163)*1/&'$!$&',399=@A@ABDDCA?>=<>>AACEFA=NfcC=Om|bF6'-ASdlmh\NB;79BNZ`jrx|}qaʥ?" +    "#"! !##!!#%.//+$+@TciihȻŽ]DFTgmqpkaRD," + + %''%##"  +)6GS^efcVPBJvs^H859@FLPNMLNPSVXYZ\^cdfgeb^[UQKD=6.)&/?Vo¹|xvusrrsx{}~}wropppyxy¿Ŀ}xutqpu}}yupmligc`ZSNHF?BMMHQUczŭ~|voh\ROLHFGIP[elqtv|sX@3149>@A>==<:<>@CFHJNMKJJGB?9;ALXWF2#-;IV\_^YSSSNRV[`fmrw~}sqxymga\VRQSSSVVXZ]`cdkkigc^YUUWVTRNC807CVforqqrpmkklosv|oZKFER[grx}~yiL' +  +  + + "4\b7 '041394)#""#%*17:=@AABCDCCA?><;=;@EECBADTeyzUFNgmO:'&ATfprneWIB<=BKRV\cghiljhRBȱR  #   "%%#"  !"#&+,,*%"/CUdjlj̻~~ƬV>EWlppj_Q=,  + "'*+)(((&"  + !3M^a[VFA3;?DIOPMKJKPTX[]\]_ceffc_[YOKE>82+()5F^wü|xuttttpnnoqsz{yusrqv}zwsnjhfd`^XQLGF?@HIFPYlű|um`TPMKKLOV_ipvz|vZ@0*+49=?><;;99;=ADFGJIHHGD?96:CRadT@'!$.8DOZ_aa[UUVNQV[_fmrv|ulnxþ{pjc^YVUVUTQQRTUWYZca^\ZYWWXZXTQMC8/5CUepqpstrnkklntyrVA3.AM\luxxx~{tqkeXB#  + 1Bg_9 +  +06<7+##  !&.5;>@BABCDCBA?><;=6AHF@>GTfov}lRN`wX@+"=Pdossl`SKFEGLPRSVVSSUTT>,cx?(!   + #$$"  !"%%&&%#! )5GZflmkdzˮVAJ_kmi_P?)  #&(**'))()*'$  +>VYTSHB3:ezgRECGJNRRNIFGNRX\_`aaffec_YUSHB=:5.((.;Og}ƽz|~vssooopruwzy}ÿ|trpsy{zzzxtnjdb_][UNIBC=@LNO[dwǴvj^RNOQTXZ`hpv{{^C0&'26<;:79;=@BEEGGFEC?9505BSfk\J4,)2@KTZacdb\XUVOSVZ]elptz{mhluľ|rmda\YXWWURQPQQSTTYURQRTVX\]ZUQMA7/5BTeprqttrnkjkmuzuX>+"3?Pamrts{{wtqomkfd`ZQ@& + +&+-0FrwZ:%",54-+**&!$,3<>ABAABCBBB@>=;<6@HE;N]hmmjϾè}Q:CV`a\PB1  !  #')'+,-2750& ++CMQUOI8;c¹}lYKJOPUXVPIDCGMSZ^_acfdb_YSNKB<664-),3BWoqt|{~|xvoqsux{|~w¾~tqqt{zxxyzxuoka_\YVPJE=@?I\cgt|dzvbWMMSY`ghmsyfJ6,*38=??<;;9:;>ADEGHFDDA=73)//+'$(# + %++553/'",3<>@A@@ABAAA@?=<;8@EB8=[|ǻko}jS?/%#&3FZejmkcWOLKJIGFDED>;<;<'C͗A'""# + +    !%.367AIVckmkiǶµqI06DOOJ?5)  "! %(+/217?>5(  -=JRRM=?dq`SRWW\a^VLDAAELQVY]^_^[WQKED>6254.,1;I`vúmmz{urqsy|zsuw{|~xtqqu}{vvuvvwtok_]ZWRME@<=<>>ADFHIKHEB@=73(-:Neuob[UV`lsvxyvrle^XUUVWY\agmruz}}|qnoqv}~upfda_^ZXUQQQPQQRQPPOQU[_bhg`XRJ>2+3AUhswwvvurqqtweH/!)+3?O_hmokfdc`]ZYURQSTUVTZ[XUN8#  +  +!.9@CE`x^F;:73/+$   3574+"*1;=??>>?@@@AB@=;;;>A>7=\}ȹvqj]K<0(%&1EWaeikdXNJFB?;98<;84521!<{گP3#!       !)4<@@JR]hnnkiʿ`<')5<=92*% + "'+.22/4<8-& + + ,:1/56228CRh{Żigu~xsqouw|~{|ztprv{wsrrpqrokh]\XTOIA?@ACEGIKKOKFA?<95-0;Plxvru|tkd\WXXXXZ_fkqtxyz}{vtrv{}ÿxsihdba^ZVTSRSSTTTUVZ^bfjlnkcYQH;0*1AVjv{{{{{zz{kO7)&&'1@P]be`[XWUSONKIKORSTU[]\][J5  +&6BKP_}fPFFB=41*$"  %*13.'# !""!'/;<>====>?@ABA>;;==>>8;630-35412.+!"3aK/"!"  + +  + +  +   ",9CFFNU`jpqnlûnM/*.0.(%# $),.3/),4/"#   !07781;e}ma^eekqpeVJC9<>ADGKMLKIFC@><:0.6834=IXmǻhfpzyvuu}{}|uprxzwtronlmmkhf^[XSNG?:JR_ûxqsz~gWNJEFHFB??@CDFHIKMNRMFB><:713>Sqzpg^YYYXXZ^dipsvxy|zwx|zwljffd`\XWVVWWXYY\]bhlpqrpndYPH:.)2AWky}}~pV?1$"")7GSX^ZUSSQNJJHHKPUVVX_`^beVD0  + *;JTYiĸlULKGA:5-)()(' ,20+(&$%%#%-:;=<<;<=?@ABA?<:>:;=9;Okysj]RID@:511/.(;NVZ`faG>;9641/'.2211+'!'Bb}g8"$#  +  +  +   #/=GIGOUalqsqp½uT;&# &(&"$)-/20,(%"   %$(%&7a½~qicbouyvnbRCB947<>?BGEB@??=<;428978=O^uidlu|~~}~}{¿¿unr|wttsrkihijga\[_WOOF=@H[sļrc\ZQMHDCBAA@FIGJPQMVPIEB@<847D[vtib^]^\XW]cgpsvy{~~xsnmkhea^\XYZ[]]^]fiouyzywsi\RI?4*&1C\q~{_@-(&$(0:GRNVZWRNLHJLOQTVY\b_]aikfaD1  + .?LSVU|ŻlXSRLEA<4/+)&$ $-32+(# !.6>==@6159@KW||wwziTKD>:79:95228ET\]__E?91043/3-(*14/*!.63, $      +",6?CEEEP^kuvur¿sQ6# #&%!'2:A?7,! +  + 3`þumjhpw}{vk[M@935898:=;;;<>??GCCGHEFK\j~lbenuy¿{tt{zrooonjhfghe`[RYTNLB;@Xpxja^OG=:>CFHHNQPRWWSPLF@=;:9BJ\tvja\[\[[[_bdilpsvx{}zupomifb_][Z[\]___gjpvyywwri\RH?2*+7JavkM8+%"+7BPW[VQPOMLNPSUWZ]dbdhorqocQ9" 1BPX[]~s_WTOLKG?82.'$"    -54-($"".4;?<:;<;>>====<<@:668;DQltss_KGC@:8999647=IW\XYUC<7/-22/0-*+//*$#"  +   +  +    %-7?DGELXfptsqpL2 $((#*8EOL>+  + + -\þ|uqpu|wgYE=5764222448;CHLXY\^ZVV[kxûqc_dlt}}y{~}u¼{vxsmjjihhfeedb\XGRPJF?BGYg~|oe_YXWZ]`abehlnpsvy~ù|xsrolhda`]\[[]_bcgkpvxyxxqhZPG>3*0=:;;;<;;;;;;9?<:966>H\x|tnlVEEED>88:;88=BMX\YTOB<6/.10/,-,-,*%!! + +     +  + %.9CHDIR`mvvvükE."+1/+%! &4ES\[L4  +)S½|yy{qbOF>=:500/138AMYalputmecdtmbbflqwzxwy}zwtup½wx{pjgggeeba`_]XSEPNFC?EU|ƻźvaRKIJKQSTSROKGEIKIIO[fywmh[TQTX]`ejklllpuy|µ~zvtqnjgeb_][[]`bcgjptxxwvogZOF=2*0>VmtZB0$1KW`]WTSRNPQRSVZ]bglpsw~w_?$  +';<;9:::;;::98:;8326@UlokiTEHJF>989:::@FNVYWSK@:6421.,'+..+($!  + + + + +  #+4(!"*4:82*'#)7GYfnm^E-  $Fvxi[OFB=610/139DUixvolwĺrkjjjkouzuux~|upljkjzzxniggfdd`][[XSNHQLBADSjobZV\ZWURNJJJRZ^cl}ÿ{ql^TNOQT\elkighksx|ǿ|xvsokhge`^\[]`cdfioswxvunfYOG<1).=Vn¼jH2!/FVcd]WQNNPPQRTY\bhosuxzeL/ +-BTakpv|ojgc][UNHECBB3-" +!)01.$ &1;@?<<;9:;:<<;;:14860048779:;BGLPSSNE=77961-)$(-/+'$# !      + #',.129G[pzX3##(1=EE>50#! !)6HYkxyiR:&5aþ~paVJD>732/016BYtxzſ~xofbekpprtx}wnfbadf~~|ukgffdca]YWVSNILSKABL`züvd_XTQMORaju}ƾ}pi`YSTPLR\eccacgmsz~~zwsokihga`^^`adddglrtvttmeXOF<0(.>Wn~¿vJ3)@Seg`XRNNPPPQSX[djrwz}rS: 2HXcinrwkjnmlkg_WRNJHE;.$  %+.&*5>B@<<<:;;;<<<=:-1420259F\|m\[bVNNMF=86899:CIMPRUNC;55870)&$(+-*'$##&*)"  + +   + + + +  ""&1F]r¼lJ*$/:IRTNE@2.+*-045:AM\l|u]F3&!$$%&&! &Jÿxi\MGA:6721/2?Zywf[Zahhkmnx}yurlc[XX^e~wpgcbba__[URROKFKPH@ERhͿ~tkhffls¿~ph`^acWFCKUX[_bejmvw||z|ysokihgcbbcdeffbejpstrrleXNE<0(1AYn~||T:#$:Nbf`YUSPQRRRTY]ekrzxaE1 4KXbfjtxgagotxtnh`YQKI@5/-+'$($  -9AD@<<=<:;:;<<<:.1300577>Sqp[W_XSSPF>98:::;BKT\be^O:2032*%&&'(('%!$(**)"      + !2LeydC$ $6BR^a\TOJF@>BGMPX]fq~jTC930%#! !$')-.00( + 9p}naQJC=;<42/0>Z{ķ}gYV\ccefen{|z{~}unif`WOLNUe}{sld___^\^ZTQPMIEHMG?HUiɷ}yvzDZtl`dmp_E9=JPYaehijsrvyz|ysnkihgedefhhihadjossqqldWLE;/'4DZo}~||\B*$"7K^d_ZYYQRRRRUZ^chq|~nV=1#5LZafhy~gZ\htzyvqj`TMC=65663/$ $" ".?DFA<=>=9:9:;::823303886;Mhu]V]YUVRF?::<=;;>M\htzsb<1-/.(&((&&%%"!#$#   +  "6Tm¸zU9 !$&*;J\ikjii`ba`binnqqszyl\KCE>:51..13646<7% -e¾yl\OGC?;92-1>WwǴfWSVZ[\]bjtyyy}~vokjkpx|yqe]VUSJAAJVfxrkb[YYZ\YVRPPLGCFFGJNXlļ˳}vqu~˵{m`jxz`=-0@X`inpvgops|}xsomljihecdgjlkafknsvrmj^RJ@4,,2E[q~cM;5)'?M\bbb`\SRRQQTY]hjq{vgVC.$;OXX\dujcd`lv~~ui\RKKE<;>7,$ "$ "0?ACDCA=;;:9999995577;@=:;F^{tvnhdb\TPMJB=>=869EPb{{N1#+--.6.&!   " $$ + 'NkxƿsP5 '+.2DRdquvvw|~|}}~{oa[\USLFB?=<;8;@:+ +d~raRIC?=82,/;RoɶiXRRTSSSW_hlmmoolf`^]adjmldWPIJGA;=GUkzqlf]VUTVWUTQPPLGBBEJRW^jwŹİysos~ĸȴzlbixw\7%*Hbisww{kmnpx~zupomliheccfhjibhloswrmh]PF=1+,5F_s¿vbQI;+*6FTafeec]UUTRSV[_giox}ubL8.-4ANTUX_n¾viXfo{~wmgZ[SHCD;/'   +"!(6CDDECB>=<;:999973555:?><:DZrzn`]dpvwwsplbWOLIB>?=87:IXr^>'%,.-.83,'%$$#""&%$!  :LUD#   + "=a}ɾwrqw~iH0 $18<@N[lx~~{}~|xqnoonjd]VOJGEFIC4# +ezfVLGB@93.08Ibxʹn[QNMKIJMSW[\\ZXTQOOOUTWZZTJ@<>?<;BMZr¿rid^UOOOPQQQPONKGC@EO]efhk׾Ӿwros~ϳwupb^donQ-!*Xqxpjjlr|}wrpnmjhecbdgggdhlotwrmf[MD:0+-;Meytg]M:7BQ]hkihe_YXYWVY]agjq{~l\RFCACDDGLbÿxW]cnx|{wsnofZTQG:1& #1=GFEECB@?<;:9877622337=>>=GXkuz|thYRUbpx~|ufWNKGB?@<77=Kaк{X901/,+1.*&##&),&!&,#!   RxZ4  + + 4Vyyqlhnty~`B. )9BGLXcr{|smjiihjjkoquxz{sja\WTSSL=* /hĽkYOKHF?8214?RczwbVOLGDDFHFFHIEA>>@BDJGGJKG?869>ADMZfz{nb\VOJJLLMMNNNMIFECHUfolebзȬ}xvz۽xnrn^YY__F(&6jujiksx~~xsqomkhebaceeeejmptwrlcXKA6.,0BUm¿{qhWE@H\fmmkkga\]\\[]`ckox|s`RA9436;V{͵bYW\fnrrty{uic`WJ>2$  (5AJHFDBBAA=<;9776511103:>@@K[kstz~vh``l|}saQHGD@@A<79BWqУ_ME=2-*+*(&(.4<93-&#$& P~l? + + 'Ejwpjknqw|y\A-!,>JRWakwynf`][YYZ_dmw~}upgea]UF0 5mŽo_UQOMF@9537CPfqǶl]UQFBAC@98:=9631369<;9;=<8573--4I]wytpcTNSdjonmlhc`abbabehmsydJ91.28OvƝrYQOWahkpx}|sonf\O>.(#  &4?KHECBBBC@>;96543/10-07=@BL^oxx||uszwiXJDD@>??;8?Llɮ{l\LB9:;:ANcv}yj]QGBB;;==::FW{|rabbcfjpvz_=!)2760& #0Jj[9 + +  +  + +  ;hĽtnicbdjqxyyxy|v[A+(>Raklv|wtqmiemty}woh[C-##Oſoe]XVSOJF>:=DWg~ȹujb_TH@AAAL\gg`N8(#$%()))-5=DLXdov|~~wplhhq}}raSJGEFHMQRQQNIECGKRYesth[TɰεüϴƶrXHHA7EaxglzvqnmmljheaadfgehmqsuwskaUG;0*0;Tlg^]bjpmhdimolnpnjilnpqrtxy||`K?=DNdýórb[eprqty~{sfWC82-,,% (8EJI6( )4Teqku}y|unbK4) *Xujb[WVSPLD>AGYjŴtjda\NDDFL`v|dD* "'*)(-:DMUboz~wqj_W[fr¾yo]NGDCDHMRSSSOHBBFLSZiuufWQŪw{ҸƿѺßtXGKG@Ojn[bxtomllkjgdaadfgghmqsuwskaVG:/+2=VoűZWW]lwysmjnnlorplnqsvvx{}o[OMU`q~v}}uk\G<747;96;GWdeaN<,'*1;BA@ABBDEEB@=9631/*020/49@BBB@>=:864201-.48779Jg~vrcYRJDCCC>857<:7DeۿW547?N[^YPSL6%!1Lg|hT8 +  +  $Tžytngc^][\]]ZXVX[]_abdhsxvvvl_J8(.D`y||~yneZR8% Bqzpe^^`^WMFCDK[uſ|tpkg_\VRVihF, $)08DR\jot|xsqpk_VOS^p¿pig[KBABGNSTSLFCDEFKQXYfvjNDLĨ~\SlԾŴĨo[TT^{ykjs~zutvwtplkihhgffdinruxsk^TF9-*1>YwÿҥlNPYgqvvvwvroqqnnqprzrigp{½~vfPA?GT[`SGCDEFHA=7437;>B@?@@@?==<9752100-07;;>CXu}zpdXNJECDEC>9::>=>Ps޶PE=FV`a^WXP;+('$#*:M^mtraJ-%  +  + ,Cwž}xqic\ZWVVVRPOQUZ\^^^afgglqj^J8).Eb{uw{uligdJ4#+N|ÿvkdefc]SKGGIYr}vutroc^UPUk[=,).4=FRZ_mrz{tuuobWLKP\hr}vg``WJ??BHPUUSLGCDFGMS]_jteJEPȱbS^ɷ|deq{hjtȨqr}x}~}zwurppqqrsqojorrvxsmbYK>0+/:RnҢjKMWfqvwwxxrpuuroomp|ñytw½whWKJQY^^M:2013584347=BDDC@??>==<;753100..3:JRSUbq{q}}p[M4  3f}vnga^YWVSQMNPU\beedb_ZY_fbXF4&*>Vn~dip}{yxvwz{}|}}~rlntwdJ38Y}phlkhaWPKIJXozusxzywng\V\nqVEBFKT\cefqu~{wy|xi\OIINVZajy~~~~~}~{m_YYTMDDHOVYWTNIDEEFJQaagiYDFVɹlZ^~ɸg`bzļqxʩkly|{qntu¼¿}wuttuxz|{yxruvuvwrmh\M?2,2;JbҠgGJUfqvvwy{utwxtommp{Ǿ|zÿtj\TSX^`UD4/13563124:@BDDA>=>?>=:9631001-17=?CQ`uzy}ysh[QJB==@EFEBBDB?@I[y֮|UXgd^`hg]LCDE@IQZYOEKXpqbfszrU1 4þ|tngd_[YUSPLNS]gnnmi_QKPUQJ<."$2CR]NTbs~xrpnnoqsutttstx~tpw{_DEcſxoqoke\TNLMYmƿummpw~zumjo~zmlnpuxyvsx}zxqcPGAADEHM[`fnu~½~yywxwwvuxz|seWRSRPMNQW\\WRLFBDDEIPb^^YJ=FZûyinIJqjoùu{ndhotyzsmjns}ſþxvvxz}~|zxz{xxwqkj\I:0,2?><=?@??:852001226=ACJ[n{keg`]WQLHE@?ADDAAFJDAEUp͒`_khdfkjaRNRRKRZa^O@?F\ftpXHUpiH&  8|vmjd`\[WUOQWbowzypaNB??;51&#)/263@Sk|vutttvwx{{zvux{~uqzhQSlwvtnhaYTPQ\mwf\[bn~~|zwfQE>>?<<9::;=@BA@:75100237:@FLVk~n\RMMMKKLKJFFDCB?AGMEDMfܢmennlqnldYY^\SSX^^RC>?MQckT4:Yol`H,  Jüwrlgdb^\WW\guygO>50+((" $&!-Ge~{jagtudW^wĿ}zvrlf_XVS]mû~kYJBIVlü~~xfPE>?A><<@CFHKOVZdoyþ}tnkkkjhgimqpdSF@BINSUZ`c`WOGB@BFHOV\VPJBAQcĻʽкaRfɿzqot|znf`\[\UYSHHU_aeikhdfjotw|~~~|zwspquy{|}vqk\H8-'*11<979;?BB@=:8410135;:747<@?=68<@CB?<:9510136>?DO^on`YQGJIGFHJJHJFDBBBEHJNaᅧrooprmmfaelg\WTXacZND:=JUP>34+,+$ +  *HrĽzuromkecaeox}scRC6+%'),/+$:[wzkQ<5=HMOTd}˻{sbbbeku{vrmhe]cnȼ|q_K=:@Lb~oWE@<87777:<>?@@@AEKPUY_fmw~xoifc`_^[Y]dcWJ=1-6CPSW[]ZTOFBAFLLF@D;5444;D]fs}̿lGAC_ͳͺػcKKVl||z|}oVEEGEDA=@JZeicjdZZXcxt{o{|yzvnkmlrz~paN@6249CJZpÿϡaNWgy~xx{{{|{Ķ}~}}{z{~zlYMJMOND>9:@BCGLNPSW\cgnv|~}}¾yoiga_^]ZWZ__VI>0-6EMQUXZUOKA><@FFA=:1-00/1758<>BM[f¿lSF?Tйͺѷ~cHIWm||vqpumWGCA==98BRdkmktk[ST^pt{Ǽn|~zzvrtqllnms|}wgYG<415<::>?@A??<;8755489@GVn|soh`\UQKFBBCBDA><;;=DRj繁fjplijlmje_^_``_^_bc_ZXUK;/*"! + +  +  $)Akž}yxnmijmsvw}}}{uk_VG=3.-+#/H_t{vfQ;/07DN^qyiYOGDJKKKLRX^lu|wsrondfmzĺl`YTUatyaM?>=<:9764558:=@CEHJJKMNPQTY^cefffffhmvÿxqjh_^]]YUUZZVMA3.7DKOSWVPJE=::=BDC@<6479755331/.5?IRbyĭufUFRuɻʸŮ}eKO\ozvjaageYNIE>?>@N`oqqr}`RV`nw}÷n}vrpljkifghkpw~xleWJ:1*'*0;@HT_s֩fQar}w{}yqkghdaekvʸ~zw{}ywvpg_YSLGEC?=??@A?><<=<::877:8?H[xutuoaWSPLHFFECE?8669>Ha~їqkmihnutlc^]bde_X[hqpjf[H5/3.*"     *4Wzyvuuvxy~vn[N>52/&&:Nfwwo`O?6:BOT_p{rhZMD?>>LMNNOQUY_erÿ|urqrqgglx»~scZ\gu~urvpZI<;>><:9854346:=?EGHKKMNNMLNQSTSSSSTVZblwſ}xsli]\[\XQPTXYUJ;48?HLRUSMHD?>@DGLNOOLHKNNKI@BCA=:9;5*$"'08BQk˾٭jTev|~vmd\WXWW[`fuŲ~|{}}xrlb[WSNJGEBACBB@=;87:::;::9;:ALc~rqrk_VQNKJIJHEA9547;BOoⷋpgjgnsqkga\dc_XT[jwtmcVD64;3.$  %3KvĿ}|~~n_MB;4'-?Yo}pdSH?:BMUSWex~voic\XRKA:79<@GKNOPSUWYZbp}{urqqqihlvƼzsnkq|tooruxujkpþxaL@8:=?=;:96543468:@BDGKMONKJJIHFEC@BEGKPV^q|xsmh\ZZYTLJOV[]TE;98AELOMIFCADIMQUZ^b_]]`ddcVZ][WQKHMQUZ`l{zk`\f͵Ʈİq_geddb^VNNQ[m~eKNUbllimvzYWansx{zww{´~vnga`acedb_YTNKGD>7/)% #&,=OeɽۯlWiz{of_YTOQTXY]kz~~~}}zoaYTQOMHFDDFDB?;85368:;;;:;?GTk~wpmib\ZUQMLLLHD?97:<>GW~էwacilmklniae_XSU^jqmaTI>55973)&3Ch|o^PE;,"%4NgyxgUF>98@NPOS_musmf`XSQNIE?:41158;CHNRSTTVSRXcnyý~xsrrqiimwſoe\UQQYf~{wy|sgfhſ~iP>448=>;::;:8666667<<>CGKKJJHGEB>;946:=@DIOer}zwtpieZWTRLECFRZ]UJ@938=DHGFFHIMUZ]`fklnmkmtyz}}|{xwtsklkifefgʬ}zztbPNf˽{˼ưn_qme][]\XXYfpRRYfng`ixhaemtuvvuuwyŶwmd`abdhhd]XPH3/)$ 0Ja|ȽڱnZoztnt~ynhdb_UY]]ZYdq̽|}~~~||zh\VTRPJFDEGFC>951035:<==<LNU_gid[TPMIJMMIE@<744444BHNTTTSTQPV`cgvÿ|wtsqiimw¾zpYOHEEHQ^r~wwyld_juú~m[E7116:;99;=<;<<;:9:=<>BDHFEFHFEC?:71379=BGNZ`hwĹztroib\TPKHB;:>LSTNGB915:@FFIMQZbjnnoty{yricd|˹|vvpWFJZƷ{Ǵ~uwsj``jprsospqrwynchxȷwmefkqrrj\MD:0 +5Dc~Ⱦÿ۲r\w{x~xhZYhwzpmoqqilpl`X^l̴xw{vuzxf[STSOIEDFGFB=830/25;>@?>>BPd|udfghd^^e\UNLMNJD>:730@FMQRQOORRW`^Yarx{wsrhimw{i[QKE@ADJVekpx~pjp|{m`XPZkzùqaRA64/4::88<>>??@A@>0" *B[rɾܳs_}usvxz{aMARgy|qqw{~{~yh[_jūwt{yqouth\UMNOLHEDFGFA<62/-15:@BB??ARgo]`dhgcceWQJJNRPK:9?FHQqǛlQ\b][ac_YVSSQMGB>:9;98:>;>?<2)  !#/6@KQU`lu{üvi\RHC4+#'1D[oypc[B6./3:GTay}`GFDIQRLMTU[^[UQJCJMQTTROMNRWYZZ]bhz¾wrooghuzobUKEBABDLXdqyvvz|}zc^ksrxxzxi\YV\ny`NE?6-23469;>?AAABBBCCCBCEFFDCCGIGB?<:49;>EPURRRWiý~whadaUNQC:7:7/2>HMKC<;703:EKOVajyýtv}Ǵw\G^|ɸȺwlns~|v|ʲ¾|su}|wfQ@/##7Eesd|yrwyv\OOWi~vtzwokvtifjzͱv~xnebbbfmobSOOOKLLKEA@B@>;7210/25:>A@>?FO`xzlb`cihcbd^WOKMNKHE<?ABA>60+)%$%()(-49ER[`fpz~ſ{pdYNI<2*-6I_r~xri\S:.&+/5@OmtYHHKQOKQ^gqyxrlc[XXXXUTRQOQTWYZ[]`mxqnlfgtzwwww{~zwsmhc[RJC@>?@EN]n{~k``a^gjp{~rf][aqxhUG>91,23579;>@BCCDDEEFEEDFGGDCBDFFC?><8<@AHQUSQQXitd]`[OIK>65:947CKOJ?98745=HQXamv~¼~txķtZNeĶǻxnou{wùɰziV@/$" ! !':Vzsd|vsn|nRPUfyxonh`aqtppuӹx~ti]TOJOTRD::?BFHIGC@=@=<84221169=ABB?BGP^s|qefionhfge]VQONLIE=>IWnənKGLOUNSONKKJIDB=;978;>ABCDA<6322013459AITainr{tx{pdXQH>57?Pew|uolibUJ4"$*+8MroMGEFEFUg{nid]XVUTPQRUXYXXV]lǽwoljegswmhdaddeda]ZXPNKHEB?><=?DQcw{jZQMTYfu}ugehu~qZRH?84/-5679;<>@CEEFFFFHHGGHIGDA>@BB@??><@DFJPSQSU[h~º~ob\]WLGI>88<=:?KOOG:33667?LYgt¿pbiȻ{|e@Meʺ¶uijpsimtyxxqnnqmip~ʸȯ}qWD- !##!!%)))(&$" *Iotdy}neqXRSbuxh^VOShwrnvĦ~}sgXI<2983'")4:DDEC@?>?:9533489>>?<<>BNaugWSSXbrsnoz}ytmcYC?<:522278:;<=?ADEEFFHHHJHHHIGC?8:=??@BCCHKOQTVWZ]`gtxĻ{mc_]XNHJD@@BB@DNOLC81046;CQctǿ|f\jͿ{sku~fA?Mk̹Źk[ZavziYUWVTUROOPNQ]kϷÿǯ~m^I7$!$%$#" !$$'(+04542/,)&%!#" &Enwfv}nfl}`XWbuzdRJGMdwmgmx˱}zvl_N=11,& *5=B@@A@?>?865469=?BCEGFFEHJOXfu|~{ysjbZTPMLJHNnʿکeFDII>EAA@@AA?=<<:9;?DFHJLONNOPRONQPRY`ms}z_H5+2CewmaVLKN[l|}zyy}}{wsolntuuwupieb_[^b`VN@."%%%:U{xaK:>Qg~l]TQQRQORWXVSSPOXpúvnkgbdltvwxum`ULGFEFDCCCEFFA?><::;<<<=@GVft|}qmfglwzts}vg[QJC778965688::<=>>?BCDEEGHHIHHGGEA<56:>AFILORV[\\_elooln|}˼{vmfc`XPMMLKHGDBCIKG=5.-16AJZm÷}e^tžjer}pPDD\wμ~¶~bOKQh{zq^J@;99::::;2(%%$%&('&&%%%&),.137;99:;::66579=BEEEEFFFEGKMT_ly{ri_YROLMMY|ɾpH@CC9A;::;==;:<;;;=AFGIKPTUY\__\\__agnw|rW7*W»l`URT_n}|zyxxvqh^VTZZ]ba\WVYYZ_fhfc\SIB9;PhiQAMiĽs`SNKONOPSUTRUQLN[yývnlhbafihhjf_TIA><<;98;?CEDA@<9888:=>=>AIT_q|usvxzts|p[LD?;6678679<:;<===>>?AABDEFGHFFEEB?:35;AGNUZ_bfjjjpy}ruʲ|vqjgd_WQNMQOMICBAEE?71.-4=LWizúxabo»psp^R[tʼ÷y^JDJarrgVD8106<:534238>CEDB@<:889:???>>AENakx~vsqw}~tnnwwcPB<;;;86568:;:;<<<<<<=>??BCCEGEDBB@<749?HQYcjqrv{{{v}оrkeeb]SOLKMNLGDABCE;1-,.:G[hz»qcdȼuo~{vkqº÷sZIEJ\jh^RD<8;6596543222268=?AEJMNPONJD<910+##()$!3Us˅ql~}tskbbhgcXPP[flqtja]k~~m\WZntzymedktzȷx{|yvxywphSF?FKJD@94/023210257;=@@?>=<=>@CDFHNXgxztoj^TOR`}ˉ[?7<6:554677437:;?@AAAFJOV[aglpoty}~jM%*[˺üymb\\dr~~}|~ym[MF646=A@GPU\fp{ĿɿiTHBCHLMMLOQTQI?>Pt½~tnkh`[ZWRRTQPLG?81,3228>EEDB@?=<=?@?@A?=<=CY]fvwspxzv|{lhit|}zwnaO@5224;632479;<<<<;;<<<=>@@ACDDCBBA?;87Oes¾oix̺ųƳyl]\hµnWHFJZe`WOHBALbvyͿurkYK?;=DGD>?D><:866558;>BDFJNPRTTPI@<00/& &&%#7Rx͉vl~zoea`^\TMJPUX_ie\Zi~rgeipqrstoicemuxzȴxx|{|}wqaRKOVRID<6124652.0379;<<<;99:897545664269>==>DMV]dkt|toopw|le`fpqeVNB60./0/4/-.37:;99:::;;>=>>@ACCC@@@@@?>=;>EQ]it{ξ~ðn[UXWPLMJDDFGDDFGFG@5.-3FYqjkϴ°eejwżŽuoaWJFP\]XPSQMRcrxôtmxfUKGIJIGHMLHHFDB?<:9<;;:;AHMPPPQQMGC962/-*##,+6YХn~~zg^[ZYXZ]VNKOTUV\kzrooomnifijeaakow~~ÿwqx~||}|yc]XXXTKB<7457730/269;<<<99989;<>BEHKMUi~{xuoibqü㽌bF77=;87;<9525678;<54H`¼sjfb^ZUNGCDFIJHF@:3/26;?BDCDAAAAAABB=<;9;=BINY`glr|~vqnq~ohbbe`QC;2*&(*+++)(,28:;;;<<<<<=>?@ABBBC>====>>==@HTbp{¯̺ƺlUNRQMLOKCBDGFHMMNJC800:NawserǺ~yμĵûuhbWPFDN[^YNX^ZW^iq{{zvlaVQXp½rk|oaUOOLNNMQXZYTSPKGDA??><<>DJNSTUVVRLGA=9;;6-&!$*(.Kl֭v}rsqe_]\_bd^SKHJMNVkskikkjle___]ZZfn|{y}|yuhb][YTMEB>:9752123699;;<::9:::;=@DIKLTh}}tmrذ^C:???@CEB>;88788;?AFKPRRV[binv}~n]NMXfqyȼ}{|~zsmnv}{}o_E==EQ[emt|ǾtXD8>@ABBBA@=:8:>GPXdltvwz}|trxnib]VM?4+'$$'**)&')/5:<==>???=<<>?AACBA@;;99:;<=?DMZjwîôlPGIJIJMIBCGJLPTTSMD826DZn¾zfft¸n[bfoøƿoa[PKFFO[^ZUesm`[`gje\TJ@715Nh»óoeyĺufYPOSRTUVZdihb`\YRNJHDCBCDGKMRSTVVSNIEDACC=2*)),*!*;O}¿۳zzjbjz|ma[YcfhbVLEDHISlugaaeghk`WUVSRR\kü~{uoid_YSMHIEA;621255556789::9999:9<@GIHL`u|ΨuM==DFJORPJG><978:?AHLOONRV]hmsy~rb`fmu{ĸĿ{xz~|xuv|{vv~vhRLLR\bjq}ww³_F568;@>9412682-2:7545689<>><=>@AAA?A?=:;@GO_kx|lg_UJA:2)&')+*)($'-3:>AA?ABBA?<<>@ACCB@>98778;=?BHSapŶ³nODEFHJMJEJLQSWYWSLA419Jbt{kbf̿kWUUVZbmyǾrc\ONLMU`b^dtyfXTWVL>501230GcƴmbqrcTJINVZ\]bkprpnid^ZUSONLKKLKJOOQTUTOMJKKID<613223-%&,4:m߶w|hXU^jrrdZU\`b]TLGEGIThvk]X[bgie\SRRPMMVj|z{~{roiaWPKIHFB;400465432456887767646;ADCEUiڹXB?EMTY[[WQB@;76:?BJMOOMPU[ekpx~|lhmu}Ǿüxqovvk^YZ`glrz|{wȼhN;646=?93./01,)+2Irº~of_ZRMGB=;78:==<:87656567;==:;=?@@???@?>>?CI\hw|xy}zmi_RF=:8.--.+(%##(/7;?ACABCDCA=;875579=AGOZiwŽtUFGIKLLLLPSX[`_YRG<00h»}ndZUMGB><966699887557789<=>?;:;=>>>?=>?@?>@CO[k~wniil}yqndWJA=;531.)$$)059;?ABCCCBA??@ADDCA<9742359=CLTaq¶x\GJLMKINTTX_cgf]TC8.3@Servx}¿|ngbj}¸}pjiilqtuuwvbQHAFHB:9CNRY_a_`gowxv»lYNGOXalw|{|ytl[D4.!#'-19`skjzȿwlx{gaVJHNT`nxzxutrlc[USPQQSRQMSTMA:;?<;<=<830*,MϨl~h^RLMSVWVZdowulcRPLGA>>?GJQZgyl_\^acRQRSQOPUj~zunf\SLGC@=:63565543479::;;;;:9855;CHMWdsԬ|O2AQ_bcb[QCA=::>DHFIJHFJPU]bipx}tv~ƻµ{sllsz{zurptx}xx|±eS?8;=6-+*&" !"$2^|l`WPID?<;96558777766579:=>@?<::;;=>>9;<<<<>AEN\nvkecs}~utrooni`UJC=752,&  &,367:>@BBAAA@@A?BDDB?:720//37=DOZhxw\ILONHDLY_chlol^SB917HXfotw}ynf^^h¹{f]_cksxvtruvpcTHBBGKIDBHOQW^`_^afmtx~yrt~fRFBN\hr~~xrhS9'!  $%&+0=ht]Zwĺwmwp_]VKJRVfz{rea[WUVVURUUTNIFFDGHHEA95.3?h½زo~x\TMNV^`_SNO[krkaMKFB><<=:877789FLNQYaxǾƕY,@RadbbYNA@<<=AGJJKKIFGLRX[bjr{}{Ǽ}vomsz~ywxz|zo{¬v`F::;2('&$"#&('+V|j^TMFA=;<:7567877777357:==>==<;;;<>>789889<@BHRaq}smpy~}pkgcjjjf^UJB:73-&"!$+2699;?BAA@@?A@C?BDDB>:6/.--27??JKTe|iYUWY[QTXWSTcr}uruz~wqmeWMKGDEFE@<;:;>?AEFFGJKKLJIOGDHMKHKTnʾݰl5?SbdcbXK?>==?DILPPOKGGLQSW^fnwɼɾ|vqou~njlty̽uTB<;3+,*&'*)$ #Jyƾzi]SLGEA=:8779::9753220/28=@AB?>==>=<84/.38:<@@CQcr~}|pgb`jmpmdYQK@91+)'&&03578:<=@@?@?@>A@BB@>:52.-,-26@AA?>=>=<81,*.5:=<9??>?>>??AA@=:41-,,.38>FWgwdL=AEFCDO[r~uaQA??HU`gmtw|útmf\URYmӿubIIMWbihfcehjhc\XWTQPQRPMLORVY\]]][[`hmmknx|cOCBOZj{[7')(#%>Yhpkqpb`k~fSPOILTat~|vspojaUMAA4;m˜qZQKRdpro`O=6>HMLGGDB??ADIP_sl`VX__^]]^``^csukdacipqtvpheb`^][XYRKIHHFEEDB?>>?>=>><747;CJ^yƽƿþؑOBCbi`\MLFGFEFIJKKNQPLJLMMS\dkrx}ʼǸĶ}usxycORaxƴ|aNC<80,$##":f¸tdWMHJGEC?;9755532100.--04:=?@?>====;60*(+29>:8;FXgorrzymfefggnmkkjgaZKA6.-.02235789;<>>=>=<<>>@?>;73/**+.39>G[k}_D7:@DCENYn|{dPB@BN[chlpu}zrot{|vmf\SNQbsŹzcSBCEKQVXXX\bggd_\\WSSUUPLKMOQSUVVSRQV\bddkt{aL@?MXfu}f>/8=0*E`immxȶnb`h}w`ONMHKTcuzoaXKH8;iùװxnVLEN`qtpaQ=25>FGIHFDBADFJUeypXUU_hllmjklmmp~tke]_bfgjt~{wqonnlie[OHEC>:443223337::6-*-38:Hdø¼iEA]ga\MJIHHJJIHGHLRRPMMOSV]ciqx~Ƿŵ˸zvy{x~l\[gxúmTE<8.' "1Xør`UKFJHFD@>:8321/..-..-,/38;==<<;<<;:40,+.28<>AHSepqnjnqvuk`[_eijolihjjf_QF9102574457799:<<<<;;:;<>=;961.((*.3:@G]lż~[@04;CEFNVhyhQAAFS_fikouti\UQS[dr~zukdYPHL[k̻iUJDFFGIJMOMRX\]\[Z_][XUROLLLLMNNOPPNLOSXZ[en{x[F::IR\irqF8DJ:2Lghlsƾob`or\MKJEHSbtxi^ML=BpùqxiTHCJ]lpmbS@317@EJIHFEEHIPYhywfXY`oy{{|}}~wokcdecacjq~zyzzwpfZTQME@::;==@ABCFE=2-/351:Tuû½PF[fb_NJKIHLLGDCGLSTQPPQX[_dir{űȿι}~wqmvsosx}u]K@=0'#" -Muûn]QJDGFFCA?;82/-,++,-/../38::867889982212358;EO[hxzqole_ao|lcYV[bghmjgfiigaWL?7468954677899;;;998899:::63/-'(*.5;BJ\k~yY?,09BHINQctmTCCGU`fhjmu|ofa`cfn~jSLFIOV`jqx~|tjbWMFK[mͶo]PKMNMKIIKNHKNONNPR]ab[PIJNNLKJJKLMQPNNPSUV_grxxyy}qS>45DLS]fyxNO_o{uqgXPNSanzre^WUW\`cihfefhge^TI@<;986566677899877776889752.+&(*/7=DKYj|rT?+.9FNNNP[nu[FEGT_dginvzfVKDBHMXlw_HDFP\gqz~~vkbULIQezƩsdWPRRRQNMMMOJLLJFFIM[acZKCHQPNKIIJLMSRRRSUWW\cjnmnpu}}}iL7/3@GOX^pX?8>5!-@RcqmtyºrgekXJJG@DO_rreSL:<71.+))++.20.-/121.,/03454-269;>CI^s}p`SV]a``flwymh_\WTSTWZbeffgikke]SLF@<77556666788776545667630,+'),19?FMXh{ygN;-0;ISRONVi}dJGGQ[bfjpxxgXI>7:>Ia{s_[[dnuz}x{xoeWON[sնvf^WSVONNNOOOONRSPJHJMX\]THCJSSOMJIJNOSTVWXY[\\bgifgmtvuwwdF3-3@GP[apiE00, :Sdrvqy~f[crøuji¾fUIIFAFS`rtgSK8@A@>;72/,*+,./31-,-//,-+./2344/39<@ELUor`WizoXTXgnicd\[XTPNNQ\adfginqle\UNG>77554444566655433455530-+)*-2:BHNYhz}r_G6.0;KTSNMSf}iNIGOX_djrz~qbTD879D^z|w|yqr{~{rgZQRbʪi_\XUWJHHKOQPOSWYWPLLPUWUNGFLSTQNKJKOQQTWZ[^_`]bffddmtsqstbD1,4@IS`fswM/(&"B]o}xs|uVFCO_l|ȿvmj½}aQGHFAHUbtsfFB6;bŠp_UTLMPPOPSV\^\O=.*+6;CKS[dijrtkbckr{rx~|y{zspjbZcmsplhfixsh^`hov|wy~ƿ׈\RSUWJIHJRTG9?P^beeaadhjloqu|¥˺|rqqtvxutoor|wh`cltedtwX3!%#5^q_NA;:<@@????><940//24453/,()()&)-1333248_usqtlOC=?DN^oxml¾ľrXI?@BEMWixr_K;5E_ɵֹse^VNNLMNMIMT_ktlS8+*3<::7324665641,(%$$&(+.011249?@?=;8797677743530-)$!"$')+-/259=GUkn`lȾ]?;FKOPNNOQT\enqvz}~sbRGAA=:620...0233331,,./0/,,(,29?EHMYnxZB5+7;8:AO__SLFEO[^VF:5,## #'?ZxucRC;;==;=?AA=8546678:8410//,)$ "$&*-06:51/.-/122331,,0330,*(.6=BGJO]sxW?5-5:?DGJOSQT]myzoePKLSUXetugb\YXVUSbelw}ûsSOfj^_aba^ZWRRRSQQPPUVURNJIKNMMOTX[\YVPJEAA@?>>AGMPQOQSUUY_egnwvbD0*2>O[bodRD>>@O^\^iyzgZWQWZWST^fknsx{ywzumdcbXKA<=EJNYgx|hUF7,/:L_oifjprolmtux{ͫ~sibZPA<><77ESr{]FFNcuueUB59@@3  %7Miwj[K<8:=>=K]tk\{ʿŸi?.*08@GR\dbakƵs\NHNHC>83/.,-/12432//2552-*(09BGJNSezvWB=85:@EILNOWVYbijc[JEGOTZj{~ua\USU[bgy~ƿ`Xlιlb__aa_][ZRSSUUTQOOQQPLHEDGJMRWYXUTQMHECCCCA@@DHKLRRSTUW[^enwr^B-$,9M[bjwtZJDEERbdrswxqf]YW_gjgjpwxvtrrw}}umea\ULCBDC>=9ZiaSE:469<=LW\ci~׽q]SPRLF@941.,-/12443225651,)*2?Kex|{oe\UONJC>>BPbpx}|}zvtvyҐ_VPJTVa_YVNQbktzywxurqposz׼u}͸scK4170-/4:;CJH>5..(*,0230.(('%" !(18GP^q}y̾[<..((+9Obpryҽ|YNPU]dVPKE=72/+,-/012154431,(&+2CO\dn|}}}}}͍]WQGQafa[WQR`chjihmpppptz̠|w|ǹnedgZTOG9//7VnøŲvf[^jrwwxsoioqgTJQ_ljcZVbynK5,7AC;87/!'" + 1:<>>7//37=@@@=8/*,./12100-*%%%$ %-4:J[n{|ʺiH;51,'*?[r}ؿeQ;6CXfi`XPF=61.-+)*+.-,34551+'&-1:EGHR`{sf`SVeknie_UNOUQLCBOcqrbRHKWfz¾οwyҨ|l`IDA?@BCBBFGIKLKIHBBCEFFFHMPSURNLKJKKIHHKNRTVUSPONNPRTVUTS\dmqpeM8,-I\rδn`YYO<(3Kky}zpkjcZONLNW^[RMR\ky}{|œjRKNU`dfc[UTV]^]^`elrquzө|{ouǷaE;=B?:861,/8>Uųre\^fouyzvodc_VJFP`kje`^ltUA:COSOKJ?22+! +%/:>@91/249<<=<:4124332210.*&%%# (2@ABCDDCB?BEGJMMMNQSSQNLLMNMLIIJLNQTTRPOMNORUVVUTX`hrvp[G20;Rcgjp{vw}ukfgnv~~ytnkceinoqpoklnoqv|vomortw{}yuspnnlkijlmpnoptv{~}|xwuvuwwuniddeeehkjfaU@D`vwmgedW\`b`djpxz}|iX?."+Ilſ~wpdWOID@;?HR_pzh_ZO:,9Rqz}qcZWZ`_cfkt{wodcfr{xx|½ƕjQKOV`egcYSPSUWY[_enrux|ڳ|tgp±pG( &-/)&+--/6*?dŻϾ|md`^emsz}wn_UIB@ES`jkifhu~bQKKV\ZXUL@@9, #7=C>4111568:<<::::75210/0-)'&#"/;EN_n˸v`I936219NgzsZE:27:;>J^ljd\TI?83-*'')++,/2440,*)*09AELZkxdXK=@NTYX\_ZRMMKMP[qtgehn|̾vtŎa\[G>:7679:98::;=>>@?BGMRTTUQRSROMLMOOOMIGGHHLQSRONLNOQTUWVVV\doz{m]<7>Qbipvzumhhkor{ztnjg\\]^^___Z\_bfmu{~||~{xvuvvuuuwwzxz{~{zxyvxxwqmijhgeghd\VL=Ff||l_VRRLMOOMQW][_fpz}m^F3&0Lpȿ~vjaZPC?DO^qɧthbR<2B\x~}}m]ONbz}z|}ysops}~ÿw{ȘmRKOWaefb[VTUTXY]_fnsz}࿘~~{phsôqF)'/2*%)+**+'5Npɺzmfe^djqywm[K;8=IU`hlmnro\ROW]\[XRJME7' 2;ED:4224557:==?@?;621//2.*)($"-JV^hlqv|xdYY\_^]\YUUM>.   ,9HI?8659867:=>@CB=831/.40-,+'! '1?P`lt{wg]N;247ALTUYizygTC=?EMMJFGRdovqkdZPF?83.-,,+*02563101-4;BLWbkstqnlkhfa_ex~oft|vomkdaU=31)(.>R^]VSRYbpzvz|z~z{şhBFOCB<4/.///45847@KV_kov||kbabca_^\]ZTD4%$3FJB;::>;99:<>@CC>;631/20../,&$+3ARds~|nbWJ?:BGFC?BM_pxzxtneZOGB<620.+*0354210206;DQ\_`[WLFEGGFBGXs~lbrzsleedgkbI:0!$5Oac]YZaky~ut{~z|þӶ]>AKFB<3-,-/068=@EJMNLKJLLMOQSTU_`][alsskb[Y[ckqzuncbadkqompuz}}|zzrokhfefffdb`[WRNPRV[airy}~~~}{z||~~}{ywvvvuwyxuqnonkfgifZPEARop\KB@ANKE=7310/15BTiz}vhYKCBCGFFFFJOSTTT[fpohSD:GeĻ~zwogWMHHCFf½hG?Vq~h[Vbȿƽ~wsponmha[[bl~~~}ztnebadhje`ZMEQg{Ѭ{WQYbfggfec`_fkosvxz~vsrqqu}ñmJ2(& )03352.-2:Jb|Ⱥo`VQSRMMOMIA;7:ALZerwz~xpkjjjigb_`^YK;+  + +-BHB><=@><;;=>>CC@>:74221/022*)1=L`r÷pjaRHHMRTOHC<79BTPFACFHI==AK[o|~|wodZRLE=840+)02420../159DS]YOF?3-17::7@Vxvm~yumc]][eqlUF8&!1K_d^Yait~tsy|xzľΤvR::DD>8/*+.138;?CGJLLKLJIHFECFIKJHECBBFIJFB>Yvojtŵysomlhgd_Z\eo}upjjlkd]WIBN`sԱYS\ehhhhigdclptxyz{~ãkhhkqxôrP6)&#!$-22242.++-5G^Ȼ||n[OKMKC???=?;:?EPao|}~}ywvv~wqooqrqrstuslef`[PA3&## &>F@==?A?===>>?BBBA>:641//2650/6CTh|˾ljcRKVdjeWG?;3-.B?9;ADB@:=ETfu}wmc[TMD=951.3441/,-.248DV_SE:3(&,5:;8C\{~uph]WXUbrq[M@..FZ_XSenywrwxuxÿľúǗhJ74=@:4,().259<@DFGGFIHFDB@>>=AEFFDBB=AEHEA=>EHA7469G@=AGQbs}pc[[`^Z[akv||~}xtqjc]\VK?2& %$"4ACB=8?@CDB@=<;=>@@=71./1354337FZoȴqkfWPh}jQDCB5)0678:BJPQ\jtxxxv~xunf_YQIA;74:95/)')-/9BGR\VJ@7.0>KPNEKaľ³~vrhZVZR_ijcWG:#!*CWWMG[x|wtpt|Ŀº¿ǺS:54690121/05;8;?>;9:>=?@A?:5368;@CB?<=ADD@<<>;:CWhlgVF6>=;720149=?><;;>@@?<<=DFGHKMMLMKIIIJLMKPW]acghmmidbed``fmrrnjhfdbc]VRU\bioty|xvvssstw|~qg]YUUY`egtzyzuwwxyz|}}}|{yyy{|{}~}zwtnlhgmsneZUXi}{sla\UPPPQPIKR]pwXB3+),/0/03688;FZjkdVH:@[~zib_begjp~pcZUPIEDIQ_t}yz}rU>;a|u|}xtpuú}xtstolkkmmjV[bghjmqvzruz}wv~xng^YW`oּaYdgmmmnqttt|~~~ϯgUJFQ\cjtĶ|[B5/-,-.//12369:987:9CKRWbv|utzxm_K=/2564334CEHPT[hq{ypmjjjmtzqoj_RC6,('" -8;;:8<94...02456:@N^qͽvbY`zrnfO8+.15;@DGT`oz|umgaZURQNC@;4/-.17=BIZmsqpjcbinmjmrumfbXJFLao{|qcRF>=DSbd_\m{mgir{|¼ǽh:.5=;861-.5>;<<:852/-+08;:9:<:;<==<=>BCDFIJLLOOMLKKKKNQUXZ^bdfijihiea_bdfb\UQQNNSURSXbehkpu|zwuvrrsv{ypd^WWZ_bcp{~xvuvutsrpoorrrtw{{{zz{|}}xz}|xuomgejrrmc_am|wnbXTVZ[\_fphUF?:@EC;5588;BPcomcWJ@F`s`ZX`is}{{{voe\SKD@NYfwwsqru{hH2=`vwurpx|lkrxzz|ulfimuſxtnlihhiigQYfnnmkjuzwtqnkny||pf^YZgwg]demnnnnqux~vsv~gPJEBIRXbk~¾{W>1.-+,-./02*06;?ADEBCEEHP\gw~xx|~vl`N?-,056425CIS[_dkrw~uvqgZJ<1,'!  +  3>@@>;BDEEFFFFCA><;841///158;?KVftϺxbZj²{_C/,).48=BP[jw}~uqjfddedUSQMGA<:9<@J_w~|}x|pic`UGEMhvxk\SQQT[bebarĮmimtzy}ü¾ȼ`/ ,
:534788<966:>>>:9630.,+*19;98;><<<;<=>?@@ACEGIIMLMMLLJJPRRSUY_beimlklhddb_]YTNJIDCHMQW^fgghkqw{|{ytpnpqnpruz}{~vnd\TRV[__irwutxvsqpokkiiikow|~}yyzz{|}~wy|}|xtopmfbfpttlhiq|ukhimorv|teYQJMOLGEHKHMWdszrfVMGQh|na[[et}}|snf\QIEEVdu~vrrstpuwyeH7C`plhfivr`[]`fkou|}xpcZ[TRiĻzsljhecba`S]jppkfcow|~~vnifju|w~znc]Z\j|×j`ggloomknuzvomrwzױyN>@@DGINYfuyV<2/-++,-/03.7BNV]cda^^bfhfeu~}vlaN>,*-45215FTaiknruzvxvobTD6.&   &;EGEB=DGHGFECCFC@?>=:711027=BHYdq}ֽzknDzoQ=1&(-4;BNYfsy}yustx||nopoh\NE:;?Ld~ylfa^TGHPlyxnc\\__`_`aaxƱusvxxw{¼n6$7CG=>;60/14>>=:89=@642/-,,,.5<>;:=A@?>=>???@@??BCEFFHILLMLKOPOOQX`dimpmlljggaYUUTPNGB@ENWajhhhhkptvusmfabeimnpsw{}~xsnptslf^WNKPW\^agu|xvzwsqrrpnihhimsz~}{zwxyyz{{{xy{{ytokqog`bmvytpot|}tlf`[URTZaeejr{ykVQP\rzl_Z[fy~}soeZOJKNXhz{oghkortwvuz~}eOGNdlggjvxfWRV[cklrw~}ytpl\QM@:Sw}vomkid^ZWWZdmrojebit}{x|ypjddmxxzzz{ysh`\X\lÖkclmmoomjmqw{}~{qkhgf͝d<07=DEDHS_lzxV@41*''(-4=Dam{}ul_L;+)+34/19Qbrzz|||z|zsgWF7.& + *=FGEA>CFIJIHFDFDCA@?<96445;DKSfp{ŨƳdV@/-27AJT^irx~~~nYK:;ARk»¿}whb]ZOFJVp{{qhd`glmjehknɵ~usw}¾ĽM*#).027950-059<=9537<00/.....37<>=<>A@?>?ACB@BA??@BCDBCFIJLLMKLMNRZciqtwqlkkif\QORTRMB>?IVbksiiilpsttqmg`[\`eoqsvxyzytokiifa][VPLOV`dackxzytnmosrqkjikntz~{yxvwwxwwvuxxywtokgqng`anz}vsv}|yrhdhqz~|n[Z\h}yj\XZgz~|yrlaTLHKOZgu}pb[^eilpuvuyxw{~ubTRSaechssdWV]fntwz}|xrmleXMD5/Hj}{wrnmicZSOP_gornjedhqz}zxz|umb]clvtrqpjb[YV\oŘogopnnmljknrsuxz{|~vme]X޿T1'39@BBFOVfrtV@62+((/?Sixɶzsl_K9,*.6506C]q}teTB4,$  *8>>>>=CHNSVVSRONLKIFB><:7:AKU_qz}ио{qW@1)" !(4769<=GNW`dedca`]\ZVPLB?>AHS_gy}|ŷʼhPKPQXafkpstypXF?@Jazxsoe_ZUMHQ`v|zl]XY]`lsqnvósikpy¶ſx\@2$%&-363/)'%',-+'(*,/13447768:::7669@FIGDIHDCABDCCDEGIKLMEHJMU`jrw|slgc`VNMRPG>7:DVeihhilqw~{wuwwvustuxz~usmf\UOMED@97=KW][aoxx{}mf\Z^ehijkmosy~~|yxuutsqoljigeca`__lmjegxyy~vjhhnzqcVTYi||xwwusjbUIA=<;:AFEHT`cSH?AIQRQXet}ytljpl^WZdkknwbRGKV]abacc`[Z]`WTNB2,:O|upmnolhhjmkkh`VMIJ[eptrnjiqw}~{{|tbW[fqspmlid[TUU^vХznplomjjllhegkpuwz~ypf_ƞk@+',+/CQn|{p_N>3,  $/13;ENW`kuxyxy|zwutof_[PGJS]is|~ڶ̾}]T\XWcioqpsz~fOA?IVfyxqnl_[VSMKVd||q_VVWU[`fnu~Ż|rmnvoOB2%&+./2-%$*,$"&&'*/59998754566547;?CFGHIFCA@BDEEFGHIHGG@?ES_iu{shb\XUQJ?:=9EPVY][WU^gow{}|xj`WPHB><81-4AJTVfzviZRT\cfiilouz~~}wwvtsoljhea[WW[^dghgo~y}~yqoknu~nd[]ft~wvzyqjc]RG=8311.)).;HM@417>CCDPetw{ojhjgcbhqsw~{s[PFISYUNRROKGIPWRRI@8/6O}sjfd`\X[]\[\bfdc`[VPLKYahmomlkrv{|{zz{ygZWXnz|unoql_WQT^w֨ooryvpkijifdgkptx{~|}{|}}slӺ]7'&,'*7EKLORYepqUBETm{ȵwuuvtobRF?@JTRJKSgz}pjqx{sdTC6.$  *7=BM[bw}um`XY`is~~}ȝùg\b]Yciorrt{zdPDGP[hywoki_YTOJJVfyxoc\\ZW[]dlt~Ǿ~uont}u|sƼkW=/'&(--+))'##%'(+.479987666654459>ADEFIGC@@ADFFGHIIIHHCBHXgq{{tjc^[VN@317HQWTMHB;:5.,3@JRVgsaVUZ^cggilqwz|~~}yyxwuromkhc^[Z[[[_`dr{~}yqomry{qkghp~óyttyxlb_XMB;631*%)6<6,)-579=Nfu{|stkgeiiinuý{th]STYZRHEFDA?AHMLKB;817Nqf\VNHEECAEEHMQSSSYYYVTRPPT\dikjhhmqx}|{z{|l_ZZjvzstvrf\SWcyѣ|pv~umjiihfhlquy{}zzxxy{|}}yɪzH*!#-(*6DKKMLRYcp~v_Vbwʮ|qpqqqneYOKO\hdYRS\osdXUV]nzn_M=2(  '4EPYgvukkqw~{x~ymnd[bhpuuu|yhXNPW`jyľvmhd]XRKHKYgtsngdca]]_clvôvokpw~|~sk`Yi~uihǼgG."!%,0-% "%%))*,/37988998642137:=ABCEA<:9<@BGHHKJKJJHGOaq}zskf_\UH6+0=^feYG8+#!!):Ogx}seTF>:7431-))0=EJShm^YY\^degjoswz||{ywvxz||}}}}||zzzywusrsnheca]YUXYbt~~ypnnt}{wwxzú~vqsxteZWQE:4223+&#/5-'$&*+3:Ljxuywokgdbfjp{º}{ofcd`UKHIIHGHLNIE;685:O{me\PG@>:::;;:<:8Pjxg^\[]egjknswz||zvssuxzz{{{zyxyyyyyyyy{vpnnkc]Z[[bvxpmltwonrm^ROG:1,-141-'"$+47/)&%%)5AQq}stwmffebcgs}smje\TTTVXYZZYMG;:?;@Rs`SOLF@??@BCEEE@=769=BB?ADINRTUTW_cdba`fmv}~~~yla[^hxnV^n½vvskklpknrvxzz{vurpruy|ysrruyѼa8$",8@CIPOQSYbqūuihfdfif]TU_qq^QHUeq~}rg_YeZMB>;876223579;70+'(-=M^zstwldkiebestjd_YTTUY_egd`VNA@FCFXqmbXJAAA?=?BDDC@=<;==:88?ACCALPY_ccegns{}}|qcYU^kzYfv÷جx~~tqnpuvy{||zwussrsux|~|yqmiilsx{fK"+=JU^^\]`gtȲtjec_Z[^ZNCCRkxfXX[ex}mXJ@:;=DIS]fp{Z: /EVn~~}}yvtƿ|ž]NP_mpqv}}yqnt|}ywz|~oh]UZnwngc_WMNZfkjjmoliq{}{ǷqbYX]jtz}ǻ}xng`\WOIIGOYO89JRPIPk}~vƻzmrqA##$#$')+,)$$(-1598536953434679;:9;<>@AFGIKMMMMYk|{ulaZPD::8:BLPM?0,/=Uiw|smtsieoqldew{{urqoos|wmXSIFJFL`w[F@=>=987AWrjO6 !8Pl}ti[MB8,%#$3IawuS@IO@46HWl}{mfafkkhjqvuwxwutttvwwwwvttpnnlkmnnknqrrrrt|vfTNS]akpuy}|ywyy{uooqqnjXQD:7=HQKGA>ALYcinw~~wqow{vvwtncVMKMD<3--28<@;402=IPWF6/6G`u}{njspedknjbdyzyjROFDGDLa{bI50;?A@AIXcnv~zvvrj\RLIEB<<;;98738>KW`glqtx|}|}~~ywxzzrdXMTap~úð`n͢stwtsx}xrplmqtxz|}|zyyrmmortŵmA%2IR\jonosu|Ȣ}d]a\TQMC:48JcyzmbZapvndN@49DLPOFFVsűK. "/Ha{}zyxwuw}¹m`mwOCGT]_bjtyzxx{wssqptyi]`kv~wvri\RR]honmpw}pddfdn|xrx~tlijaUTbkbRHXdrdHFZglZD9=KY_[YbnxfA7?SοL"##"!""#$'+.062.*(),.233006@IKQWY_ec]\QFEGLVbr}{}xohdZOE42MrucSE7-?Xq|r]F:4-($ )?`}V/(3>M]k{{tkhglnkkmtvxwutuxtttvwurnqrrpnkjikjjijjlosof^UOKIQew|zxyvomonkkmotxz|}si\QJGC@@<;@MZdinnou||}}zvromu|xupptqb_abOA.#'5@;5/)'.@ROA1/;Riu{vnjhgea``bbfvy}|phVNEABJZhwlaWMC@C?9=O`jw}ysicTL@6358:01;JRT`otuutx~~xrozuLA@Xeo~guș}{}{z{||xupllqtuwyxxwwvwwy||xtrssrqſ~P.2FR`qz||}z~ܷoaXTONI?4/6Hbyxpe]cmpfYB72;JTYYACUpȱL.$$0Kf||{yvutxͽl_kpMDDOVWWbmtttvy||xwuuxxohkrxxqf^\cmqpqt|ÿvicdeq|xt{ztl`XUSTbwpTAScuhG=M[gT;,,9HPJCIT_u{O018HnƼP!!"#%%#"!!"#&)-/1/*&%&(+.10//3;DPX\bhruqeZPMOT]iv~|zsjeaXM?59V{yndTIG\o}jR9/,''?PW\rŲh3'/9FVdt|pkhjljjmsvyywwxyxvuvwurpqqrqoomllkjjijjkqld[RLGDOcu{zutrlijjgilpv|}nbYRKHEDEMZfnttpkkrwyyyyywuqomr|zwqpmgbivqjfcL=+ #2>7/'" (9IH;/.ADRdmuzzvtvxnuiMALXn|gwŘ~|{|}|yvplkprttwusqnmmnqs|yusrqoV,(:Lauzzͣ{bNJKMH:/*3E_wvh`\bkk]Q:30;JTZ[=BTp̴M0)"!%3Ok}|zvtqt~ʸnencqnPLENSQQ[jtoruy}~zyxyyyyyyxpnnqrtz{ofbflrruyƼ|pcbgpsrxpg_SG@IWs]B9FXL'$/E9("(7HQG;9AOgriD,27A]T &$$%''%# !"%(+-+)%#"#%'*-.//28>DJNU_lsvsj`[[`it}{ztld`\SI<=Jiuj_jt{mXB,$"$7V{Ŵx;+33>LZk|zslkkhjnquz}}{{{{xwvwwuusttuttsrpomljjiinjbXPIDBL_r{zssqjghhdaekt|xpic^[\\^fpy}vjegmrsqqqppnmknw|xtpmkkcZ]kxkaI8&"1?8-""0?;2)-?Xmy}vmggffbZZ^gv}{~vg`PHCFIJMPOJC;2/7BOYp~iUD:3/622546EWfr}{qijpg|ʯnPGPsyhz~}~~}ywqlkorsruqmgb__bdfpz~wrpomb6+8Nez}|߾lNHHLF6)&.A\ts\XW_gfYN=62:EMUXAHZsϴO3.'$$'4Qm~|zvtpqyȴ]Ytl{sWULW]YU\hqkpuz}~~zzyyvmbZZ]bejmihq}xg[UWbltw{~}³sfgt|qm|j^SJDCPb~lQ:9?6 # #0BT^XC8ARilZ>)'-8IZq~V**(&&))'$!#%(*&%$!"#%&&)-./0351249DTcmtpiffkt|}xtnf`]WLB=I_|~{zeQ@3')Hh|C2509DScu{qlifglqw{~}yvtvxwwuvxyyyzyvutromkjmibZSMHGO_q{yvvtnkkjfbflt}~{wspnyxwy}yh_`elniihikkjhks}}zuqnlige^Z]gzq^C2"#1@>3'+72-,4JcvyohffeaVW^nyy~qe]NFAEIGEECB@<53>JftpYF7-5/.10/8GZfu|ujfieðdIItȻ}kظ~{xqljnqqpslg_WRRUWZboyysqoo[JRbsݲ]QHJE3%#)=Xr~pXTUZ`^SK>614:DNTENauеT982...8Tp~{ytqpovƱZ\̲xsv[XXfmg][_egou{}~~}}~||{}xiTFEHZ`ghbal|³l\G;7>QduyzzupqyƷxrx{nǼxhYKFLV_n}~lJ4)$  $1CWd_E6BYogK*  (19KVg~X6,(&&))&# #%'%%###$$%$&*+----)&$&/>Rafjjjlryzwmga^YPD;@UszxugO;.+' +/KrxH6438@O^n{wojedgpuz}yutuwwwwwxz|}}}||zyusqpmje_ZTQOUap{xxxwroomilnqw|}zx}|~wh\Y[addcbdgiigjq{|vrnljife`[WW\iz_=,!.>B8-%%2005D\r|qjgeb_TWcw|lfmz~xvj_WNE?BEB?>>=;::ATfs[D5,""*2138KWpvlkĦvREjɵrϰ|yqljmonmphc[SMLNOTZdoxyvuuȹºxyΪw`LHB0$"'Ws|{ywspnnuƲ_dҷ~xqTOZjtn^URScktyy{}}|}|}~s\LILbhooherźlYE5#&@Yswtnow{xtjbaen~Ƹp÷}paQDDRbgqut}T-# &8N_T;/=Wk^>&'%18HfmT=.)%%()%! "$$%%%%%$$#%'*))'%!$5FQ\ejpw~{vshc^[UH>9DaqhbS>/$&%#;ZulL=88:AN\ht}vmeackpv{~yvtqsuvuuvxz{|||~~}|zxvunkhc_[XVYalx}|wwxxsqqokmmllnqsuy{}~|{||~{xy}~ype][^bebachlkjjny|wtolhgfecbf_VOMXr¿c;)(7?82+!$17@A<99:77:53/*&&(/;ETatԼdMOJGC>AXr}zxxxvspmltȵdeҽbE>GZhcUKFH]gotuwz~~~}}}||~rc`brxwr|ú|hS:*( 2Linh^\cd^^XRT[fuŸpfreSE>?N\_jlgq`2 !#!(8F>+$0CSI, *!%$0KWH:/(""&($ !$%%%%%#"##%'&$" ':L^kt}~}~wpnga[VL@;=OmzdVK=.' !!%KlǾnln\I@<>>NakI5*+'#248<8,&.@IR^o|tojgfd_Zmyym^UZj~xljpwomgaZRJD>?BEA7101;PmwfD4Pʭpxķ躢|xsmjkljhklmkid_ZVMD?ADHSapv}~vj_ZǸ{osqì۶[H;* #(Ce|lcWKCBBFMMKIJQZ_vlVUKDB?BWqzyxxwtolflwнe_y}hV?,21)&&,=LVXQIHFCIJJMR[dhvoVI?Px~sqplf_UG?=>=:D]pu~O)#$!#'(! "*20(.*% !#!##$!"% "$$""$ + 'A_s|wqmlki`ZUC3;Pm{`K<-)(!8eþjWPQJC@9=BBKZ^`mx}uhbbbchossqorutrpppoonooooorqqruusqmjfb_\WSRWbpvvvxy|~~{yxwgd`\XYZZaaabb`ZVVXWWTOKIOYfmpqtyroptxxsninw~zvrnmjge_`_`_^\[TSOE9:CNhkG?960((-<<<955:@PXbmtvspjghid]Z_vqrsu{viehlcb_ZRJFC=>AGD9/*8Jf{]LdǪ۹Ŵ渤~~~}zwqlgegkmnprqojbZUID;417AK`kx|uh\W}n`[qırVA-"!*Ef~}uj_WWX[fggims{~ӿoXOE<;9>Tl|{yxvsnlelxȺvo|neYLLOS\bb[VNPRYafnt{}|zxz~~}|}}}~~~{xzvrx|v|q^PF:0.29=5'"#(7EW^]TKIGFILORTVXXevľsbP;Ab}re]WUVUUWXVOHUiyM&"&!!&*& &%"!'% )'"  ""!%''&%"!!#''+."6Nh{}{ytokhge\VRE8BVsuV<0()'$J~ĸkULMF?:0:ADO^a`ksx~qiedcfloonoruusqrqoppoooooqppqttrpmkfd`[TOOR^lsttxxz}~}|||wtqonquw{yusqmgc[\\]ZUKEBJUakrwzuuvwwurogmv|zuqmifda_]]]^\[ZXOOKC859?K_ss]FBBA<69@DGJHC?BITY^dhhdbbacea[]d}|vzvg``c]\WQJEA?>AED>56+$ %2970/39>CDDGNU]a`XOLIILPUXWQJFQbzü}jH:L^{`NHKP\kv{ysnx~R) "$ **&$#! !%,+)'%$&)/046.! *H^u~wvsolhec_UNLD=J^zfD*"!&%0cſjM?B?:6-=>@C?77EWhtyrjtⵡ~}||{zxumkklmnljnpqoi_TM?>;72/-.?M]ltvxyʽ}mM93-*3=L\jwînO535H]dvɯ{mVMA6.(&#%+2Rl~|zxtsrpmkps~üǽ{wzzy~~t\K?=;@EKU_ekrvwvvwxyy{|~||xu|{S7'6AKZm~yt`acb[RJHPQQPKG@<>I^yúeH3BYz}hXU\xzbI6*  !%&"(,# %*.158789;;:8879ARn}X7)8Yxmgmwi\SQI6,' # !!)-&#)/47<@@@ABDA<9;GXg|{wtxqhdcdcbTD87?M^kpqsuwxyzdH( 5`yQ*".9ELfpsvtbRU^cjqw|}wollnmlnruxxwwyxxwvvuttutttuutqjhgec_YTNMR]fgeemlmkjkps~~~~zy{|}~wtutplkovxuk_W\bjnqqtvroligc^[VUQQRTRRPQONMJHED@;61*#&08>DGIQSOKR[acbaaelsyupg`[ZXW[`a_`mxspkaWMIIKU\gquslf`XOJGFC@C:49DTfv|}{s~nuDZuҺ|zḤ{yxxyyvttoiedgghhea]YYYZYUPLGD>;444;ETbj±lcgyzfA%"6=Qelx~zyںtR;* +B^vŢrG-#8X|vmglqy¼~iTRQWew}{yx{wsoliecftµ{XF@=;;;@FGB9217658??@BFEA@EUhuzvutrlebba\XJ?7;IXdlijklmortvx{lN7# #>esJ&-;HW`qz{ys_PSZ^dkpx}xqonkjlpuvwwwyzzyxwwvvussttuspkheb_[VRKIMZdfdcihhfegmq{~~xxy|}zuqptwwww|ysnlkksyui^ZZ`chlnooomjfca\WTROMLLLJJKMKJGEC@<;83*"'06:>BFKIBAHQU^[[bmw|}zvpjhdb_bedbgyxtqneZMD?>EM[isuqkaYOKIGB??729FXm~|}}vn{q_fuxwäyٳ~{yxxyywusojfdecbba_^]^`a_\WUROJF><89Mi}smejqytghlv~{yxx}ysnjd`^ct¸wS,#$##$(0..27DDDEObu}tqqqjgcbb^VOB;8AQ`ilbcdccgkpmoruxz|~pV;'% + (AdjD& 9KZjtw~yr\MQW[`fmt{ytplhkosvvvvxyyxwwvvvtrrsssrokhc`[XRMGEJWcfdddcca`cimvwy{{zxwz|}yrv{vplnr~vjc`cju{p]PT^cdfjmmkiifb_\XSNPMJHGFDBJIHGEA>>464/%  *..03=@;42;CEXUVcs{yvstsrnhjifo}xtmmjcXNFBHNZiuzwtc\RMLHD>9318EZt|mkk}r\`nf̭|ү~|}{zxy{zxvpnjgfd_]^_`abceeca^\\ZTOJFA><<;<|_O^zrsrj]U9,#'2:EN^gqurpvŞ~U3 #-@dİplr~umjkmtö||}}}|{{zxma\ZTKKZr}Z2 "((()/6@HMSX_dilnqruy|~}ywvx{nVc{vkaWNFBELW_b\TMFABMazpU6'(8SimniXDAVqzvdN9146>O`f^UG;+"" !$(,$ %7<=;!#&*036:88876;AEEKU_iz|wrmjihfda[RM@<;CRagi```bceghmnopopsv}bC,  "1Hd{f>"*Upw}|tqlYKRTY_elrzypkhhmrtuttsvwwvvutsppoqrqoldb_ZVROLIBER_cbddca`_aehsuvvttuv~|z{umq||rh`^`cjmng_XVW\_^^`fgc``_\YTPNMLJHEDDDDDDCA=;:53-& #)+/8=@BB?;AMXfhjoy~z{|{{yvsvmjoy}vsswuqh_XSR[dpxypc\RLJIE@;4,.>Wo~~pm|}ploȻzѬ|{zxy|~tqlgc`_^\^beghggddcba`^^WVRNIEBAvp[ay~{~}~sg^]]YQOD=9@HNU]gnqropxǢuR9 $=XźxpllmrzȺ~yx}~}{yusjb`b_XT]nc; + #"#%+4=EHOT[`eiiopsw{~~{yxy{p}~qeXOGAEKSYZZXWOHBFRfwU7$ /?[_XC(";Zo{zh\N?1-*.8I\ec_QE6-% $!!!(1+#"?]hZ& "#&*.245:98976:ACHSbkq|zvrliihec_WNF><=ES^ee^^__abcdhjjjikpvztZ<%  $4LbywtzcJ.4`~~vus^LOQV\cipw|~{slhgjprsrrrtttttsrqpooopokic`^ZUROLGACQ]babba^\[]`cimruvwy{{wuyysh`]dmuof__^ZVWY]^\\__\`_\YTPLJJIHECBAAAACA><973/( (/28BISUXWUZepyzyyz{}}~}zwztquyokizxupiefgiqzvkc[QKIGB?:5.-6Kcs}ttyrq{˩zyxwy|~upmgb`_^^`cfhhhgggggggffeda^ZWTS[tlfpjfmuvsnoquro]QEDFJLPVW\ejklpprokiq}ǤwI*" !  ! *JhԸĹ{unlknt}Ÿ~xvz|ysnjlmsɾ{Z; !"%*19ABHMSY_cdjkoty|~~{{{~zi\PFBGKOQRW\bZOB=ASpxR-:>;)-M^l{mZE:40,/&-8IZegh\TIA6,'&#! !(2.#LK#   !"'(+.2445:99:749?BL^py{~|xtpkhfeda[QF=::>GS[``\[\[\]^^cdcbcgouuyvfL2   (9N_nrv{lbovvutmcE*.Ur~fMIOTY_elsxx}xokhjloqqrqrrssrqppqonnmlhe`_[XSPMLDADO[````^ZXWX[]`fnswxy{yx~sj`\bo|rVDM[]Z[^eifcdcc^]YTNJGFHFDB??>=>??=;843.*!")39>GR\insttx~zz}~}{|wxqf_[^\[YW[`dt{}pdaXOHDC?>850,0@Vhzz~xst~xù~vttw{~xsnidbbbcdgijkiihijlmopqtrqomkiiSl}nk[SVZ\YUZbheaNB:;BMXcpxwtmdetĝsM.#'!"&$$''%(&#!*>]ƪyomikpx~¾~ywy{}|xrkecfnò|e= "'-29>BHNTZ_`dfjpuz}~~~~~}}}|qaUJEHKMMNS\c\RD;=;;;<<;:73/.*$$28?FMWcn{{z{|}~}zwk`XROONOQYbju{xl_]UKB?>=<;5/,1@R_qx|ypuƻ{ks|qq{ȽͶtsruy}}}zupjgefhhhjklllkklnpsvwyzzyzyzzyWo~pWGA<=:7=GQRQJDCKVdsqegzÔc>'%%"!"),-(&**)(((%##((% &8V}Ⱦ~plhinw{{|}|{yxxvsoljddnȳwxY3 !$&*-17BIPWbny{}{yz{|~|}zskc\XQRSUZalry~}xqeZVQF>9:;=?7,,8HT[`jvzz}suǬ|~}t|biymeesƼǭutsuxz{{zxsolllmmnonnnmmlmoruwyz{||[naM@44/(*3?FITV_mz{lm¶޿d;"&()+.12.+*-+''(*+)%! &)(%!$6Sqsnhhlvº}wvx{{{utsqqqqpbcpͳxbI/  #%')()+.38?HOX[X[_ekptuxxz{}|vqnnkiiihgehfmyiZRKMNOPPQQQMJMTc{sP2*BQUTMT`rtG* "+4;BO\cc`\VY]`[PHG>4*%"*.'1 #R{թj1  "%')+/0246645345512=K]iu{|}}{wvsrqlgd_\WRKA7029CHIKKMRSSTVXYX[[]_birxzr`H1   +$-7CLZjw}m]UOKKB78Gc|hD@KNSX\bgkruxz{~}ysojimqstuvvvvutstrpomjdb`_ZVSQPOIIHJR^dd^[XXXUOKDIPX^djnoqrqprx{}~ysi^biycA@LSTW^de^VTQMOOLKIHGGCA?<988866630+'&! "-9@FJOV]hrz}vx}||}}yvtrpomcdfhjpuz|sk^TQKA946:>C9-.;JRTXeutv~}{~ʷ|{{|tnusbgrjdanĻܷ|wrx|xvuuxxyxzyvtsrrssrrrqqpqpqrtuwxy}~Zj{nbUQH=7;FS[hsprijϹhA(!&*-.2696757=B<3-.//-*%"!$$! *:M_nu{{yοvpiglt}Ⱦ|vuwyutrronmllkW]sǷqZE6+$!#"  #%'&$"!"(-5>HPUSV[agkopstwz~zuqpnkjjgb^b_f|ucWNMLMQQMIHJQ^k|x]C3/0>JNNNPaxŤ~O.%*2;DJS^fhd`XWXXRKJOG?62,% "!!&*#- 9i˕R #&*,./01234555545526EUht{zyzzxutrrpmhc]YSNG?6119BHFEGIMNOQTWYZY[_aekrysiV>)  +&28?FSdorqrrjVD@HF81@_iICHLQTX]bglosuw{~uohfjnqqtvvwvuturpnmkhba_^YVQPPOIIGFM\ef^ZYZ[VME6:=AGOX^acedcemttuxwl_Z\ltytrr^KHNTX[adb]YWTPNNMMKHFEA@=<87675543.*&$ "'0:FLORW]dmu{yrt|~|{vux}xneYOLG=5149?C:0.6AHKZi||soutsvw~ywüzqt{rroihmqojbiɼƓk]^_gq|~|zwwwwvuyyyyyyyxvwutrrqruvvvwwww}~Xg~wm]QP[ju{}osղ^C)!! ',/00378>@DLX_WL6752/*'%''$ #)0;IW`krqʷwrjgjr{|wwwvqmppnkhdb`ITqjL8.--$!%(%###$#"!""$$"$+6@JOQSX]cilmorvy~~zwuronmib\XV`v|g[OLHLRSMGBGUj{tcQ?AEKJHKP`xĢ{L0)0;ENQV_gjfb]XSOHCHQLE>:5.**&)'! "!$Guݵn" %)-012.//01446556649J[pz}z{zwtsrqpmgc\XQKF?7119CFEBEIIILPRVYZY[_cfkrxkaN7$  '7;=CN^gibbfbL65DA30JujMFEJNRUZ`cgjnsvy~}uofcglmnsuuuuutspnlkjgb`[[VQNLMMHIEBJXdf\YYZ\VKA///04;FLSVZZY]dkhhjj\NP]oy~r[MOXuod[XYZZVWUQQTSNPOONKIDC@?=:86657652/+'$ "'/9DMRV[_dkry}ypr{}{yuuztjaWNID;3/29@B<3.06>CXkxfYQP[iv~hZXYY`q|ƴ}rvio{tvkensrundhگpAHMSXaimlsrvz}{{|}yxxwutxy{||||{yxwutssszzyxwvvu|}J_x~ſ|su|n<- #)+(&.-32*/98??TtqS@1140-/,-)! #,9FPWd_[h~¬}ulhjqxz~µ|~~zywsoljknurf][TM:LnùuP8+&#%!**!!# !$&&%#"# ".:EKHNSVX]djkmry}}~{zwqnkg`[SQRazr_OGDMUWQOJSbv|tbSTPSKACGPavf?249ER[]afkkfa\[XQICCGEFGDA>:96.'# "HizC).!#,.14/))(+-1010246;HYe|{z{zzwvvusrokc^XTOHA;5338?B@>ACGHJNSVWVZ^aciqrriZC0$  )3?>@LUW]SPTN9/32,+7[}~iPBCFJPUZ]_bfilqv|x{soieeghktuvuvtqpomgea]YWWVQKGEEEDDB@ESag^YVWXSG<-' "*27;?DGIMQUYYWN>8LexmPK=7Q}tgYWMGFOTRNKKKMNI@879:9999996874/*(' %/;EPX_cfjov}~wz|qos|tkcZOGE?6248:<@5,+.29@Yh|xsfVE<;>HRdtzdVKA86:CMq²mP749:6455/&!#&'!(4BPY_`ZT]ozȳ|umhjouwz¿{vz{~|uutqnlkmnpkaYVTTTj}aJ6&"!"""   '3>EEJORSW^egipwxy}zxtplifa_SLITm~pYOGJRVWY\guxtdUVMVNDKXizaB9=CLW]`gmplaYY\_[PE=>:4+#-JiӲX?5&#,,//'$"!#(-01235;DScmzyyyyxwutsrpnjb^XUOH?941.1599:;BFINRVXZbdhkotx{x{wungccdhnprsttrpmjfb`[WUSQLFCA@@@A>806QnaD@6>b}xqeVLIGECHEBA@<999:87667779961,*(")5BOZdiosx}z}wnlpw{oe]TIB?8104:<>@5,.6>EKU^dc[SRTJDCJQVY^]ivxk\Y`he`Zcxҿ{j^cyqdgqqfagkikqtaeƓQ!?XprfXOG@EQ`jppppsrqqtwzxyyz|}}||}~}{{|~~~8F_zysomrvd\TORRH=4-(+.++, %6DIRTHIVʯaB?HH<4794-*--,"'1@P]dh]WOUci}¹}wpkjmprv{wxy~|zwqoljjihhmhb^\_jtȱrK,  )39@EHJKPV[`emsrs|~}xsnkhfcbWKAHa}l]KGJS\dp|yqpaSVRa[LUmrZECJOU^finrsne^_ad_SF<:DC@=5+(;Ttɼu[@-%**,*").0114?O`muywvwxwusonlkie_ZYUOF=62/,*+-25669=>@=:ARbk[WUVVQE<6/#!$&(%!$8YuzrQ:62DqÿdVSLCB>978976897534559:;73.-+*2@MXbjntz~|sifgks|}yrf\SJA:3/+.5=@B?4-/8@HNVYVF1&)2>AOftulfWVZfonie_`^br~wi]duȻx`Y[b{~z}|odenib_fjhhkr_cȗZ-F\mm`WX[ZW[efa_dihiklpswwwuvvy{}}~~~-7NnvomsxxdYNJNTRMGA??<744-:Vmx{eXaòhPOVQB9/55/-/-(-3>LZdhj^YRWbewȯ}unjikmrw}~ytpojhghfeh^VZevϷ`6    #)8?BCEHNTZ`jnmnz~|wqlhfee`REI`|kRDEN_n|ohfZPVdxs_f|gWIJQW]errqqrrqpjhbXLC@CA?;88=BGNF?8.!")4IenK2%&%($ '+-+.5BVhtxutstuusqkigfc`[WZWOF<5/++'%%,1446:AHMQUVV[]_dlmlYH3'%# #5?A>8/4I`j\>8AB;17MeeRCDLKQ_ozmbdoc@('<>AEKPUX]`eiloqttvz~yzvofcflruwyxuqmnjfb`\XTROKGDAA@BB?;ASdk\XUUUOE<70&#Aatk^F:84Jx¾zkXFB;7661.574323577:97400/6=IV^dgjov~}{sd`]]`dhifhiklkkjibXOG>72(((.7@DE@81//2;EW\XC)";EZzwhN?9CLMKORckihhWA;Oq¿u`_]Ogztsupjingbaimkijq]dzҡb2FKNLO^ymXRZa^^cilnqvurqosx{~'+@fxrqsw`XQRX^][URPQLFABEYooq_[[XTVMSM>5762=BKWaghgb_Z]edsӽ|rjhhhosy·|wsoihgifecWOVmƤrE +     /5;>?BHNV[diikx|{}~vojgggeYOSd|{^KGPev}ibbYVbxzzv`WNPW]cjxywtssrsni_SGABFB?<657<@LGBEC9+$07CYy̴vP4" "'(()/;M`owyssqsttroiheeb`[X[WPE;1*(% %+/049@FIKNPTZ\`bgebP?,#""  &7@A<0#/PssPINE<:=LZT?8@B?BO[agmSKO[S<17FECDGKQT\`diknprrsw{~{}|ukefknrvzyvsoqokfd_[XSRNKHFEDED@;AP`h^ZWURLC=<5,%  .PhocSB;970+("%(1$!08Nl}xdV8)$2BEA@AWbVC7*"Ev|`YSE`{ohkx~woqgdeltuuvxelzyݫd,502>W{ĺfY[QMMXdjossspmimrx|)'9bzvx|~q^XUZ`b__[WW[ZURSZtɵzy}ja\^ngLGHFOQW^eijhhgcfhbkĴwmgghmqv|Ƽ~vpieedb^bYQYxɼ{sy˰V    + #,48;>CGQU[bcivzxz|~|snjjje^XZfvo\U]rxf``Y\qi]XVW]djow{~|xrkghe^TH@>>DB@><;<>FBBILH?:7CTm̲{Y:# &('$.8H[juxwqqpqssqnmjgeeb_]ZVMB6,%!"'*.5=ACDGISY]_aa\UE9'  *;CF@//ZcYQ>9;@;4-(# + 997765656752-($"!#&,6AHHH@=7/$".;50-)#!  $ImrbXH<30KyúǽT5/12+../.,**,/13257HGKT\eq|}zwwy{}~}wqnnphfb__hx|tmb^ZKPjm]TZbgmrvv}|vssskeXJ<211/5@LSVVYIIF@79EVrwU7!#&(('3E[muupopppqttrojgdb`_\[SND9-##'*2;ABBEJRY_`_ZNE92%   "4=KWZI4LwkS=E=?@DLQJ?:8=B:-.95BJGGUeoqgYJDBHMPU\cfijkmorvz~~~|tib`hr{|yxurmjfa]ZVUSPOMKEHGDKZhnkd[RJFC@8520.+&%(% ,Qtr[I@91.MzĽõgE;85-/00-)%$&),-026;DMZgqy}yyzso~yka[ZUPJC932/+&#! !!#"""#%'-/6?HKHD8*!%%7\kC, 4X~wopjhw`JK\ry|zwyvxxtsʜa5,4SƽqU;8@IUdoole^^cjqu|0-;a}sg``dtztd_\\`egghhlqsqv{zǿ~{vpofzķh\achnswz}noµtjghlmorv{Ƿs`SGHHixj]PHA\{w-    ",16:=BJR`oww}~|{zyxx}zvutsppqjb_]bn||q`\^TR_iukf_cinqrsv|}}}}{zvrdRA2+(),18BP]fn]\TPQZep~qlt{ydD% #)'" &/?N_lpooqqpprssrokheca]YWLD:0$#'/9@CEJOW[_b`WKE6+ #1CTae]Rdk^RFDCCGJKFB;7005LVZ[bqyz{m^PE@CIORVZ]cimlmrtvxz|}xmgfhjox{{zusnjf`^\\XVTQNHD@@DOZeoumf]SLD=9761.)&$#!"!! $.?\uo]M=35;Imľ}ZG@<6774.))**.146665;CQ^jsy|~|||zv~|qgaZZVQKE?;0.*$  %+025:DMRRQC5" ">kxN- 8_{yzxrou|yYUdtsosxy¤wK/2QzǿiI822>Pblrmd_achnx,.Ahxold\[_gxxtlhcdhkjikkmqqqrxútyrmlcxcU^chnux|mq̾{ngeklnqty}ŵdTLD`uhZM@88Uuʶ0 + + $,4:CKR]m{zxussuyy{yvvvvuttmd_\^jxzqb\ZV\mtyogcdhotwxxz~~}ypaO<.(&)+07?KXepxxwzwi`_s|nQ4  %+0-''-4ERbnponooooqrrpmjgca_[VSG?4* &-8@CFLQX[]^\TJD6- $4J\jpjaqpcXMHGDFHHD@>=><7139dnutwsaRF@BHKORW[`gkilpstvy{~~}~}xojffgjqvyxvsplfa][XVTTRMFA?>CSaltxoh_WPIA<41.+'$""%%$#"!!"#(1Fbqi[L=57;HgiPC<<<=;52032479:::8HRY[ZPA/&#"  + -NwQ1 :d{pifntprrgb[]fs~{qmsy{˽qO5(BcſrN9-*3BYdlkgcacdks{#,Hryuumc[XTQV`n~|{}}ytqlhhmqolpopsqmmrtdurli`u\LYbgov{~nsvicjjkmquyz~Ժ}dQ?T{|x{rdWJ>1)0Op|úҽ4 ! +  + *2;CHQas}urmjlpwz{yyyzzyzvofa\^gtxpc[VZoyngddinv|~|zvi[H7+'(,.27?<;;748?{vaRE>?CFJOTY^digjnqrtwy||}~zsohebchnsvwvrmgc^YVUTTQKC>>=DYlx{|rmf_WOF@651-)&$"#"!('2MgmdYI?:<=E`¤zYF>@?@@@@@?>>CNV]chlv|zxyz}{~uj`[ZZZYSMEA74.)$!"$&'),049=DOZade]RA83.&  9[W;IZhnplhefmuy~|||~}{xqhc^^ep~vlcZUa{sifgins|}wqk^Q@1)),168866>N]oruy{ztq_XMGLZlv}xi\TPMLOPMGDHOYbippnmmonnnnljgdb_]YUNKE<0&  + #*6AIPV[]YUOJEA=4+ (9Ndsxxwynd\UOGDBB?<<9:;;?>DZsʯ[D:=5/"+Dfy]H. 9hwrsvmns~uidjt|~}||xngiuɬwYK7)%0]X9&!*8>JW\ZWUX[_bfjpsy|#U~{wtsssvy|zti[UTVWRKEGJXi}~}~wj]VWbqvwxwsppsy|}|xvsmdacvXAnufWpO9JXalwzovtdffefhjlmsvz~ǧaAOxph]RG8'"<\v|zxaZgz˹>")' + + ++/4K]nxvoic^X[\ZTQSX^djmnmmmrpoomlhdca^\XSLHD:/% + + &,7BKSY\[WOIEA>=4-! (:Mepsw{zpia]UKFDC?>:9;BFKSZ}o]N@75:@DJOUZ`cdgknoruwy|~|pkc\[ajqwzwngb[QJFB>=;9847Hg{tqmhc]UNKHD?82.,&%!!%/(5WleXTD>==>BSfþɲZB84258;===98632236;AHQ[eow}}z{|ynd]XWXZZWQIEC@;60-+++.01258;AEJRW\_a_YQNMLFB72*"  'VtĺF#%!  #&+8N`fdejou{}|{tmib_clxzp_YVYl{{zvpopuy}~seVK>81-,/46997328CNOPK=-$$*358AQcrz~~zwrngbZ^a`\XX\_bfhklmnrqnnmieb`_]ZWPID<4(   (.7BKRVYXQIB@??>5-! %9Mckkt}yqjfaZQKHGDC=>CNW^elwj[NB:7;=BHMRV[_afiklortuz~vpg^Z]djv{wlc]TH?:41012206Mnzusojfb\XTQLG?953.,)%%(,095A^ngYRE=879=JVsư[B91.037876.+(&&(+/;AGOWbmwy~{}y~vkb\YXXYXUQJGFC?:53110244573'!$$(28K\sjcTD3& DmoLMQ]o~zsnkifd_^fsz{|wttqkeepپvJ% %.7ktV@3+)#$6HMORRROLIJKNUWY[_gpw;prokgb`^^Z[\]]]]]\YVM>49DWfx~{zxq`RNTckikrow|xx|{wqf[VWyQ7ryhUltOAP^fs|~}ízjifdcbbbglquy}Ļuuxmlllh\K@5AJQUPXnywrs|^>EfM%   + .F^kny~{tnkd_biq|~ul]UV^n{zz}~zxz|{qdTD9,+*,/26864335;BIOOJ?3,+-05=HVer{|zsqpme_UY^a]ZXZ\_adgkmoqpmlifa^]\ZXTMFA6-"  "+/7@HOQTOKC=;=>@6/$ $8J^danyqkie^UPNLJHEHQ_jouyqsninzzndWMC;7;9>DIMQUX\begilnprv{~}|~wsj`XY^cospcXSG82.)(()*++6Qtxwsokieca\XUQJEA?;84125;?GFQerl\PI=2.16>Db|¾\A74112440-%" !%*/:>@DIR\ekr~y{yvw~|pg_ZXZZ[YUPKIFC@;8755465558>BHLNPOPRTVRNNRY]``]SI=4.,-17<@FNU]hvplaTG@;9WyxXTT\m}~yyz}~|vpid`^ZYWZcosqx~{wutqhc^^\WSTc|ėmF$ "0;i~k\NF4'$1?CDGIIFA<:;=ADEGKPX^kqz#I{xrlfcaab\[[\_beigbYL:/6DTar|{ur`TRXfkfekv{vqeYTU¶S7t{l[psVL[dlx}zͷmkgda`__dhnrvy|uimsz}wj`MROHA8Fcrrnp~jNXQ% + + + *A^r|}}yrmic^_fjv{rh[SWanxus|~xobSD6,""',047941/1593852230+&#  &,18997:?HO[gw~xz~yopwwmd]XW]\[XUQMJDC?<9777676559?CKMPPNMPSWSMLQY_dljcYPIECDIMSX`glot}tpg]USQOee^VUcw~|urmg`ZWUQQRV`kminsvqmjgcZSMMLGDF[uԭxI& + );bzobQ>18AA?B@?<82/.069:;>BHM[blw?axmhhjjc`bgjiltqeTB3.5@Qas{}~||}}th]Y[dfcelz}xrfZUWbK|~v{e`ktw||uq{ξzlehg^Y]`ciruuzznilyrpry~vnbSA:GZtqjgp~p}·U+  + + +  !1=V}ÿ~zwrlhb`^^hkvzoeYV[k{}wuv|zspaUK>0'&!*15778248:97559===>A@=FKLNR[gn~upopkgZ^_\VRSYZ]^`cfjmomkhe`YUVVVTQKB=-$  !(,.15;ADEDD@@?@@?<::3% +  &4@FQW^|~slhge]TOPRONP[cgq~tYOEFP\_^RPLF>:88349>DHLPV[`defginqvzywutsrnf]WSRTVWO@0% !&(&!$8Y{zzxtpmmmodca^][YXVVWVSSTWU^ddkqgUNR@*-2-'Db[<058971+&####$')+-2/+'(-4:HTfvzqu}skfnzmf_YWZZ[ZXUQNOED@=975457888:>ALNQQOPTXXVPLOZ`bmmjd`^_adaemqsywzxpgdeiig~~xZK@Ja{~pkpljd^XTQOLMQY_aabcjkd][XSLC=>?<>DVpӽQ- + + 1Xlyp_PKKGAC=886203=?@@@CGLPYenruxzPmvnjiikhhospnph[K=.'3EWfu{|}|z|}}wj^Z[`a]dpƽ~xmb^cn`vrx}~zvmiuı}ogih_[]aciqst{sf_`f~}tdURV[VNLWiqqfu{·I)   +  + +  *E`s̿~{vqlid_\[adp}yoeWU\jx|yy{zunfWK@9/$ )27774147974112@?>?9;<@BCA?93' &0:BKNY{|qhed`YQNOQPPX`a^cmnhJE@EKPLGJHD?;96515:?CHILSX]abcegkpuwxvutuvsl`UMGKMLC4$&*(#!7Xzyyxrnlnqsonkheddcbccddddd`dffhibX\]L73.";[}V8.2452+'#$!#&*+-,+" #+5;EN\it~wosz|xc^gwha]ZY[\\[YUQOOFEA>:76589::;=AELORRQSW[]YPJO[dfljgdcfmrrsy|{yojmruu~ydTGNbyxkfmfeb^YTRQQQSW[\[Y]b_VMJFA;759:9ADCB@83) +%,54$ + )+'!!4St{}zuqprvzxurommooqonnnkea_^bfga__ih[KB01TrP7/-0/+" "%&)-/.,'##,5<>FOWakyslotw}s[Xdsa[\\[]a`]YURQPHFB@<:88:<>?@CFJMPRSRUZ_aZOKR`hjkiecdlw~}~}}uqrw|}~~|xm]OTew{l`_c``_\YWSRUUUVVVSPSTOE=942.-069;>DUqƖ\&  + +  -:Qhokhijrx|sh_]`enxvjdehfdjlonljiis~{urjpz~wtlP;8/#.H_kuxwwxxx{|}wlhc\PKXmŷ~x~xs~ɿĺsihghjccflor{ocbpűwhWB8@ACFJMOQSSRTZ_c]SOXejikieccks|||}wvwz}~{z}|vo`TXfs{xj[TUY\]]\ZVSQSTTRTUSNHGB;4310//26:@FMZṟuD + 5FXaba_[`fq|}z}~vrpminsy}|voj{yq|~zwkK443+2F\hrutvwxvyzz{xqj`NFRfȿ~´|icekpedgkmpywqr~µpWHEGFD>K_vd;" + + + +$*)""6Qpȯ}soqrokhbZSKGHHRcu~wqdXVi~}}seVG94/(#!"),52.,.//-7:><:520059>GMKHOW\][Z\_is~}yyyz{rkaZZ]`beeddcb``a_\\ZXUSLLLKG>5." $+169;;;=>@CFLKGDB@:530'  %(766:Uwnf_ZVSMJHHGGEJMLKPTW]R?1*+1741-06952.1688?@BDDHKOQSTROPUZb`[Y_hjgggfeeipu~rjgp|{sklpv{~}xwz~~~zl_V[fmpporl\QRUT]]]]YVRPPSSQSZYTEA<953349::9LVTPKNT\^_i}Ư}uqonkgc^WPHECBIZn{uoaTVp~~}mX?-#"#'/2<6.*+-./7;>>;8522239ENNJPX]^\Z]_eq|}{z{}wskd``dgfgfeca_^^\ZXWVSQMKIGB:1+"'-48;:;<=@BDGHFB>=<:70+! $'836Ff~vng`ZVTPKIGHGHMQTSPMJROH?744733136752169:8;CIGJOSVZ_bcfghiloqtrqpnf]UA5%"#%" ")5DRX[Z]]\XTQORQPPQTXYWPH@8.%-PxtrfYTD1+0Kq|zvpnsk]M>?>;646788-& + +%(*5.8W||toh`YWUSOMLLLOORVSJ?9;@EEA:54456665327>CC>+ (0:GNNKKNQW^gnywsoqytt{yzoaSOJC;9BN^ky{zzywrturuz~|}yxvlberx~ƾ{meahgilmlqy}įY5%'" "%$ +@YrҺ|xrmf`TPNKGFBBA:/)11#$'##+5860++/3437:<;9743-4;AHMNOKRWZZ[_c`kv{|z{wmhilnmjfb]XT[XTSQPNLLHC>91+&$"&+268;;<<=<;9874/-.245+"&-0.3*ADILPUZ^deddefknnmprrlaXKA5*# #%'!#$%..,,****&%#"! ! 2Sux\YVC34Fe{|uvkiiqtogaYTK>1)" &$#$" &)-6H\zqg^\]^_`Z[`mv~wpigirwwvyle[X[^_\UTPNKJIHKLMNMORVQRRQNQX_ahlhcdfgihgdcejoty}saSHFE@=>:GYkweXURPOLQK@G_d[_][ZWXXXY^]WYcc[ZRNQRMILHOPJFMTYdxȤ}nJ*$$%0:?CBAACKT[gszxy}~~}|wsk]JJD:5;AEYgtyxy{ytsstx{||z{~}{wtty²|}̾ud[_egdfmnku{ưS;,'&"!%(&"$+4@b¾ں}tmh[JA;9:<><9=>BK[n|yyvfWLT`oz}zvttvwzynsseKC=;92' ((#%2893.)+289:<=<:752125;BIKKKJKMRZ`aa`ejsz}vnlnkljg`ZURXXVQJIJMJIC9.&$& $(+,07:98999751/--++-147+$ );7>5+1+Cw}voic_\ZWTSSSSNRQKIF6#&052/027<=9410?EMPG;7;;?DFJOV]\^abdfkmllmomib]OF90*)((,($ !  "$"!"  >?CHKZcnw~{urpþ|vke`TA7*! (6CVesxxxxxtttuwzzz|||yuȾ~ȳ{g\befdfjlhry|N<0+'$$).22+$(7Hgݽuh`QD=7212554:;AJXj}}{yuh]PU[abdefjkmoppqqqvskhe_ZSIBADB:1:94*'-232-*-4:<>??=:742157;AFIHIGHIOW_bbadipx~uonjjifa[VTWWTOIGHKHF?4(" !#(+./2897220/.,*)+,.00/.-)#  F[RL<23:W{uoic_^]ZYWWVVTWUQQQE4$(253348;=;71.7>91)$!  !!&*--.05B\tyk_\ZVQQSQORPORZfkrvz}|vnhejpu||ukc_][Z\XWUSPOMNRTUVVVVVUUTSRUZ^fjqtofdhijigefjnuuvx~ygYRSVZdekvzxwyo`YRMNNVTLLZ^W\\\^__abbeaXV_cb^XUXWSQSTWTORZ^^drxP/ +,28;;>DGIPZbjs~~volž{rc^\UF0.DVesxwvtssuttuvww}~vʹæm_bdeddhhfpu~įtJ=71)'/<;=:0*5MeãxgZOEA81,*+,+38BJVex~ztmfa^cfcZTTUY\bfhhfdaf]\eYKR[RKMSVPF4550-03540-06:863378;?DFGIHIIMV_bc^`fmt|~tmggfea^XUWVRMGDEGDA7,"!&*-002674-*'#!"$%(,254/(#)! *goZ?64Pvysnidaca_]\\\[Z\[X[\SE-"%4;98789=>:0**,/0+%)14;BFHILQX\`bbceeigfgfd`]QJB;88774/)!!,,(#$"!"%())&#!!! "Twz|zh\bnrh[WX[SJCB@:750-)%" +!'*)( "$%'(+.00./2:70/7B=>=;@Rnſ˫~iYRMH@92-*'&*3?ISav~wkb`btzyhZTRVY\^][USOUJPdSAUXZ[`fljaJFB=:9877435;>@B?@=;9766:9:=@DEIJJILU]ab[^ciqw}xndcbb`]YUWUQLFDBBA<1&"'*..-.21-'$ %)-1686/%$ 2nxZ716e~xrnkebedcaa___\^]]^]RD.&#-:>:8988;>;/&#,18AFFFHJQUZ^_aacecbcb`_\RLC=;98884,$!&.-+&$"!#%$"!%)**#!"!!"Z|pP<5268841343)&%"! ).1/-&'*+,,,,*,----/6CUlwd\\YTQQSTOB4.,7@LU]bfipqpojebabo|smdZTT[ZYXWVUVVXXYYYXXVWXWWY\^ir|~qdciihfedfgjmqy|{yuw~nhfdb`aa^TJIOUY^dikkkijaUT^a_YTSVYXXZ]\YVU[bgsşmH!*04?ACDIS`jkoty}tlkiabhdV2#!-D[juxusqnrstsqpqt{z|}˷~{ӻpe`]_cfgglqx|zyx~}wԾwrs~mM?;;855;6:@L`xļӵkXPNNKF@7/($&/F>G[MB^{r]LA94:779=@AA<<;:9989;::;?BBFKKILT\`a[]agnuz}}pec`^^\XVUSOKFC?><6,#!'*,,'')(%!%-169;;6/%  +*ZmeJ')=u}xsokfcffeecbba\^^_^WH9*+1<@;549659=:.$(-5>DEDDDJOU[]_bdccbcdc`^VPF@;:88;7/'! $)++*(''&&$# "%%%!" !"X^B/%*482.,+'(&$#! #*120,(**,,*(%# #%((*,1;J_zqf`VMEJPUQG9-',5>FJQW]dggeb`abev~viZPO[[[ZYYXXXXYYYYYXWXZ[[\^`isufciigdcdefgkpv}||tnmjgdbbaVHFKTY_gknnnhh^ST^a]WSQVYXX[^[VSQW`jžX;'0=>=;;ALSZ]dimrx{~~toswux{t]5!(8M_luvsqomoqsqnmorxxz{̾xzwzz}ο}jb\]aceijov|}xww~}}~~{y{z˱{kbiwlPA:;:5113:Jb}ڿhSIGNOOKC9/*).9CN]owi^dpybSMTQNKFCA>5<:?KGQrcK=6;9:;;<>>989::;<<<;:;=@?CIKILTZ]^[]agmtz|thc]YYYWUROKHDB=;73*# %**'!!" "*37>>=<6/'" + 8CC0'L~xtplheggggfedd^^`a^SA3+4@ID800752697.%")1:AA@@AEIOUY^aeeffhihebZSIB=;98:81)$!$)*('()*''$" !"""!P|||[;' ,662.*$(&$"  %)1210+& ! !%'+.DIONH>1&)0789?GOWZ[\[]bglzq_TQ\\\\\\\[[[\\[[[ZY\_a``bcjsylgkjgcbcfggmnptz~|zwv|xpplfdcb`XOMPWZ`fjllldb[RT_b\XSQVXWUZ]XSQQYgvvB(789756=AJNU[`ekmuy}yvt{}hA!-9FTaltsnnlkilnmjikowxz~~|óz|s|~~ƿrf\\_`chhlpw}}wuv{{{}{usw|Կ|iehm{rQB:971-.8F^ydzvaMBBHKPNH@95038@KZgw}yk[_i{iXNLJHEA=:75059:<@GIJMTZ[[]^bgmtz}xleZUUVTRNIFCA?:61-'#!!!%+)$$*2:=A@><6/'#  + +!%/_{uqnheijjjjhgefddfcXG:;DNSJ<44521353-'$""%!%,5<=<==?CGLPTY^cegjljgd[TI@;:::971+$"$')(')*+'%$#  $$"HmursH(".870*)&#!%+.52+%   "+=Y~fRGJKLKJE9-*165239AINRTV\elr{zh\Z______``__``_^^^_bfhggghmurlmkhddfhhglklns{{pf_YVTWVUWY^lzvmmia^``\\]][Z\`dgihh^^WPT`a[YTRTVUSVYTRU\jġtL)#*.242246;?FMRX]agimsy~xrnnwz~~{tq{}{ulL0/IUan{{yjVT[poi_RIFGBA><63.*,0884RֹÞkG8777764322358;>AA<;:<==:B@@?=7/'!   8m{vrniejjlmlkihnigih^PFNQWYOB::31/01/-(,++,(")2899:<:=?CGKQVacejkjgcYQE=9::;740*$"#%)(((+*&"$"  #'&+Ebyofrsx{{S.".88,$%!"')),(  0JovdXTQNKMLB5.5:8203:BHMOSZfpu}nda`aaaabccbbccbaa`bejllkklovxqpmiffhkjifhkoruuvj\K<2.+),-/5?@AB<;??;;CEIKNRVYYaccfjs}~si\ROOONJD@>>;5/'('')('%,%"*,)#$'*168;=>;<;;6/%.P}}xromknmmmllkkkiikkd\Wc^UJA=<>1464,&%%)+.++.+4;99;1*<<5EBRRUZ^^[XOH?<=>=;70(#$($!%+..+&#$!! '($' *59VxaZintslc][yb?1KK5++%!'*)$   5Vwnh]QKNPG;53:DC84;60-4>JUe}ukfYIBDKFB=85205332-*&$&%+))WñҥuE200220./01/049=@AB<:=;75=FIJNRVXY_bdhmt|yqbTMKKLGB<;;841++))+**(-)%"02,"!&/1469:=@B@><80&  ;f~|wsrqonmmmllkkmkijie]X[XRJB=;<;0&&+-$-)'& *712GDPLOJQifhv{zwqgZMHEA>;%,/'#*&(+,*(%$  &&$))28Qswhceec_WPLJ_teNI]V:-+#!!(*($!!" +EbxbNGKMGA88>HH=9==ACABJS[cdksz}xjffgijhdbceffdbccilqttrqrqv~{wwrlgefimnmkkom`J:   #Cbo_WUUUX[`ipohga]]_b_[[WPNT^`]]\YWWWVRQWe~kC& %----(5>=567;AGHEA7/),4?N`}}pe]PC>?>;97520/10/-*'$#%&+&%F{Կd9)+/21.+-03-*-2;?AC>;;:758EHIMRVZ[\aekot{~yjYKFEHD?:77520--**--...-)"$57.  %)67788;>AHFD@:1'   N}zxvustpooonnmmoljihe_XOOMIB<98:- #'#%%()& + 4;OnqµümJ1,8D---#!%*)**))('"#)(*$!) #)/8Kcstoje_ULD?<;F\xtf^`m^=,($! %&(&   $(*  !"!""""#$"#5MkiJDHHGG==BKKC?B?>;5..5BCDGKNQRRTZ`egijbb][Z[]^|ojdcfga\^_\XUPNNT[_b_^^_[]`cdebbbaaedcflmnpswy|}xxrilüɿ~ywtaUV^[akt{}|wpicaVUVZajruroonlgc`ifccfugXVTV^irx|]LIUgyzyzvnxu{kZrڴo`ZKNSSQJ?667;AFIGB:0)(,5F[z|zym`UI>:;8565521/.-,+(&##()*)(9Te{㿮mN.%*-00+'*-2-(*18=?EA;:;:8:ADFKQX[]^bejmtz}p\KB?C@>;962-+,,)+.1440-(!%58+&-.69;<>>@BLJEA;2(! ![~zxvvuvqqpoonnmqokhghaYIKLIB;63+/.% +#+.'#0DNWk~sqdN/13+$! %'(**++,)$(5P]XD'$(,.:IXhrpkjaRHA>:9?Oakjeeeem\:)%!!##"  &'&%%  !""" !" ".Ed}kHBFECIGB@@=401,+*+)''*.-19>BJSahv{tmkmqqolllkijlnsx{}|||{xxyslkovrj_Y\eosyvrmg\J8)! ###%*.6>DMat}z~t`QIHKQVUVZ_ab^YXY\]^VRLKS^`^]^]ZTMLPV~G!''/697568<<=?AFIKKLPTX[]__^\ZXWWWxphed_PECHLONMNRX`fhc^[\X[]`bcaa_`aeedflknpsuxxy|{sjix~|{z|dVU\V^iu~wnga^VUUX_ejlihdbbcb`_]]cl~žia^\^djmoquy~|~cOIP`mxxxwsj]Vq{ykmswtjZPp̟sZPKDR]WKD@=:;>BFHEB=4-)(-?Us~ywti[NC:761///-,**,,+*)'&%'((+134:;:HkݰkYF;+)(*-,($%'/,*+1699E?969<<<:>BHQX]aacegjq{raOC==>><;60(&()(*.3671*$ #-0$,4672'&*,"&*..//1* 0Ctj. !"#&(--AGOUX]bdekX9*##%$  !# ! %3IghFBEB?BI?4-$*1/(%%#"$##&-:ARg|vppuy{slijpttsx|~~~z{{vnklpiaWRWbpw|ztmkg]PC<8;>=>AMQVZZ^iu~yw{p]QLLOQQNR\begd_]\^`aZUNJQ]a`__`^TLP[lɼp>% &+2555577779;?BCEEHJNPRUY[[[ZZ[Z{tqlbQDKPVYWUUXYaefa\YXVWY[]_^`__bffeglmnpstvvwyumfemzϽzzyxy~|¼¿l\VUSXcny{qib^[VUTW\`ab`^ZWY^__SSWevĺncaabdgfgmpruwvqnhhkuhPGK[gopnjbXNJgr{d[`bf_UNSy޴]KC=AVdWD?A@=82,'(7Mj~{wsmdWI>631/,+)''%%*+*)''&&!%#)3-$*,+;bψUA722')$$&'&$$$,--,.036C=4/3;=<9<@GQY_bbdeeipz~}|tfVG=7:;::4-'%)**-05651+&##%"/89;@HLMKKIIHHE>4)"8o{xvuttsrrqqpprrmgikbUGHGD=4.(&))%%1) $>cʂώRGVZUSRfuwrA##162!&+-...1(/Nj5).2,'&)./=LXcjgdhcZQKFCCBBBGPZbekmY;,# "%&  + !  !" .@VraE>B?985/% "16-!,'$"#/EZiu~~xwy~{rkmv{yw}}}}{tnji^XOMTaov{{ulkojaYUTY]^`epstqlkpvyutx}qeYRRSXWTSZfkknlheaabb]YQOT^a^YY[YPKWiƵ]3"$(.0/05112469<<;<=ADIMORTVY\^`a}vlbZcdfe_[XXW\_`^[XWSSSUVZ\^__chgghmmnpqstuvsojjmt~ý{iipty}þ}m^TOQYaiortwskb[VSRQPPSVYZYWVSNQX[XKKUkĽm]]^__`cfpqrssohc^ajyhNBJ^oojc\TLD?RdwmMEOOYVORaɓ`E=92=UcUCAA=;;=ADFD@?;70&%/Fbv|xtof_SE93.*-*'%#$$%()(&&&&&$!+$-99Ik|F5322&' %'%$*-.*((.4G@3+0:=;;>AIQX_aacfgjqx|{}~|vm^N=27652.*'*,..03542310+"#07:=AFIJGGFEHHGB8,$ +L~{ywvvuuttssrrrrmhjmbQCDB=6.*'&#  *0=W}xh]y"-t߶^ZdiiPH>2,De@585,('()()(*/%%Esۺz5*253-*,..3=L\fgdfge^TLGGIDCADMYejooZ;-% $%! + "%&'$ !!"" !,@VllZC9;;60!!),,,)/84'"840-%&4?KUmtz~}}{ssx|||~|xrjdUQJJQ^jpvxrjjqnegeku{||~ursvzwqpor}zph^WSUXZ`aaaeostusokebab_]XV[a^YSTVWPQfö|I $&%(/-.0256665559<@EHJKNSX^bd}wsqmlie^VSRTVXYZZYWRPPPSWZ]``cihginllnpqrttspovw``ks|~ÿ~l]NOSX]befgc[TLIHHKKLNRUTTRSQLNUVQJJVsƿ\UWXXX\afgjntxxsohm||bF:Fav~rbTJB707Qq_=6BBSYU[pxG433+9R^QDC@8:9;=BDB>>;92(#+@[r}zvol`YL?4.*%($! "$&'&&%&&&")!!325Fiپn:.266))%*'%(,-'""*3ME6,0;><@CDIOU[_\afimptwx|}yreS=.530,)().0223452/4694""+25;>@BA@?ACDGHD;.$ &Z|yxxxuuuttssrqrnhknbOBB?:3-*(""#.Hiq}{mk~٭H0CicT]S:Eh\8,.4/+&#""%+"2\׭l2"553/+-5637>K]fcbffd^TJGJOHIHJNYgnpnW:-(%*(  +!$'*,&" !""(.:RkaTA57;7.!##'(171&+9@<:70(%%",5O^s|xx{~|zyti`PKFGNYekotqjkrqgjnv~tppqxwqlkjnw|tmaYQMPVZ]chlkntxxwvrngca`__\]`c]UWW\^Z_z¼[&!)-/03566543458;@CEGJPV]bewkplf^VOKIKPVX[\XPONNNPUY[_aehjjihllmmnnpqpmjywcahr~ľb[RNPSQQSQSNG=9:?=@EJNPPQQPNLLMMKIObxSIKORX]eilpsssvzz}kQ<5B^v{naXP@34FjuV=8@AP_l|љX3,0.(?JNML@689:==?><;9864/*-:Qh}|zxk[SMD;2*%!"&$%())(''''$ #+64EoȬl91>3./!(*($$'"##):ROB3/5;>BCDGLPSVX`hmoqqsy}{{ynX?/,.-,*++.2200320+6AE8" +"$136898757=4@H:893.9G<$,*3;8:?<@<:95115/%,@Ykt{~}ywtk]RC@?AJV_dhlqttohdekv}rqrprwzvpjfeiot~wttkaTJELYac`bjw}zsv|uniea^`[\dgddii_[^`kľz1 +$',36754544446:=@@CGLRX\^~thb_ZUOKHGQVZ\^_[SONMNPUZ\`bdhkkjjmlmmnonolifw¿onsxûudZPMLHFGFHG@7459;?CGJMMMONLIHHHIJVorNEFLPW_fmmopnjjmpv~xjRH:-(6UrzhXAPp}}sZEAGQatƻ߭~I.'(),CKKII>479:;=<<;:98761+-9Ph~yurgXOIA:0)" %#&'))*(),*'&')*,15SǤi<2:+(*!$'&#!"& #$,>[XNA:=@@@BCDHLORV_hmnpprz~|||{p[B2.0/.-.0353/-/000BDB<3/# + F~{{{{wwwwvvvtnnmjoqdQC<<9//3/+# H|oqh_dt~λU)3/#$(2HauҾd*,M>./--.'#),-:UukWR]fwzlWI;159/%)AZp~rdgx}ywmpuxvgZV\hyƲܶ[9,##1LNHCD<2489:=<<<:87883--7Oh}xrnjaVMHB;0( "#&'(()''-($&+-*'$/TɲV4,1" &&%&%#! !#$$&,>\YQE?>=>:50/0008@HB1!$',1579;DDCC@=96+" &\~{|{|xwwwwwwuqpomrufSA986-.3/* '-HrVQajw_)(77663)',?XtּoG9{h8#$-4. /BOOJJPVYXVTXg}lJ1*5:GVcfea^a]VQMKIJNSY]`dikprZ7(#!" $)*)&" !"!"! #.E[woH<;>@Slvɝuwrf\[de]TIFPVRRXSI;1*&#:Vq{uj]M?7./5>IS[_^`dlqoe^KJLPQNMPOORZclyuog_ZZ\^`ba]ZXRJBAIZnxridgp}}tlfcbfgkqroquqbTVo¿W( #&'*-011246688;<@FKPTV}|xqqmf`[[\\aecbab^VNLJKNSY]`behkmnonnnmljjheZRc~ºͽq]RIB<979:86346;=>@ABBACB@?<:@HXr¾bF;>CLU_ipvupiegnt~~wiUC=@Bbu~}zompijoyyx{콋aF2.!2TSH@B;34::;>>>>=878:60/9Pj}zxvoje`[UMHA:/&!#$&&&'&&(%! ""%Fv[7$#&$"&%$ ##"!"(8URLC>;:9?@@CFJNSW_gjlnprx|{~|teP?4.),1:DMNKD>840/19@@2! +!" &*/59>ADFEB@=<;<2)  0m~}~}}yyyyxxxvtrqouwhT=653++.'%'Y}m`ZV_ۼ~J7:BGIEFU^ZP@58<::>9@Oez}reekw~tmjiiow}{umjhd`nj6 $(+-024777;>AFJPSU~}ytqme_[]adijhdbc_XMJIILSZ]acehkmopoonnkigddXO]ssp}{Ļ¯{f[UMDA===<:867=>>??????=<<78DQjvXA69?FNXbipojfeku~~wlbVF8)/9@;66;Vex{wllpkhn{ɕeL;/.5WTG?A=59;=>??@>>767;:55=Vo|xupmhc]XVVQJ@7+#!"#$%%%$##"!$ 1ObdN0(#%& ! !'#  .JHGFDDDFIEBADIOTYagjkmoru{|{vkZH8,%(1=LY^]ZSI>7259>@6& %''*.4:>BDFCC?<;<=>:1& 7x|||{{zzxvtqpwxhR:210)'&'#>ýkQmķ`3.0:7,$+Itwe]`gsnQ>.%*8H[gid_^c^XVVVSRTZ`egijjvw`@,  #(*++%""""" $5F`v|ZHMZsĺ`JJVi}}{n]G8)!6HlumaP?0(%#&,7CNTWYX[dnrmf]TIB;8;BKVakuzlf_WRNMMMLID>9538G[pxkhis}}tpoquz~}wleem~ɿwC #&)-046778;@DIMO}wrmh`[[^ejnnkede`ZMJGHKRX]ccdgjlmooponjfc`bWQasmiy|vzĺȳphe]TOGFC@<:98>>==>>==<:9:7;LbjN<248>ELT\gigcdhqxtnaRF=3(#.;AEJSWY]cpz{tuqy{ssvpmp~þ÷lL=3,)%>QQG?B>:>>>???@><755;=<DMSUW\[SIB@ELT\cgjjjmqtz~zvpaQ<.$)2>N\ehjf^QHC>;<>4%  $%,16:===>:;;:::<=?8-&  >~~}|zxuqpwwfN5,+)"!':sT:W˩vE.!-Ut{laRB5-)((),4?HORTST]jtvwnf]YURU[clu|~vn_\VRNLKLJEA<5-,0>Shx}wqmqw~|uszzz{yqsQ + #(,/1246;@DHJzvnh`ZZ_glonjebc`YLJGGJQY]ddefhjlnpqpnjea\\TScqhfx}sv||{}÷Ͻ|yzrg_VRMGB?;;==<;;;<<;87;9@Xsz\C4/136;AGNZ]_\XWWYQI=0*($"+5>Ndzsd^hw}yikzzz}zrteH?:5+%2GHLEAC>;C>>>>=;:9734:ABEPn~}|yvuqmhc`\ZTOT]]R@/! !"$(1-# #4:JanqtxreRB;?HQ^ehihikotyxuthZB2)08?IVagornf`^NF?=2" #+/366400.1478999@;3-' D~~~{zwsqvvbJ3&!4xTKn˯^@C[szfO<%/=h̹jN9;=;=Hf{qgc\ilZA502=EUgpoieegeb\WWY][_cghlortvfM=, %&),.-,*# !" ! ':OohW^o}a./)'BgƺwX=$:\ztdVD60.//0/.2:DJNPNNT^jtyvutwwstw~ytqi`RPNLJKKLKD>92,.5I^u~wpmot~wty{_) + + #%)+/37<<;:::::;77;9.#%:L@FD@B==E===<;986634M]nvsmiikje^VUX^]acfhmsvqsgRC2%&)()*+++*'$!!$&&$!  !&9Nlp]Uh{vϑ7-.&;YºmI'!&$)Jy}vo_O;/-13453/08@FKNKHIP\hqxyzqkh_VIIGHIJLMMG?;4/4=Oh}xoigly}vss|ǿi1   + + +  #',046{y{mf]WV[`cgfbba]XQIGFHNTXZ`bbaemrprnklf\USLSU^kjkxtkglpsu}ŷʵ{uoiedYHBCHD><<>=<;:;=EY}ƾkI4-+*& '"!&($ '(34V~[Tgwzmpw~~}ǽþ}Q71496.%!,?LD>=AFGB<<::;<<973579=HWg}{ppqrkb_ab_UJK]toB ! ! '>ZudC-1BS\bfgiloqtwz}}zz}ynfJ@9<@DLT^bhlnoqulh\L=54112676345::85/)#!',39<94/286*""3[~}}}~{xpv{cA) ,IƊ}Կ}dXen|ÿ|hI+&9|}eHE;),>96NWK=:JmâW/9J^m{zuromhihd]\]__adfgkpsrro`?#"-+('')+*(&$"!!#&(%%$"!*B\r|mUQ]jttw~yǻb-'0.)D}pY:""$ "-`xk`ME:56;>@74248>DKLHDCGO\ht}xi^WTOKCCMWQEC8353.3?Yev~xplt|{yqscn¨{y¿u4 +  #&)zyzle\VUZ_bc`][ZVPKFEFKOUZ\`baaemqqqmlmh_YXX_agqnlwÿshflnps|þƻu}yoln{~yuq`LCEEB?>@@?<;8;BRkžgG3,'#    1B_qVWbjfgksvw{~Q81430*%'2@IC>=:72,'%+15:<93/,42' 5\~}||}|xpvz`=%  !!\ʠؼ_OUh}¿}gN<'+_ռoL0$( (522=]{E=Bcr~~yuspjigc^[]__beghlrtutqcB$ )(%##%%&$#"!""#%&%$"! ",CZoyxT=CVqmpznG &12.5jξv\=)! !$(UteYJE=9:>CG:6456:AGLHB>>GT_lvuh^XVRMGGNTNB;548628DZgv}xpkpy~}w~zw­qaJ>FSŽ|8  + {xxkc[UTX[^_\XTQNIECEIOTY\]^a``bkoonmmnkebfpvux}tnvɸrcdjnquĽ~xus}{plmżyaG:<==>@@@=;825D]z¼bC0+/) 5Xo`KMVZYZ`djt}ÿ}P4/0,'#%.:EHD?=?BCA=:889;;:858<95/+('-03651*''/.#8^}|{{{~~}yqvwZ7  #++[}UKSnq\C)7fǺ|[8( $'0;OtȀMGQlx{yvskjgc^\]__cfgjmsuvvugH(%$! !!"#$$$$#" "&/CYkt|`7&7TngW_otR:&%05/(*YعzZ<0)! En~xreWLA>:659>C952444:CJHA:7=HQ_jy}rg`][VSOMONE:128@>9=I\jx~yxphis{~xz{|ĹrH1-+(2?HQb{=!!  + + |xvjbZTRUXZ\ZTPKHFCCGNUY\^`_cb__fjjomnokjpx{ovÿ̽s]Yait~Ģnlifgnu|y{kabzƽÿĺ|_?/0238<=<95605Ji}_A-&,'   #'HvrRIKKHIOU\htzL/)*%#2AIHE?<>@B@?:8899;98:8*B~⽝mI/21 5Uvxme^SIB764/+,/5/*(+*)/;FHE<57=AOYhtz~{pidcaZXWVQG9.,5DMI@AH_ly}xwpfdnyztwɷQ72& +(   %-;FLjzcSL>>@FKQZdsÿzK.'%#6FKIB@=>@AA?:9899:87>@EKTalw{xspmlhed`XTTNPUd|{^H9%""*""+3898:99998753310//..+,-013434:73/% .Pv{fG/)5DON[fnpnigmpsuy{}|}{{{|}}}zxuuwxvsmcTGCGLOWY[^`cgiihgge`[UNHE@=;:9:840,*))..,,'#%% +. 6etQ.-7' $*>e{p_QIB=:0/-' " .AIKC:664?GS[_bglpwywy|somki\\^[P>.%0@TZPA>Can|~{zrf`gs{thfw̗N4:22,%!"%''%-9FTh}D  yujdZSRSSTROJD@@DGNT[_^\[]aegbafkmsssphgssygOOc°xgcyƺ¾xza<'"!$),*(%$.3Ef¿sW9$ + "2FSgu~yupgYO99KMH@>>@ABA@<:988864>BGPYdls|}zvrnljfcd`XQOHScwlXG.#%$)  #$%*2:@BA>2/*'&$! "$%$$+.-,&)9a~fE0,9ENKXdlmkfdkmpsuxyzyzyyz{{|zwutuvvutl\MGJMLUXZ]^`cffefhhe`ZQI@;777531/,)'&%('&$!#" =a}}||||||}}~{|||xuvlJ'!,1,(2p~:#'-?h~{qMcdnwZFCHITbe۰bSYo~{|zwplda___`afjnpsvwusvrZ;(&!""!"%%%"! #$%+19FUejmnmpx~zdA")151160,45-&#!2DNMC3&">p˷iN5+7*%+$+Rwn`L<3/,+$%"  $=JQI>94.5:ACDIQZ`lrqt{uutqm__^XI7*'9Na`O>;@bq~~qbY]ei{q_PLTcne?C;7.%!!!+0-2EYf]G78@cszjWKIJKXOA72368R{E@592+(&% $*-D_öK!!  {vmf]VRRQRQPLGCGOUW\`_YUTTNUZXX_hksxzteVZc|~}xt}çDzĻ}~nL5, !"9Hf{bH0!&+)&$*495489716=GVk~lWKGEDD@==?><@ELVfusE# 8KRKB8;?CDCCB@=:875217=HUbkquy}~~|zywtqmkigcbecYOJMemM>-'&! %+/10-,,+*'#  (:XtqN76AHKFR]ehhecefhlnqqruttstvwwzxusstuvvqbRILLGORWZ[\\^ccbegfa\PJB>;84/-,+)'#  =`{wxwwwwwy{{~|zzyyvxxkF$!*480&8x[!&IoztR20SʯƬΙnjjn}yzywrlda_`bacglpruwx}xyt^>(!!$&%&%&%%#$ #')'(-2:FSaeeffjs{s_>%')$"")30-4/&(7;107>LTSNLE>6%'7NWWM=6;>;3/23*&1 7SWYF;/'$$#"%%#%'&# )=NUK?<72010+)1ANUhrqtxy||umc[RG7-1=N_gY?17Bcs}taJ:621=7-&$ *^GD><82-(%"   .?WpM  !! }tmg^VSRRRQOKJKOUX^\WRNJGELJMQRS^jov{u`NNUgmrttux{ƺ}~wQ6-('++&",B[v¾wY=)%*+)*8ELMKHDAMQZhvudRA206FDBA<:?HMT_hnpqskB$ (;IMD848=BGFFDBA>93/.17@LZfnqs}~|xz{}}|yuuttrpmji`_aidVNN[q\E2%&!$$".14773,(   +#7PqlM74?EIDMTY^acdeedghlnprqqrsuxz|yurqqrsvodWLGGIQUYYXXZ]aikgba^\YRJFEA:2-*)(&!  8]xtxwuuuvxyz{|}|yy{xuvylF !#&+35+!8vR8Js_E)>w粙z}|~zqjec`^afhkoruxzzvxyp\C,""#$%'&$#" $(+/+(+07CPZeg_^isxsZC3,7A=9;?B@:;@HLIDEKMILLNPQPLIA<1&&.(#$+7DI=EE6!$'# 0HL?=80*''&'//049;84($$#)?MTJB=:4861++6GUgmrxvqzzmd[TI;-*7FUXWO=17Bdp|{mW?*(&  % :hނKHA;=:731-)" 'KcǼR*$$#! "%&#'%#! xqj`XSQPPSQPNPUZ\]WRKFB@>CADHIJT_kpvo[JIQ_elpru{~Ƶ½{vyrQ=9669;5./7LgnP7&"&(-CMSUUVVW[`hs~}pcQDBIPKEB=:=CMRZ`dffi~f= /@IJA7.3;DHIFEDDA;51028BO]jswy}wwwxwvspppopmliia_`f^RKMa}N5%$"$+0025762(   + + !,A^wxaI99@CAAIQV[adedcbdeiknooopqsvwzxvsqpoormfZPJFDLRVWUUX[cjnjda][[WPMKH@7.*'%# +  +  4Yvv{usrsruvwz{~~~}|{ywwuvvxyiE$"%(+01+#6~kH<<8:73/0;LYlqw}zqpx}ui_SI@7/.:FWTOE719Dgr~wlY?$ '*'&*,"$K{oS\ZMIC?<;751-'!&5LcuŵR.*$""  #%$(('# ztmaXSPOOSRPPSW]^YRJA;866;;=@ABJS[_daPBCK\ahnqu|̿ſ|tu|oTHIIKPQLFFK]v_C0%!&.5GPY`dhikjnsz|ukdch_TGB>;:=EJPUY]`et}w~xZ4 "4,19BEFEDEFD@9434AHOV[`dea`_abfgjlllmorsuxwvtrolklli`UKC?FLQSRRTVahmga\WSWTPMKF>5,'$!   + + 0Truzrqppprstwwz|}}{{{zxxwutsoqsutb@#!',,.-*&8xR;Kn}zfE4E|ͽٶƍ{}{zuojhfdfkjmosuxz{~|zuhS8& #&"#&'%"""$#"""%#!"'*--%##&'0BTZde^_iqqkTC@@JMD@BEIC:7:FE@99?CDBDINPOMLLOPJ>3+( "'  *-*/>C=62.+*'$$&)+*(&%&!"*10(+5GPPD=>A?<;968DS`ou}{pmputk`XKA9436BNXPHA:8=Eco}}~}}uoaH&  # %*'"4SxˬUZsrZQF@@?><@=6/'  $,@e̽S40&! "%(*)'$!ztmaXRPOOPOOOQVYZRJ@84346;H^dinrwøtns̴~~r_WYY]dfd__aqsQ8*$$,6?LS\hmnnposwz{~}}kZG?=;87:=CIPX_gp{}wvvwswmN, ,GQLC92/27;?ACCEGFD=757CMYdmtxz|wzxrnkifeaabcddeea]^_YQWc}u: )!$&%""#  + + +  + %*! +)9JFB823;B@GOUZ_cd_^]^_bdfhjjlnqrtvuutrnjhejmdTE>=AHNQQPSU\bhc\XSOQPMKHB92,'"     +Qq~svppnonpqrrsuwxxvvwwvutsrqomnpn[:!).,+,+*;lj=8cuV<6Y꾮ķۼy}|~yupkjhegjlnqtvy{{~zyvn[A-(-.,)))'""""!!"!%$"! %##&)+,+!! "$/CVZdeabltsgM>?CLPHACHKE=9;<<:9DJHDA=83/("  !*-+1=A<5/("''#(3HOPE@DFE?><=AM[grw~wnoqoj`YSF>844<@C[jy~yvtsppkU0',+06ED?80'0DYoʶT6/" "&,))'$" ytlaVQOOONNNNORTTHA83039AFJG?;=3359<@CFMPROIDA@=CDBCHJF>;5-%  + $%'3DIE9/% -BKMEBEGCA@@CKVcmuz{vsurj_WSPC>845AXoo^J<55;A]jyztld_`dgZ9"2550)*4?HORRZsyiT@7667;BCA=7/(%#" '6L`vιV7-!!$*))('$!  + zum`TNLLLONMMLLLK=82019@EIMNLIJF@90(" $1?\bhlr|źzgZXuǯyusz~eF/#!(2=KW]UPUY\dow|zy{~|t\B521.-369?FP\dnsvtpmoszwc>#4KPF<530.,,1:DKCDDC?<<@GR_hnt{~yvtpjfa_[[[\[\[]]_`\WTJJ[rk/ +0" !#   '1:>;50/0121/,+'"! #+6>=3' )AF=8:@=CHNTY]^[YYY[]^_cdgjmopqqqrqolgeaimgUC845J{ź{wqmmjffjoqtwx{||{xvvo^D0/594.,,*#"!! "#$##"#$$&&$!"(.0-)#3I\]eigkuxt\C568=EG>@DIE=;>31279880.:Fdmurj`SKMR[X< #),(.DYht~~ymV=1*&(/;=>><831,*&#""  +%/:NnñT7+ "!!&()((&$##"   + }zp`SKHFFLKJIGEC@63//3,!%(*.6EOYaijlmmnotsmW5(5HKC<8741-+.5>BAA@@=<>CMXcjlotwx{~|wtrpkgca^]]]ZZYZZ\\XTQIMep4#,/"# +8IV^_deV@?><::83/&*,'.74255) +5AA;879<@EJOSY[WVVVVYZ\_aeiknooooonlkhfdhjj`O8+6;?ABFKPZ^_XRPNONMLHB>:7.'!    + + "BfxmpkjihhijklkkkjkkklmlllkjjfdeeYB.$!&(')/3244?Ogzxr_C3>\þα|xsopmhhlprtwx{|}{zxtjV>+*150++.-$#"!""$%##$%()++*%$),-%! #8Oa`hjgltupV?5624=A?@DFA:8<84366349=ACA@@ELQTQFCHG?B?:74.*&!!! ,CW_NC7/,--..-,-/001,#-;BD@@GHDGGJR\hsz|vwtvrfZVPKA817G[n{xiWE>IUfgfbZRG=@ERXD",40&$+39>=7214CVgt|~v]B1"#148;<<:952.,,*&#""1?d¯P0%  (&!!"$%%$$$#$  +}rbSIEBBHHFD@=:630//4>GNX]\XTSK@1%#:Wnuwwwvz¾Ĺ{raTb}ļٿXH6(" !$ /Odghmsz{x|~vxpSA8434158=FPYbdcdhlnpugbM-)4EGA<;;:72--058>=><;:97-'!  + Nk½~{urrokjnqstwx{||||ztfQ8&$,0,)+/0%$""!#$&#$%'*-./3-(*+( #;TebjlhjrqjS=68108=AACD>86:=736535=:?B@@BJQIONECHC9A>9530+)#$#"&&&(*$ %:R`VK@721/-/+((+.-,1*$#->>DE@BKMJILOVbox~xtwospe\WPIC6.;Ujw|x{}tbVYb^ZWPKH?6>BP[L*&7FGDKY_cdb\ZYZ\fjqzxwiL8%!+-26:;<<975554.*$! #" $8NbyҸK) $0,#" !"!!#  + + }um`TG=:>BCB@9312//4:@CKUSSUUK<:>.3>Pi{tv~thfcd|ô{rS;*%!! #$ $<9743578<9769>EMZ_cedefffhloonlkiiijjf`[\\YVTTUVURPPP]zvD2157%! %1+( +.ixYVU=$*)!0;820+% !GMI92D[hrj_RF?:9<=@BFJOUVURQRUWX[_aegjmppomliiggfjghn^;)101211=JYaXJHFCEFHE?<<;5/(    +7]srkihffghhgdba__`bbddccdddecfjgO1(.$)*-486329Mh~ƺyuvdJ55@Y俻ү{xspkkknqsuxy{zzyxwthT9&#(*&$)01&((&&)'$&'(*,/014,&**# $>R\cgggmtnaM8/303:;>@CB>;9777789:9;;>ADGGGGIJIEB?>>==<:740.$'*+)))-.'&&$3MYUOHC?;9882*#!#" "!"*8BDOJEFJOOMRTZdnx~zwunjd`\UMH?4.=Ypwsv}uljheYLC?<985<83355/+%&$"  &=>>@>=;:97;5448?HO[_cedccb_`acccbceddffc]YYYUSQQRSQNMPVexA+.:A**>JC1( 0Uۡq8'3.,06?GF8)$&N]ghkxvi[PGA>?BDGIKOTTRRSUVVY]`cfhmnnmljhgfefhfin`A-*)*-**6EXaXHFEACCEC=:;:4,& +   5\ppjhgeegggfa`]\\]^_aaaabbcdcgidL0&+%*,/596418Kdy|vvfN6/6Qٸɦ{xtpllmnpsuwxyzxxxwshT:(#''" %-/,--++-,'()*,/0333*$&&  $>R]cggelsk^K6-203::<====<9631*,..,++02)))$2JTQKGFEEEE<5+$!$(3BNPSJFJOPPSV[cmw~{wurlhb]XPIC932@Xkqmqx|smhcWI>962139IZXB1++8Maijnu|~|z|~wdM2 (06:;<61133.*$$#"  #&.9Y–X*,+/55117*($#""   }zn]PC:7:9<==9765218HTXYWUQQYahpwȹx{{qeckyįu[<,!! $.7@HPVWK=Wp~scULEDFHKJIKPRQRTTSSVY^bdgjlljihgecccefjmeJ3"!#'$"-=WbXGBB>?=@?98983)# +   4Xlnihfeeffec][ZYXYZ[\\]^^__acdf^H."$ %),0795428H`ry{y{}{yyjR9+,Iȯֿ{yuronopqsuwwyxvxvurgR;)#$! ),-/0-,.-))*+-/1224)"! $?R]dgfdkphZI1).0497;>@?=:8744445689ACEFGFEDEEEB?><=>>>><97502320/.14,++&1GOHEDGJNRQF=2*"%+3>OX\UIFPTOQY^eq|}xtqojf`YRJB=129GXehfjnx~~xph`TF;41-,26CV[N>31=:89?MVY[^X\aoŴw|~uiaevҺgM0$ " (3?N^nxtiZSYeou~g[OKHCBBEHLPRTW[^bhkhc]]R>''7>BHF>;::@CFGFB>;74339CPZ^abcca][QNJEDFILQTWXYVRQOOLKJLMOJFFUlvN>+%)9^doxxylTRNIF;' 7WyT* ' "S^egfejneVF.&,.376;=@@>;985444579;DFEGFDCBBCCB@==>=>>?=<98677520036-,+&0BG?<>BHOUUOE:3+#"%'08>FRY\UECPTLQ_fp}~zupnmjf`WOE<7'1?MX_abcdiptri_XNA60,+,13=N[UE5-8Mfuy|~mR7!+68881)')*'$!"""" %#!5ZlYUQ@01.(%$" !q[I<2/24;?@DIIDNOPROOT]tͻw{wpnnnDzӹҿŽɵ¿zY@$## &0=Oey~pfdhnq{|`WNKHB??DHMSVY]_^bhjgaYWL7  *:CEID=;:9?@BBBBBA8768>GT]`bcedb^YMG?969=@IMQSRPMLKKIHHKLNJFFYwwB+)Bjx}]H?96- 1GVU2"/6*;Ze^Z^aV=)! 1<810'&&!.Vvmc[UQPOLMMPOQQPOLPTZ^acffddeedba_`^dhdi_D "(?ZgZ?67663764220*   8Vfiihgefecb_YXUTRRSTUUUVVWWYZYUL:(#'.31-*,3BVhrunsx}ucTLEA;51111R]cgfdilbTA*$+,044:>AB?=;;86557:>>=;:::8631/27,*+&.=A857EFGMOONA?LQLRcoy}wsommlibXLB83$3GU[\^__YX\baYQMF<4.++-./6EVXG3(0C\ovy}{|{}v_F, ,8967.$ !#! !!!! $0CZjjXK>2/-+)&#&$!"nVD9103;DGHMTSKOPRRORapμx}{yyy{}~}|neeqаʜvl{ȻʼlJ2""'5G`xymfgkov}v\TNLHA>>BGMSWZ]`]_ehe^UOC/.>FGGB=<<;=>>>?ACD<<;>CKU]bcegge^XJC91-.38EIMONJHIHHFFGILNKGI[}}O:;ZdA2" !"-/5'4FJ4'9]s^NHUhiO7!%,21,-.  Euula[XVRPNONOPOMKNSY]`bdebccddba_`Zbc\ggK#!(E_k[:.012/21-+-)"  +"Rcmqkqyzl`YUTYZ]eu~dK:1&&)+0368:=AEMZjvv^C4-<<<:778:=?DFFEDA@??ABB@?@A=>?@?><;;;9720036+*+'.<;621573-&(1=FJGCDCDH@=GLNYkzztomllmkeYL@61):P\][Z\ZRKKNOHAB=82-++,*-2=PYI4%*8Pepw}z}}|~xiV<# +4?>95+ !  )=ew_J<:52/-*(-*$"%'zgP@8348AJMKPVSIEGNYewɴ~}vvusrquvx{yz|}xphnruwsolkkdWNUqȪԽeb¶~n|u{ȿ}]8""-@ZuukihkqxsYSNLHBABEJOTWXZZYZ`dbZNH:(3CJHGC>?@??@@@ABCD?AADHOW^ceehjhaZKC8.+,05BHKLJGFGDDCCEHKMLIJ\`SLV{wx_H5% + /-=E7??9@XotTGCSkq`L+2761.*#=d{pid_XSOOMMOMLJMRY]acdd`bcdeca_aW_^TekO$)Hdo[5'+-/),+'$$  + +(@Xdhikiiihea]\ZXWUUVVTTSRQQQQRRLC9.#%,0+%#,:L\fkhmv~{i`O>1*((6:BL_wjN=76:COZdkn_VH=@?>>?@@AABA?<;;;:631157,*,(0<:6.,/6@HKD82/)"&3=FJF@==>DA?CKVes}wplkjkomfZK<3/5DXa^XWWVNFDDD<6;:72-*(+',09N[N8%%/E\ku{wpdK1,ALIB4)!##! ".FQhrZOH?8544420+'# $'*+vbK=859=CKNKMTOCJLViι|suspmkmnqsqqvysfZcgjjga\\YSF>Gm׿ýfky}{wonsϼ¾uS.  $-?Yt~tkecmurXRNMJEDEIMQTTUUTUW\_]VJD5"  7GKIICAACBBBCCCDCDBCEINTZ`efgikiaYME:2-/38CGLLIEDEBA@ABEIKKIJ[}ZJGZ~}wm^WeiWN?1+  +&'6I@6?=;:;?<9879<>ABCBB?><9;>=<<>>BBCCC@>==<:741359,*,(/:94,)*19BGA5/.'$17@DA;::M\c^VTSRKCA?<6/6542-*(*$,/7K\Q;""+@Xju{uslU:*&)9NWTK3(  + #$"!(,&9fww]TG<89;=7753/*%" !#&)-.0oeP=669:@ABEIIA8ASnĴnuprqhmqjjoqpomdZ_acb[RMMIGB0AnѺDz}}ovȼ|}~~|rov~ͩfA" + $',?\w|ndbkr}gWTMIGIMPTTTSRPNMQWXUSQI>2  !:HLJKJECGKIIGGHGDBCCGMUZ_aeffikhaXJD=7468;BFIKHFDCDCA@@ACDGFK\zqE#'HrwN6+=PRQT\[SA) +(1.5PkumaON[a[Y[T:A@:=?( + +  3Jd~yla[QILPQMMPSW\bca_bbbbbbaa``YT\hf[4' +!Pg}_)&$$!!""   .ER]gghjjigdba^]]]\[[[XWTQQQRRSZPDE?, #-*%8LW]b]\dmgO2#((&%%&$#*(+6JhƩjXOSWaq}gQFIWcrveE-)It}{xwuurqpopoprppqqpqpongc`[N9( !&-0,.*'$$!   -@MQWYZ`cXI2.,---.358:9899;<;:98999ABA?=<;:96446:>>?ACDDB@>:;;:62134/'%)--('%'-38;<940/01/-258;:;=BB@?GUfz}|{yvrjdbgjnh^UC304IT_^VPTYOHA=;83.563-*+)&%*,2ERI8"!6Qgty}}xwvo^N=8BS\c_Q5( + +   %,;SmxxkXF>AEED;>CB<621-./12211ufO>:::8==??62CZoʴwwprrjlpjloomllf^_]YTMGGKNME0Aoĵ||¦ztuxxpmoowЬ½|^9#!$(',>]w~oedks~{aUSMIIKPSWVTRPNLLTYYUQMC;1 '?KLHIFBADIGFEEFEB@ACHOX_cefecffd]UKE?;98<>DGHJGECDA@?>?ACEEFJYuvO()GWT;6:LYZY\XPA/  4?2/AW^O>HJW[OIID685:GO>&  -AZsui]RJMQROMPRU\aba_abbdccaa__ZW_idV8'(Vy`-'  + ,EQ]fegihhgdbb`a```_]\ZYVUSSSTWaWGHD0!,)%7HUZ`b^__VA,&49?EHGC@:404B_iWNLR]fov}|sgZSV`hrzmO5,Em~}|zwutsqpponnoopnnnnnnomic_^XK7&%$  (+(*&  + + *=KSX[[bf\O60-2897856455677::98889:=>=<<;::75237;=>?@@@?>;:;;;9534750'$%()&""%,169;<:778852468:;<=CECCO`p}{splgcaegicYP@539LT[[TRTXSKB<:71,110+),+)'('-?NG9&,H_lryz}zywpaTMKUdjmdT7* + +  + !!2QithZLEGKMMGIKJE?;954556678xgO?960,108B@A^Ͷunpqjlqmjkjffgd__WLD;8@JRQK9JvȽzyysvڽsprsmkjeco֯½sT3+96+1/*-@_ysiilt~tZQOLKKOSVZYWSQONOX^_YQI>6& +.CMJFEA=>AFDCABCC@>?AGOY_dfedaba_YRLHD@=<<=@BDDBAAA????ADFHGIMYp{rlW7$/24DWcebaaRC- #@J7*4GNE77.))9KQC3 + '8Pi~saVLMQRPOOQU[`ba_aabdcb``]\XW`g_P>)'Uc2% ! -DQ[dbfhhhgdccbddedc`_]\YXVVVV]lbLLL6#.+!/CT^ec]WN?529GQ`lplc]MC617PwiTKEIMMMOW\[Z[\_elr}dF3?_|{~|{yvsrqpponmlllljjjjjjkie`\[UJ8)&%   ! + + &;JU[\]ch^P:1-9GLFA53/15898887777898888::9975348<>>A@>;:887:;:843572-$ !$$!"(.48:>>=>@@<99;<>=?@EJHK[oznljhedehc\RI=78>RUWXUWY[[QF>:73.00.)(,-,)'#*=MK@-!!=Vgnuv{{sg]][hwxvjX;- +  + + + + "##  !8Vid^SMJMOQPONMKGB?<;99::<=rcOA6.)*+*0D\xȶsknrnotqiigcbb_Y[OB90.;LRXWEUyptrmq|zrfq»wsssmiifbbh֭z»jL/ -23BVUGDA88Hgxnnmt~kSLLKLNQUW\YWTRSUW\ad`UH=7 /EMICA<9:>BA@??@@=<<<;=?=<<<>>>?ACFIKJMPXkeROUL3%!&/GS`mxzZ<:Nwx||{yvsqqpnmljiiiigggggghfe_ZVRI<1'&!   +%T\TL93..5;;;765667785768899:87579=?@B?;8544467985313-'""%+157<??@?@AEMMTf}zmkkjiiii`YMA98=DVVVW[`cb`UH?963/00-((-//.)$(;MOK6%:Ugoqt{ukdbaqzlX?1 +   !" /GX``[QKJLMUQMLLJFBB@>=<>@B{k`O?/"$.6BJX~˽vmrxrosomnlgec]VPE92*&4HZbaJYʺtinnjmuoeauҽ~z{{|xtqrx~zyzwphjmia[ϣ~t|u_D-#$.>FDNacXXTJFTo}romt}aOIIKMPSUWXURPQTY^agkfXI?=<::=ENY_cddea^\YTQIHEB@=<;<>>?==?A?ABDGJLMNQSXhtN47UYA1'*;E\nohe\RJ;*""# +!+15Ljxia`TE9530+25?M`shH:Dvvzywurqnnmkihfeeeeeefffffee^YSMG=60/)    +  "7HLW^bjk\I:/,AZd^TD;20278765554566667899::9879;>??>:63211269<<83/.)##$#").248;?AA@=;???>=>@EOQ[p~wkjiijihf_WI;5;CJ[XX\ekmlbWH>851-00.)*-000*#&6GOQ?. 6PblorxxmheeuxhS=1! + !!!#&%,51' -BhsrU]ʲpifjllmokfm{}{{~|yx{~~~|slmqndZjĖrx¿iS;+$&2AGBDOSPaaYU]suokt~uZOJKNQTVWXSPLKNU]dfloj\JACG32FIE?:85779=<;===;::>FP[bcdcec`\WSOHFD@?>=A-$4Sl}vfUPSSTUQSV\``^[[]_`_\XVUSSTWYXVQ8 /hr   +!!!';KILW]efeeca_^___^]\\[[[[]^^]^i|_SL8%#"%.+##,A[kppfR;.1>GPSSOF>:9CEFFFPh{of^]__XOGHN[npR?B}vvvrqomiifgffdcccccddeeeeec`[VQJE<5:82)$#"    + 2AR\chno`L7..B[fc\RH<3////6654444588788888:868:<<;75210244;=?=82-*(" &)& "(.139<@BB@>=?>>==?AGPVcxzukhffgeca^VE54?KR^^_dlssqcWH>840,121+,010.)##,;GRI7# /EWalot{|rjlm{scO:1& %%#   $3CU]]UOSXWVUSSSSPOIIGFDEEFxr\@+!9UƳxoy}tqnzztmjje_L@73(*?ssr˿ofbabfmmjimw}~yxyz}}zxwuoifgkos}|{{}}|{zvrprrmgg鹈sw~z]F2$*5<:7=FO_c`[`tulisjUQNPTWZZZZTQMKOWailprn\HBEO;!7HHC=:87666>=<==><;?CJT_defacca[TOLHFD@?>??DHKLKKJLLMNOPPPPVUSUd{z`?)6a^?4-/IV_innmkjeb[SKFEE<>;44=GMNB;@JRW[\QXfnskYDA<62138CDDBACFLP8+:XmyziXQSTUVRSUY\]YVY[]^][VSNPTWXVVXX9 :ph  +  #%&&3IRHFSZbbb`_\ZX[ZXVUVWWWWY\^^_`khVG6,' !+)!%.FcswogVD<@CBAA<4*&')EJRUSXj~yrrtwtp`aiusZEBy}xusonlifecccbbaaabbbbccccca[ZYVOF;1773-)))$%3EUdkmkml[H5/2EZdda]TG91/01876433229987554586556874654669;=??=72,(&(!%&% #)/46<>ACA?==>=<<=?@?>=CIQ[chhh_bc`ZRMJHGDA>?ABDHLNNMLMPQRRRRQQWTQScx{|u`E49ddG@:8OY^fkgaadrqlbVRTYftwpsaaxqnpmmgYSY\bioolfd`ZVVY\]B3B\nv|~lZRSTUXQRTWYXURWY]^]YUQHNV[ZUUXQ/ #4\[   +  + !&),0?UZJCOXa`^][XVTXVSQPPSSSUXZ]^_`lmXD51*! *(#/Jk|udPFC;1+-...5AJY`hiddqymfgjknq{}u^GCk|xuqpmkhfddc`a```abbaabbbbb`Z[^^WJ<1,/.+*..* "" !$" '08CTgxvxtlhdR>4/4DVaceaYL?536;66542221896632004422221/88:<>BDEA>80($#$$ "  $*18:;?AA?<<==>>==AEKU`p~ytqsnhefeb_YP>14H[ceimruurlbWJA;50,3562132./-($$->RN=%"6QdfimszypjiwypeT?<88;82,+./) #'$!   1DT\[ROX[XSX]]ZXY[WWVUTSQQ|`G15S}šujcb_WW[fost}kfp|}}vkfktnd]Q:( :fƽwg_ambabhpuvv|{}yk_RB71#%1BPW`jssx|wloyoʝ|}yxtwjG,".57@Pbc^XV_ryois|_U[_bdeda][UTRTYaipv|sh_OA?A/%ALFEB@<968;D@?B>:;EEMV`gihg`bb]UMJICDDBBCCDEIMNOPPRRSUVWWXWYXVVaq|zxsrm_J;J^`L;5AZ\cihdcfhqoljkq|ҾvhikbUU\ht|nnnmkgcbbNAK_nsx}yn_WVXWTLPSTSRQRVZ]]YUPOMMNQUXYYS- Vs^E + +    %),3;E^fOITP\[ZYYWTQSQOMLLNNOPQSW\^bmk[J6+%%$&''"!$7Xv~tfXSN>0**,26=KVcjpnjlu~uqv}{l^PH]rxspokihhfcaa^[ZZZZY]]^^]]][\S_nmcTC=6-&)/0* ! !%,23CQZcnrouj_ZRI@=/3=JV^eja\SKEB?>896433332433/,,,+-/1158=<;<>?ADIN]ju|{wtqnmjghic[SH=>GS`jhilrvxupaWK@:52/356631221,%!#-:HRB)!3Mbhddjrxvimsxwpd\NGBBDFB>9852/*!"'(# +"6FY_^WUZ][[\]^`a`_\]\\\[[[uVGAU|ƨfXMKF?;?GMMJOZ^Y[Vaqtzxriemvsk^Q9$ +.Oźk\\`jfgintz{}~~~xdR>1(   #-6BNeo{|rjnym~ܼ{{wwsu|~a;"  .8>DJQZchihg_a`[SMJJDEDCBBCCEHKNOOQRUVWXYZZYYXWXbpvvnljjh`SHO^XB54BZafjkklkk_`fsõnda\UWY_irwuqoopomjgedSISequxyz{~zo`XWXWTMOQPNMNNUWZ[XSPNMLMPTX[\T9)!jskU&   &+-4@LchRLSPVTRRRQMKNMKIHIJLMMNQV[_bk}hXG5+%$#$''#!"(<`wqh`^YK=89?>==>?ACHOUcnw~~zurpmmjghic\PE=BO[fpmnpswxupdZM@:520456642331-(!!(5COC-!"1J_hedgmt}wimsxwpg_RNIKORNJEC?<82+&""!&))$#7GZ^^XW[]\\^_ababba`_`__^_xkYW`~Ѹo\OHKOLLQ[^YSTVM@B=HY]dkjfb]^gsupgZG0 ,IŸ\R[cjnpsvy}}yl`N9#  +  +  $0KattkfjpkwԨ{{yuwsrxuT/  ,9CO_l`ZSUbp}~|~}vlisu[Ydkjjhfb`^XXY\bipvvtg`d\KD> 5DJJB@BEGIHGKHFIIFFIT[bhkjge_`^YSMIIFFEDCBBCDGKMNOQSXZ[\]]]]YYY\fopic_]]_]ZUV]M6,1CZgijmnolkdhtɽ{zywleaenttnoooonkhfe[W_ksuvstvx{}~{qbYWXWVNONLIHHIPTWWTQMMLKLOSWXYPE3(t4 +    )--0DSgiWPTRQOLLKKIFIHEDDFGIKKKNRY`ek|xbSA1+$#!!$'%$$;a}qrqonk^PMMPTROSZht|x|yl_RIE\wnmmmlljhffeb`^[XVVWVUUUWWXYYYZTiugO6*,.*#! +",:EV]^[TLB8<2("#*/7DMVZ]^fc^[XUROEB;51/..36896410./13:FR[ekibYOF>?5)"$8LVQ@0,'" #+27==?AAA@>?@BCGNV_kt{~{wtqoklihhhb[KB>IZfmsrtsvxywrh]NB:50/358753451/*"".3-4BDHMKJIGMYejje]VC%!/HyþƵTOakpux{{{}{zvgQA, +  +1FZache^hn}ϙx|xuxuquy}}|~~~pO* +=;89::=@GQ]dmpneYNB760'#!+IckaK:4,$!(17?@BDDB@@?@BEKS\fqz}~~{xtrpnjjifgh`YG?>Nbmopsutwz{yuk_PC;5104699765600*"%2GG>1')3)'%##!4UlocOB8/& !(07ABEFEDA@?ACGNWbkv}~|{{xuspnliigefe^UD?ASfolkrtux}}xmaQC:51/4799776710*!'>DD:,'4F[bc__hv{~~~~zskeUTU\fljf^YRMHC>;==;94.'#+>N\]_```befhhihiihhgffedcczgWs̿ynmsvvqnsvb5'%*(*-)-,/56547)4QS3'34DV{ǶnT_puywvuuuvz}zm_M8$  + /OedZRP_yyu{wwytppqrpmig__]]ajt|fJ.$'*&%!&4PfdUMJJR_kppvwvvy{tljs}igrigeba`aadfjnqrssj`QTikZN?"(=BBGIJIFDDHLU_ipwwmfb\XSPOLIIIIGEBAAADFILMPTXZ[\\\\[[YWYct|sdXTLECJWahgTBBIRagkpn`Yh|¸z_PS`nspoppmjgd\gpokjjioqprqsssuvwwxz~}tg[UTTTQQNJC@>?EHKKKJJKOQVYYRICH>2:uſY4 + +$%#'16.%A_jee`[]TPMKKLJIIHFDEGIJJIKPU]eiswgO<+"'$ "/8<5+#.Jehafr~}s`H7ObxuiuweOSZbijgehecccb_]YURPQQQPQQRTUVWXSQqudU@3+*)&%%&  + %'! -;IRRRX\[]\[[[ZVTQMFA<:::;?FKMNOQTW[]]]]_dgd]UK=1 ## *=Vb]PIE5/&"$*29ACEGGECA?BEJQZenw~}{|~}zzwutrpnlghecdbZQD@FYjpkjsux~{naPB9411589;998930)!4?F@2(-9MZa]]guz{tlg[YZ`iool`[TNIFB@?@?;6/($  1CQ\\_ccadijkklllkkihffedccvcS}ɫ}sjkqy~}|x=+$%!"$$$(-)""+U`A?HQhvulfc\VPNNMJIIIGEBA??DFIKMQVX[\\]]\\[YWXdx|mXUMFBGT_iqkba`]cbdikcbuɸxaST_lttstrplhe]luqjiklpqqpooopqrsssv{|tg[TQRSOOMJC?<DFHJLQVY]]^^^]\\YVWd{s\YQG@DP[jy}z{sfe`^bggkvcVV]ipsttsolge`oytkjmprrrqnnnmlopoory~{tg[SPQRKMLID>;:;=ABBBCDB@@@@=86MKA$E[ +  ((! !%(39/"KnqgkfZ][VQPPQPPMLJHGGHJLMPV[bgjjhW?. &"#5CHA:36FVVN_jxkabfhntqfhjmtyfI3Rk~nSXjosx}~mWDK]txlffdbaa`]ZYVRQQQPOOOPRRSUUOJht\H;1,,,)%  +#  %*/783&$??;6.(&  %0@O[^\`fgdfloopppponlkkjigff{nRT~ֶ}no{a@1.!%*C=2*(1>P`efktty{wsrng^]aghgZUOLJHC?EB>94/+(#%$ + +$%(0>MY_^aeijkkiqqppppppnnlkjjij}yoRU}ټsm{`NA/-0&#0Lekjif_N=Tƙtdr|{oa`ekqwypcG0  "" !$&&#   0HT_K@Q⾘vgddjrupjqmheedbaadglptwxw{~xB ?_p|vrnmvsokmtwrkhozxrxztxplfdflrusuwwrnlka[TW]]PA108HPNIIB9/2@Wrzmfgh`\TOLJHHLLIGCB@?ADHKLOUX]]]\]\[YZ]R]c\SPLJNTg|ym^ehgdivrgfimtjcfnsx|vrfZQS]gnlhhjkji_p{uopoomrsooqpmjmonlmqwzsh^WSPOHGFC?;851257864332'#+*#%:?E.(WS) +*+&" #%/7-Mroib[^YWWUTRQOPQPNMJIHHJMPUY_dh`J7/&(0/*"%$'3DMN^emw}dP@4.-1;JVTF60;HZgc`fqzwnVAGWU>>I]_aaVJGGZxougifa^\ZWVVVTROLJHIJLQVWTPI;LcweO?0,'$$$"#'=SlxY37R^`dedfaaa`][WUUUTSSTUU]___\[[]^^_beedb`]\YN@88EQL2 ))&&0&$#$%+28?BDDB@@DDIQ[fnquyzvtuusrxxwxxtplieeig[MEFWcmxwuxmZM?87888BB<9554783,'$ '3=@9/'.:M_eefjot{zwwxxrj`\_cbaYTOKJGD?@?<83/)'$%$   !##%3FYcf_aehjjkiqpppppoonnmlkkjjyxoTV|׽utxlYD>@;)#!$').4I[koong]H7Mrhu{sbP[enuwq`P/ #%&&$',020-+&'&%#   ATiY@:85113453/.*( #%;?C,#I~7  *+'$#!"'(07-Mple^W]XXWUTRQPQSRPMJJIIJMQV[`ccV=)%# (.*#$'*2>HKY]ckxmP=1'"0=;/!,Ecsk\X\lw}xvo[G=RX:/4LNPPE<@Eayfojhea^[ZWTUUSPMKIHIILORTSPD5+%##%&!&5Qmh@ 6Sbabaahgggfd`\[XXWWVWWXcdb`][[]bdfjjhc^][ZXRHDFV]S9%&*) ')*.-$#!"#&,2>BGHGEDGINU^ipsvwwtsstsswwvwwtpkjeejg[KCJ^lszzzreQG<68:;=BB=9656884-)%"(6BA5+,6FYccabkouz~~zvtw{ync]]^\[VRLKIHD?>>=:51,))*'#!!  !"'8OahgacgjkllkponnnooommllkjiivvpUWϹvt{ºxcYVVRD<8;AEJNV^gkmlaUK>Mrvrxn`VM[huytdJ7  $)+.//.16<>=:9441/,(# + +-9Yc[O`ʤpd__htysjkifdcbbbjmoqrrqpmnruwxyz}}K- + +Irxhcaalomlqwxqliowndev{zjpvxtpmmvwwtokjj`\[cd\LA;:811211.*)%#" &9>D+#Iv, + +  *+('&#" %071&"Psmc\TZVVVTSQQPQSROMKKKLMPW^cca\G2" +31-&1402971\uZM9( " 'BCA=9677985/+'"#0>@:2/4@S^`^^jmquy{usv{}}tgb__]YSOKIHFB>=??>:51/02/*(%!(4FVaddegjmnoononnnnnoollkkjihhtvqWW޲zlmrzʤvchkea_XUY^`bd[^acgfZNKHN^w~wxrYKQV`nzyjR5'-39;=@A=?BEGHIHC@:51,(% @\g_f˟pc`ajuxrjhhfdbbdekmoppnmlkmorvzz{}S9%" + <;92120.+)&! "% %6>D-+T5 + + +  )+)*)&-":?*)Ttnc\SXTTTSRQOOOPPNLLNPRQU_hkf[Q8*! + ++7::7?=31;KVUUZahpx~bUE9.# (/6BMRe{u`PKXjy~rvvvtkXE1GS7/5;3-167:=nvgjffd_^]\ZXXWSPNMLLJKJKLNQS]W=!MzhM5% *:U`nz}m]A-"-M^YTQS[]_befea_^^\\\]]]_`bbbehlkkkjihdba][^^]]`^\O;3DJMMMLNTY`jqvwwrqooqsttsssturmjfcbc_RF@[s|yz}}n]Q@<77:>BDDB>:889:983-($ ")158856>LX]^`knpsv|}xuuvx}ulhggc]RNKHGEA>=>@?;755797/+$ .CT]``bgilmopqonmnnoopqoonnmlkk{}uztXWԿjhpv|ͧs`pwmlkfdgihhkb_]`daWMIKMOgvuqnaGATcirvlV>% +&49?EFJNRRPOOPQTWQLC;51,*'"=PSLXė~pbbelstoigggeccehlmnnnlljllnrx}~~]F'  'E^]PL[dcfljknrsplnqu}qjefpy|yzywuvy|}~yusse`agdWMJMQSJ;( 2c{fahibZVOJHGECCCBA???@ABEKQTTRRW]_\WVVPVncZTURNIG713?HJLSba]YY^gmrsnc\]`bXSSZ^\VSXz[<@D@JhnogYT\ghlpttpg`]_behijiopnknspjelsxsmihhe`\ZWTQHFC?=::83220-*('%& "4=E0'7Z8 + (((++)/#=B)+Qsnd]TYURRRQPONOPPMLMPSUUZckmcTC+%!  +'6>@CG@0,7KZSTX^cejr|~q[WPG:,')'$&,3;IUaju~{hUHOZju{ywpstrneRA6HO3+17,"*3888ozwjfac_]]]]\ZXVRPNMNNLLLJJKQTa`?B|cK8.'#":O`hnnmlhcQ> -KZUOJIQTX]cffdd^^]\\[[\Z\_acfjmihffhgfed`]`c`ada^Q?8BS[SDBD>9. $(-39>EKNOOPSX_enuxxwrpnopsttqqqrsqmifdb`WMGFe|~~~qbTJ<988;@EGDB>;9:;=:951+&#"!"%&',3978=JU[^cmopqsy~~zwtts{uomomgcTPLIIFB=;=><8679>>8/& 3N^cbdghjkmoqpponnoprrtttttrrqq|x{v|wXV԰rhpy~̪ubw~uyuqnnkghmkd`ac^UOHHJL_vobWL=E\jqtlW>* + !%-7?DKOQU[afa[VVX]c_YPH?920*&!"-FIB:H~ϲtkdglqsrnjfghfddgjllmmllmmlmnsz}qY,"" %3847L[_dkiiloqomnprx~|nfgknps|}vvy}|wspga`e`SKLKNI9':gufddb]ZUOJHGEDBA@??>@@@ADJQUTQQVZ\XTTWUUo}dZSTSNIH8'&2=K[bc^YVX`honi]XY\ZQJHOVWVWd|T96EUvxthZV_jjlpuuoha[Z\`eghhlmkkouslgoy}xrljigc`\YURLJFA>;:9431/-+)(""%& $2:C64BT}k/  + +&''+,+)"):=.$'Kmkd^W\WTTRRRQPQSQOMMPSV[]bgf[J7$ (8AFNNA.'2FTSQTZ[[_hxxttz{pbZZ[WL=65/2:DJLQWafkry|sdOMNXgpqpnolgaZI:5IJ,"&.& (0234jvvh_]\[YY[\\ZWTPNMLNOONMJIJQU]dD3kx{iVF90!1IZbb\TOLC:2$   :U^ULBEJNOQTX\biqwzxvtrooqtsspopqrplihge^QGHOk}paRG@:78:=AFHDB>;:;:<>;65;?C?3& *EKPVZ\ahoslb[Y]ciie\RJA:4)*'#!" (2GHEAKz˽vhdhmsvvsomfghgdehlmlkllnnomlmsz}m4") +$(/FW`jkihjmonmnopsyvkbglmjmx|yzzzzsnkg`_c\PJNFF>* ?fohgb[YYTOKIGFD@A?>>>@@@ADJQTTPPSYYURSU]YqeZSTTOKJ>$$5Meegd]WW^ejf^TORQMNEAGOUX[h}QId|ueXWanlmpssnhcZWX^cffhlkhglqogjq}|tnklifb^ZURQNJEB?=;531/.,*)('&'"&27A:=GKgX* ##'*,*")0474+"Fhhc_X^YUUSSSSQRTSOMMORT]^_a^SA/   ++>GMWUE/$-?JSPQVVUZdrqnnqqeXUWZ\VI?;=EUfkgcc^cglv}sZOIO\jnmmkd\UNA41FI)'" ',,-2gutd[YXWVWY[[YUQOLJKMNPOMIGJQVYhI(Xf~lYF8 )AEHDB><:;=?<;93.('%%#!"%(*-16@NWY]bgilnpuz|vttvwxutuwtkc]YSONJD?=@?;89>EE>/%8EUcilmnsuvvwyzzrqrtuwwyuvuutsrr}|zzzxx|xi\ݭhjdhwֶzn}~zywspnkgb_[ZZTVQMYoxvhR6.>XkrpmV. *7CMQU[\[^jsutngdbbcgie^UKB=:82+'" $-4/X]ZRF}œilhbqy~}zwqknkhhijiijkmmmnmmnmosy~~;!$ &BU]eg``glkjmnnopuyskhaipoiku~z{m\QZef\RPLEF;, !Hlnjb\^\[VOKJIFCCA>=<<=>>ADINQSSPTYYURUZX^}dUQLMOI;+2% +'5G[deK-#'7KNQTTRQTXid`dlk`VRW]^VLB=BQfu}zm_VWZ`jrtpVJGP\dfgea[RI?6/.NxxG&)+.0ii`\VRSSTUWXWSSRNIIMQMKIFEIOT`kF%0`}o]N4,#"2GXVH4% "2HXmniZMD8-*+07;<@FHNSTQORUYZY[ZXWVZ[\\]^^a`][\_`_]]`_XSWeovulW=+&&"#&*-38=BDGLQTW[chlosstvrrqrtusqqnmmmlgcblfUG?Mhx|raOB95357;;;=DJEB=;;<=>?<8420,++(&""$)/4GTdnpjZK546=<=>@@CFJNQSTUX[ZVUZ`iwýrWI?066,!*DX_UXUX]XZkqjYB435694/5<8:87751/,)&" "&)21;HWmraG'!$%$,9ML4%+/&C^mihd_a][XVVWSSQPOPPRTTVQH?ENT\nQ-Eit|z}y`O9'!(-% ->Tiy}mca^PA<;<=8/+,39>BBDILKHC@==?A=?@A>>?ABEGNUZ][W\`cbfntxmX?*!$($%)-06<@BDIMQUY]aehkllklklmnpqpnnmkjigdbbjbRDBUuzz{ytmihWPG=531189<<<>DHEA=;<>?@A>9531.,''&%%&)--4>KW`dfa`aejopqqw|zxusvuvvurmjilh]L?9:58BMWUI?* (7CQ[flnopsvvwxxy{||}~}|{yxvvٳporpoyαxm|~~~yqkdaaad`WNQ_hkX@0AasoaT8 !%!"#&-39=>EOYaec^akvyti[PZVLB:5324248;=EMGNocsP*Yz}zvrnmkihggggghiijlotyywtt|sJ0&-% #G^_^efinqrstqqsuwyz{zxtolklnrutpihkou~{wspnlifophYMH;,?j~zyǪz^ddZY[\ULGFGDC>>==<=?ABDGKORTUWZ]ZVW^e{ĭmXE,,41'.HY]W[YZ]WXjwq_H61216412716Kc^UOQ\gmvzrreQIWkoggimrqj_WMOPSVY[]ajmhdekmvtjgikjgfdc^[XUPMKHFB?<:8651/,+( %,5273-& !.B@%  (+-.Zv}lc]XUTRPNNMLFB@ACB@<:::;?GRY`qW2 6^ktruucJ3%'7ARcyuf_`\RGA@?<2% '08;>?A:5.)(,0336751/02897688:;<==?DGD@=<=>@AC@:632/,&&&'''(,)1:<36@OZVB2 + #1BPY`hmpqrtwxwxvvvuzz~{zzzyyyxiYetyvƩriy~{}zy{wojeb`beaXQQZadQ=8Qp{lYM2%&'+&'*-4:?B@DJMJILPXdpqi]L@>;620035?:789==<=>@BCEIMPRTUZ]^\X[dlƪyX2(.-)1IY\_a^\\TVh}ylWE=;:8:87948KbXLFFP^jswv{qnaSUekfgjmpmcYPIKNQUXZ[]fibZ\aezwkghlkgffd_\XUPMKHEB><96540-**'#,609Lh\2 ! (+2BYdW3 '/*B[ihkhcd`][YXWURNLNNNMLJG=0" + $0>LZaQ4$ .09AGHHIKQU]hkcRC;<;418HXgq}}\<&'/8;GY`ZME=9542.' '30 + (,.0Pk}|pga]WVSOMKIHB?<=>>;7458;BLW^dsZ7*Tfonp{}{~pZD2& $9Tguxjd_\YRIE=:71&+7=<96*%$)0453-*+.4:DP[bhj`_^^^`bcWI6( #%$%)-17=BGIMQVY]bdhikkjhijkkmoomlihheca`_adYIBBTpjbXRLHCA;:899:<>?>>>>ACFC@===@BCC@<9430,&''(('(+(.:MX\]`\]`cfhijhnx|}|~~~~~}yussrooonkirvtfQB<>25>LUN7$  + + + "*:LY`dinpsuwy{{}}~~}~{{yyxwuuƨ{[Tbry}ogy{~xtpnu}~yvsojgdbcea\XVY]aK>@^z}kYL9)+00/0.049?EJMMLH?3,3=K[if\O=.!#$(-48666=EYisyzpooO#-n|xrnligeba_^_`abcehossqorzl,#   +Sljgkpsrrwzzuwz}}}|{rmhhlqtusrqqsvy{xwrpv~{tia]\]]dieXNJA5 <^rwwzѳc]YVUQRMGDEEB@<==<=@ACEGJNPRUU[]][Z_itwC/.+)3ES\ad_[YPTh{j[ROLCGEDGCDRbVJEACTfjszyqqrk]X`hiikmlf[OHBFJNRVXX]cc[UV]a~{njiljfffd_]WTOMJHDA=:7531.+((&#+4.7Llb8   # ##%.4AWhfR3"(.*@Xefihcd`][XXWSPKIJKJGCA<4( "-:EKVJ1!''/7>?@BELR]hj_K;;:3,-=WlqV7#(69;GV]VKD830/0-'!!)$  %+-.E_uyqic_ZXUPLHFE?=;::98647;AHQ[aerZ= Gbjjmxzy~}viU?/%!"%(2Jh~ug\MQW\XNEC83.($3AFB93$&15850-149@KV^bgic`[XWVTPC5' !$#!#&)-17>DIMPTX]_ddhjklkikkkjlmmligggc`^^_a_QC?>J`YPF=86442467:=@@CA???ACDC@==>ACDDA=953/-)((((''*(-:NYXWZY\`bcefgflsxyy{|{|~}zurpnlklljkrvtgTD;://5@G?)  %,6DS_egknqtvw{}~~{zwvus|ҳl[^it{~¦phxy{smkjmrvuqpomkifeedca_]\]`G@Ge}}naUKB@@?<87:?FMQTU_SE6(%0CVfdXK7% %*1;DLROIECA?DK^mnqrjn{wJ)4r{wrnkifd`^][[]]__adjopons{©y6% 6^troptvrqx|}y|}~zwunidgntututsvz}vpquvptnf]XRMJ^feXNKD<,   8Yp}ԵjZQTSJLHDCEEA>==<=>@BDFHKOQTUVZ]^[[boyɝ_B6,-5@LX\_ZUSMTk~}qhd`V[ZY^ZXch[PH>9H_`_pulfmnia\_gnkmli`SGA;?CINSTVY^`^_ht|}rmkkifeed_\WTOMJHDA<:6430-*('&"!%*.*5Mn`8!  &&((+5?RmveJ1()-)>Tbbhhbc`]ZWWUSOGDEEC?950+# +)5?AMF.! '.3358:?HWeh[G694,)/?R`hlmjig`XHA:-!6AAHSVPGC;4,)+,'" & !'+,;Ulupic`]ZVPLHDB==<965789=BHNTZ``kWC!8Zccfqts{w{}{yyraH3&"%,38>Qm{p^RE7,7I\`VLI?92-&"%+1:FQSL@8'!&.4::66:?GMW^acdeb^YWTOH>6'%##%(,07=DJOSX[_cfdgiklljkjjijjjheeffb][\^a[J=;9>LH@7/)')-/36:>@BBFCA?AABCA@<<>ADEEC=:740.+*)'&%&)),;NXTQTUY^``abcflquuuxzzz}~zurnlhiikjmsvrfUC72&%(.2+  + %0:CNZdlmlmpstuxy|}}}~~~}|{zzy|{zx~ʩfakszzĨrhvvwolkkmpqqnnmnnljggcddec_^aF@Jf|zph^\WQLKFAAFLSY]__fUA2&#,?Vgg\M8%+/4@CDGIKORUVX[]^[\dr}yS>028=HVVYROOJUm}}uokfkkkqmjrobWM=4AYYM_qcW\\hfca_airmnlf[NC=7:?FKPRSSY`eqsljigffeb`\WUPMKHDA=:643/-)('&$#%&))'5Oox\8'*%  (),,2?JbfE2+)+(;S`ahibc_\XVUSRNECDB?92-&# %/8:IB+$*---136ARbfZE4.)#%.8==@9* + + 'DJGKQRKC@@7*%&)'$ "&  %''2Kfrpib_]ZWQLHC@<=<9447:>BHMRVY]ZdTF)-R[Z^jllsrw{}}{zvzxgM4%!%09=APhzjpkVB5&!=ZgaURJC<843:BDJT[[SF=,'"(,3:;9:BGSY`ddbabc_]ZVM@30!#! #',28?FLPTY]`dgcehjkkjkiihhhgebeeda\Y\^^XE::55>=5-$$*/38=@DEFGDBBACCCA@=<>BDFFD?:741..+)'&%&)+.:PXSMPSW]_^^_bglqsrswyyz~~zuqkhfehijlqrndSA4- "  !%-:DNW`gqponoqrqsttutqommmmmpqttyy{~z}|zzz}Ξ{agz{wɫqeqqwwrqqtyzxvprtvuqnlebcfd][a=6Fgwlejkgec`YLBDHOVYYXVZRJD;2/1A[u~u`A*022359<>@AFNW^``Y\fi\X][X/G{~zxtojfdbZXWVVXY[^[[ajrsryģvU5  .@^{urxyxywz||uqphaboz{zz{}}yxyqia[SLJMglhZOOPNI?1#>iڵxZQVQFAFIF@<;=;:;<[PNLJHM]nngdfc_agiihdZM;-/8@CEIORKU_sɯymihjigggda^\UNLLLID?;7531-*'%""%%#"#&9YzpM743&'-$ +#+,056Caf:+)+)1L_djiba^YUQPPNLGFDB<3+$  "),8D=$ #$#%(-)7Nag]J9,.  +  %Nlm\MKLE8//42)"%'$"%"$ %;YnpgabWTTRNJB><<:535:?INTXXWUUUYWF# + GTVU^a`fjotx{y~{iJ-#0@KOSX]SPH9( 7XbWRVPRQOMLMOORX_a[MB80%! $((%-:FV_hib[]dlgfh`L<6,+ " %-9@DEJNUZagfbddbcehiiffdcdedcddb]ZY]a\XJ<476.4+ %*569KQXbedotvtnjmqold\YXPGHEBBHPUZafpyvx{{zy|}ŝ~ces|~ʪnbpptqwwux{~|yxyxuqnkgdcd`ZWZJEK`idbhojgec^UNLLMKJGECBDGJGA>ALd||jN8??92.+**)0:BKT_gZW^b[XWOM,+S~yvrmhc`_YWVTUWXZ\[[`fmpr|k;%  +-Dbzqo{zzyy{~}volieiu~~~{yyxoeYMFKTdifXLIIHMGA=91%-JqǸ^PSQG@DGE?<<=;;;<=@ADGJMOQTX[^]]_eq˹nf]QQYRPKQZVSary}{wzuiaREM_QLEA@ETdjfehebcgnhh^LC>5435?HJFARe}Ͷphgjjihgfb`\VOMNMIE?=9642.+*'$#%%$##%7Vxx^I9/,24+*$ $,*/6?Tu^3,,+&0K]ahgaa[WQNNLLKGEB=6/'   #'2=<0 #'*,5FYd`O?7; +'./''?d}mWKC:-%-0.%"$&%&(#$!"'"1Skqi_^TRRQOIA<:;:86:@ENQUXVVVVVXUE$ + +>JJKTXX]chlpsw{~}}}~strcH/ /@FC>??873* 9W_VSZ\\\ZWUUURTY_a\OG@91.*%&*#'++-3@KW^cc]Z\cqmmocN=6)&  "%-6>GJPTWZaiiged`behhigfddeedb`_^[XX\^XTI=772',&"+29ACFHFFC>9543340(#%(*5;GVZTLHSV]a^XY^filnnoprvy}~ysndb`adffec`\\\Q5 %/;IW^ekjgkljgc_[YVTMFA@;40-((,167DHQ\it{suwxx{̽mgmt|~|ɨl_oqtm{zz|~}zupkikgdc_YUV[VSVY[`enidcca^ZSNE;4-*((0AMMFDETkt]IQMC8.'#!&/9<=BQ^\TW^\ZTGA*&=b}wupje`][WUTSRTUWZ\\^bgms}ʮS -Oqvzxvuuuxz|xohikr}~}yx}viVD>K]gkh\QLKKJKP[`WC3@]ûfOPQJ?BDC>;;==<==>ACFGKNPOR[`]ZZcscJKWJIENZVQ[hq|{wvx~zoedg]SIC@FS`ffhkiefhlbf\>4911-0=DCBEb}ȷrigkihhhgdb\XRPNMIF@=9653/,-*'%%&&&%%5RtteC.4>9571+*% (1*.8LjQ).2*#0KZ]cd``ZUPMKJIGEB=70)"  "*19;0!#$,/9N`dVHRY6  0=MX\TN]ysXG>5-))+)#"$#%&"!"*#(Iepj_[SRRQNHA;9;;<=BIMSTVVTSSTWVSE' 6@>?JPNRX]adhknrsuvxyyxwlidYF0 +<@6)"!"## !?W\VV_```\YVUUUVY^`\SLKFA?;769469<@GQW\]_][Z]amlpshTD?5+$("# $)/6=GOSUXY_hkjec`beggdffeefeca[[YWVWZ\UOE<86/#&$%$%)3:@EIIHGILNKHGGGFDA@>>@BEGHHEA<741330($'*.9@LY\UKFJS`fbXVZegjllnprvx{}}yvrgebabdcdc`]]_T8 + +  &&.=HT`eggd`ZYSPLF>8672*%%##&-9J^pztuwwy}Ǽwqow||Ȩj]ntvn{z{|~ztpkjmifc`[WT_^VLJS\`d`[Z\_ac[RD5)$""$0BQPGBCWj|zhV[YQI@93/4:>=9=HT\UW^]]VI<-3Nm{wtoic^ZXUTRQPRSUY]___clt|ںR( 6bu}{xutvy{|yohhoz}~yv|viS<8JaegaUJFILNYoykƽqRNQO?ABA><<==>>>@CFHHKMQSV[^WX^k~V;@PCC?ESQLRckw}{vqnv~~yphfZNHFIS\cflonjhjkckb:).($%.9>CWo̽ujikihihhec\YTROMIF@>:7640-/,)&%&%'('4Lm|U5ADHNQUUTQNNOQUSPD)2;87DIGKNSW[\adgiknqrrqohbXOC/"7<0  '4IZ\VX`^^]YTQPORSW[]ZURRPMMJFEJKKLOT[^ba_[[Z\_bfhoun^SR?+!#"%&,49:;@DMRVW]fjjfc`begebceefgeb`WVVUVXZ[UKA:97/%$&+--/8ABINNJHKOQOMKJIEBA@?@BDEGIIFC?:40440)&*03;DPZ\TI@BL]gbXTWdfijlmpsxy{|{ywtjhcaa`abb_]\^R5 ,8;@FMRVWSNIFDDA>7/("$'% /DWcwxyz}xux~|˯q`mszsyz|~~zuqnmnlhfda\XUUMCBMWZ\XUUX^cfc[M?6346@@ADIQVYV[aZ[ZRE8C^w}yusnhb]XVTRQPOQSUY^ccbenw|śh5 Co}lu~zy{zpjjs~}wstobO:6I`nkcWLHNU[qþŽ~[ORR@AAA?=<=>>=?ACGIKIKRZ][WQYfvɬzG/6EDC>?JJGMZcpvvqmkt}~zxna`VMHEFMTbiqspmjiphj[4#%"$5JeIJyjglkiiigeb[YVSOLHE?=97641.-,)'$$$%,)3HgjIF@7?=;;?>7/," "1:69JkN%6:%1HRT]b^^ZUPNKHDAC@7.%   + "3.  *&-A[gcZnjK==NMTQNJIP\gy{qx}cO>0('&((*(! '-+%  +6Ukod]XVVTRKC>@AADHKOQRROKIIKNQPMD* 0842=A?CGLORTW\_`behijihf^QH<*.4+ (03;DQ[[WX]]]ZWQNMNMOUY]\XUTSRTQOQW\ZZ\_bcbd`\[\_cffiqvodadR4"$'&%&.6@D@;87GNUY`hmnjgdfjkgbbcdfge`]VUTTWZ[ZVH;8:<7/)-243480*''.463,%##%)('&)&   +'5><===>?AEHIMJLS]a[RS`sǩ~P1+2BEA>FFEMPXcknmnnszyush_WPJGCDKTeowwrokinfWB((=0+Bp̽lfllihhgc`ZYWSNJFE?<86541.+,+)%"""-)1Ca|cO?7@:9;@A940'(39;@TzR'34,DNPZ_\\YUQNKFA>B>4+"  +  $ $$):O^a_os_TO]_edb][^fn|{v~gT@0&&(''+*!!'& +Gbke^YXWVSLE?BCCGJMNMMMJHEFHLPPOE++52,1428?EHKMOTVVYZ^`abb_YM@2 &# *6?CCGOUWWXXWVSMIIJLLRY`ca\ZVUSQOMR[ggghhheddb]\^bgjpquwndgp\:/86/*$*3?GJGFDFNX\dlqsokginoib^`befd_ZUTRTX[[YVE79AEA<569:9;AHEKQRPMMNPQSSRLD=DDEEEFGIKHCB?=816760-1569FSYXQB42;JX\WVX`bdghlqtz||}{yvtoomic^[\dd_WM=<=<>?AEGINMNT[^YU]kиn@(%;75430-*--,&"!!*&.@^{[A=@;::>>70-(!+17=D\S(-)&>HKV\YYWTQMID>;>:1(     " !%/?O\botjcZgmqqnjgiot~{{|hVB2+,)$$'&!/2 8Udb\YWWUSMC?ABBFJLLJIIGFDDHKPQQF)'31))''09=ACFHLNOPQTVYZ[VPF7&!%$&,5BHQVVSPNIDAAFKU[fmnib`[WRNHGNYjlnnliff``^]_cio{zzxlckz\?C]]PD548?FMQSRJQXZ`jrvmidgmme^[]`ddb]YTRQSVXXVQ?5>JOLFB??>?CHNNRUUURNLOOPPOIC=CCDEEEEHKFA>>=8369951367:GTZXQA1.1=MVWXZ]^`ceinqxyz}|{wusutpha]\bebZM<& )(%'0GFA<82'&38<@BEILLLKKOM?0  +qtzų{uplslfuzryzsprsmffgaVPFBLX`glkjgd_]\]]]\]^_abe`altwwvxscnlgc_^]]egkopoljlegg`bfa`R\z|wrkie`\XUTSQONOQSUVZagkort}~̜t`D:IYpw{xoihlqrqqzupqv~|zvqlfWF>=FWhxx~˹~UCHIFC@?>=;<==>@DGIPPRTXXZYfs˽P.&2@DBDA>GJPVZ]`dhgjow}wppi]SRJFB>:?N^kyzrnkhahK:A,=Żukmkigfc_\XYWSNHEC=:6443/.+-0.)$!!'#,>\bFBB=;;=;3,'($,/3;D_S&&  !:DFTYWUUSOMHB:696-#    + + +    +#!&1CVcixnlh_ks|zxsnou|}}kWA0*+*#""5@?' -K]^ZYWWURLB>?@AEKLKHFFFECFILTTTG( '42'$!"-59;>ACGIJJKMPSUXMKB1%**+,17:86325>LVTOOLGB?AHN\eqwwpgc^YRJCBKVchjkgdaa]_```cjp|yvkfqzbwoRNJIKORPNSWW[eouid_bgg_WY[_bda\WSQORUWWSM;5@OUPLHECBEJNSVXYYYUOKONLKJGB>BBCDDDDEJF><=>:469<75577:JVZYQA0+,4ERWY\Y[]_bglouvy}~|ywvyxukc^]_cd]QB2%"&2@E@::NHHG;$ +8MMPW^ehiljggjfUB + +ruzǽjZ^q^asxz|yvwqsnhgid\OLNVcmqolkkjhd]YX\chhiii]dmssrrsw{~ugjiggddkustvxwusrqfcc^ad\UMVq|xtpihe`[WTRNOQQQRSVZ^cgjoty{~ڼ}maepux{wohejqqnqvz}tms}yvulcYL?;@L]mIJ^E9BHHB=?@=<=<>ADIKOQWXSOVcn|ĥl9!6:=<;>BEHKOTWZ[[b`ahqwxurqnh`XQLA@><>JXerw{zskfdghUS]E8U~mmhfjieba\XSPMIEA=964332/,/1/+'&')#-GkvUDIBA?;2*'')" ',.16GhK%7ABBCDDEEEFFEFJOSYWTK0 ,4, #/017=BFFGIJILRSRID8&!0=66420.-+%%+9N\ZOJC@ABEMV_lwzwtojgaVK?79BP\ca^`a^\^`bdiotzyyvnn}ǡwaRNOQPSPUZ]\bh`[W[chb\bacge]VTPOORUWWSH<9DPVTPJGEEINQSXYXZ[YURNMOPMFBDFECCBCEHFB;9<==9988985345HWZXTG9103=KVYZX[^`aejmopty|}|{y{zwngb_[^^\RF@@6?Qci^K?=DFB2 ,F\mikt{hJ+  + + + qtyɸkPPe|˸ժ|X^wwx|}zxytuqkjkg`UPOU`ikhbcgijhda]cimnnnohow{xsoljnt}zlghlu{}~}{ywwwwna]^Z^`XJENk|yuqnhgc`ZVSRNPRRRSTW[^chkpuy|½׺xpllyuplmpsusvy{tqw~|xuskaTH==ERbqkL6?FGB>??=>>>?AFILMS[\UNWeryǭxE)46988;BEGIMQTWWW[YY^fkkhedb]WPJF@?>=BN_jz}{rjfdbeWRaglƿspifhifdd\XRNKHDB=9643320-..-*('&)#1Pz˸gPGFHD=50,(*# $+0019GfK%5:=JOLOQQOJC;2/*'  +  + + + +   !!' (;Smnjebbglnqsx{~}r^D0))(#!!"! %3?D;D7  -BNQRSTSPI@<>@@ABCDDFGHHJMRUZWTK0 +5.#",-.28>ACEGGGKPOMC>2 #5A@:2-(&"  )BDA@@?=?@@@BFIKKU]\QM[lzzvv~нX455788:>BCFHMNPQQTRSVZ][XWWURMHC@@@?@FVhuzphee_\I8Bhľ~rkegigfg\XRNKHDB=9534321-,*+**'$(#4Zȳ~^FJOI?884),&$(05329Ea}K#357CHHMOONIB91,&"  +   + + + $"!& &9Vuumd_]`cdfkt{~~{x}q[D1($$ *+04=GMK68) "3CNNPRQNG>;<>>?ABDEHKNOPRSVZXUI/*51'!!$(('+06:=@DEEGJID93&"7EB:/'%" 4O`\NLECIOTX[ZcikmpqpojdZK<68@KTWY]]^cfilpty}zw~ʲybSXgonilvnkggie^XRRW^a\XVPOOQRTRL?7:GSUQMLJHJMOPQNMKMRTSPSRQNGAFNHFDBAADFGD=;<>=;<;;:950.1GZ]ZXQI>;79@JQSTWZ\^`cfginty}~zupmljfaZQMU`iqyzn?! +  &Fbz~{wtqnjgcb^[WTQPQRTTTVY\]afjnsx}̵ziebdefjppmklrz~}{|yuqmcXE=:DVfr{¸h4;=AB@A?>@BABEFIJKRWRKOdxxrv~̥k@458?@=98?ABFHKLMSSQQSSONNNMLHEB@AAADM[o}zoheh`K1#Y½Ƹvmfghigi\XRMJHDB>:6344210-)*,,*%'"3\μkINSNA?B=0-'&,59628@WoI "000;BCJKLKF@7/)  + + + '% "% '5Rw|rf]WWXY[altxzzzvwyxvuuu|znXB3)$# )1>EGHE@3/&8GHKPPLD<;<==@ACEGKOTWWWWX[YUG.)75,%#$%%"#'-139=??@B>9,'  2>91)')*'!&@SRHNJKNNMOTV_gkmomggc_XL?9:?EKORX[_cgkosw|~ӵiadioonoomkieb\YQORZ^[WUPONOPONH;7>MVVOLMMMPSVVWVRNPUWVSUVVQF>CNJHECBBCEGD?====<@=;:71+&+E[^[ZVRIC;6:BJNQSVY[]`abdjqv{~{tmlnnjfXRPXbkzh6 !$'.Cj}[,(&!  + +uxǷwyyjgkxaeƞsVR[_E;>@CXjppnr|~}}~{xurnmoaTGHQ\][Z]`dhqywpllmtm_`emt{xvnb__[_b[NHMfz{yurolgd`_\ZVTQPQRTUVWY]_bglpuz~mb[^cegkmgacp~|zzxsoj^SC;BAA?@BCDEFGIJKLIEIZqysu{Ҵ}K*,5EJB94<<=?CHLNUTRPNLIEHGFECA@?ABDHP_q}wlgehX7!)H{ؽõ|qhijihg\XSNKHEB>96444312/*+--+(' /UsWRSLFFLE9/)(.7<7028J[jtE +.,,6<>EGIHE=5-& + + +  +  %& +"# !(/Ioxqi^VSSTW^gnqqppiihgffjpzykT?5-'#!" #4GMF?84/)  -=BGMOJC<;=??ACGILOTY]]\[Z[ZSD- '88/(&'%$!$&(/354660* + )3.*'*251+)""9MQIPPRPH@AIT^ioqodZUQONIA=AEFFIMSZ`_djnsx|Ѹumlkjhea^_`VQPVZXUTPNLLLKHA76BQWSMJNNQTY[\[c]UUY\ZWVZ[VE;@LJJHFDDDEED@=;<==A>:85-$%C\a[YYXQI>55CU[emmr|{||~~~~|zwsnosbSEEQ]a__abcelt}~rjghfjwqZQQTX[dt~wqldec[^da\TWjz}zzvuqnlida]\ZWURPNPRTUVX[^`einrv{ȯq_\_`cjpg]_q|{xyvqlfZNA;=Qhv{{}þWA=<@BA@ACDFGGIIJLF?CUntozμ_"#,AKE;7:98:?GOTWVTPLHCABA@?=<<;?BEHO[jv~zrha_bK52\ýȻvkjliec]XTQNJFB>964543231.,-,*)( ,Kwö~kVQLLPPI@4-)/9>80.0=JRdut`>  ++))39:@DFEB;3,# + +   +  +"#&*%  %,+>bonlcWQRUX\`cdca`^[XXWXal~|iN;50+#!  + 1FI=2,**% +$09?HKHA<<>?@AEJMPSX]``^^\\ZQ@* %790)')'%!"&&%%&  + + %+,*+16840,*)3FVWPPPQMD;;BPZcijgZL@>@FFCCFHECGLQY`^bioty}~ʽlilkf_WVZa\SNRVUSRNLJHHFB;35BQTNGFLMPUXZZYoe[W[^[WOVZQ>19HIIIHFCBBBB?=:;=?B>951(?]a[WXYVL@527@HILRUWZ]]^`djpvy{wtrrsrnka]]ae|ÒR  '6E_^1,($  wz§idkv~zj]VXy]=?loT\zmLPJEMKZijr{|yxzz|~}~~|zuopwgWGFTbgg^addegmsy~rbWROMO[lnXA88:DNYgt}unjieheYYbcf^^myxuurpljfd`]ZZXVSQPNPQSTUW[^adiosx}دwha`iy{n``u|{wxupjdVI?9=To}}zƷnE>;?BA@DDFGHHIHJMD=Kl~zsnŤ{*%(9EC??:856=HT\[[XUMGCB?><:8777=@CFJT`istqk`YVWVepŻznmmib^\YVTQMFB>:745532420,)''),"*Dlž^QIQVPIF:2-2:;>@@AEKNRV[_bb``_]ZO<(#680*'),*$ + + (././034211AB=73/% =^dYTUWXNA515>FFKPTWZ]]_`dhnsvxrruvurlieaaccy㿃N'PT?'$#(8IWbitttspjc_bafcTUacja_lvtpqpnjhda]YXVVTRPNMOQSUUY]adhmqtx|۽~mhywdcy~|vwtojbUG=7=Vsɸ|I?;@DBBFEHGIIIIINC@U~vm|toͷ;-(4>@@D7412:HV`__]XPKGF@?<97664;=ACGNX_monh]TONu|qnmi`Z[YXVSMF@>;755542231,'$%(.%*BgļcOGSYNEF>4.3=A<2,*12/9CA?- **)488DB>;=?@@AEJOSX\acc``_]YN;( 14.**-0.'!  + + !.5311/0022@UqydMC?DKLIG<=<;=?;4),7DKGBA?=>BEE>72." <^dYTTUXOA4.3=FEJPUWY[\^`cglptvlrwxuojggcee`k᱁GDH[w}Y/"3Kka;2*&" y}ƹ|\NWcfaZX[fJ--G`fa@9:XsCEQP\fotuwupptw|~}}yxy{}{vrijSG[ebgiec`_bdfpqv}nXK=0(%)394,*%+6GQSY_jlkijj`R\a_VQW^abgmnoolmqrokd\VRNQRQOPSVMKLU`figdnwwppyѶ[Vx}{yuvrjaWOHE7?d~x|¹ªL*IUEIFGPQKFFJKI?CSnvr~puırL8+">S>4)(167EY_dd\TOIDCA><98779;=>AELPPcf`WDNxȾvfdhg`YXWTQLGE?<977531-0.)" %-'/4DlŬrT=BMMNQJOH928830,01-4=:.  #+/1248:;95+! +   +  #)((#!)1037O^nsodVKGB=:4+,3?O[\\hy|Z=+&(*#$081,&   + '23-443212110,(%%%"!#+.&%:=?>CJPQWTard?0;:71)&"9V^\[\XSH;1.06:BGKPUYZZXZ^afktxoquxwsnkga_bag~ؼ˼h@)+=rȸþ|Z<<8- vx|ƺzXCJSWUTW]]N:37;7216GiJIVZ\dmqtwurqtx{}}|{yxxz{{vrjjUJYc`fieb__acejlpw~s\KF>4-(',,*'*>AISUTW\aefeee]S\__WSW_bhnqpmlkllokga[WTMPQQOPTVOOQV\chkgoxxru[Xy~}{yuwvm`SIC>7Df{{yŹïO1JTEJLOUOIILLGB>K`tzuy}lu̼fC0$3D>40//*+=SadaYSPJEDB?<:8669;==>?BGCTXSPKcygcggbZYWSOKFE?=:87632-//*"!$*-6>PyԷrU?ESZ`fecU?354/.*..+5>:.  #+00148:961' +  + $$$#! +1126?Oantrg\QKEB;56>UdnomvnO3#!" -980)!!  $/9@CBBBAAAACINTW\`a^[XURJ<+  +$)$"%#$##" + &.15008E[wv[NFJLC@C?B9334136BGLMF;3.1AHKMOW`\]WK8'%9X~GDRZ\dloswwusuxz|||{yyy{{zvrljWNW`_chea^_acfegjpvzzzyteQFEB:.+*./3:GKPSUOIFHQY`cdc^YacaZXZ_chookeeffhjfa^[YYTTSQNOQRPSWWW[dlmrvwx˹r[a}}|ywsuuo`NB:5:Miwx|ɷZ>>>>@AIHDHW}iacfe[ZVRMIFE@=987642.//*%!!')3@Vīz`MUfq|{cF543.+'*++6@=/"  '+-/26:84/&   "$%'$ *//-/2=Ocv~xkg_XRLJOWgryyuyubE-" !!6@;2&!  + !+5@>3<@FIA856.'"! $'()('%"! " #'! ""&7HPP^osO+#  <\a^`^TND:20248;DNQMKLPV\chkmnpnpsusnhdd``db]_hߵiQoɿ§}^@@;/!bdhlquxy~»wS=>CFFJQYW`f]I5($/DcxA>JU^dknrxzyvwyz|}}}{|}~~|yvpiZSU[]aeb^\^`bdbbeiorsromdVMKGC65578;9767;?BA@?@IE;8Im¿k__cc\ZVRNIFD@=;88642//.,($!"/B\įufnfF4343*%(*+6??AABEINTXZ]\[XUSOF7& #(" ! %!  +  "%?Uŷw[lzXIGLHD=0" ""%(-39@EJIIMYcif`]blsyzxwyuruĩhdZJIGC;-(1;A9.!"%,+)&"$!%3;:EPcg6 9Y`]_[PJB:201257CNPJFGMW^gmoonnnqssqkd`dabhhb``xƼ̠q{¾ȿyZCB<0#TVZ_djnpvytP:9>BBEINLU^^WNJKLXlsJCDN\cjmrx|{xyyz|~~|ti_YSW\_`_]]]_abaaafjmmljibUMMPRLKHD>;BPiorodUF<<;F7,5Vpb___ZYVRMJFDA?;98753/.-+*&" 4Miĸ_=,-00*$'++6<6* #$)/684.& +   %*-* + #'('$//3C\sytwqg`^cimoopqlf`^L>+ +,8><2$   '.5:>A?ABCDGLOUXY[ZYUTRMD3# #)$  + )8?DWxò^KkSHOUWM;-+)(,0103449>FLOMJKWepsprw|~|ulfwsr{ʾy\RA,2FXTG2$#!  ""&+5:=Msf0 ((2OY[]YPG@82/./02?MNGCFLY`ipsrqqqrutpib^]\]beecb[s|kdbkc˼ȾuVC?8."FGKPV]bdjpv}pN438=ACFJJNTY_cdheirqUH9EX`gkqx{{wxxy{~yjd`RS\^[\]_`````__aehhghaTKHOZbeca\QHIRnuwuoeRC?J]lnhdchddca\[\jtr_RZfjhfb][[]]WTPOQTVUPOQTX[]]bcj}һǻOMr}zzxvtqc]_\J5)3SqwxþwLJUX_UVVUPA:H^yednvx_d˾G8DNG;-.012389547*+Dp{ng`ZWVUSOJGCB?:987520.**+)$!%=Xqø|R1##'()$'+,5:2& +"'/660& + +  !##  %*-," +  #''$()*3G^jjlg^WW^ab`[Z^\UMI9/  )1698.! +  %+16<>?@BEEHLOTVXYWUSQNI?/ $)$#,&   +BR_ly~źMHyZINU[UC;;759?BAFDDFKRWYWSRVbmst|~|wneaqw̵jL2,>QilcG( !!%(++-?ZeG),"%=PXYTPF?6/+**+/:EHCBFMYahnsstuuvxvqia]ZZZ^bdfeRVZXJ7+&/&IƈŽƽǺrVA=4);8* -GlƹľƻtGQ`KIKRQEA@;8:DHEGFGKT[_``]ZX[bkpsqoligffmзmTQWu{Y1$'"/82  )%+FTRNRE>4+'&&'*2=??AFLX]elosvyyz{ysjb]WYYXXZ\\RICB:.%#%/d庀}oUD?5+"568;@FJNU[dmt{bF41147;?BCCDJSZ]^air}onleI+=MWaglsvusrrtw|lkiRP]]Z\bgigc_^]\]_aaaeVIPcqrnmjfbYNILOQR[lvo`SSZce`^b`ZY][SNQYd_C29HO[[ZYXYZ[]XROPRQPVXWPGIVaq{f}ͺǾtO[{yusqpommd_\L6-0Cd}Ǻi\^S]XYWI66XsotpbWdsE3Td@4+,30(/AHXdc\VTRNLIFB@>=<@DEC@<;:98422,''+-)%79??990-572(%("&571)&)"  !$)/58<>@DEFKNPRRRPOLJD?3#  "(" +6>?5 *:RnƹɶkHaŊjTKFJPKBA=79CHGCCDJRY\\Y[ZYYaktrnfa_beimŨ}g9!"$!% + **#?QMKRD=2)$""#%,49;?GMW]bhmrx{{||{ulc^PUTNKKKKF8/20)')#8VqbcjRJD;/&!*/577:AGLQYdjnw]>2../16?G=1,4I\fhYZ^`^YUSUOPWWRPR_c\D-&.8GQTQOUXVXXWTQPOOXYVNDIZjījbnȺɹa`t}|y{||wpnnlifca]SB3/5GjtnɻeVPQ[QH;:S~xtyudUVră^XOL=9091)./EW\]YUWWVTPJFEDBAC@BEEDGL[jȼraTUVUTPLGC@=:850./0*','#-BXqɫyN-  &*/=@3  (150   + + +    $!%*+$$&.52( +  "! !#).155651.,-((''*-("!! +2A;.&%$" + + "'-23<2  #(  !1<;7426:@^uȰſTVҔgWLGEF<5./4862249@JQVXSWX]biqvrcXXXYfvŸlE+   + + $#",1!#(4@HJJE;/&%&%&(,/15;DKUZ^eipuz{{||xqg`[UOMF>::@4% (22( &ObjYPI@5,(&&'%#$$!*,02479:GJR\bfoyy~|U=2-,.16:==BGGDCFIGHMV_cc`HIQfoS42AO^iptyzyyxxx{|xndYTSVU]bcadc`_][[^```b\S`xv_TG>68=AFHD5)'3ERXTUW[ZWSSQNNSSNMPV\ZD,$(1@JMJILOOTUVUTRQOLSXVRYlɵ}^`tǹťo^u}wvx}zvpmlke`a\SF7.4?Njso|zq[QLNKIGQnttwo_QYɛiM35/839G?DZ^]XUXYVSOJGFFEDCDFE@@LXhɽvfXZ]\XQMJC?<:761.-1-,/&"*FXn~˷qF'"! '+0@CHLMNMMLIEA=;. %% "(26=FTfxŷ¼}VeئzcOEHPIA72244414:CLQTVURS[isuqh[SUZ_nɿ{[=& + +  + #& $+.$$'0;CFG@9.(&()(-010/5@HT[cknrvyz|}}yrg`[VOMJEEFQB/$'-(*=ONH??KWawk\VPH?7433/,*++)"*)*-169<@BIRW\eoru{lI<1*'*16776>DE@?CHA?AGNSRP8>JbnW85?KYdkpvz|||{z|{wof[TONSZ_`_aa^^\[[]__``ZR\laG<4:?HUaf`fS<+(1>FNORTTURQNNNSTQPQSXR>,%+4>GKHEEGFGGHLORSTIKPZh{̳}Y<^ǼĽf_{}ystw|wtolkha\\RE6)*;N^nqnrsmnż~cPDCEO_wysqttk]Ueǿȱ[1'%//E`OA]_ZUSVWTRNJHHHHHEHIE<=Odx˿|n^^^YSNJGC@=;8720+3210&!-K[mʾg=# '+.:<0 + +20,*   +  ""$&%$'-44,$ +  !" " + +8A6*')%!"    %,2569<=?CHJJIIIFA<96( %% +#+5?L_rÿž|_zجmTGLWVNC;68>CJMLD=1;F[iW;6?Oc~}}tibXRPLHCC?=;9842-5532*(7Uarΰna`uy[3&*+68- &-.-$   +   !#%$(-34/(    + #:60" + #' $,C\sľŲqЮqYMQ\[WQJEEMRWZ_`]XQPLOXcjhZOCGTif6  + +  ! "%& (/243/)'*,,*),.+(,:ES\fkkkotrtwzyrg_]WQOKFGI^TB.##$! !)01=:9@Qaa\burhfb\TOLKLHEBAA=71*-01/.028:@HMPXaeipv|V50-&#&-20-08>?;8:=;EQ_S<78BLYafoz~~}~~th[QHFPX\\[^_]]\\^_```b]QPQD96=ES[`lz~~~vk^TJEOVZYX\][[[\_acbceZKIK>8F^t|kVLG?QKA5+,4:LQTV]ebZfhkryfg_YZYOA92:BD@?@D_x|}§`C=Rn}xwwwvrmjhggjicZQ=4.05=GNW]]YL>Kqǿ[I`qnlkjnzþƀE' 54:TYYURTSQQNKKLONOOKIJJILRu~~|y|saLDHMLFB@<<;;85582/57@Tvw{Z>+!$0\{O,!%%"-3+ +'1/'"     +!!!'(+1462-#   +  + +<7*%)* %!  +     '*-/237:>@??>:62+&  + %*##6Rs̰p\SPS\^`_\\]_hjlh`YWXY_`ZRVizôO! + +  "+.&  #'&(%%""&&!(6?GJMSYalqpoolf]RJJHHLLHEFKOH3%.'+,*2@HIO[fecelpo}ysmgdbb_[XXVSMGC7*'.6981483:M`}ut{|z}gPCE^}tsqqqnjffefge^RH8-)2>DEEIPOF;=bɿyn~İtolosz½עo8 -MX_\VUTSQNJJKNMONKJMMMOTi}~y~~yx~o[MFFC@C?==<<97870.5;DV~~jG&#2Fs_9# " (0*#"%*+#(/+$     !" !&*.3662-!(&#     +,82(&)(%"  +    !! !#(+-.149:99851-$ )( *Gh˹qaYWXYZZZZ\acc`YUWZ[_cdk~h0    #!"*+$  ! !!%%  +!09??=BJSX[^^\\XQIC><>CEDEFHKE1&-./28@JRT\hqsrw}}~yuqommifccc_YSa8"$066-1:CFEGNSX_flqvzlJ1% "$#%(/463/'&)0795/3>>@ORD>04;KU[j{~ysk`RHJQSRRVXWYZ]afiiihQ8CJB2,A˿Ǩ|upou}ƽÔL (HVaaZVWWRPLKKLMMMMNOONRZ_z||x|~y{u_OC?=C@>=<<:887-.8=DT~|`9&"(0JiµrL/   ",'').8;7/+$#"!  + +   + + +!%!!!&*.3651+"+*'   +   +6/')+)$  + $&$  %')*-/666663.*  +'.&HyľķpPPQSVY[\aa`[URU\adnǻF  +  #''##$    %% (29636=DDCCBBCDB=:9569;=?CGHA2'&-298=GQW\agnsvz}zwtsstpnlllib\`A1+092567@JJCLRY_ekqu}}^E/!! #'(+06;;50))-1552-.4;DNPB6,-3ES\iwtw}|wobTKBKRSSXXUWWX`ionkhWB@F4 .>P\]^[ZYWTPTxólüǦaOJFCABA:3@c{nfdgs{{yykTOJEHXt{xsrnlkheb`^]\VNC;1..3;B@:>6--AqɿĞtpqqqy͡]-$ 4Naa\\^[[WTPMLMONWXRLNPMX||zpu|~}~rZIABCAAAA@?=8435;ES`zZ6" 0APg|dB' $*.2530/'%! +   +   !! %*-13/,'$! $()),(    +   +*1,,32*  + + #$" %'')-33221/+'  !# &6Iy»۹Ծj[PNPNORUW[YVV]clxſd;   !#%""#"   + #"  (+)'*154/32122221*(()/6=BEC?935:?FLRW[`gmrw~}|||}{|zwtqnlgD/.6:=<9>FJHLQX^chmrx}yW>+ " !%*/27>@>81(*-1650-,2:BKL?3)(/BQZbmnrxzwodUKBJRQQVWUWVX`ioomobMGE. +  +5AJR[_]XURPPPQYÛeӴhQD;77HJLRgsg_^bjpvzzzj]PHHIKHIWs|zusonkhc`ZXVRMF>8/9@<33:D9)"7gµÝrlommuk>0 5J[\\aa^][XSPMMNPVVQOPNHRt~wlqz}}|{iWHCBBABAB@@9647% %1FXi{iI-"%))($#!!   + "  %*-110+'$" $')*,,   + )0,.44, +  +"$! $$%')//./.-(% &>]xճѸt_TOMQVY[]^^ahpĵQ'   "%" "#!   + + + +  !#" ## !(+)%('&'()))#!"#)09;>DKTX^cfkqv{~}zwsqe?26?B?98EJIJWq}yvuqokga^UQKFA=85,6>;/,3@/$*VƴĹmgkkkrϰ|UF,)7GV[_ed`_]ZURONORSRSUXRKOj³rhlv|{y}lVH??>=Lh~uO$%7Mbt}gJ/  +  ""  $(,031.*&$#&)+-.2# + +'   !).+-12)  !$! "%)****($ +">d¿þϴξulgikijijjpy­rB   "$# "#" ""  "!##"'.59FGFDCGNVbglpuz}zyƵaE8=@@=::@ELPTWZ^cgmsvx|iI2$"#"$*1:>DGF?5.((,054/)%)3989@LWZ^]ZXTONLKJMRV_РmTD:9=>;8;K\bfmlfgfddfhinx{tttg]PHC?968>BDK^t{yxvrnje^ZNIA;76431**1750+#1U˻ggkmmuܽnW3%4:IX^`dcaa_\XTROQRQPU^c\UQhIJ~qgiszyv{|zdUC@;757CFC<3-'',1550+!&/9?;6770)0?OY^afmv|}zvwuoaVLJKNOPPRPRUZbgkmmk`UI2(0>QVNMOU_[YYTPONJGIKNPSU\Б{ٺnRB:656@?:7>JRZ_cdjmjgfgjs~{yskfccSIA@EE:2477;MfyyxxuqmgbYTGB:523337*%/:5'&T¹xekptw~ϩa4%5EQ^ca`aaa`\YVTRRSQPV_c^Z\o~ųvmjqwwsppu~rfXSH<426;@;9;CVrtjK.E[rzm]UVXZWSE4&   +      $# "%*.12/-)''(,/02*$'53'#   !')**+,*$   +  ((&!"#$&%" +'BfĿƼE  #"  ""$# "   + &%"!!%*19?BNPSUX^gp{~­gA:6;AGILLNPRTY^bhmprw~~xW:*#!""#"&/78=AB<5.)%&+1661-!#-7964;<7-.;LY`aelsx|~}}zurtupbVNHHLNNNRQRTX\aeijh\SO>8CTila]^adZURKEFGFDGKORSSUxk꽛hSA;;9441688:AELZ_dkmiedfmw}mhfb\WUSLB<<@=1*0318Pm|}~zvtsrmhbZQL?;4001333///( *LĽ{yy{~|tltz}׺vJ7EV^`cb_^__^^\ZXVTTVTTXZYX[k}ŵxu}ummqsoijmty|ywupcTE=>@D;7>NavvjWD]{~rdWG?;9999/% + +     ! #" !! !$(,//-,*(&),023% 4:62)!%  !# #)((()*&" #! +  (-,$ !## 0S|¾ÿ¾Ǽ¼f3   #"!!!#"$   !'#! !'/7@EIUX\^ahpyþfP:8?FHJKLOQSW]afjnosz|nN3&#!#$%##(1:9>A>6.'$ "(/451."#*3523=?;408HU]_cjqvy}|{zyuquwsfYNHEJNNOSQRTVX\_de`TRUOMYl~~ohfb`TOMFABDBDGIMNNNNhipfjyǏb֚vaMEDHHB;817<>AFFJTY[bfecejp{~wm]XWRNHDCKD:3-(!!+24;Qmyw|{vqpmkgaZQHA631/1221,16.4Yſxpliijorsrq}îmdv}pb\]__]\\[[YWVVVWYZVQU`zyuĶrk||pikmkhkmoqv~~raVQQH<7E]q}|mi]utkaXLA72,&$''!  +    %# "" !"! !$(+--,*)((*-023% !!"5<=@9/-)('" "$&%"%*(&')(#  !%!  (01&!!7aĿȼƺʿĽS3 +"!!"!#"% +  ! "*3>GLP[_cfhov»nI=CILLJLOPSW]adilmry|{hH.%"!$%%$#)3<=617DRX]ahpux|~|~|zx|wux|xk_OGDJNMNSPRTUUX[`_WLO\\]ixvmg`[QNMHDGHFEGHJIIIHD=PBD[fɖìXG<>ISQF>;2457;A?AJMNU\_cgot{~xog^TOLIC>;7FA6(&39@Rlvty|}wtomhfa\TK@:1/..1100.37/ )Xzlca]_cimoqs̽zz_V[a_[Z[[[YXWVTW[]UOYhtf~ƿøpfyqefhhimpnlr~vjdbK<7Jh}owpxfXLD;4-+$ ""      ($!" ""!!!#')++*(+)(+.123'!"#*9>97;;DG@WЙdŖwMA=<=<=>=;@C>5,*17BJPTZcjusqojcZQKIGB;4.,A;,'388Hanmoty{wrkfba[RH@97(,011443/---3Sɿ|pbWTW[Y_lssyԵc]iqog]Y\^]ZYXZ[ZUPS]UMYlxve`vŻ˽tgom\Y^jllqpis~y|s\=;Os}|zylYG;7/)"!"  + "$"     &! ! !$##"&)++***)))**+,/' !#!"*7@LKBEIBD?73* !!! ! " !#  +  +##*5BNV[^ggilovy|{}~|zxwwxwxzzyxxԬ|[LILMLORUX[\aehksvuy}lT@/$ $'$ #*/3++)%!"%'((1,(-5=<<:759AGHFMRZenuy|xkVOHFEEHOPPQQQRTXXZZdokemy|xhULJH?>ADEFEEEDBABFIL=FKKC@ddgIAA@AEIKA;6322116CS\`^[Ze_XRKGB?AB=3)%(,,,& "#.421B\gbglt}wspleaURKC;731/004655462?fȺhYIDEIRYdaelnp}ē[BF^mywoicb_]YYY[ZZ^QS^omd_bfm~jjvl[SWejmspejqmXZ`hwhDF\w}sslaTI=1-- !%&##  %#     "## !#"!&')++*++')''&%#%,%#(,/3F_zy`Yfm]UMRfwzsM1$)-+'$'+*% "%'"  "# + +  ',.,(  + ,GnþĽþe: +  !#"!" "$!   $')0;221:FMKGNSZdlswzwiTLDCBCHNNPQRQRVXY_`ejaY_jnkZIBBD<;?BCDDDCB@ABEIKDA;?N\{іdUA=BFHGDC68;<:4*%*8IV\\XV_WNE@=:;A@:/%#)1,,$,112F_e]dkt{vrojb]QMFA<::88434679=*Aiȷ~rl`QDBIRZagefjjm̢eC@\xl^`i[[\\[YUTMOk|rd]^iiem~ʼƿsoxwfZ]jhjqnbfpnSV_m}lFPi}}zokWL?6-%"""!$&%" %#     #$"#!!#! ))*,+**+)))(%%"#,&!"'(# 7\nic^[`o}lI* $),+'$%')$ %&# "#   + +#-2/" !=]}žŻI# !"##!!   + !  "'*/6BO[chjnmllmpstpsy}}}ytsqrqpooppqǺɺnMIILPTWVUYYZahlopv|~jQ?2'"#$#!# "#%'0+(/7=:7002;>>869<=???>?ABCCBDE?4:Rj}ŜmK=:?DDB>=64)$'1?KRUSQXPE=8667<<4)""(00-""+/5Kcg\`hu{wsoja[RLD?=;98=:87<1a|k_ZXNIMW`ejjgfjjoѮrG;^uukhj^^[ZXYZ[TZ|qsw_^fql`csʼþysy|ma_kjlrl^amlYZ_jyqHYutz^T?6,(% " !$&('# '$!   '$"  $! ! +,+,+*+,,-,+(%##)% $)&&Myfabj{mX8!&(,,(&%&'$!"&'" !#  +    +43$ %#-Llüôd:  """!  !"&,15=GS_fklppnmnpsuqty|}|zyxz~~yvsrrqnlklno½nTLC?EOV[XUW^gijkrx|{{|hP?3(##&&"!  !"""#$))+/3511356>HMLJPTV]bgjlqv}vjXI<ACCA<J[vxTLA<::;;=>>BDB;4///5=DILLKPH>7210453*#%*,(%.8Ldi_]gw{wtqkc\UOGA?=:68:BHA429kŵn`VQOLOZdilomgflntв}O:T[gvsnke`^dlt{qkm`]cmtmaak¶ÿzuu{qb]ekntl[\fd`[X]h|yL^y||k}uD5+&"$%"!&+*)  )'  +    (#  #  !++**)*+./10.+'$$'$!%,, 4lohdhj`OA*! (+-/,)('&#"$)'   ! +  + (33( +  *'#6Uz¼ɸĶļ_ !   +  $+29?EOYcilnqpnmpqtvwx{{zyvttw{|wtssplhggijgZG<>GQWWSR\cedejswuty~xcL<3+%&''&$#  +  "#"  &-0-)'+47:?FMOPPSV\aehjinu{~zpaM<;BEA?AHPUVSQOXiog_PGMKIC9334-%!"%(-36;>@BB@=:9GIAAH[tvUCGB=:989:;>;9887558;>AEGHGE?62.,*,.+" #$&%!,5Hagbbm|{xussnf_[UOLMLHD>>FIB:BTƻwg_WSQS[gmnoqohhou}ɿɰ_EXUT`wvwvsnjlqw|ukc]X\clomhdftŸ¾¸}zv{vh]adjsn\Z`]`ZTT[pP`xovytia2($!!(*%#*,+ !**   + ## +  #'!!! !#++*))),/2320,($$'$ #/2#"RwaRF9/+#"#!'*-..+('&$$(*'    +     *1,# +  +$.-/D`¿¿¸ȿ|. !!"      #,5=IPYbimopppnopsvz~~{yurpprw|{vttpkecbdeĽ|lXIFINPXPOY``_aemrpotzzr^H:2+&'$%%$" ! "#$!%/1'!!&158=EMUXRTW]bgkmchnty~}~uhR<:BD>7=CNTTRNKUktmdUMQHD>4121)$ #(06:=>@BA@><;HF>?AER[hoXFIDA@@AB?=:850.29;729:=?BEED=83/-*&(,(!"$#"$#+2D]gcku|xxusssqhb`[WZ]^ZWOKKJDHaoea]Z\_iqtpoqqjir{͸~{¯qUtk\RU`ggqtxvpjfe`feb`YWa\bhimnhadǸ´z}n`bZbqn]Z`[]YVUYjUatfkqmkS-*&#&,.$%)( + + +%.." +  $(&    + (&!" $**)))*,/121/+($%+&!,3&KgL5$ &( #'*,+*'%&%&*+(   +  + + ".3."  #)276?VqĻĺF   !# "! +  !  (3>>><:75;>CEB@?@@?<99=::76;?DDC<940,*),)& #*6EWbft}}|yvuqnjiijhhde`Z`jh\MHDDH^žphhjkrz|uqruvwuux̴a^]NJ>J^r{dMKIVXcjoqng_[NRZ`aa``eeeffeeehqͼ{~~|qi^`\ccYZ_[\SOOSblkmss^mcE/ /7.  $# (70$ %!  +"!  !!$  #*)))**+,//.,*(&&+'"#,0";pƼtV?+ #!!$"%(,-,*('#%)-.)" ! +  + .40* ,*)2@Xt½¿ùj8 #"!  #! ! $/9LT]hopnkkloruxz|{|yuqnmkgimprux{}rqmjje]XX¼r\KINSVUQTYYT\_ceegjjbP=4,$   #%&'&"%&"!#)38@?<8=DKMQSUZfpngb[TI:,''%&)#%(-279:;;;<;:8678<>??=<9:;;;=>=A@@?@@@@@?@BCEDD;7469<<;=:4.+)*-)$"*7I[eh{zzyuqqlifdcca`[]YV]f`RHA>I\žysuz||{rry}{zzƳgI+56" )7FXjtȶqXTPWUW[]^\XVUQU\bdffghihhhggg`fwŷz}|sj]ZW\^VZ`^[TNORa}nxG,#+59-"!!   %-5("##!  +   !  %+***,,,,/.-,*)())'#$*, 7dgR;0,(%""" #&+-,)('$'+..)!     "(*,.(" $%% "4PnÿûI!#!" ! $"  "-8LU]fmnljklosvyyz{yvrnkihcehjlosx~wrnkke]WU¼fNGKRTTSUXVSXZ]_`acaZM<1)! +  #%'&!$%! #)4;@FPXWSUWVUSV]bhlomjlt|zuu|pbOB>@AA>>7;>@@=96::99:<=>>>=>>@DGB=878975950*&'(+%!)9Nakl}wvuokjeb^[ZYVTNNLKT\UG828Syƿss|Ƨz^<"09&'(#'4AGUyǿ̹ba^`XXXXWUTVVVZ_dgjmomnkkjkjjaaj̿¿vv~}yo^UQUWRXa_ZRMMP_wql}[))39=9,    "%'-+.=ZtqO527@OVbkidXD.% + +  + &#"!#" !&,+,,-.0000/-,,*+%&$$'' !0Qy{aB2%&+-*&! ""%+-,)'%&(+/.)        ).*'%$%$#6aÿa ""!"! ! #! + +   #0;OV^djkjhkmptwzz{xwsmhecb^_abbglqz{uokke[SP¼nSILRTVWZ[YVXZ\^___]PG;0(  + + "%$%&"!$)4=CIT[[XY]\VPPXahnsqllry}zusty}}siXF>?CC@BDGINSZ^a`ade]R?0%!"#%'*-0178:>>??>73./39=?==:30-,*&$%&)%(8Pers{utrlfd`]YVTQNKCA>?ISPG44Cj|uxļеfU3>VOF6'%#'0/1Jsdefibddba]\]^]`dhimpsqpmmklkljddqļº~soyucVOPQMT__WQKHJZv~tpnup;!8D@=5& +   %-7ARiէyĤW7+#  +!%# !!!! #!#$#!#',-,.00222200..--$$%%%# #+;P[Q@2' "('$"$#! %+.,)&%'),/.(     ":o{yx5   #!!"  "! +    &4?QX^cfgefkmquxyzzwtnhb_\\[[[[[_eju}vojhbXOJ¼vZNQSSUY]]\[Z\\^_^[YJF=2'   "# '($#$*3ACDDDBDHOV\\ZY]`YL<.$!!##$%(*-.8:=@ABA@82,*,3;@GIJLPUZ^`dgihfc`]ZTLFCBAA?=>=93-""###$$%% %3Lfxxssqjdb_\XUROJGA=77@MRQIK_{vzȼŽ_A6 ";eoA/.&%,)"+@scbbjgijigda^^dehijlnponlmkllkof`fw¼żxrju}j^SPMHP\[TOHDDSlnI'0?A<6+  + -I`ƨw\+   !!##"! $##&&"%)-,-/012322221011##%&$ "&)+.43.0+%$! '&')& !%*,+(&%(*,.-&     +  @DDB@ADKRZYUTWZQE9-%""  $%%%')-/9;=>>?=<652018BIZ\_ckt~zqiaYRA>:985/* !"$$&% !+Cb}|tpqpjdb`]ZWTPLHD>75:GS[afxuyȽ̸sC)$3\}K04+%5C>:.JwĿÍl`Zcejllkfa^]ggijhhikkklmllmkld]]iȾwsfp~qi[RLFNZYSNF??Kat_E)#1BE?3*     +Juši7!!#"!!  %$$&%#%)-+-.011222222222%$%'$ %*+$!#'(.+)'""*)*,(! #&*,+)''*+-/,%      +?z{lcd¹ƿÿM%  "!!  +   + #/:DOV[]\]_cgkpuwxwxqnf_YUTTVWWWWZ^cmu~wl`[WNDA¼pa^^YX\_[[_^]]_`^XRRTM<*   +$*)$"#'/8=@GNSU^fmokjlpuw{~}ytpmjltxvuwt}x_F<=.80)Jr{sF:Hx÷ȟ}fU^bhjkieb``cehhfeefgilopomlmf`[_tǾyrckzvraUMFOZYTOG>=HZive=%-ELE@+!    -KyֹB& ""!$"#&%#%)++,-./1223333223*&%(&!$((# "##'$$((#!%%%&+(#!$'(++*))*+,./,$   + +  C{{i^]½ÿ¾d/" !#!!!     (1;CNTXYYY\beintvwuvnjc[USRRSTWWWX[`jr|uiZTPIA=xieg`]aa^^bbaabca[UWZS?*  +$)(# !&/69:>ELNZcmssrsuz|~|skkhlvyvtuudI>;:A@?=>CJPXYUPRQH<5)"##! %$%%'*.00001/-)(6BR[^bkt{xzykXG<4.*-)$!&*#  3Z}}|yqkilmidcb`][YUPL<:5/,3CRoѶºġc8%=ҡk2'7/*Yh>.Y¸̽ɬmV]ccdcb`^_``cfgedcdehmprpnlsnf^ZkȾô{rahuywdWMFNZZURI>;FWdvnc_^bD0:OH=:& + &Alr7 +) """!"&%"%)++,-//0012111111-(&)(""#$#"#&" '-+&$ $)(%%()*++*)+,+-./,$ +  +   &Fyľzh][ÿǿs9-"% "# +    +"(2:AKQVXWW[adimruvttmhaYTRQRQSVWWXY\hpyueVPLE>;{vkpgchf^[^ce__e^V[YelE%    ")($ !&1235<@BAK^ekstrxxz{}zunigjmooqtuyxxoY>356BEU\aoqoupqqqpnkiijkllotwxwvoZ@/*-5;::?EJLMLIGC?9-(# $&(+-00.+)'&)-50S½רcV[Z]adfgd_YTY_ccdehllmmnnmmkjlldbq¼µtjlfs|p[JFIOSTWM:8IY]ilg\USPIMKMRN=-%   ! -RڻkK+#%$#!$%&(..-.045410.+)()+/01-,-+'$"###%%$##$&(,.0/-,++++,+**,/40/1,     +    />HGV¾žĽyrq¾ǽnG- $$!   +",5S[^\ahZEAEINQSTVX^aehijkknklqq_< $/78NX\YRND:7<@>:10.-,)&%(,,,+***1693'!%*%$&')-023320,++,.///-.023/.0+ + + + +  + + + + + -[s}mküĽſǾ½üļýwK1 "%##0EatW8 " !*16:=ADFHMSX`cgijkmoolfc_]YVTRSWX[aimquy}}xtsmc^XQHD>;743332¿}u]MG[jqtsgdo|D    +  +!'**$$(-)(*//.>RY]\cgT<9>FMRRSTVZ^cgiihhjiksxlJ**20255321/,*('(,04762..6DO[ac`]`kvwwskbVD4  'B?6*" )En{wsojea^\YWUTROJG;722.#6aοɽɲe`o۾t>, IƊM0B}ת|SRTU[`]X`o`^[[^acdcccdehklnmlnmjfdeŸŵnn{qld\QG?;DHE@@JW^c]RE606>SVVI;1)#!')' + +"&&"%KⰢྎZ5*+--+"!+1[j}qaTF6+420/,(&$%()))+.1>EH<)")$#$&),03441/*()+/010//133/.0+  +      9n~usºþǾǾſ¾ĿǺ¼V6 '--2/%8Ysc.!  "*16986511011iULV_dipjhqC     + !&))##(,)&&--,8LSVV]_K56AHPSSSUXY\`cdegghhkt|uU5!$%&),1341,***,-03&(+2=L[cca_]]dksoogZK:'   %--)'!  +&"0T{|vrnid`^\\[ZYWRLH?:22.&Br½ľȾ¹êХd:)+9d{E(8uệVT[SU\\WXb`^ZZ]`a`bbbbdhjlnkijklgba˿ǽǻvmsumbXQIA?@BFLQ[^accfhkjfda^ZVSQONSVY`imotuuttvtpljjf_YRLFCBA=8000//./0|eXMQQ[knmu}B    + + !&)($$(-+%#**(3FPSQVVB04FLRTSTW[[]_abdhjghkt~x[; &/664(&'((())(*09DOVZ]ZZ_ionmbaWG4# +  +  **%"+'6_{urmiea^]_^^^[VOJ=5.1/,J}½¾ƽžĹ̷X8*8Y֨k=&4n˔_]_RNX]XTX`]Z[^`_^ccabceiikifgijc\bº|moy{o`UOIC>>BB?>FQYQPNI>59CEHC9343-..)  &-- JҨԥjC $4K^mòu^B;3.)))(!##&+5?CIOX[^abdhkhfb`]YUROLLOSV^gimstrnjhfa][\XPJA>:::83-+,-,,-.1»}[OHAJ\cnq<   +   &'" $*+-& #'+4?OLHGA5.0ANY[ZZ[[_accdfijekmnx}fE*   )/22*&$%()'$"+;LSPKHMR`lqmkobT<(  +     + +/Fn|urkgb`^^^^_a_XPJA:3/84KĸŽſտaC15{ŀH*0DeգpZbTPXa`XSZ\^^]]_a`a`bcdffdfgilng_]}¹˱rkpypaWSSMD>A?<=GMMNIHIE?=@JC9/-049:1!  /,6TٵX4QRqxaXWXh}įgI223-&% $(1:=><5,&'*,))(*,,,-.,-,./0564211123/./+   + + + + 5wztjj¾·ɿźýʼ¾ĿV0! "*+/2')t~ǧQ' + !)2;:9;98;<>CKSW\`abcdedc^ZVUUNMKKMRZ`gorpmic]VSQPQME<44333210--,,,-,-tRE=BMRfm:     &'#!&,-.&!&+4>JHA<3*).@N\____^acfggilmjnooxkM/ #(+***-//0,!-ASZVOIPXcijhddQC+  "   *4Pu{upjfb``a_`aa^YPKB;51<>WǸþ̱O90">}Ź\:!*Pv޳cZWUZab[S[]^^^^_`_`aacdeedefilmha^zż̵xmmwocXVVOF?A@=?HMOJGEHFAAEG?4-+08=9/  " %6Yn^OB/!2DLP`˷gI=;7+# !#*25640+*,..+('(*++*+**,.14775322113/./*    + +Gyobc}Ŀſ¸ĴĘg=#! %*&0˯ָG" #+3;<9;:7:;[i9   + + + +  "'(#"(.//' #(,4=DC;1% '1CQ_defedefhiklpqruts{rZ6 %13653232(2CQXXTRR]da]\QI9- + ! !"!"#   "!  (=_}~zupjeaabdaaab^YPKA:61YħkMA<1$!$#!&-1/.--.01.*''(+-.**((*.149986543440/0*    + 1^~qb_w÷{|ÿ¾ý̾żҫ}M%! ! !4²ѣ}:  %-5>>;;95679?ELRW\]^]_^^`^]\]_]\ZZZ_glqvxuqmg^UOFA>;620000//..--,+*)((zy{~|~u_^x]MG64[f8    + + + !$(($#(/1/' $*.4;@B9, !/>LWadfhihgiklmosttxxyyd< +  + ):<=91,//:?CGIPWZU^]URO;&& + +$#"!!""#$&'(((%$&" 4'  !  $En~~}|ytpjeabdfbcba^XOKA;:/5Lyͼº½l4"8T^fcZRG;8!")[ץsDVb^^edY\\^^]]]_^`abddedcefhlpld^lɽzoqlcYWVPI>>?CIORRQROMLLNQI?1*-6?E;,)"$8oξ~S97/26=A9+'&%)+CldC7/% %*)&(-/,++.132.+''),.1,,)))-048:9875443110)     'Jpzkfx׳xowĻ}sppŻ̸ŷٸ\"# !,bɰY. !)19??<:73455>ha6    + + +   $))%")01/& $+.17I4   %Nx|{{{xrojeccefdda`\WNJ?;<-.RľĿ¿лY&(0.+-67+,EQap庀EVa^_hh^\\^][[\^_`aceedcbcdfkpmf_ftðźuolbYTTPJ>=/!%3fǑs`<$(6Xa[D/)-(!;A0.AgĹR8.("+-++./,+,/121-+'').0110+((,/3:;:;96564120) "!    + >ayvs{˭|_FCNY^`s»žzrmgxȮôٿj$$ +@UUm̭|M-! +#,44&)) '08@D@:50,-/2:DDJTZ][[[`envzfO98??;3* !**+7:4484/-'!!)$!/'04'  &Tq|zvuttqnnohaahddb][UI=@45?aùžžȹmC&+Tҵs7v澑^FT`abc_]\[ZYZZ^`bdddcba^^afiihg[Y|¼Ϳ̵yeUQTUXI>69<;9B:575. ('(154;;5-("!%!./# + +,Xu~|xutssrppoha_edc`ZXTK@8,3P~Ÿ¾àZ;.=dɚV)/˞hIR]^__\\\\[ZZY]^_`aaa`b``dhkjhf]_|ǼͼzdUQSUWPE==B@@AJRUQU_b]RI=:>A:0*(%""$$$/+?ٽcq'%I=76;;342$**++! &(% "#$"   )ax}f[dy͜^A5539=71[ͥ}N66Qļƶ|~Ǻ½þȱפb3(  ""ED;42,$''',07HF>0% !&10% 4^y}}yusrrttrpnga_adb\VTSME6&3bƸ¿ƿ˛@+.Fiשl3 %J̥۱vOPVZZYXZ[\\[[Z\\\]^_``aacgkkkhb\_uózdUPRUW[QGFHIJJRY[Y[ejf\TH@BD;01.*'$$$&*"0gİthilkhhdacqόSޖZ$(@GhݮcFAbѻ>"4?A@9@5'"#&# 46652-("&0:<;7<<444(#)-* $')&! !$!#    + + + 9tmXWqǞf9*)/9NYO26kӟ`>5Ck̽~üæ·ҬwE)   .`͡k+$!%  +'06=A>:61.014:AFKPUW[]_ciup`O>42-/122100..-,*)((eKGSUZ]ZXY`g`ZG11EX`trk_SPV[VP@( +    +   (,++&!#).029AB?;;=?EJPUUUUVY\_cehlonotzz_OI:/.,*.39;;@GVOH@3%&0FJIA:5/()% &)*,,:SXM:)  "!"#)10) ! 9b|~}{~|wrppqtsrolgb`_a`WQPROH=.>užҶɼźƏ6")FlԽ~G&0ImקuQPGNZƒSLPSUSUWY\]]\[^^]]]_`a``ehkjhfa]`puhqÿ̿xdVRUWZe]RNQTTTY_a`ahmme_VPPNB46.)''"!IˬfVF3)*--*0+(+5JaqU|M,&*L弸^MDLqЍA# 4?B@9D:0*++%"68631-)&%$,9LTE<=;36:5+./*&)*&"     +&F~u\TiƝd5-(0AB@>>AGLQTTSSTWZ^beilomnrw~w`UP@69957<;1&'/BFMSLA?ENOMHA<5.(&"!"""!! $)-,(8Yg^I2&&('%! ! """&--)"! 9b~~{x|zvrpoqtoomjfec`^\UNNQNHCAWԪ˛j^k{Ͷ¿ĸſֶ9#FsŏR.*JoT22;DLrΎYLIMQPRUWZ\^^^baa`abde_aehhggdeaalmXVl}·˺xfYWZ\_leZTV]][^cfefjqrqonljcQ@1% $("'##^—iF9::5/++,-+.5@EGC?>AQrzV?2WӜeG;0Tݟ\8/;A?:177661-)(7641/.*)-8PtOA>>8:>843/("! '*)&#!  + +  + +/PygZeyƩp:""$7SxE(BpJ20Xǥ˾ľɿľÿƿ{ȿh,  ! +1`jE#   &/5@DDBBFJNQTTRSRVY]adhknlnqu}s`ZUD;@BBBDA1 (6=HSSLJMWUQNG@71)'$!"   %*.,$6\sn\@..113.'(.2110/+*.22/%" 6\y~zv{yyvsqpqrnolgfgc_ZYSNNPMFCPs̭rXHO`өi7/>FX|ȡ¿¼ſĚg4!Iл_, 3\xE*1ZnqxךcOFINLQSUXZ^`afffffghhaehjihhhfdaggRDJOwİʹzk_^__bkg\VY`a\aeihgipuz~s^I, &.)(##kԿxV8$!('+/112101:ELJD;547E_ęܶC61fͤݝ_K?$DݫjA08<=930:CE?62244410-*'$,4YaLDD=<9020)""#"$')(&"!%   + +   <[~wnot{ļS*)),GrA,MoL1.YxaüéǻĿƷŹͷv0   %A\g]B+  '/7=C@;51-/016>GKPSVWZ[]ftraO>31/0233321..-,*)((bB9ACDEFHIHHECCC7!  .AMQPI?- +    '***)%&)+05>>@EEDFKKOQRRPOPTXZ^aeiklnqs}sc^XE<:89=CFFE?98;<:6+'" 0Rs~xrwwxwtrqprpplgegc\WWSOOPKB?X|֦v:-,6;K{M,7NEG]غ˾ÿԬwH/,^ص='Mpt@,9{tpUFFJJQRSUY^bdhijkkkkjiknnmlmnilgghVC=>Wɿpgec_`ecZRW_`Y^`ddcckqx~rYC*! *.'$)&"y fG..65,(+.38:;97;=@CDILOQKGGL\y}>)%*6ALPJA8703774-$%#-^dMD<:90793' #'*+(# + + +  &Kkz|xtƫpC$1::\حo@4\`A/2c|SUǿĿȪgSKP^ƭƿ7    +56,   )17?DA<41,../5?@DFFEA?@A@>6% $7CI>3!    %*+*)&'*,15A@?DFDGMKMPQONMNSUY\_cfiloqr{whc\GXv‚D+/BRKDḛx?,Ed\PNlȿtǾʚ^0/&@v֡j+;mߴr=.A˝izvWDAGHRSTUX_dgjjlmnmkjnqssppsuu{vqqePEFFdƼtkhe`_`_WOT]]VX\``\[cjqw{|vfM7& %#!-+"(Ĩ{T;'!(*,3446<>A=:>BEGHHJLJGC9-/FavלV66aŕ[8%,GϮT1/3:CC9ALQLD:6.49<8."".kˬXE:>A=MSO<*#!(-0-&"    + /Vwt{|vnœ`=#4:9bd?:f׏K6/;p];RǿԮWB822>UľƧzú̈́;#   +   !  +!)17?C@<40,-./4?<>JQC.! +!-+ !*-0,+((*-39;@@ADHLOOIILLJKNQTX\^aegnosvzfhUJO<;0+)0BLKA=Iaqt^WRQQOIC<500007AACGJLLKJNFED:6NnjPEEIROKIHJNRSNFB?>:40' Fg{wrtttstttuspmkifb_]]ZTQMD:0NkޢW!>vg>wĦVC?myOX׽xP23Iwſú˽wG('4X|6+Xܼ}>,C߭`xpXC8>HRUVVW\afjiijijjkprutruz~{zyqeob9Ivʲ{rjb\YXSMMQSRNNSXVTT]dlkie[K9,!  &J߻N**0)!)2668:?BFIKLJIIOSLABEC>4//23Ccӈ:-DڮrL%3]lC8<=>D<5GTD?C;-36321'):nУoTOUam{|T7$!%,/-$ "    + Gk}u{ywuspnoqI6/&$9rߣZ@;772--/038BHORVZZW]jzvdRB:84433322200/.,+**Y6,.26@JRTQMJLMNW\P=,  "*.0,+)(+/5;@BHMNLIHKLJJNRUY]^aegnpsux|qiQNS=BD?NWHELK983./30'(#9i˥c>)"/(('*+( "('     +&Qrty}ume_ZXY^`{I81-*2\֡X55<>AJS[^[WQUYZ_cYK@4" "+.0-,*)+/6=>A>?BHLNKHGKKJJNSVZ]_aeglorvxz~}eFMU<AR_`XTRRTSOKC>;\wˣ`-2.0:OfpqkcQ?9:2),[\EgueTE?AA@JNDAJK:7.().0,,26ABh¹\5%",3-'$&%  %'&   +  2^ysv{~wnd[RNMNONkV;.15/DvŚS4=rα}MEDP{fRIXݰՍbSܺt?D\}ɽIAݭhKCKUuúž~ǽ¿׸I + +   +'18>A<772--/048>FLOT[]Z_iwzfTC9855544333110/-,++eKFOOPU\``]YNTY\]]WOMJ@1 #+/0--++,09@BA=>BGLNKHGKLJKOUX[^_begjnquwz}`7CM=@EJC=9/-;FKC31BPSXVSTSSPMEA?@CGLPRQRUW\`b]^THGWglziWKGNRYbhmorsod\VOF=-% + +  +Mmz|{yurrrrrtuutqnmnnmkje[PJG<1)/:=Cfԧ`"'TݡO[zÀQ2krQߵK!E`6'b£o;!"(-7c㿊G (5LmբU/B}{זaQ?/09AGKMOQTVWWZ^aegilrwywvx{|m9kѻ}rfZNINLIMU[[XZXVW[ahmdVA.$ "##)$3̦yV)$,,& &9EDBCJPV\bgnt~zsmgc][VNA85,%!"*33=Nc~S454,#(7AAA8139@DHg_86Zq]H>=<;@B><<:.00-*+./>G\kZoȧtG)'5+$"',*'  ! >h|rux~zsc]XWUQH@VnC+062CoL5Bp|Q8Ia}˟K?DhȐoJYբe?A]Ѥ\Iڼ~TADiοº̸̣U    +)3:AD>972-./049=DJNT[^[_fsueRC9755554433110/.-,+q[Ya^]]__\VQLRXXXXURPUUL9$ $,.1./-,,0:DEC=<@GKMKHILMKMQWZ]_`bdgilqux|Y-4?EROI<>G@6=>C9'(=PS[XSRPQONKHEEIOQQTW]cimpqfeXII\jluq^PIPU\cimnqqmd\VOD;-#    +&FetwzxrqqprrssturqpqrpnhbWMJE9,")997]԰m0%Lܩ_gy˙d,]}Vդb50hT7lpԦP-"&()2kբj=(11#&Eax߰`0;΁xՙbM<001:@EHJLOPPRUY]behjpuxwxz}Dd̾{qfZNJPONRZaa^`^\\`flpiXA, #&&  Hʤp=++11)#*>ID959=@CKXiuujebaa\RI9300.*),!.Oxo>265/',>LONIJV_ixb>2LkwgM=89;;=@:-$'14/+09UfԭăH0""1-$#1?EG:/$ $#   Jn{yvvx~oha^[TJCL|L!'1?bÍ@/?_sqaQAG_ٛG-DFA;82./00494#)F[^[YTPMNPQRPMNRY[W`emtxyyxnlaSR_jktxdVNUX\`ceegd`XSOI?6+    !@^mswvrqqqqrsstttttutqne`WOKD5%"9:7gۼz<'EnpԦq1Wۅ[ѼʔC6OW@tmrВe8*,+%&7{ňN58-&&''(-9KZjpy~xrpnjb\MGA=6)##! -?Nyh;..6BO`sȦc7)>o|~rS><6@ADMD/%).11)'3Cnϋvګ_+'&%1;+ (C_qxdU?-$#%%! +  ,Wqwt|yx}{oe`]ZX[]&*DdΊ5+9EB72:Hr֒J"7ɼٷ{ٲ\^ۡjXHEuOWتrDChƶs@Cè~Ƚp%!    +   (23( + + " :XgovxutttttuttuvwxxvqmfbZSNE1 79<{ȂE*C߶qnآr:Yӏhʑ5@mQI}fc͑[.)1*$+O̱w<3N`.7py@7dѼqusG4<;+17:=?BFIJLORWZ\^ejnrsw}T`ƹzncXMKSTSV_ca^bdec_`fkj]K:.)&&#*Ljsc6$2::;941330230*$&.6FP[fp|wqkgb^WMC<4)" $%$ @}Y18aƘF Ew\EIF^gl{wecfW@0%)=Tt̪fQfⷂM6@GQVJ0"1VuZC2)#" + 93./0159KLE;9>FKKNKLPQPRV[]acbcehoqrssxcB 4ȯzL_x^CH<,5Ra[XTMGHMTYWXXW`kkekkkjd]UQUUXZ[]bgzob[db]XTRPQOMJHHF>4& !#$!6Scmwzxvwwwwwvwvwyzzvqlhd]WQF.68Bʝ̃E2Dزokۘk@ZϜw{KTԟ=BzљMQR=26/7:09D9EGINRUXY^aehjpxneƺwlYNF=DHIOTURNRSUUUVX[``V?(&`r[A&!',..369:=DMTcb]SE7-'37@MZfotyri`VJ<3.)((#!!$%#0=TaNc۩_?&,`}t}c]iKDVy8R˳dHS|rcroJ-Q˺rG,!  + .Vsytt|ywx~ummqXXlx,((AUwaC3By͞q͜y<+:}Ep̕f>HeݴgOçĿ¹䵜i_TQPSuʎC   +    + + +  +!6?HMOOH@:5/01249:>CHLQVXUV[afgecea[YY\_adffaZWPJEB>952224210/////..-,+**}dTQWXWXYYVQNFGJPX[][[WPNLNPQXZH$   +  $(-27>5,*'3ayUMJEIDKKKLLKMQUY]befhjmw{zww}~{f9)|Vg|OT\YKKTPUUVWPJKP[`cdhqutha[^gkje_YW[`cglzi__ejntvqjfcYNHE;-# + '$+=3&%)>Tckoptxzzwutux||{{|vnhe^UMA,2Wu美>`g9;xУ[nz3@q{[|_"%IٲdWjƪRl^6Nyʱ^2+2JwػX3)Oסb"&qտr9Ht`z֕N49:50(1939B;CEIMQTWW[`dgiow}~vȻ~uhRF@9=BDJOQOLEEFJNRTTb`S:% + Rna_]R;!"*14568'5iz0Q|>5mǘWsΈ31ZjQ~f;x^Ry]rqA@c|srҦrJ-/dҎL:}??^|ZߢY549=/%-988?>BEHLPSUVY]adgmu~ͺ}raG:627A?@CJSZ_`aa\UK@:6;9=Las|~saPC90*+%$''#!#"DTOTfijnc[\aj~Цb3*?xiͯl\\fviU]lj~۱ãϗebp{M(  %?^oqrvz{}vqsxrkl}}*";}r<<-4QaRFN`rT58c̚aTq֩ZBIrƑNTˏwzyxƽxLNeppTBH~̦V$ + +    $-=DLOQOG@951343479=BGKPUY\]^__[UQFC@@BHKMPPME@=83///0111110/-,,,,,,+**))(x[IIRIHJNRSQOQQPRUYZXWYZXSONQDJPI1 + +  &+/3672-.0@hwTMJGKGLKMQSSVZ]`cgjjjlnrxzwvyV(WβhkvXR\je^]YNSXZQGGNW[\\_hjiiknrqokigeec_]dmt}te\YXYWZbjiea\QGED>4*% ):5)&8E0$&!!/BTainuy|}zxwxy|{yyxtmjhcZN=$5qk-Q•M8fQw֔7(I~YNz.2mʩmA^ydeowL7O¾ܷTB5Avs<-YψL?Leb`d8/9G9.,576;BCEHLPSUTVZ^cfmu}ƺ}p\=0/-49>CHLMMTPPU[]YS[R@*bwcgbI"!.8BJNMJIJNPNLQPKD:2,*13;J`vy`I:5204,)/4532" =PSZezZ@;8FI^ճwG),Sk_ЈPVM=CSwƶp_˛ӮiZmC56@E\~F(++   + 'B[ghmt~~{wxz~vr|z%+Ic49'*?I<6?MU輥ߠU;6MzƯrG]ÔI6NխrI`z|nþÿ̦yTRmhA:aկ["&  +     *3>FLMMKC<842443358;AFJOUX^_`aa`YVKIFHLPUVVVQGA=:4112210.-/.-,++++***))(((x\FCHIILQUURP[YWVZ_aaaa_YQJIKQW_^H!  !(-02653/14CfmMHHHMJOLOSVWZ]adgjmmnnptuuuuylE;tŭWH]cUMIMQWYQIHNTXYY[bfeow~|qfaa[WSNFCKVafhbXQRV\YQNR]`]WRJCBE?4)$2BB94=C/"%!):M]hnuy}~|zxyxzyvvuqjcec\Q?# @җ\.TѲ`>YuJ{ؚ=&=dgIQƺA ([ÐIKVGZ_D,<Ⱦݫh=:CbҫdB3UwЕ[A:GXvq>,9QL@1.216ABEHKORTTSW\adlt|»Ⱥ~nX8+,,28PPGTrloܾzrwXպкrA2>aûĻz/"249301100349?EIOUZ`abdc`[VMMOS\dikmmfYNG>7000////..-,+****))))))))tZD865:G\t~pg`\XPNNPRSRQHFEMSI*  "+0236:6.+2GiZ?BJNUPTQTX[\^acgjnpqrsuwrpuwux}hC,5vxSdqs]Waa`dcTTSWXTSUSWXY]dgfqssngdehkbVI<3388;===I[ilh]OEGHIJIGDED9,$$#8?GFCIK9! )>Rbjotxzxwuuxzxtrsni]_]WL;! 0Zͣa(JԂH56LPTӝK),.:W˹{@#:oƛY>(&2lvZK8.9,7ڤY.3JѺ~8*3sǮ\mw5 7uБS/7TlhE',217>ADGILMNKOTY]fowŲgO5,..6=@BCEHJKLOQOKE@0'(q}wlY=#):HRW]`[TH:0++-4678:?DHRW[`h~tR=665&'.8<;:<@:3)%?Xb[jS=8C=Qm±P-$Z}Ut͍J@KrQ{gkaWAV_`1J}D!%IP:)";bO)%#  =Zkmmptx{|}~l]lk)#FʰŽԼJ?FoaK69Ӝlgƻٞe;"2VpygYh|V@\಄SZӻ½¼Ž½{jϸvIJYȗaOTbĂA' +  + +  &.5HORQPOG@:3-..-/348?DJOUZ`cceea\XQRV^iu|xvpbTJ?510/-./01/.-+****)))*****r]J?;+/:Mh|yvgdbcc`YRJC=CSW>#   +#.3546761/5FayN7?JQYSVVY]_abdhgknqstvwzsqwysprQ,KS8J`ZeYRZfdX[gfYTRW[ZWXQUWW\dffnidbdiorxnaSD612/39;BPevzyn[KECDEFFCDC7*&'$"'$(;BGC@HJ6%qκI&TV@*)&NG8719N@EۿhoԞk34@ѵS]{3!?כ[25PoqK'-735{w[E0$+1*,?NUZ]`\WLA89?FCEGJMT\bbbcfrz[H@==A91.)*1:=<6.#!4Ulfi~pI>=F:H|Ɯd:"SuwƺʐPBQΡ_sjioƻJLQIh|K->ujE-%9{n?+  $BaqtssuvvwzfP\d)@ζĽʰw<8HʙoO7@āV_ɾΆW@$'AOX\sq=/bɊeSwƦµƻĿ»ud}ƾͿ|NJIԲ~`OUE*    #$(),17=HMPOOMF?:3,,,,.348>CJOUY_acggfa]TV\huwg[MB641/./11/.-,++++********s[MJM4.+2Fax~ucQNNLKT\TD + +%.3567:3541Df|R%?OXU\VV[_dfhikkmpsvwxxs{xnqzo\7%(7?FRUSXZQQ_f^SNHRRPWYXZQPSZ_cca`ZVW_jsxvvjZSRI:;9>>?@BDFHMS\gnv~Ⱦ{^@,%*35=DHKNRTTTQJC=4,! # 6{vXNA+!2>6$,CS[\^^aa[QLORSMQUXX\chokjt~dRJKQWN<+ #(/:?8+"$:T_`oa99++-Nî@1F_ŮüՕNESzέln~𿔆LdŀPlɅSJ_`8.^on6  +,Tmu||xyvvx~t^NX{]("G˓a@4ZmFJYs>lbNL,)/8KpܱO%2ahYԶ̻Ʒ±nbx¿–bKVӿʬ_BUŠU,    $&),27=BDFHILMMJC?74/+,.0149@EKQV[^adfec`]X^fsylXG>5,++*+.0.,*)))))))(((((t\MGH3/-5EVaevrfUXXRU[WN0 &/3579;2244HfvI!?PZV^XX^bgjlmnoqsuwwwxvztjlshT1!  'Jmrc`UEAIMLMRWZVNPOQV^`_\WUQU\gos~|rikndSEFM[kzsdRIOILP@30,.---/14833.+..""5L^gijlkkmoqtwxvvvqjfcZN@- 8?446+!QƑH+1op6#7kخx?':@,./KlsaC*>Wpxszͯ\>>_Unǭe8:U׵V=31XlU677089;====?ACEHLR[elszŴz\?,')/61+CT\`bddjmh`WOGMMOQVamtwwyl]URTSNB6/,+-/8=;5, 1HXdt\97,*=q\0!)CpıæܞZMW{εwqÄu㿒fSUwYqӄYfǎWNk`18QD +9`y|p\OWuS-,NLjU:8dfFRkl:l٩TAH8;DUt콇@"*Wo^mŬƺü÷g`wɨnuپtJKpk1 + ""  $(,/0026;BHLOQKKJKLHA>64.--/0159@GLQW[^`cfgfba]cn}{fSC8.+,+,./.,*)())(((''''&s]NGG=618ERY\Z_hs~pxyma[WQG2 +'/2579=436:Nhu>&1GhµƤۤcPTvɹs~˒qyږoE.,Mܥ\s]g˔TNrؒM*=P, +Ns~xm^TYmO39ZŸƁK9F|փT?Uza5pНN6?CUdZ;-)LfdZlĵ¶Ⱦ`^w˻ٸqIBrʭx7 !&)('&+28;;:8:?ELRVYZSRONLG@=74.,,/127;AGLRX\^`cfggdddjwr^J>3.-+,.0/-,****)(((''&&p\PLMH<4;Og}td]ZWE$  )25567;69FJfzopYOWbggieachmopvz|~~~{əM/;oƸuT4.,*9jΦrUNNC9@;JR@1.%*.4:?CGKFGKNSZafmryѻuQ:1-)(*-023544564-*& +Gnpb\L>62!%AC3(7L[bgimrz}{{~~tl`TOH@<<;62*/9CE9 !4OmfM24@MB>`{xQ690A}ʻʕѥhJHqȷ|o~Ԟwluהj<%'=yܦXnyZ}ʂISxޱzE9z~]C +"Eh~wlb]]fW1:a͹{C9XqF9WתW5vѺM06OqڄBF>(?OYlĊcgĸsZ^wƼƛdMHȶ; +%,25545;AGKLJJFKRX_cfgc_[VPJB=63.,-0137jÞYpxs~žkXSNQX_bca`bgmtww{wwxxx|ǿӤ`;?mic`?5>?32Sâ^]pylZRANYB44++.4;?CGIIKMQTY`djouz~־sN6-)# "%$"#%%! 5kyoh[KE1)"&1962.=;;@GMG7! 2Op^L:>Wpãg2)]_N(,nί֐ͬsG63/-.1449=CHMSX]^`befgeejq}ĵzeSF:42//133210/--+**)('&&jVJCBB?=>BPqĻt_WH5!  !-6874312;BLf{~80HXZd_^_afnqqnmnpsvwwxvuspaG/!##!!!  !+,)0JۄZJPLMVTSW[[WSNOX\cmy|sle`^[WVZSGBKV_lxnVJC4-13, +&,,% 7N[`glljhffkoqttog^VL@+?şk?#VD.,9l͜e>($7Z۽hjïtbSJVa]OHLTm|zrhbdoǶ׳S:F^vlFH{MEZr`K3:`{aW]~yb_aK;8-038<>ACDLNQSUY_chlrw{ƱrL2'"Dssn[JE#);@4)+/=P^fow~{vyxpndVNKMOPZ[^[M6# 3NmeO?HhE30?{ϣrS'+m˺ٕӺK8fˡalЎw{Å<$/5WձcsRO]4uҬf&:`_ +2kxojj`Zlo&+\ҵk/6oӨcHBe‹SNgI8:+7v׼b24;:853466664310.-,+*)((kVF;7?@E@34Puþȳvmp{hUI7   $-3565685;EWtz6 (AV\g_`_aempoklnprstsuyxvp[;$ !!""/2$IoJIPNNUTXYVPPU^cdddfnw{xtmgaTJ@92,,0),,/CeyzjUIE5---" *)%!-FTZdikhecejnpqqkcZRH;# LɞnA3LƄRKDJTWWPIM\krmaRGACGD91168852(  '1B?3Hv{gQIF7,+(/4)'AOW`gifdadimnnng]YPF8 RęnV\jHJQewvfPFP[cK9K\j_Jkĵ_T[[QJCFKVdt~}|}ytiUD@IRShνȞiNIG3;8DUnì~UJMUdzQ1+06=AEIJQSUWY[^abgkquzeC*   + !" &X|ni_XM;8>GI>/*.6DS_gpx·yp~{wxxxqlgX@+ !1AUyDznKOěQ&7VyϐX=2Sɿ{ܳ˹W:Z{WِfbQeөjNI/=}ˆoPMK|ۢm?<_<"&Le 6z~ymjk]OaǢ_+=bͺʪX2MTLKmiOdêpMTA>=Q֫L7!W͏D:>:Qģ|\MMMHHaŻý|TN_v}ȩ~xf]}ȷX/$%"%  !!#'-4;BIMQU[`hls{{p_NB840.04679=BIMSWZ]]__^^\\dirvcXPGGFB>><===<9763210/-,,s`RG?<@KL<5EH44BUdnv{¾{s~sgxtnn^>'#) #6@JjpwʹyJ)7hܲo?0>oزخÿ^;GpSؘiMOf߼Ϊ}_I1[ѮзR1VߥoSHNc̋PGse\d_9)7EV`:8>rسr=.FEfҲbD51AC:<;[ļqOTas~_Q]ɸvK""+ #$%(-5;AAFJOU\chry}r_J?;7313689:=AEINPSXXXYY[[\\`grzkcWSMJJJIH@@??<;885521.-**viYI931,*NcJYO" 1VeZ`_`cfjmmkoqsqmklr{|r`E+% -9DGMSURRZcji]G755* ".+'!+90!*CHLQTYZZ[\]]^cegmqvy|ڻuR' *}vsmghgZIBFE;=UZC3BUgry}ur}ni{voo]=$!'%-<@EcӰcA/@tēW0)G˞ҥʟU/Al|bӛfDXݱʳ_G;AUsg+=pθf:Gxd:(33-')AgnV Fy{}sgejr߭cD;8[̵ˬK6^ܨsRELcdEIlsgt}T=>@LDZbA:DXǐV9-=Pӫ{T4&/DWZQK7BŹѹoHTdq~rVXƌ\ '%& !$(,29@FJLOSX`irw~{saMB=953589:;PܬxgWH+ +4>E>39>4Aix;*OfZYU_fccjmkoppmiils{ykU9#  $&.9@Uz;-.CGLQW\]^^^^_^^adgloruw{ضnK! #0relkc`bXIA=93=Z]D0AWkw~xnkjovʶ}enzsp];#$+8HECY||H45QrE13cąoʥɥT-@\eryΣo;aۯĵR<:>E_]2i_;9[ŠnA'%+2:S{nR .Q}qjo|}rd]]_n}A7Mr޽vHG2;_нM1$'IsxK8qؾk>SgnxٿҼZNjϩs#/' $&+2@BEFHGHHIJKKLJLOTX^beijhfa\WSKHFDDDB@AAA@><:976531/.-w^NGFA:IgwwE%/DeưjTBNjəgQK_꽁gPT@ !-6AH?5::3Hvl5 + FbXUL\fa^fllnnlgdejszubI/  .3=c֦a8.7D?>FUYRQW^^XJDJU\]VSUY_irouzyof_^T\_WXjwtfP8$.A@8;=-(;Sab_]_edb`^[YVO>2 0y¼ϾeD0@kݔ[=DDl˫u.Z۾ʱwB037>WOFp}rL,+TԼnPBBP_Y6!9U|~xqov}zrfXPLLW_akX9=CaĽשyO^V=jϸϹe7Shks|o{bco՟ZH[,3(#*)07@LWageegmwvuqfTIC?;::=?@??>>>@ABBCCDEEGGEFHIJLMNRRRQPNMKFECDDC@?@@?><:8755320.-,rPJKGPM4 +!$07@H?6=<7Rg?:YTTJXb_]cjkmlic`birwpZ?&! /,(@bH.+7@<@KPOQY_`]SNS]be`]\Z[dmnqrj^SOPVekfdhqymT5+:><>>,!1GW]^^`eb^\\ZVSM9* 6ٽeF9AOVPTl²y]U^k´CCFILTZaacabaa```cfillklz⺞dC" %"  8rhmmdZVNDHGHCAOJ2.@Wkw}slyrUIDUtwdegcbhxxmW9%!$,=QSLO\ڗVD[~I3?WqSʼĮa447B|ǫnOΠ_7.*,:AOVK9*)6JJC*<{ͺA!>VsuvzqlaVKD@?A8-<<*($H]}úشrɢmbfR`eYC)"1Hz㿞tJ-(+)577>OZL57Hqõ_@489QߨWB,,K{־t@f˞ypưa4PfjslOtq]YVfӽ߫^L[|ŚA#3##(/14:BO^lvsrrvxknpiYMGC?=>@BDDCA?>?@@@@A@BBCCABCCCDCCEEEEEEEFBA?@A@=<==<;:8653210.-,+cRI@46?>:.0N|[GBNND[הXF?LʼnY=KQI. +48>D=6>D?]kY% ,JLTNS[^`afjkifa]_eoriS7 ! +$,%-FsP2(3B?>@ENW_eiib]`efcbb`ZUW^noj^OEEIZkrrqko~nR.$-6<@?,!  %7GS\`cd_[XXVROH4 + =ճiJ;?KQTZožu_ND^´ƯCDEHMSZ_bcbbbbab_adgijikx~ΰY9%)%! 6wtnjidZQLJMSQLSM73BWit{~wz~ZG9D^ryyi[HBQeg\q~sdN5&$)0?SYSSYeoϯyƳnB0CmӼkYӶ`(*=a§gMҲ|F9@4+53& /QSK2&))0g˿c.#DYnow{l_YPID@=:/12EB*'#,3Ki˿kJGbĤeTJG>I[vj61:^jhY?11,'1\ґ>4*5eͬhCmܱxLDaּ`6K`lz`<^n[NaޮjW]oªb;1"'-369=ERct~}{re\epmaUKIDBCFHJIGEA@@AB?????????@AA@?>>????>?@@@>;;;;98:;;:8643210/.,++`G9246+-6T|mL?EBKW[ųvQMMfʝu`\^W<$-58=C<5=F?a; :ASUOS_d`bhhhd_\^cnjaJ0"#!!## #;WpE2)8CFB8=O^eouxtppnkbbbb]]guvdYZbcorwto~hH" .:DB,# +%5IW`c_[UTTSNIA+ E̮iSICMYX`tƿ{X:=[ƺ˶BBEIMRX]`bcbbccc_`bdfghkrxxIJX6")*&"!0W{oeml]QRMQXYV[V@;IYhqy}vSA15BNQSJG95Lmvhlv{lYC0&'-8IZ^[\cRWfr¹׵_E;WȚ_`ִf+,LҴm-Oҷ}V;OndIB9(&#M~L6?RfvoJ+$L_nuxk^VRONNMHDCSavkPSY91>Nhvx¦̼ô˺~;0-FY^km\AEA33:2%4e{?0.GӪSNբf=9Orлc9FZp^3Mi|șpNG`թx_T_~Y/ $+16:>BKXiy~ZNL[otj_QNIHILNONLIFCCDEDDBBA@@?@AAAB@>=>>>>>???A>:989779;::7633110/--+,fD87<6#$AvzB35KEJ`w־cEF\ӷztdJ3*!-68=A:3:C<`J09R[LM^f_^fgfe`]^clf\E) $%  ""'&  !OJ/+%7BKE68Pchu~{yvpie`]]f|neiqwyyju_> )8CA,% + +AVac\XSRSQJF=& J«sLLQQXdcoþȼg@+Ca½ѽBDFJNRX]_aabbccc`_`bdhjlm||ruƬ~^8  $)*&"! *@fugstaTTZY^aag`JAM\gpxy|cTC3//.049933NszghwxfR=,&)2>Q^^\cn[^`YZhڬmOEChŵ~Q^ѽȧn94X˔u7IuͬRABpw]E=JJyĩelN@J]br}pm`\G )Thtsljc[[ZZ^bb\WWhty`htVBEEHMOg̫ݫn@2:8-9G<>BEBDE6'Dqɕk<(*Pӷ]@XϘ\88L\~­eCIR^mz}|{J?AVoxpfUQNLMOPRPNJGEDEFIHFEDCBACDDEDB?>??AAAAAADA=99999:;::76331100--,,zVJE.$6fW?;?N[bsڡ^80Gzپ˶h@/# + !&' -/5B?AO^ix{woikknx~uuz}pkJ( +"-<>)$'" "5HTX]QMSSI@@. J˱ĺX?KZ[Zru¾Ǿ\6-9dĹӵQFGNOV\X]`aba`aa`bcccehlqfqzw˪Q- !$##%$#!!"" #&#$Uwsm_TQWYWXdmcPDQ_jov}~z~|n_USF3((,//0-4HZj}wWj~reL/&*,:GS_bciphfe^KGhְvT8GnʢgZme9-cǓ}ʯv=4P\<:86465420.-,_L>)!1ZX@BNVapȣk>@XtʹNJfD5' !!**"/.18?A:66?IcknkmvwpYJAAG]׽ܡkjpsvzI.5JkdK8-3Mcglu`WWlahw[==8QȰgCJTif=47Lcvҭ_PXl|`LERn{7"!+3;@ELPYgsx|yxw{h:&(Ghqb^XUTUVVRPNMLLNPQQQPNNLKNNMNMMKLKJIJLMLKKKKIHIIKKHDB@?<:=<;97532iO9'0MU43HSw׺mG9^檄tZD:- + "+*#2.,4BD\ylhn}ok`A$%/,>Pahdaemimnmhea^axՀXFHFPO:3@ZiU65L]XUA4,)RѴQ#!+$8yˤnPNxrS8('#!&+-/-($ ,Y{mbSU]cgjt~~usuurjn^: JWaa_dgd]RJ@.+LvοŻ¼ľ΢Y9A-;AHUP=2/-/598:?JUoÍpXE0={ڶa@HSaw~gL84HZfuԭvURVQ_bT?9B]|<&&09@EJQV`ox{{|uwwyz~za;" ?cuhea]XY[_[YWUSTUVXXYZYZWWXXXXWXVWWUTVXZWVYXWWVVUVTQMKJHFDFECB?><;rQ6*Co~XMP\oaAJfŀUp_K@:, "**#4-*/8<7449Lg|T* +9HTWY^_[`cdbdd^XH1&*( .)  .% $/5/5GQMNYbp~\: +  $'(&/5'!'***& -9GMMFB?2" "#IͮѶƴZSh^[pzqN-(?dӿ¿ݻl[PNP[\PUY[^^_ac`bcccegjm{pqôyG '%!!%&"$$!$ (Jsn_WQV^hrscRHSbp{tllouzyuqif_YVUSSNOSTPPVaZjt{zwml]=!%1+AUhld`chqurlmsqbMQaw緊i[PMI;+.7?84JhO=??:/'IٳkN:0)"&@kưpF475CNG1 %&%#$)1670' +2_ymaVNKOT\_^ao~}l][fospgO1>Rb_WV[_`\`_E'(ELPV[es|zxwyyzxvw|{tsy^A'#?axmkhc\\aeba^\[[]]_`_bbcab`a``aaaaa```cdcbddcccaa`]ZVTSROMMMKIGEDCyS4.Px}|}jTJI?sød^ĵUF>:+ +!''#3,(,47529( ()$"+& *0$   +';35EOKLUaniJ/   '($)/$ (-00,%  +>GJD>9+&'MѬSSkaa}¿_9+9X|ν̾մubRIJX]RUW[]]^`a`aabacehlwlvw> $#"%('"'%""-T}|`IJMU`jk^PKXjywkb`cnyyl_HKNQSUVXhqpgceZHRhty~trniZ=#(3-EZkla^adlttmp{{jL=@SuݼyiZB4*8OioKP_W@0K|л[TfhW>3Jz_QZgngWD711/"(%  $$$'.3*# +"4\zueTD>>CRW^_ZW_lsl_ST_ilw]D7' -IcfYPRXSPXdX8#"*OĹŵުtPH@>9>LOD7418Uʿ`jݝS)9V⹞`6DVek]4*Pis}~nT:.;GIP]vؼoce`e|ʿR4# !".:ELRWZ`iv|{xvxyzxuw{~zqmms~|[C,+Ec}~rqme_`ejgfdaaabcbcdfhiijgghhhijjihgilmmkmmmmmkihda^\[ZXVSRQOMKIIzO1/VxUKD=DWȷZ^ŒeVH@<+ "$$&%0,)+.1119:AINXVE@/*;JNPVZZ[^_``]PC0 %)&"%# +#,,  ):57BJKLRYcoziH/  %)&'+  )2661( + +5BE@3  + *.Vհÿƽɱ~`_lde|lI9@UqǹȮm[LHW_TVY[\[[\]_``a``cffjlۦh5',.) &"" 2Wzu^LHEIOOF?P`svke`[_aU>+1;GNLF?KZ]H" ;QWgsn]E2159BLTcѷ¿^7 "!'2@JRVZadkw}|zyssuwz}zustw~sV8+2I`vzvqjeeimjifeeghjfgilmnoommmoppqrpqpruwwuvuvvusqpkheccb`^[ZXWTSQPnG/3ZºY44AQpijɱjKwȭoOQD><- %(&#&),+*,,,.165;>;=?9<5 %1?HLOTXY\^__XI:% **$"(' #+%  &/47>EJLNQX^cgny{qO-  ")'&(!,8<=7-  !" %5B?.#*/Z۹ľտ̹|rljigl{xYIL[mzɴzjWMY^SX[[[YXXY]^__^_acdayȟn=& %+,)#! !"3Yz{[N=65788Nbxvkng^VL:%%2@GA7-)%*BU\\\^uyx|siQA:16CERblf`deefnuywobP@318F]}{;ֿ`@85@GJc¼~iTB71,*#  !!#$&)-.1+"  2kw[KFKVc_[Z\\WVXZdow|}siI6/=E9%7N^efibXNJKG9,!5`õٷfK0)9[lLivGA=c跜qI?=HL@0'+4DML]uznaRGFJMOQXnƾpB$# %-9ENTX\bchrxyz{qpqu|}z||{}~lV73BXet~unlmpqkjhhhjlmkknprsttttuvwxyyxyxz}~}}~~}{xwrplkjjggdda`]\ZZ|b>-6^{mlbUXQOYuƬ|b\cIH=:<0 + *-($&+()++**+086;>549:;9 +#*7DIJPWX[^^^WF5#*+"&+)#)! $/6@;0"  "% +<<- "!!$'+X¼½ιպrZhiemyÿdWWbnwŹѷtaSZ^PZ\\[XVVV\]^^]^_bkdüЫrH0 /1.' ;Xhs{q\B1,29@H^ysknke\OB841>MUSONOF)&4:FW[Xy|}nbE676;JPWdkfbilhsruwrdTB74887BZs¹̴ͷhXGP`jŦs_J;4/( %"  !&*,(%  !&ahNCDN\kdWIFILPT\bggaWF5712DVVA*(=KOPOOJDDC8(%Hkü͠{P2%)A]sxqhbZK>[ͅR8*Y߼}`I:AHFJUVV[XRduqz÷T)(&!+4?IRVY[``clrsvxroot|~xx{|xw{wl[EG[ns{ysrsutlkihilnonoqsuwwxxyyz|}}}}|}{xurppomlkjigecba~~}{yriU>5B_v|fJ841,)Lut`_fͭzeGCB=. &,' &0**+*(()-3655668<=5  #.;DHNWZ\][YQ@/ $)'! (-! &"$ #,5=ADEGFIMS\chjlrqknyztvvxpcTH1   #"!/9;><3# + +!#  %/30& *'*)7cлñֲmX]dlvývcV`psɺΰ~n_ZZY[[YXYYXV[U]edff[loź۰yN46:2 "&.?ZqwbF2-278AUqtlllkid^YWYSJFJUYW?/$%(+:LR[wvgUG64>MUW\djgcgosuyyr[D602022/2Mev~uq~~ytrpnwd+.(& .=KQTXYYVUXcmprtpmms{}yoruxwussy~xld`dm{~{yvtrolmopqqqrsvy{{|}}}}{ywvttqpnmjigf~{{|{xuh[C/*9SiqR*-?CKT\^^W[`bejgaihjottnj[M?7&  ! +58<;4& + #  %)*&"*(-)>oԿ͹̧jTZdn|}m]bpqqֶ̼~sd\]d`]ZZ[\ZXZW^fcb`Y_wƾǾӧuO6,#$$  $",G^kdS?1--03355.*+0.*2BPZyvfQG>@L[a_^dihipwyywpcH- ),130/4=GYfkrstrSGQQLI@60-*$ + !%''$##&)++%!  IwmXMG:/,-4AR`fgTF;??835210,)+17ESbhnpeV=-&-./12-$-5KǾҦxQ9/0?JLB8KxǎcA-Zܵw_ax~omyth_[w|ulhhihcp`*))& '2?JRX^`_XTS]glnolijs}|vhjmnnmkkqw}zsmvy{yuroopssrsuvz|~~|zyxutsqomlk{yutsqokZI3%)>[qwePKWfno|fWG-NrkeɶyUC5&*'#%()*+*(('+1420./1683$4=BHORUTQMD3#%)$ (,+ '$% + +#,58999667@JQQOGIR^b\VQUUVWYUOJ@6-& + +  #$'049:4' #!  !##&'+&IļŽfU[dqyddnl^ۼm[^lf`[Z^_\ZWW^gf`^`oƼǵ̔bA+%+  !)#+>T__N8(""5Gb{|tidhst[F>>?3;LVPA?HXa|~qcPKIO]gjg`cfhox}{si^L2 $,3456;=?CCCJ]n~jRIMyujȲ~U@9<;>@872+% #'*,(%#$%(((" + ;Sgl^K>;5$ 6M]`^H=7;9-"!$*8JXfotonokdYI6( 1sȾþиt]TTgz~}ͭɿwU=3bׯr}ujjkhcjhc[UOLK`fnu|zvpiillf`p~i1#%$$+5?IQ[dgeZQLUagihgeht|rababccbcinu|~|~ywsrtvwvwy{~}zzxvtrqp~wsoliea\F9*"*CgqdQ/jjU|gRC  !$'('%#)**+*((+140-+,-352 0:>CKMPOKE<+ %( %.-' '%$ (/3311.-.6?EC@??HWZPFEDCB@=70+-+' !%& "*/462(#"  #TͷŮe\`ht}gckhNŵӿֽx[Yikc\\`a_[UZaiiaaqܽۤk@3  + XrveZY`j{qnlYbpyqaXYgmsg\QOOV`ijh`bfjs{zr^SD5!&18=@CE>73+&.>E@93+#!'CUVZz{cSZNHB;?C;;5,$$(,-(%$$&'&%! +  #-=>GPRM>%!8JPO?5..,$!)3vΩyo]@0+.4:ALV^OT[ckqsruuuurnhd}{A%!# #%)5=CKWcfdZNFN[ccda`ds{nZYYY\_`afjpw|zvvxzzz{|~}|zxvtt}zxtpje`[UO8/$/SsfK?90:C9E95v~rnY'%"!#)+&(),,+)),12/,)(+141 ,5:?GHKJE?5& !#%*0,$ '##  ")+*)*+)(.4774749EG;34540-&  &)%'"$(.2.& !   \ışzi`bis~gcheJɹʷaWcke_^ab`\Z_agi^dĿʿ޶JK:! +  +.DVUG:+(8Oj~~x||~s^RSZq}vpmgcbksl]QKJKQYaefafjmtvobF:-$ "/9AFIH=3.$!/# 7M_xrdWOINFE?7>D<=8.&#')*&%#$%%$"   ;IekJ, %39:7-!"$2>N[bhnrz}|uooqprmbTC1  + !;n´ˎG+?auv`>&U|uupoabzȴx]MA>:77;BFPRT\bhnrnrslbagm~R1#%""$'+6>AGQZ^[XKCLYaba]]aqzlXWUU[`cddfkqw~|yxz||}}~}{ywutsxwvtsrqqmhc^WQKF7-$ /L]aggaYTPKA=:13>FeT*3qnF0Pm0(# */)(),-,*),02.*(')/4/)14:ACGFA8/  + ""!$-0) %#!  !""#%%$%&'('/,,01,'%%$ !%"'"!$*.,%"    cλnlcdkukgkdPξȹƿqbbgfccdcb`afbcgZjʨ`WKB3 +    *=KLIF:,*8Ogx|xsy{uvyhTNPXiz~bSW`gjisfUHHGIMS[bfhlnonj^O6) + +)5=BCA941+#!, 0MewraWROLKE>?<48;585,$"%&(%$""##!  %XvK-" '((-$#.6DN^lrsqooqtusttunoj`QB2& # %TöÿĿqE:AHHA-1sq`XPFGUs|raPD<73XTTWZajsmppdZ^s~ienqZ;('#",5;BFHLSTQRJFNZ``_[[`o~wm[XUX^dffabdhmsx{{{}}|yxuv_^]]]___]ZUQLGB<0$4IIJKIC<554-),/A^rFOhO/N z6 *#*3+(*-/-+),01-*'%(-61 %*-4<=BA;3)  "!!(..&%# +   "$"! +  !'$#),+$$"  + + gּbmjioytoodVöмvjfhiigeeeglbai`zɌVFg_   ,:B?AGA60?Shuyvsx}zy}iTFAAIPZfszzxeNHThstu{s[QIPQSVX^eilnkd\TG9& $/6986764573.$1KfwzcMILNLII==>521,.,&!  "$$""!!#"  + +7sT-  &$ '4?DMRZgqvtsklmrttrpjomcVK=1&  #HɾýǾեtM3% '--M|siUE;1,?Xs¾ɵzuld\TONPT`lz|uzbSYh^?(&!".:DNPNMNNLMIIT]`__Y[_kw|vn_[XY`efca``cekor~~}{zyCBBCEGJKPNIFC?:6  -@70032-&*+"%7>8/& +  "%,/,#&#   +  +     !""'"$('"##  hƽкӶzZlsrv|xse[ø¼peinojggjhnbbnj̾pV97#"   )4702<>63CXjtwttv{~~yjWD:2214=HHDQIEMbv|{`OOO]`a``afgfe_RF>2( +,35315637>9/"%&#/2Hbq}uY@>HNNLE89?7.,(%$  + "$$""""#! + @z|[5   #'*/8BJLJJMWeqvvtqpuwuqnglj^RI>4/% + + #H¿ˠoH-&.IXvíudYO;-&(Feyûof^[Z]kzmZ]ma<3& #251*.72#/CF+>QQjZbíXc|p2)'.*$"*.23240.120,)*+072 (/43310-& +!'.,"#%!     + + + + +  + "(# '&&%&% ! #"   2ļż˭mTrrzuikgǼʿkehosokijqjfiqƺ׻rF*  #+-&$-22?KZfnqpqxyy{yw}kL6-#')%$0=Nar{xpwxtgWPSYjihfecd`^SJ=3)$  &,15348:9:<< %("$.8HF@N^\WRKB;9:=?>@>:5/'"'# !&" "&#  +(ILF8-)$ !,2:?@BJORRTVW\cnwtuussrokijjf[M>5/+# &K¿¾׿~ȥoUC75,#5PiskP>C\~½V8&-2;GT\][WTOLMNQTY\^]^\]gtytmic^_bc_Z\]]_aeikz~} !#&*./0489875, +#043,)+*%/;A:FZsPi|bL|ȳU+"%(+# */234630341.++,070"'+//0/,$ + '+&  $%! "  + + +-%))))'%" !    Gοźʼ˯sWmx{kikżͿŽcdiqpjjpwrgdrĿཐlO1 +(-+!"(*=JYdjmnt||{zvsv}vbP9, %6Lfx|tkrofYMIMSedba___ZKB91)$! &,1479:8775)&%'$ "':JD9AIC?D@:31059ACB<5.$   !&#!$&#  ( !$ )3>FJHGLOOTWZ\^dmursqpqpmjkjg`WJ?730+&!!DĽ¿ƼƧbV8-(,%"@XdYB(%U}yн÷Z8&29>DKSUWXUQMHJLPU[^`_^_fpwvroolieb][\Z[\_bfiu|~~!!!#&)**-0110," $*042+)-4//4CHaa;vm~LGşg=&##&,&(.224641342.,+,071  %+.)+,-*# !()  !"$$!!#  +   $01'&))(&$!    *gݽ̿Ĵ˱~cnx{}|idrͻrijtumjpyrc`|ŻɥpH# #./+ %)7EU^aeiqttuwvuw}ukYM=2.1?KOiwoog[NEEHLPNNNNNPL>83-(%$#%,79<=:8768.(()&"">OJ>?C<9<<93-+05=>=80'  !&%#$%"   !" "%1BFOWZVSJGFGLTZ]]]_dlsuuuxwsic^]ZZZZ^afhsz~%&%$!#(,++++*# "*,13,&)4.*,EIqlTTk}`PjεP5% %%+-"'-114763452/-,,050   $(+*,+)& $*) ##"! #&   + + + + +  (//'!))'&$#"  + +  G߻Ƚ˵ƨnst{yzwd_uſʿѿ~hcr|umnncqſ۬h2!. +&-.," %+2DV^_aenqqpturtyz~yusmg[PD?AL\jpxpcZMB==?@:899:<=<830,*)))"   (46:;;987:1,,*(')>NMCEFB@=<92)'.6::96.% + ! "&%%%$ +  &  !%)5ACKQRQRSQZ_deedfjokkpssqqhfb\VOJG<;961) 0`y~ƹĸhG.#'1%$(,$(>PE$";QyƫʵôzA*#1WwbfCbȖY<4#%)(-- &,0048864420-,-040   #32,%#'% $! %'  +  + + +   '()%))(&%$"! + jڼѻϻymjlt|}ticc_`ddgwv^Xm~~~}}r`]sƼʼɾĽgZj~vpml²p"/)  &*++& !$*5H\ggffmvvstpjfedec^[WRLKC>DP]js~obQI?732/,-,,.024530/,*))*$"  $*.379988841-(#(/6GHCFFBB?<6-""+5::<;3)%()  "  #&&&&#  "' +$)6AGPWWUUVS\`ddcabdcaelplkmgfc^YQJE=;973+!+=Xd\S\ŷ½ǸĶr\@-%&,11020( %0:KB,*:KZi}tʻ«p>-!,;BG82/=OZ_ebYJ?;=BEHQZcgknoonlnokc\SUZ^bfhjjq{~|{)--'$,!  +!/--./0./+27Muv6cOFʩq8,1%-+(,,!$)//39975520/--043! $*/94*  !#$'  +    +  +   '&&$  ))((&%#  + + +  +  ~ŻƯʬmcRX]bb\OA76Mk{~~rdmr]Zm»ƺŽ~ghzypsi|Ӽy3 )*)*& ")9J^hjgdgrqpqmc[XXURNJC=6=78ES]ekwzeSHC<61-($%#$&),.//.,*(&&'%#!  +  '+38;=>=775."#/7DFBHF@?=7/%&/44791$!&)  #" !$''('#  **  $(4?QY]ZUTQNVXYWUSUXY[dnlc`e]]\YTKD>:8630*$ &*@G=2:h¯ǹkR@4'%*-14=;::427AHX\W`fglryϫİķa1!!,=EJ:2+6FQYbhaTIB?=M\ehe`aiiilj^SMLGB?<60,)'*2;BJRenvvqhZMIE?91+'# #')*,+)(&%%%%%##" %*29;=>>751**7BBAIF=;50(!#**+/2) + ""!"!!"%&(*)# + &.( +!$(4?QWYSLIFBEFEA==@DKQ`jaPLRGHIHFB=:951.-+(&(.,$!(NɳjSB,+-5;=AFPNMOPRX_fsz}zrjccp|ezԿȼX0#!&6FIG:1)3=DLWa`]YSLC<9?IV_eghhgfggd^YQQPRXcnt|}}zwsrqhkosv}~~! #%"   ',66+'..(7@Ni_Wauh5[mXC<27E?.&#$-+$(-/3:;8432110/048+ + &&  "#!  !    '-/*%  &(**($ # + + +  + )˻¸ys`577754/*&NãihةaFCMWZ\i~|wVH]|·ľpWYpkȿM%!*6IS^fihcckjjjdTC;<60-,)%"&&).15@LQX[WQOMJFC=5,'#"!$'*+,+*(''&'&%%%$!"+1466651,%(0::GLNHA=:7552-)).3:CU_R;4<1358;<=<83.+**)(  (";cõ~Űq`L=EKRXWTXbcbcfjmtw~}}|еʷgE)#+>OKB80(18;BMX\beaXJ@8:CN[cgghijib^ZZRNJJR_oy{zulc\YWV[bip{! +  &-45,&%9LU`iibTJA@AFNWaghlkf`^[WTNECKXfnrlaVNLJJHMWes    '/00./0-+3@ͥlkvS4*S|^:+,&(,,"$'+03798400122/.650%   +  $'" !  #%$ +  *./,,+ "(+(%" #   SåƯwM62BK;1) 3QY^nrkilK$-NZU=*!&&&7@560*.8@A?5436;>:7GWUbfXTLVxǻɺuZ]bn½ĴC "#(@=94.)" $*,,+*)(((()((((&#!  $09@DEC;2% (015A=0/-142+# #'%$##$%(+,*%   -:7$ #.259;:9@GMMKGFB=6,'(,16LWRB* *?@@DP`q)  + (3-+04437/9{qxɷn``1 "++-)!&),036873001220-464)   + $'(%    #./,*++ !()'#    ,pǸIJmPKV^J5$&11/130,/&3$%&   (;@LMFSUR~˾ȸscXc~¾Żɺ_, ,4)%'&*;Q^fmpnlijijca]F)!#  #  %+/12.))+19<;951,'#  "'*..,*))))(*+,+*(%$!'07?HMKC8( ".101--9><72.)&$   $(''&&'(*,,)$  +5A8" '49=@B?:AKSUTRQOI@5-+.19Sb[H+"1DO]gcPF;10122/'%Yĩ}yrjfgdqX?;@A@Rd}vRǧg<1*+&#&0DQNIA9.-13227?LX_dcbZSG>=CLSVLG>633699?K[m~YSGFC)  +   )7.*/0++71%QubHTkûW,,./)'(*,13575300232/-155* +  + +  $!   "')'$ '/.((**" ')&"    + >ĺij~omrtbE+%*) .0)) ".0$!'-&//738V^MµnYf˻ȵϊcjM( $?F:/3FZehbjprqnkljlda^F)"#! ! !&(+(%"#)1;>841.*&#  #'*//,++*+**+,,++('%# %,026=AB?:-*0+(*;W_VD92356(  !&)*))'(*+,,'!   =F8 )8@EGHCADJLLKKKNH@5+()*7UidP2$+'(8HMW_ZJB8213676+ 9soeYQLNVai>-044=Kfկ~^ln;1+-""&2FUUPG>/,/34417>GOYaee[MA:=BGQX^`a^WMA>::?CGID?71/1578=JXiyyN +  +6/.0+#%14"6MVfga[B:CKYhlvu}iE&)-/, ()+-134531//1330-.23+ + + )11+ +  $'(( !  +'.*#$(+$ ')&! + + + + Pſƿúɿ~x}uX9+ #%" "!  $" EWN7"$"&)+*,2A40-*'$!"&+./.,+,,,+,,,+*(&$#!&*,0696782 !$':NdhO>423'"   #'*+)*))*,+*$  %AE5 +=>@CJF@80,,,7WlhS7+410;DCGKE94/-05;>=2" #Imuh`XXY`n|}y|pA&*478?Txxѵv[qp8)#$"*6JYZUK?/'*378468>?:4.-0366:1 +   $(*$$! +  +(.'!&+& &)%!  +   +eúƾzrt~kK<$%&" '" + &,)9i~i:$343216=C;,)\cSʺÿ|̷˹̶ӿeUI58>YiouvsokkiibaaO94'! &/6?>3,*'$"#%*-..-....--,,+)''$#"*29;B>=5'#!.Y{nL4('',+$ !  + $'****()+,)'"  'A@/ "1BKMLE>32/-.28>FFDB=::9>\ojV;1:528:213,)('*06=BC:) + + + '7Rl}vyrnmnnmtyoC()7>:;Ii~~y}}qnзPG{~o2%&1;6;@DILF=64446887750-,.133COLKG8&$,)),+%&-./12220+*-05530+-/.(   + +  "%.4>IPNE;&!  ""(,($ '-$%+'!&)%    + + +0}ƽƺto}bP,3::1)(+')" !DT>+04.,82-,./2%!-ek]ν߾þʻīxjkylrwxtpmmhiccfWEC3*!!! &-4:=91+(%!!$),-////...---,*('%$!*?TdifXH8&&))9]wY?7;Q^aO7) + "&)*+**))*,(%  + &>8) + ,;JQOJ?5(&#!!$*..$'/1-.4;;<=AEMPRRPIC>4789>B>632225764320112458AO]kxժ{g< + -20*+5<0/&""-=*(.*(-/&'9:8>AJ>8;:/*+*)))$ &-./12220*)+/3531,-.0+ +  + (,-06;CLXcgbWK2-% &" &,*!"  ).$#+'"')&  +  + + + #Fѿüxo{s`/=NXTG7,-783+FlWD00[΀&!+59<>AC=4(  $.hneѿ÷ȿ»Ρylnswyvsookkdej_ON=5)! !"#!"#$&''$).6:<<43+'$"%')+.......-.,+*('%$$#@frT:%!4=?HOb{dSYgV7$#"#" !#&())(()+,($ +  +$;2$ + 2AOUOG9.&% /5=BDEEDQjytfQISTLJ@-$#"'-17;99:EHMQPKEA77449=9221014553444689;;>GVakv˸0  .4/.1/)+1'#"$*+'"$02+&(/-($%-6:BHJJHGB=621358:95315:>47<9=HV`fku}}~~~ئW   -4112/)*/*&%(,,(##-.)%&+-)%(/6:;B?=<5+$"'&&(##-+,.02332-+-/1221,(,45% + +   .>]k|zsnciqvvspldWG7/,*& '-+  !#%'%"!!$&%"  +1-$-' +#+0,$ +     3yϾºƢʽ}h]]eox|}}~UJEQ^ceihXG+#)+H}L+'DÅC>?NZZ[UH4*   *Bipqȹ͹zssstwxyxvvplkkh`ZNHB@@ABA=<866665?EIG?85340*!%&$$$&'*--,,*,-+*'&%###"#4nлnQE9--;:<:@Yq^ZpN+)+* !#!""&),,+(" +  20!&3;DHDABEMLF:33444% +2tyzywqjjouxyyxurppnomptx|xaF<=@@?DB=>IW\Z[[\]_dkpstssux|~~}}yxyz|~}|~~}zxtrqkgfhkiaZWY[[YSNKDJNPNLKR\cfkpuwxxxtsstuwxwsrrspppswywuvwxz|~}|ņC  *4232/++.,*)*--*& &,.+('(.-*.5;<=B@?<2'#%**('"%.-..00110,,.04667-*,46)  .Phsvxuvyyusx}|tlfcmg_RC820-**//)$!#%'#!&&!&%$&&#,+& $4&%+$%,1.&  !   +EûѺñxaglrw{k]JDLYejeXE'+COkL#8eTC@JY\ZO;&  9Yolqǻƾysvy{{yy{||wpmlh_YNJFDEGFFDCAA@?=9IsƭhVOnS3"% !!!"$""$&*+,+'  + &1) +"7?EEABLU\ZPC<=>>DNVWUUUTap}zl[LBPRUSLGCDFFJMJC@B@:5-*)($"#-773321,-.06;@DC@94359<99864468EKS\cghhdgimooooqrpmhdddabba^]^`_^^adfgfjkjlnqtuxz|~|zyҥ^ '44540-,-,*))++)'&)+-,*'&.-/28<<<>>>;1'&)--+% '..//0000.--.14778+(+26. %4Hbqttsmmqsrrstqke`[chnm_MA<@82220+%&(*)! &(",-++*)-)  "  &2 $(" + +%.3.'!  + +%Yƿǿƴyzywwz}s`MKTWQHA6!/P]rb7VŻg>7DZb^K1  +JlnftǾóǾvtz~zy~yqmlg_WLHDBCCB>CCA?>>>?NSSJ;5680+%"$" $(*,---,.)(('&%&& %$",-&BolHB9,/CKFF_r_RVxwQ6!  $$####!#&)**(% 38,"9@FFAETaa_WLGHHGLSYXUV]cp|ymYFTY]_\[[\[[]_WLEED<+ ,FYKVadbcjpvrg__ff``]XSRVZ]`\WW_lzxrjfgikkggffda][\billkij\G2-4>=*7c|O)Gi~qd_hoZ917679=DQ^]T?91-++)&)-12135621012479=;86344658<@CGLNgkt~~yrnkkgfc`]\\]\[Z\^a`_fdaa`cfgjlnqsvvwwyz}}~||{{yyvvttѸu' %35640..-.-,+++*),-,-,,)(-/259<<;==;8.%%*.0,% '-///0///-.//13544)&(.73" 1J\bba\fq||vne]JIJOVYVPV\jrl^SPPG<5561(*),+$ + + $' +"/30/-*%  +"&&" $- +!% &.4/)"  + ?qĿҳȵ}xy~|md`R@4/(%CJZ‹`wr53HkzqU5  Wvig~ývtz|z{spokb\RMGDC@<9==:879>BPSRK>89:+&$"!#$"&)+,,,,-(''&&&%%"('&./jĪkC:4+0CFN^}|scQQlzR5'  + "')'$""!"%()'&# +6GE0&)7?GGDHWdjkgb`a^Y\^_^[`kwz~xfR`dghfegjdcdcYKB@E>1*-:JQ:@IMMMSZVPGGSbc\TMD<8:?BCHOX`hlniaZX[__^Y]^ZSOMPS[die^WVZH2)*07>DD<-&0CNJLOPOQQSRW[ZY[bjolhccdeidc_`aaaa^_][YVTRTPKHHGDBB@>;99899&+Fm~F>GnrehjW91528 + +%1574111/210.--,,...-,,+,.047:<<-'&&" #$#$')+++,-'('&%%%$$)+$->ëd=2106C@Vvoa]RBJ{fH3!$%)*'$!! "$''%# /BH=/,..7>EGEJWbpstsuvqjfb^[X[fswz}|{vj^cegfcdgkifgeZLB@B@:9>B>5&(/5313792-1:@?;60*&'-5<:8655666+)2HqtK7_riaO61427>GVafaXLF?<;941,'%),/376421//-..6@HLPVZbiu}vplmopsstuuuuuwwwxyz{|ԠX$ $.484242/5430...../1/-,.00368;<=>@:4/*#!%,2.% &'-,-./0///1123331-+),68( "8Pnqk]U\lsxqf[TTQLPWcq{yncP?6=FIMPNI@88?@94221-$ "&"-33.# + ()& "#  %-41)# +   8ŻдxyĻ|uqsx~}}rnc]NOPGXjzA/3JRH2  + +7ku]~ǽµyƾ}wy}~}vtwvpl`XME?;639<>?AFNT]WOGCCFE80,,%## !%)*)*++(('&%%%$$'--" ;]ʸ~]9.16:>BcvcZQKBOtiQ=2$ $()'%#"  $&%#! + +".6::8519=@BBIU^nqstxzund[RMGDIQ[\aff^WVPRTUUZbhiggdYLCB@?;=6/.362( #3AHDEFDCCCEFGHIMQUX\YTPMOQRRNJHIJJILMLMKJHGEEA@@?>=98877799<91/9P{jH[ygXE33:65?MY``ZVNIB@?<731++25423,,+,06<@CN]ky¹۬i3!$+48425404531-,-/-021--/4368:;<>?<4-,)%%(+2/% %%,,,..////12456532/+.77(9Ukprm\T[krg`UMMMD88F\nvqf[XB39EHIKGF?9:DIC:7872) "'",23+ "#'(% #" %.30)# +  O¶ƿиwǽ}wrnpuz~~teuw}eA,--(  + + ,EtsX¹Ⱦx}糁zw{ytrvwsnh_SID@;8;@EILQY^e[NDDGLKB831+! !#!  $()))*,))''&%$$!$/4*)MzʮsY;.3;;7Mmp^^QOQ^uliXC/ **)'#### #%$!   ")8EE?9;==>@GT\knopuxslaUJC:1.288@JI>:@7;>BHR_gdaa^TG??B=55=A4 $11(!*71#(8??AEINSWXZ]_^YTQVUSQMIEC@=:;?EIMYZUF3!+6FMF:474.#$4@BAAA?==>@CB@BHMPSURLIFGIJMIDBBCBCGGIHHGEFEECBA@??<<;;<<=>=D?>FDZ\[n}eO?15>?===2)&$"$(00*%$).--.,-./.1556667388356,!7S_b[]chif_XM=@VZE431@Q[ab\UUNHHIHILGEAAGOOHA@@<80% %"$),+# +#)$$$! %& + $27/('   + ;oȺ¾ɽxtty~ó{_:!#;[nflȽü~t}sis}}{{{zyvsrsutsjd[RLHEEGIKPZefae\QJFHRZYW<$++!' !"%')*,.(('''''($$+0*3eؿbT?02:80Rkd^UWizujS9("  #&&%$" "#(*!   &8FH@859>ABENSaknjjmeXQJ?5,&!!#!"+7?DJQUWVM?2" !1HUPD>>=2!"1::<<;;;:998:;=BEGJKIC?=>ABABA@@AAACDEEEFFGGHGGEB@?=>>@ABCCIJSVJ>J]UOdC587* $"$*,'  &' $%! *58/&$   +\ʿyx{~ývfYSME>A<1  +&5Ibleoſͽz}Ǒseoxzxxzyyvssstutmh_WPLJJOQTX`ihb_YROKMW`orQ-,4-+,(#!!! #&()*,-**)))))*%'-0*8q˴y]O=33765^~jZQHUz|zwiL/! )'''&$"#" "#$()!   %3CH@8636<@ADIMU`db``VHA?<841.,-*)*&#)2#'/6:@@AC@<978;=<<=?ABBBCDDFFGGIHHGECB@@AABDEFFGJKT[TEBIpfN}_@35:@ENTZ\XRIB8>;;8.%%'((+//+$$)-,--,--.1488776657747:6208@PYYQMNNPTUTOLDBGPRKC>IVcgfgfedglmdRC<:?CJS]\URQOID>4'"!%*+$   &#$$!&"-78.%!    3Żվƺzwy|ûzsk`M7&"?O_ki`t¿̼žr͓q_isvsvyxxvsrstutsng^XTRQVZ]agliaXVUTRS\f|k@5;5,0.,'" """$'))*,.++***+++')//':|Ǽ~jUH;6216>nqkN>DIKJIIDCDC=;BL@?AB@<=C@CEA::DEFIPVYVTWVVZbihggktp]QIGDDFIKOTTUVUQJF:0&&/;A=8C@995348?N]ry0%*/)!)/210320330/,-+,,./1356679:==<:95,$%)*+.0/+$ %*-,,,,,,.2689877678646;88?CJ[hfR@29DOSND;DYg`NBEJGJMNVeqwvrngYG<939BLWa`XVURLGC:/ $))!  ! %$%) '14/'   +I̽жƹvsuz}yzlb^[ZVgssg^xºպtДoZeorqtxyxvtrstutvsld]XWXY^bejmg`WWWXVU\dviQC5((,/.)$$'#$(*)*+,+,+,,.-.+,/-$9ƴrcPD;81-9K~shjH-BlvbK4'&,I`szseM7%#! #%&()&&%   $0:HPF2.725:ACC@=?INMKH@7?IU_aa`a\]acbacg_\XUK?77;>?804;CEAA@8=EB899AJRPPRPMPTSQNMOWaiuw{yqcUMFFEFJNQRUTRQLF=91*! &.:@<68??5$)/-----++,465443110.--.023148<==@BDEGOMMPPJB>MZȥ|nbL6/27AKYWTQMLHE@;7544329=DMU`t΋A/,/,!'-10/21/10/,+**++-/2467789:=<;874)#&+--//.*% $),,,,++,.378988869865699HNNJHVhp`HAISIF?>L^konkjeYG<8521889;ADC=7:@CB@@>4+2;CHFKOEEGC:AFA6/16<@<;977;CHPSXZXSMIEEFJNPNMNKFB=9312+$ %,9CA9455+%*(*)***)()1333441/...01134358;<<::;;<===>>><97668:78:=>@BDHJKIEB>;C?utTS@1/4:@HORPJC@AB><:5.-3;DPcu֜T9-2,#'-10/21.1/-+*)))+,/157:9::;<<;874*"&-0/./.*% %*,++,*+,.269:999986788:;AIW\WPMMMNIEEKV^dgf]PIKQTYUNJOZ_^Z]ckgWE,%"!"#! !!&'((*++,,,../00,,-,Buo^IB9.,;^}nicQHCxynpfI/5Wz~^WxQ)'(('&&'*-,%!  0:?;78;=A><>B@93479879<@R]gh`ZY]^WPNU]_[\[\a^O>55>>2)1;CMINVNOTRRX[R>," #%+21-*+))*)),/368<@ACAAFGHKOPLHD@841.,,/)# "'2@D=3.-&$.-&*****)(*/2344310-.0235555567765344444454321002345679;=>?;DF@961+21^kHF6-19>@DFKLG>;<>?<;70/:Jdr߮gC/3.#&-10/21./-+*((()*+.1589:::;<;:754)!&.0/...*% %*,++,*++.159:;;:<658:<=@IP[XJ@AJP\YUVZ_cfbZSQRQPOYZVOMSZ]\XY`d^UN\_```[OCPNKFFHD>1" " #%%%   $%$#! $%"*#*1'-0/& +  &'$!]ʻдų|z}zdoprv}yrjemsqnpuĸϭ|亃eT_hklqvx|zwvxyxxz{woc][\_ellklicWQS_komkkm|`E3"$%'')+*++,-./0/((2;Rȼy[EA6(+Jy~|kkc=6.0344249@QY_YLDFKSQNIILG>DFMY\O=3.:<1)1;AJFOZUU[Z]dg^H/ ')&&'$$%&&(-.-/38;<<=@?=@DEA=63-)(&$#% %5@?5.+*'%+1/)+,+,,+*+034543/.,./1231233220/...--,,,*****,-///123466793:6,(-+%&,Kqd8;-(3@D?>AFHFB>:8867=CK_qqG,1,"&,00.10/0.,+*))*+,/258:::;<=<:765*"'/1/-.-*$ &+-,,,++,.15789::;46:ADFIQa`RCBKRQV\fmmfZPMPX_YMFHFKJAF454.$ + + $)(%   hջºĻ~{usv}xok^K_hqutyzxwwwmplmvIJ˻͠޳~bR]fijpux}{xwyzyy{}xpd][\ahljiheaTMP`qxvssqãrU5%%,-) #&'(*+)**+,-/0.&)9Ha˺[AA5%-Woylnb-G{zhL3@jya@Qt}ZG3-)'&(-0+.,$  0NWF?O[VLC:8<;5-0245339@FMQG7/29V^e`YPB4/282-11--11.-.....--034431-,*,.0100/01.-,,,,*))(''&&&')+../.-...001423&)/+%*8Y`&3&%6FJA;ACEGGD<5.,4H_yV$)'  &.43122010.,**)*+.3668<@=<=>>93.+(&+361,*)'%"#'*.,,,---06887652238@HLOOSZXI>GWZQYftxsdP>=GUWPC?@@?96=NXX]RC=AJRW_ZVZaaXQQRRNIGGE9- %#$) ( $,)#" 5)-,%$,6<1(:W`=0,,!    $&$   0vм׿žzfjuntmYUI7Tl}y{tpruqqru}ý³ȻüʹzԬ|ZSYciknu|}{xx{|~xnbXX]djopljigcQOSdx~|vvӱpP316- #()((,/.-'!%/217384Mȶ}`;??2=qvp_P%MweV435AEFCB3.**/0.*)(%#!! ',/.,+(((+-/100121002354200111//.--,,,+,*++*+-.,)'%%+((-/-*+,,+**,036, $%$"-Xb!%&-3;B?99?FGC>?A>K`uȘ[(%$ (0431232220/-,,+04799;>A>>?@?<61,)(-462,*)&#"$(+.----.-1597642015;CIKMMQRPF?I[`Y\fmni_PB;DNMB:@@;O|nPC9a|mYJJixPCNioR:-'&'*+,+(&%"   +  +#5DNUYWRC<53673-+-0/26:9=<87@Uhq^A;548963-54--693:BINRSJ>20-.15770/.0478863003677569=ACB?93-+--+(%$#$$%((&" %'%"!""$&),../0////.0133101322111000..-,+*))-.0/,)((*(*/2-((*))(').25," $/O|S#$-2:@=7;====@GNgwΟ^+%#  '/4423322210.--,369;<=?A???@@<73+)).462-)(&#"$(+.----..1576542117=CFFDEHJKHEQ_c[XXRIFHJG@EIB729AA<3+,5<>8=?9009D83/5@HHFVWUMFA@==3(&!(,./#+27752*"&-*+'/7^}K?^qo@3/.! + "&&" +EӾرütsupxx[RNJe|~xogefhs}οƵɶȽŻɒf]UZbikqx|~zvromke[ROS]frtrlihd`VUXg{_ZΰxfF#!%+/0.**-.+(('&/594ckO:65;]|g:4]}dOVcv}e><[p[H:0(#&*..,($!   +  (:HTZVN=6/.142-,/1/05634/%!*=JOHY[S^mX1)'%'.5;80+%"#'+,/15:>?=;82+(()'&%&&)+.012/+&##$&(+)%"""#%')*+,-..--,,-/2221232222345610/.,+))./0/,****')//+%#'&$##%*.0+$ #19H`_A""$,3;@@>>?:;AP`jΞ[&$#  &/4534422221/.--358;=>?@A@@@@=84+*+/451-((%$"$(+.----..146543213:?BB?<F?85-#,.(-&.R`]Rgrs@30-  + #&&"-Sžüҫupu~jdehu}vngdgkq{{ųùijȿͶ|zȽLJUUZ]`fkrx|~}yuqleaa\UQR[emrrnhed`\XX]k|_SҼrC>=;5/*&).21,(%'+5:6oƩvcL7-+=jn[+1}_LczRHO]qrYH@;2)!#+//-)$   !/>MUPG:3++.1/,,/00132-3)  +   #-6;>2334661,59@IMK?5.)"#,7>OV_b]QF?3+"".027;=:7/*#!#%'(+-.024654320.+)(+,.0331000//.,*)--..-,+**,////010//014563210/.-,./0.,**++'(,,)%"$"" #(,))(%#%'+3BFEHB1("+38>BFACCHXr̙U"#" &/67454212221//-3580$%5FNCD@<=CD@HJI@3-3/ "(, !/2"(3FNG=:2(),-*)#6azoigg>1/, + + + +  $'&"  8_ǾΩúĻoksztkko{|umgfjoryp˻±¶;ļź{zyɿɄLQa`_ciry}zwtqnia\ZWTTZdntpogb_b^XWZcsi\˦nR<10235771)%'-7ACɤr_L6(.L{~aP,=xbYiyB=^us_J<872( #)..-*$ +   + #->JJC60)),/-),-..13.(5) +  (156654574/)&),18;82.369@IU`fhjnpnfZQHA6.**)*/0156853'#"%'-.13689965555310122357:<:88641.,0//.-+*((*,-,+,-++++-034332110///00/,+,-,'%(*(%&! %*)*,+)+05DFEDA@?>><85-.0342.)''$#!$(-..--...003333347?CE@7239DO[caVG<36879?B@8FPPJKMPNC;7:FOSKB=BIORPSURNJHGC4%!)/3 -5(25CLJD?837/%%+(!#.DWzh\Y;/-* + + + + !%('" + +  + ! Al¿Ϊfdqyó~sszz}ulfhkppwi~ŽѾµƳwɆNYic^_fqy|xtpnlia\XWY^fosvmkc^]a_ZV]h{tlfN=430020+*-5EHGEA?>=<:74/13541+''&$"!$(-..--.//0/2233468@GGA824;CMX^WG8/*5@FIG?5-:BCGPURKILTTLECC>4)$+;GSKA<>DIMNRTSOKHGC:/&!'08(2+77>GMJD>?CC+&'##"K˺YOH6,+(  + "&('" +   #HxΫbdsy±y}xoiglplwe{´κǿƺʸxÃTirg][box|xtoopoid_`dlsxxvmjb]_ed_Z`j|İjN=2...+,08;Oh̹|^=*$ErM>PxzmoypB+EnqbULC80*(%$$'*+-)     +#)(#!$+/,'%'*-23.%3* + +4755/.0+%.>FIORLBBJRY_egknryxrnijlokid`ZSID;821/0.-**+,-1479:7* !/: "/)87:AMMFBGJP."$0*&c‚k=>73()' +  + #&('" $M~Ǿͫcgtyľuz}skjmqftcx߾ķ˷żȿȺ~xŸ}Wuvj\Yamx{zvqqstokgiox~{wnjb_ahhc^bkzͦ\L>83,(+:9Ssì]3,*VjE:b~ncdlB0EowdSGC?6-(##$&'(),'   #+/-("%'+14/%3( + "073,2+).++>VZ_gh^RRZ]acdbcdhlsuriefjqqpni_TMD@931100*,048=AFFHHHGFDAA@?>>>?@>AEGGHKNMMJIIKNOMLJFB>:82421+)&'## "&)+)($!).+$ !" " #% "%'*-5KbĀO!" $.7:;<843334530,,*/83:EMMKLOMATT<1BQOFCFSa`O=18;6.3FX^XMC=>EJEGLQOF@>@?<2$ '0  +*865;JQLHMF>6* )9wwqW6*#"#  #%'%   !Qǽͫ¹feouua{ɻljxsxz|volkmikoȺ½˺wz˝rxzmaadjs}zwvy~yuvw{}wmjfgknnmjdfvrͱX@/#*58.),-2IeqvxwncYSa_YSNPU\ckrrjfdgonnmh`XSNHA<950,,17=BIPUYUPNNNKIKIGEDCCCHKPUY\]]]\[\^```_]YUPJD?><850.++*&"#&*)()&   $,/.&!)&&.7AQhwL"# "-6;=<94444553/,*(,7>??A>=<97532.28960+(((%!!(.0//.--,-/01358=BCDA:57@HMSVSMGECLOKDCLVYFNI72>JJFFLU^ZL@7?C=33CRXPE<8>ED@7+$$$ +'8A;9CKICB=3+-/,$$&NzXpzoW8#/,(   + +  #%'%  !Sýȫjekp}|~lVw˵sWQY\envunjjjouzž·ɼzq}{Ϳ͜~ufcfmv{yy|~zz|ylkijnqstrln|}zѹiL:9:'Fǻg[hspZPf~keXB0+7VzfMMHE?1$"-)&$&%%$  #()(#%&'.54.61/! +"& (,$ +3>DB9<2+-/6Nhuwtj]USUWVUQNNQT^dihc`cgloprnjc_ZUMF?91,15;CKT]cc`[XWVTQPPNMMNOPUX]chkkmkmnqsrolgfb_[VNJCA<941.-,(%&*.-++&""(/0-&$#!"*1@Qcw߱lF$"  *5:==:6555553/,*()179BC@823:FNW\a^WOLNPLC:;GSWDA:318@BEJQVVPHA>EHA53>KQG;549>?=@GKG><>EF?3,*@HIG>=4*+0FNYdlljfca^ZWXXWVVXXYehlrw{}~xy}ytrpmkhc]YPMIC>96442-/131.+%!#'.23.'$#"%$)9205BLS^^``YNFCBB><>DFC5.,1316>HNSQICBDKOPF:8BMUL?;>DGF?BGIC;=AEFGEA=4'*(" +"6@=AID34@AJKNPPMD<'+>NIC?990'(2E^oqqlbWOLMNPQRPOKKINRUTX\bimqusqkiba]ZTOIGCEGMS\fnutrokgb`cb`__`abnqu{{zyvusojga^YRLHCBA>99873/*#$)1771&!" $*)%*BZtߧ[;%"!&3:=?;67777741-+*(%',25444444557:<;5/)')*'" '-1//.,,+*.0247:=A9412;GPSZSQTQF93<@A@@A;2'$,:;24>LPRLA=BIX[WL@@KX_VLIMQRQFFEE?9:566678630*+'!%+-223456679;=;5/*(**'"!&-10/.++**-02589<@5535=FKNKB>BA80/BFGC@?;5.-9JKA=DPSTOHGMT\]XMBBNZ_ZSQRTSRLF=;87=FCC@AKYXJ-+/0.)$!-,4BHBCG@87&"&+7Kv뼒~|zzyƷ¹˾}O% F}zeN?<4.*$#&'&(,01-$   '**$&)-*&$(1PsqVR`eipm^Y]]WNWkkO942/..4IdrrrfZUY_^[URPNNLJGDHNRTUVX[^bfiklkmnoonoqsutrnlmps}~yusmmmnortvz|}{vqkgcb[XTRPLD=0' $'#)4<<3&"" $6NhٟQ4%$" &3:==8356689752.0+"#()113457899;=;60+)**'" &-10/-+*)),1359:BDA823.(,8LRUSPRSPJJQ^aXOLSVY[[]`d^_[PFEMV]\ZXVTQQK?1-.3=GJA6:Tpr`@3-2>GE=9)(8C>ESOA]x}_W`G$%'*4*%43/& +  %'()&  !%$(hĺʼʱuy¾aR[^iuunryq˽zogflszɺòþȿæn{??LJLLG?<<.%(647^ś~}}~ô̼i:-Bkw^G<352.%!#%#-/11*    + %(*$"%**%#'-Ls{mnuqp{yicmpihisnS=84+03?<979;>A81,"*@S`jlkoqpf`bkpj\QTW]dkopnegd[OLQZdfec^[VWH:)%*2?IP@.7_wR:,6Vu^=+5927HWQxεb( %,() +),1+  + + $&))&   !$#*lú˻Թz|_OXZao|~tmr|~zzxv|ƿyskfgq|ïIJļϺƿ۸l~Ѯk:?CDF?0'*3"$&A?]͡οU-?kzoP?=/...&"$'%0230'   "')&"#)+&&+/BavlestgcptnqjmdL:3-)05?Wqrebbcdfgc`\Z\^``[VTSRQQTWZffeegikmloruy{rkaUF<.&!" !%(.3644884,""1?Zhʢ̼ͼºߴʑK4)#"!%29:746579987551.-/.**-136765456:=;4/-..)!"(-420.-,,,*./05;=<9;;810:FNF;1%!1Hit|zvtx{vi\W`n{}rutmaXVXgnrqjd`c]G,#(2?GE=*(Rc6@b|ȩuH%%28CQnħzP/ ( &*.$  +"%'))%!#(pñļxx¿scVYb]ivzwux}~|vw|{vƼxtopnihr̿ɵµϿȦ|ɂZJ:;=6ISHWc=$).ApϦú\Aazi\K810('&%"#',5;<2"    %$#&'$&+.,-6Kg~tz}wrsuvzn]OE?61)+4F]kmj_diljfb_\]_abb`_\ZVUTVY]ceilnnmlpppsxzm[I=41+'" "'05<>>@<=;1# '.;RjζŬĻвϴƎI3'#"!&1:9655579987653//10--0478986456:<;4/...)"!'-421.-,++(,.15;;:32/./4BQ`SF<45Iaw}sjkswmkmpuxwrlimlX<:--2CXhkidhnolfa][\_adbca_][XXXZ\bejosttsvuuuy}q`NC851,(&%%&*08?DGGEEE>-!/BSeؿεŬIJ׾ʲĴ‰E0%#" $08966768999764401331158:;;98567;=;4.---(!!'-310.,,++),/15:98-($&-:L[hWF?=E]u}}}~yvvzwbH91+&#"#1Vvd`޸ydUUdxԶZHV3 &))  "$%(($#-qŰŲwx|~tjdbdh^dlrvwz|}˿yjdhong^_t¯нʽ⽇iQ05<%!Cѫ|? >L=_ӱҿŻshg^N=4+$%%&&%',2461(   +!'*''()&*-4>PhsaVG=9:<=3/0>Rcjijostoga\\]_bedcdba_]\\\\bfnuz}~|yxxz{~wfUJ>;730///27>FMRUTQTRD+ + +8PkϴδëϿӺIJƼB0$$""-6887778::9764301442379;<<97557;=;4.--,' !'-21/-++***-/04;=<1+&)5AP[aQA?CNd{~}~wbI;5-&$!#$%-@[lnyɷ~ʢ{K "$%# ''%  "$%('$#1qϼ̽xz}|wpjhikacgmswyz{̿rfcgkg_^jIJҾǽ۠tٕH').2HÑC !+..EB/Lղøž}h\`XE51+"'''('(-462)  + +  +'+)'&'$*--07Mjo_RK@86789721;Pajkqtxwqha]_`bdeggggfedba`^cfox{wusqtyziYOEB?<99::AEMU\add_c]E%  %3N`yɭͳưиʺɵõ|?0%$! *3898889;;97642/03423779::86338<=;4.,,+&  (-10.,**)),-..3;?A;628@FLRUH@EMWi|t`F940--**),.5AJ_ouB$(*+"!&%#  ##%'&# $6qǸɽ{|}}tljlfeeintuwzvnjfeb\ZfƷӾľĽЗU3(#99kɡ\%!$IedH/.IwׯϾƿ}i[[P;-,*$'()))+.37."  + + &,)&%%"+./,*5J[lruqi_QE?=;:8643832>Rdmntwywqjb_cdeghiijijkjifcbbfmv|wsklpuy~{l^TNLIFEEEFPU]ekoqqnqcA  $C[~ɮ˲ֽ˳Ͷðs;1(#!'17:999:<;97642/033136579975338<>;4-,,*& (-1/.+*)(),..-2:>><<=CGFCDC=?JU]l|zeH941/0/.+*-01,5D]bOM[ffưtLA>%-.-#"&$! $#$'&"!""! %;qõ}||||{ojjhfcdgjmox~øzolkd\USZuƽ¾ٹ΢pUG70,-29=>:51313AXjqrtuwupkfeijjjkllklmopomhfaciq}{ooooqtwy~~sg_]ZWTSSTU_dlty|}}z{h> =eƴ̲̱ӺȲ˲ϺԸѼk6/'#!%07:99:;<;:76440144226468976449=>;4-++*% (-0.-+))((+.//267537=DF?9755=NZcrlN=61.-,,($)0, "*.1579K`y_F1%**'$'% %#$&%!"$$#!'@qùĽ˻~{z{w{ysmijgb_^_bfowǾyohdXMGN`ӫдϞ`>!""^ĸsEEFLײ˿ȻŻӾƽz}uh[J:1-)'()+,,+*,10"   + + +  #)'##&&010/*%" &*%&/9AA:2-+,3F^pusrrsqnkiknonnnmmnmpsuuqli`aelw|ytpnoqsuz}uoljgdbbccmqyl? )@cηͱѷͿƮƯβѸe3-'# $/7<;::;<<:75452255236368987569=>;4-++)% (-0.-+)(')(.01340,(/7@@93225AVbkzrSA81,+&*% %1."-)! /=JQE8'6" !$(& %#$&%!"%%##'BpöϾ~yxztitywuurkjgb[WVZ`enï{pe]M??KfŹນ~ 3* >ɐaQCIյĿ·ξλƽxlWA0..)&)*,,-**,0,   + + + ")&"#')210/-)!*2=DA9/)$'2Iasvtoppnljlnpqpoonnnmquxwtnk`_ahrzsnmoqou|{wuromlmmtyoB !2Gdֿйβеĵª¼ɭϹ^2%-# #.7;:889;;:8766786422368::9989??=93.-,)&!%-.--+'&&)+++165.'%,32--026DU`iwz_E8432.&!*.-!-*'1.!'"#%+#(*% +"$$$"+,#!,GvøļϾxzvrw_QDGJ`xstqk`XZa^X\jƽ|}q`VQIBAJ^{̸зȾʯt;%&,,$"=x۝lZJL²Ѻ̽Ͼͽ{lbH=2,*+-.+*+++)'% +  +  !! %*,,.2673.((*-/2338:=>;5.*!(6Piz|ypqqppnopwrnknoooqqtz}{wvjecfktytqnkqqsw~|yz}n;,Puֺоʹʹ׽ĪѷZ3(+#"-6;:899;;:9866786322468::9989>?=93.-,*'!%-.--*&&&)+*+/44/+ #('%)/47BP\fvt^J=:;;2((//  ''$,,  #+,# ()$  +#$$$!++"!*Jvóžȵw}{ybI0 &1Rrrtrmc[[a`[YeútvqdWOOLFHKRc|ƽƿƾԺxI) ""!5dѡsXDMǶһ¿þʿtcRB8/*)*-..---+&  +    "',()+/6;=>=<>ACDDEA?<73/,*,-6Mfvzvqttttssustrpnoprtux}~||tmhfgly|xspqqruzm9%EtĽֻ¯ѷγ{vΰԻҵT5+)! -5:979:<<;9977886323468::9989>><93.--,(!&-.-,)%%&)+**.1310$##%%&+379@KUbuzrdSD;;>8+"-45# +!(,,&!&*-(!*("  $$$# **"(N{ϾôsyyziG/ +Iqpqsph`\^``ZcºsjhaTJHKLHIIIK[~ǷοºɿʾŤr=" LΒdYPWҽ̴¼xmZC;4-+*+--,,,-)#    +  $($%)-4<82.---(!%+-,+(%$%(**+.1346/-+*)*/6<>AIScu}xn^G5/20$$264+#*)('*% ((*,,"&,'"   %%$# ''!&SǴÿuvy{tS3#Rvqowtlc\Z\_cjúvicYRICBEEDBEDBIcǻľƿƻΫJ#FzxBQflƦ¯ȺqiX?4.,+*+-.&'))'   +  "!#'*,07AHMKLKLKKKF?4(##'+4..=Ujuvvy}|ywuvuusrqtw{vla^gs}{rpmklptx_) 3TtȯκϱαnfixtnkvԾnv{l}׸P6-)" *3888::===<;:::96313568::9989<=;82.--,'!$(+++)%$$&')+-.26;8400/-.3ABDIVgy~vfJ/#$ +75/4.#(6(%&&(%$"  *.'! + !%%$" %%" 'Q~ÿȻyx}x]?#4`}rlytne\WX\hs|laZNHDA>>>?ABA>?Qo¾ÿú˴K&S˷k4=b˧Żž˼lbS<.**)**-/*))($ + +    "&&!%),.28=@?@?>=<;:5-'$%*-61-6I]hlnt{}zxyz{tnou{|zuh`ck|zwqlkloqx}}T!'LyǬäҾͰsuͰg`crngdsѹoyufzֽؽT4*+# *2999:;=>>=<;<;:6213568::9989;<:72.--)%  !"()+*'$"#$),-,.3;=:554114DFIMZm}~xlQ2"" *>H@432* +% # + +   --$ + !%%$! "#$$+Gv¤~}x~~zo\F0 @i~pmyrke]VW[k}seXPECAA=9.Q̩žĿŽȿkZH6)''(().040,&     +   $!$**%  %)+.13433310//,+'&'*.09526@LV[kt~|tos}|sgcdkxyrnmoqqv~mE:bǭ¦¢ζ~kjv̯jjp}wnhtͳz~m}ѵ•Z1&-%! *39:::;=>>>=<=<:6213668::9989:;:72.--&#  %(,,($ %)*'(/7;6211013CGKP_r}yrZ;)(*&(;PZN;.-)  +" !-+    +!$&$!  !%)0=nԿ{~~ujXF8+ +!Gk{oqwogd_YZ^oŻzmaSI<>?@:7ALL=33=HMO}¾úʳͼT6&Hx˹QI<9aЯûȺſnT?0&$&&&'.25.&    + + +   +#*---,+*&# "%(++)))))('%%""#%)-246789??>>==<:6224778::9889::971...$! #(+.*&!#''$$+32+%%'(+0BGMSau~{vbB/-.(,?V^P<11/(" +  +$!!+(    + #&%  $*18k̰ym]H92+ %Kkypvxmffc]]buumaSG7:>>76EUF6+2@ID;fμŻνɺc(##! -@Rao~~i<-1TԶʽʷ¹sR:.&$%&&(/40*   + $/5?;4.(# %! $&$""#""!!$(-2516:;;?EKWamqnlnosw~|x}vpot{zwwxns{oZUjǾϺÿ}ȦŞjlɭu{{íœa/*)(#'2;>><<<==<<<;:855678889::::9:;972/.-% ! $(+*&"'('&%(' ((*905BNXg|{tjO504)0CHLMF<72*! $('   "%'%! "&$#0`Ǯx\N>40* 'Wmsutvsohdaei{{qi\MD;768?FJG9/*0:BB>Qm̿Ƚدn/$)(#$0>>8;?DOTL:(GJMA-"$# $),.-/16:=@CGIPV[ZZ[WQYptqzz|x~{ur{zhhntpkwz|sw|x~~{møѽypǦĤvyδx˽ɲÞc0+*)$ %19==<==>=<<;::75567888::::99:;9720..%  #(+*&  #$$$'+01<9)/:42BQ_nxw}~wtoV;10+5CHKE40-("   (&  #%'%! "'$")ZֹlKB80.& + 1_ppstvvtmfcgn¿wmdWIA721;JPK@-)*19==>=QѻŽԟU)!!%/724>C@?DHIGEKIZǴyaI8/--256785+"!!  /FIIK@-#%#$'++-/049=@EILRWYWUSMH9Wttbeu~ywgaccZQRSZa]Waq|x|vy|vgĹֿle{ɨǨ|ζƶɶĭğd2-+)$!"/7;<;<>?>=;::964467898::::99;;:72/--$!"'+*&  #&,@KZT<7=;2BVhuue[Z`iv~z~|uw{eC3,0?JLO? #$("   !$%'$ $'$"!SüǦs\>:72-#@ispqqrvwqhelu·rf]PE?602BV\M8!#+5<>>>/3xю:(&!0_wi^`hcWTSG?JWyeӿùlTB0-.4;<:70&  ""!!  !,&$;NLHK@0&'%  "%(,,--.26;@EKNUZ[XVUQK6]{t_ZiwzeL@AGHFJKQTNEGRav||sr~}{yy|whǼĥ~zgatʫˬͶ̹šf4.,*%"+4::;<>?>=;:8753356799:::::9;;:71/,-%! &*)%  !$)MbrjQB@A6D[q|}{wrv~vmg`ZXZ`fp{~v~qI5,8ISVX>   + )#  (&  #%%'$  &*&#NȲv]I58;7/" Msunpqmuztifpz¶n`WLEA:8?N^[H2(6@B>;' hϰø|.'/h³hZTDAVp@iɷõyaP9214::3.'    06'#@SKJJA2+)&! !!!#&*,,---15:=CJMW]`abfc_S~s[Xckr|yoq^K5-6EOSSSTQE613=Phqmy|z|~Ȧz|ogt̯β̶ǻ̷̿©Ƣg5.-+%!)28::<>@?=;97642356799::::::;;:72.,,$!  $))& !"! #Lfvp^MDC    $.!&*#  +#%$$&# !$),(#L¯taL<49=<2%)Vvtmprjtzvkisk]UMHHDISZYO=-%6DE;1T|ַƺǿϥh4-0"%^dzz~v<^ǿp`OE<996.' (22.)%    "%''35 ;QJMMB6.,'!!! ! #%(*-.-,/259;AGKV\bejpqndhNWS\jx_XR[TE3.8GPU[XTL=-" $/Gskty{ƾ̪zw||rwеҵͶȻͿʵֿŢh5.,+&"&18::<>@?=;96532246799:;::::;;:71-,*$ !#()&!"%" C\hhfWFDAEZ{yj^VT\ekvtaLB=5)#'5GXb}xqI40;MY_\;   #*,++ +$&%$&" "%+/+$LþȽvaTG959=:4(1\xrkoqjt{wolvý}h[TNOPPYa^O>3+" (6BA2%@fkt{}Թ̾†T;67=Sˏg 1S{۽¾rd[SKGB:5$!"+4>KTXRJ?5*" +  + %)*))(0-8PMTPD92,%"#" " !$'(,-.-,13689AMUZ^[TJ>2)$4|ypuvu{͸;ѱ}uy~{ӻԶ͵ʼ­ȴ˶Ţh5.,,'# %07:9;?A@>:85421246799:;::::<<;61-++$! !#((&!"#! $9PV]meNIEASytZJ:1/2@BGMTZ]xzznI99;IW^Y8 +   )-$0* + !#%%$&" + #&-0+%JĿyzcRLD:25642+!;bwpjnplu|ysqyzfZSQTYYaeXB1,,,-08<4%3CLV[s{ӼĶºΤb??35Zʾ޿X%)Biٺywuuspnjaaeow{yjWC1& + + + + '240)$#"&&;TU[UG=4,""##"$"!"&'),-..-257;@GNTX^bdhnnl}чJPLLKVwQMxW$2D_aRB;BOZ`]ZRIB<62&$9vywquĪ׸y}ն͵ʽ¯ij¯ġg4-+,'# $07:9;?A@>:8431114589::;;;::<<;61,+*#! !"((&"  #(5ILVroVMH?Mt}cK1#$0;N]r~qkiilqvwwvpg]Wuz|kK=?=GW]W6 !)!"+- "4)   !#%%%&! + #'.1,%JĿ}rrrhSFEB9/10/0,!)Adwoinopx}|vt|¿wdXRRW^\baR8))-45:;6)00:DBY^at·̿ͽǛ{A1@07uڽПcڙN,.6jٺùy^D1   ')')3==2&  ""@Z]^WI?6+!!$$"%"!#''*,.---369=CLU[[adgjqqov׌LUHMLKa{~lIKf2@QmbR=38FS[YVMD?=:664Iz}xpryҾ۽~Ĩշ̳ïѿƞf9)+.)$!$1648;?BA>:722///23699789:;<<<;71+('$! !"!(,)"(2:@OaltgLJIXuvld]ZNVXRNU]`rw~ssy{{{{rnou~n[VVX\ej\8 + %'%*- $)! + +## #'& + $%*,*%!LĿ{mbc_XNGC<2')+,./("0Jerrlkoow|{vu~ub\ZVUWWZWG3)*.<>B?0 !-354:@CCUyƾĿ÷Ŵ˯[H3170S׷Ưu€B%)+!h{Xjپż¶eF/  &.01/,2;=1  !&L^d^WH<4/+'#$$#! !$%**+,.../36:811...025787889:;==<72,*($! !"  &*&"(6C\mpnaJESg{ymfegk~{}}}{xyqefmjhjm_<  + (,1. '( + +!%%""%)'!  !$&),)$"Nr`RZXTLD@;4'*,-00*$6Mdpokkoszxw|o`ZZYWX\VL?5/,*7@G@+#.3448>41Aavz{}ĸξʩ\93*%3L{Ʊֹ]-"%)%^}aSpvԺ½mN5 +#,4661.,08>8)##$5Pcj\WKB90&! !"#!"! #&'**+,-..07:?FNX^bjloty؁@JMKGA[gLG=XtT4A^\=@ABMX`VL@1+'+iŸusupv~Ӿǭ˵˰ӹˮ~Ⱦ}ëíϿěc8(,,($""/439;>@?=:811.-.0247778899:>?=81,*)#! !" $'$0Hk{obYKB]t{x{}~~lioxqmk]?" "+36*(*&    #&'##&*'  +  "%&(+($%P~hQ@PRRLC>:6)-.033-';Ocmkjlov}}y{xj]Y[]\^_O>654.'4CL>#'/5458>;4:KVWapyqwݸJ-"(&.kĶյ}=(%(.)#YrmԹtV< #*0.26971(%"'3?D;,!!#"$6Pbh[VKB:2)"! !%(''!!""$')***+-.023>ADIPY`dgkow}~ˀM[]VM=HP71C[mP3@aS1;>4?SaZN?1(%$6yuwdglpwŊɯѾͲӽ}yȭƽƲŲ™a7)-+'$! -34:;=>=<:9320//125789:;;;;==;6/*)(#!!" !%%*Iq{dSQOL_s}}~|~xgfo|{vlbR<(#   "&,20 +!.-" + +!$&&$#%(# +  #$(+)&%S¹u^H9JPSKA<86-033771*=M^ghjlpu}|{}vj^XZ_df[G4156/)9FJ8!%*13549CG.(KbjO7?\{{D)562?TXVJ;1'&/C}hhggjtȚDzŪѶǨ|~ŪȻƿ̻Ͼ`6*/)&$" *34;;<=<;::652113469:;<>>==;;82,('&#  "! %&#!(FlsVFOX^_j~ljqw{xjS@1&'$!"&*)!#1+  !"#$#"#%  !&,**'Vôtlp}~kWH>JPRKA;851567992,9GWbhknqs{}}|~yoaXY`ijP?1143//AGB- (*.15468;<99>=Ta_B586?OZMN@3."!3RŽ|sjfgmqy¿Dzŷ˳սѻ{zūʺ»п_7+1(%$"(24<;;;:::;87432457:;>>@?>>:960*'&&" "!#$#" "%?clSFTbqgj~qpv~}fI2' !&),"$/' + !!"""!!"%*+*+\d\]kr_RJEKPQKB>;76899;;3-5CSajmoppx}{z||tdWV^dfE9256206FF:&#+-/124568:768;<;AIFMPKC@ELVWUQIB=AFJQUY^]QA, )9BIOOKGB;2+%$%(,,+*)+.14454533347:=EJNS[afipruy}~c\VK3";QRH8=bn_O@@QRMD@<:GVUOR@45&!7`wqprtz̾ƻ}˸ų˲˳Ͻ¿—`8-3'%$# '04<<;:9:;;87422346:;>>@?>=<:60)'&'!"! !"#:_n\R]i}yx~{tx}aC/$%((()*# """""!!!"('(2er^WYdviXOJHLNMIEC@;:=<;;;3-4BScmpolrx~zxwz}ytgXSXYW@64=>74;CC6'#,205555679;;99;:8:?DGGC>=BGLLID>978CEJNMLSap~ګuK5!"+Pѿ৊vcOrѲ֐F%!%*.*&%6/;{ALȤnm{p_j˼xk`\YYXVM?2&.=BCEJKH?:9KUPSVC8>.%>d׿ƺ~̼ͿIJŸǻ`8/5'%$" &04=<:99:;=764222458:<>?>=<<;70*''(" "! 5]qf\dl~~~|yyuX?/$'&%'($ +%.(  $#!"#"!  $#$7kyl^TS^pwbRJFFJKJHHJF@=?>;<:3,6BSdnpkgrx||xssv~~wthYRRPJ=35@C;7;;@6(&/5299989:<>:98;<=?ACCBA?@ADFFB>::;=@CJPOIGL[ju~ǢtP6EQxƶč[aSEqໍ~f$-)#/-"8/5xq޲~\Sacg}ú}o^QKJIFB8,$" 9GE?:FMKFJZjky|psvdJ:)%+/4@A;9962.)*,.12/-/159::766432247:AFNW`gjlsrsuy}dRF79KZP&=_T=3HzwM?@HcZUFADEOVPPS?7B1%?aĿ¿¾õſ˿×a;/.)%#! %-4;>>;:=<:9631366599<===<;:83.*'%$! #"(Ljkgnv|zvrxuT9-)&&%$"!"#)-141% +-3+ "# """!!! $8roaVPS]m}nZLFFH>@BDGMSWRLD>;8666@M\fid`hvvmru|qeZPIC5528DA8==5*$)19<<>?A@AA@<==>?@BBHEAACHHHJD>98>;:==:9732466589:<==;::83.*&$#"!#" ?anv|zv~}}vqwhK6/+&" $+143.(#37(##!!!"!!! ";un`VQQYhwweVKC?>KORTTPMKDAABCB=<3:FWgmhdgqy|~xpoq~ynbUIA?AAIPKDGE9)#(179=@ACBCBA>=?@AACCGDBCFHIHGC><;=AEADILNNNNOJSb{жӤx}ubLJx嶉fa}M.(#$-0+%!&Ap۲mi}Ĵ~h]RF>72./*#+4753515CdĿsdZUQ>3' '/=@;4-**-36974223/.-0134402246:AFPSX_eknorrsttqkcB>=JO53YT*8J6 =y6/?J[[JL?,+1&+LoԺĽȶ]8-.($"!%-3:==:;>>;9732466588:;==;::92-)%$#! #"! 0Pkvy}vqsx|xjT?30.)$!#'.253+  ,66 #$" !!"!! # !>vxbWRPU`r{o`UMD91AEGJLLKJLLKLKIFC44:Ncpld`iquz|xqikx|o^M?CBFIG?:?@AACCCCDEHIHGA@A@>?@@>ADGIKKLMFM^r߰z[uPOuܧ~jt% )&/' %3:Hv͡vx̽~lTI<0(# #!!(0686344=Sxxlsxo]TUYRF9.*),1>DDB91*'+28831472.,-0332259=BHNTbdfhloqquuuwsj`UFGDHE-.WU,:I1:y4*8Uh~wS;;J\^NA5%!%$6Y{}º¾Ѷ÷Ŵ\6+.($"! %,3:==:;>>;96324665779;==<;<81,'$#"  "! " %:Z}|||xpjdaXM=/()--(%$"!!""$&(-120,"  !24/ !"! !"!! !&"!;ouaVSTZg{sf\UPC1# %0?LT]ZVSOLKJ;32B[khaXaju~}vndfrkRBFBC<))'(+048:=@ABAA@???@AABCCABEHIIGE=>ADB@>=ABCDDDCDOJQ^fyʈdf{S[ʹE'.&**'?gx~ijòmVD81,)((&% "31/15766?Lb{zl\MC;87>DGGC;400574//5<72..25536:AIOX_eprrstuvuxvspj`UL^WF>5,`\1=N8!9{6+7VoW8;J\_R;1'""*Ff{yǿȵĦî[5+/(%#" ! $,39==:;>?<96324665668:====<82*&#"! ! "  )Ez|uy|xm]KA4/'%-(''(((*,00134." '61( ! ""! $)$$:fqaYZ]dr~h^USN>&'8BJLNORSUUG92;RddaW]j|vj`akz^LQIH8 +&267:>;>@A@@A?@@AAABCC@CHJJHEC<@CGEB>;AA@@@@@AMNW_`bgikNjȺT$"#&%$*+Gsȹ}fSD5)"!$(,+'# ")9559?<0'4H`s|ysnv~yne^YVXVPKFECDAA<4,.4;85014555:@IS\fmt{||||}|{ztlf^WPKfU=6/+ib3=SC.':{:/9VqU6=82)$!!!  1f|urvyteO6% #$$')+-./-,,,(  + +-5-   !##! %*&&8]rf_`gmvt\TPOH8  $3BNV\^L?7>Qagg_al~wl`]dvq\TMUC&5;::;:<>@@AA@A@ABBBCCADJKIFCC@CFHFB>;;<;=?BEHHOT[^[p|X|SN~ۡ3' "%# &(7KUkȹʾeH82/+##&*+' %*26@HI?/!$;ViwxhYRQRURNF=73488877689:?FOZcmsz~~|vncZTQOOR=.6;SjzO7ALUYV=6;93Ecr|sr{ʽ׻Ų{{•Z4,1+(&%###$!!$,2:>=;;??=96313564357:<=>>>91)#  "K|~|}|suun\D)   "!   #.1#  +! "#$#  %+& )3Olud^_jwkTNLLG6,8DI?:9BSbjogbfuun`]_op[]un7)5;:647:<>@AABBAAABBCCCGKKHDABDFHHGC?<668:?EJNJNKQ^\eǓ`]ҫpHd¾ؓH"" &$)37,)Qƺ~jG2+.0..+)'$!!*03:AB>=@FKZhszph_YRPOMKF?;:?BA>=?CDLT^ekot{|}~}ytri`TLHIKP:%#KX-)b^/9PG:;Pnq?9;L\vmG9GMOUW@8@?7Jgomnqtx±{z–Z3+2,*'&$%%$!! %,1:==;;?@=96212454357:<=>>?:1)"  ! 6d~|qiqp_dvutqgU=#  )0+   "!#$%$  &+&!",-A[u~j_^etwcOLLMH:$ +#008DTakql`]gtvpm`[[i}~pylOP@3-.5<;4-78;>@BBCAAAAABCCDHLKGB@AGIIIGCA>668:>ELNOOCG\__vկwUiݜTJ~кb#  $#/3Eνa^²zz~~v[F-!#(+*0,$(29>B>2+9\z~fUHKR[^XKA>FKJECFKHNV^cgkmpruutoie[SIB@CGN4!Xk7+a].:QE;C^ek>;:FQhbB;KOLRVD9A?6Khiaipmmt˼~|`7'/-*'%###$%"""!!*4:?B?=??<763213554468:<>?>8/'$"!!#" !.DWX_YRezpqw~r`PZx~vsm`L5 + .2&  !!!"#$&%! " $+5)2Jl}vjg^k|yfXNMMKE;/+  + (6638J]\Y[hx}rh]YZgwüwxiN8/5:76;8:>ADFFFDBCCBACCFHJGC??AGIFB;88:;=AEGHIIGNNKQ`gejˢ_XDŽKh޲tx: !!%$(##$&Iְ{}l|ʸ|tqptux}cSQ<0(&#%  + !.6;>;9BUmtk[ORVUPQUXXTNJJLKSZ]_deceejmf[TU?D?:<>=K898MS64_X9764212455568:<>@@91)%" ""#0<>GDCY~|vnlortti_Zgwvsl\E/ #-.   ""!"##$%$  "$#&+0%*?]mkddmxraTKJKKHA96 +#%!'5>DThy{qgc\V_qbF45>CDG:<>ACEFGDBBA@@BCGHIFA??AHHE@9789@BEGIIHHGLMKO\a_Y–[ewPіocV  !$&'!$0[nӺ~˘νsjcbm|βO092)#$! &/36:@K`xraTKJR^gea]YVSRPW\[\]_[ZSQUXSJC==8=JH;9LK@FE,0]Y9=ZqaSD@CFHIJBFLKNRJI2("6LHK_njelv{μ´_8)2-*'%#"#%%##$""*28=?><>>;975322446579<=?@A<2*&"!!#&/15Lr~wsrqrrruyospgS;& (.(   #$##"#$%%$!$&)**$'7O`ddi{|kZNEDGHHFBB*+066/!   "'/;JWaipiafy|z{^F?CFB>?BCHGFB@>?ACB?;88:=EFHIJJIIGLMINVXVU۾ZreT߷t]eԁ0 !!%#$ :rݹ{geæê̹fPNWs۪N02'  +(/379OYi~|fOGSbnha^^\VQUY[YXYYVWMDEJG7(+6OmrM3DKA?=+6f\;:H<=_xaSJC=FLDB?=:<;9;96322336679;=>@C=4,&"  '+0CdzyxyxoljaL1 + $.-  #$&&%#$$%%%" "&)*))*6J\envveUK?>?CEEEF8.1;=>=41(.FY_ccgt~Ũ{gWNJ@3CA@ACEHIC@?=<>BDHFC@?>@A::889=ADFGHIJJJJHLMJMRRO^Ția^đ]cܥT##'!"!=̛nWVԩwqԸvWHYuŪgQ[td"67*  '18>FNpygVSWa^\[\YTNSWXURTTPDB=><=:8432336578:<=?A<3,&!%).=581% +)5FVfmruxy۶pXQMEGFDDEFHIC@><=?BDFDA?>>>@8757;@DFDEFGIJKLKLLKLONMYrշƯksϟjIkx-# !" !!!$9ǃ`_ڳѱmR8*-Eģ662)  $-6@N^j|m\NMOUYWSOMKOMHDEEBAGB4/:BCpǝoRB/@B@:(6db:2;12Qf[QE718BBG40<95322344589:<>?;2+% $*3G_q}wfcYC)" +  -0#  !)**)&&'''&$   $-45;FVgx~m]PF@>?ACEEF:27?<<>9:6, 0D^kd\^iͭ~SJMNIGFFGHIHB@?>>@CEEB@>>?>=;:9:=BCCCDEGHIKLMMKKKMLLR^иʛksʀOACB@=964223324678:<<80)$  &-:Sjztg`Q9"%   +"-,  + #$)**)''()'&# "-8?IUbszj[LC?>?@CEEE;27>::@?<;5+'#  ,EUM;?RªċRCGGKIHHIIHGA@@@ABDEC@??@@=;<;;>BDCCFFGFGHILQOKKLLLORPzβώWidB>ݖ1 + +'#! #$ !:~Ӯv[A5+5ux2$*'#! .+/6DVnuU-*/12/+)+.,&$(+++;D_qYGA?8;7&={j9+721CMlkH8F=AlqO:99D^p^RM>&)71*%(;Vlx½ſ~zxƿ϶Y4(4*(%####$###%# %,7:532222134679;:6/)$ $'1Ia}|wuttuxqkoy|unf[H/)&!  # "$,)"$&()('%&())&#  %1>LYeqvgWI@<;=@BCCBA7:?:;BB@A<520% +$/4HYO9?XmϹЙaNOJKJIJIIHFBABCDEEFC@>?A@=9:9;@FHGFJIIHGIHKQNJJKLMPTEgǮΈPYzR?Li-$! >ɱeH. +!#OΔ9$*,% %327@Qg}~tkea^\\XX[agkluvw{xU.%#$&% #$!#+15>Xit˕jXCHC;B>&9xo<,:65CHpqG6K=>x]G>6>[scWYL),=0(/Kg|ÿurwŽϷ[8+1+(&%%%%%(#"$!!.9@HG?9;?<>>;64574322334562,(&#!$ #7Rm{}mdVPOOLJ?JYemvukcaVE+&$(+& + + + %)$(-!   $####%&&('$   %%%+5DXiz{n_QG===@DCDA@=>@??@ADBA@><5.( #%'$ 1=FDO`e\Zdi~þsf`SLIFEDCCBA@ACFHGFDB<;;<<<9=AEGGFEFFFFFFFGJLKJJOQSKGYƶΒJSZ~VSnp.!! #!>׾|Y8! + (yY.+,% #*/1DYiwzheS8"$&''(9Tozg;1&$+( $)-003@Uk̮ynffKCMME9=>+?{x=3>;:6=pj;-H;9qlXC.3PgWV]R3/<7/%#7TturwɾǾж[9-2+('%%%%%(""$!!-8>EFA==?>><954451101223561,(&#!!2Hbrysmnu{}||uru|yqjcbXD( ##',)  "')$ ),!"!!#"""##$&((%   %')2?Oeuwj\OD<;=@CCB@?>@AA@ACEFEDC@;4/,.1431-*"(7?>8?BEFGFFFFFFFFFFJLKKLOQSOMWyŲȹΚ\KMjfNb@"#& =٬x{gM5! +   NٸvF.)  "*03>,>wyB7=84,1kb6+H>8asp]>,2EZPSUF/-:@@2$!+Dd½üuorȾyzz{|}}ȿз\:.4+('%%%%%(""#!"+59?CCBAA@=864432..//123572-(&# #/=Re||vqlhdg[E&  &-.'#$'(&%"" %%%&&&&&&''"#)(   $$#$##""#$$&'&$#'-:M^tsfXNB<:>@AA@ACEFEEEDA<8469<<<;952.,0897--4CMR[h_gpllkeYUWSJLIGEEB@?>?@DGJJHC@;9:=>ABCDEFFGGFFFFFFFFKJKLLNORTXXeο˧x]UTNCso(&&!! <թhTHGB/     )\̵͜g/#$&.45Lc|v]C8:AMNPTW\][VWVUVZbifbXI>>JVovyefϭuU[J7KO:79CXN>=>+:psE<=94&)i^7.JF8L]tb9/6?PKSH5'&7OV@+!3Yzÿ¹xmn}phdc_ZSSSTVWXYȿз\:/4,)'&%&%%'#"#!")-/5=DGHG@;41121/,,-.124683-(&#$*2BWq}zwpkgfgenaH% + !,-)&)+,*)&&%%()*+*)&&%%#  &*% +$&'&&$$"""$#&%%""'1E\p{naTI@:9;>AA@>=?ABA@ACECBBBCB?<89;<<>>>>=;>@;-"1Majlq{tfTcоto_RMOSSRLIHGFC@><=?BFJIHB>98:?ACGFEDEFGHGGGGGGGGJHIKKJJNT^ZX~ȱvSB9w5$%""" :ڲwJL<    A߾2 )&08>:)+g\?9LL<:Cn`53>?KIQ=% #;bmN--Pt{mk¼ȿ{rf\RLIGD?;<<<>?ABȿ϶\:/5,)(&&&&&&#""! #'$%*4?GKK@:2/00.,--./135783,'%" !#&(6Je}zvtohc`bffsgM'  ',(%(+,))('''&&'(('&%$!!%(*!  &'(('$$"""$#&$# "%,;Towi\PF=788;???=;@BCBAACEBA@@BCA@??>>?@@??>?ED6 AkiGQԵtlg[W\_]ZZMKJJHC@<::<@DHHFA=::JA"   8ҕ@&+""1?Ks|tG:4Ec}||ukcbit{{~~ysptz~rcZOJKZn}|~{p|r)&CA41HhV:5<.3[]KF>A?*,^ZMCFLA02^W38EDKFK5$@l~T. "+Ffȶynoƿ{}Ƽwj_TG?;9862/../01344ȿ͵[9.4-*(&&&&&&$"!""$% $,6?EH>:510/----.0134672*%#! !!"#.@Yp}{qppoooruqlfa_bgjukO(  #(%$&,-++)('(%$$%&%$%##((&  +$'('&'$$#""#"%##"'.:MftfYMB;567:>>>;:ACDCAACEDBAACDDC@@@@??>=@=>EC0 KwuWdʟoSKNR`npcZWNLMLID?;::;=BEDDA?=>@CEFGFEDEFGHHHHHHHHHGCCHHBAFPYZYpÿį~SEjM"  "7|̙eRC110'  !  #gު^9,$$"4L`~jRE=BQh~}vidXOS^mz~yy~wg<>0/IqX51?44SXQK==;72///-.../12471($" ! " +9NevztommkjhgimrurngbbgmqvmP)  '%%(+-++))()&%#"! !"#$)$  "&((&%%%#"""#"$"!#-ERRW^lϹ_QZrb! #6{ÚhDA32*'' #"! +$NVL.BtR,#' &;[urWF?Wew|tfZPSct~wtz~yٛ[#'>803JyZ2/C=8OVXQ=CD)*3IbO.=N;67429BCB5+(&6GW;/;<01EsĮru}|ru|snh^VMHB=;9768;=AEHKMPW]beoz{kbXNFA=98632332022110000ƽ˲Y8,3-*('''''%$# "$%"('%##(/5>??;4003--,--/126/'" !  *5H]ozysnnnnlklptuuuqjefjquumR* &&'++-+*(((''$!%&)"  "$&('%$#$$#"!""$!!%4Iax{qbTF=61358<==:9CEEDBBDFGD@?@AB@ACDFFFCCC:687.'(Jp{úɩzz{}pz}pe^TSSROIB<:88:>??=AAADFGFDCCDEEFGGHHHHHHHHIBBKJ@>DUOS`iwζaPD;vf"!#(&#7zśkLCA%)$ #'%" _ԣg-"*"$,Ceq[PUguxv_F94041-))+/25+$!  !08Eg~}{z{xyzqfafp{~nR0&-031.+((*$%%!!!$"  (&%$$$$$#! !##%""0D`ysaZSA74-36:=<;;65;8,*3]Ĵsnz{rkaXSUTKB@7:>?>=@CCDCCCEFFBBCEFHIJKIGDB@??>:9;:9>FQKN^ghȽ}d>+\l$!"$" %*.q׷lOD=4,' "%%!"##%&Hs+)#!""!5NV?16L~a78A?GDOkVCFA<1"=^S-/ILI=/,2;?A85/$ ,.57/(1@c»wʵ{kc_aeglqxξwnWPHB?=:4-*)'%$$$'()*+-/1789;>CHL[eyɻvh\TB=85221241.+*+-/0/,*)+-.ɳY9.1+))()*))&$" !"%%*-1/)%$&+.49<;9742.++-036,#   +0?c}{sjfkt~tW4 (.220,*'('&%!#%!!#(&&$$$%%#!!"$$%!)@Rm}m[UP?62,158;:;;>DDCBBABBBBBBBCDDA@DKKD@?=649737El|~vwf]WXTIA=8:>@??@ADDEEEFFFGHIJJKKKIGC>:642-*+./08@IFIX_`¬yT>=CRv¾nm{ne^[TJ@<9;>AA?@@EFHIIIHFGGFEB?<:640+'#!"&/9@@DQVUzô~c~#  !$):~ɫZL>86630.+(+-/-(! $'% 0}H" !".98>av]WWbwlF&/9_}{xxm}ձU@TbTC=Pf?>B8DSbXJ>1),4HiĽϻgJ³ypnrzʷjXH:/)'')+,+'$"!  "#$%&+,/0233358@Ob{mWKE?:51-,+**+,*(&&'*+****))))ɿŰV7.2,*))****'%# "$$',240)! #',0355544334569-! #!.Uvywuuy~bC& +%-320.+/)&$$#&*& !')*((&&&&%""!#%%##  .D[luXLLJ9/-)-/2579=B@BAAABBCFFEEEFFFBADIF>6588=EGEITpxbWZnxqjaWMD>;:=@AA@?CEHJKKJHEDA<6/(%"! '08ABAAABFJKJJHDA>82+%!"!! !"""! !%,3;CLLJiA !#'*#!CƧgPLHD?9411012452/*'$$(-,#7yſФP" + -;KkyhPCZzfC"#7Jvhh˧|[HOX\QARyeAEKA" AQ;"%,.+&&(,4CS^a^YJNTWQD1"(Kólz»оyaF632,%!##"  !!  $(*++*)'(.8Jc{˳z`H@?;4/+('('(()&'%%%&(*.00/-)%"ɿ¬}S6.3-****+++(&# !#$+06:95.*%$#$&),/147::9878," !"Gk~~~|yvronrv|qY?& !'*-.++(('$!&*(!$&)*(&&%%%#$#%&&#" !.KixygG?DD4)'"#(-25:=C?AABCDFGHHGFFFFFD?>?>;;=E?66!####&&)6;4*#.=IOJ<,"?vùmȲ[G2(),("   !! $&&& !'0?=>CF>8:EONLBEDMWN??A;=EKLMS|xh_YPD>:9=BCDCCBB@?><5310/0233321111285683-+.2;DNNJ_˂8 + #&)--%Iŝzg_]YSPLHA:3/-.----..-+'# "$##2Pv1! 1kqhϼjH9*%(+("!!!""#!!"(.9Laϸ|[D6892,++((()('(,.0113342334320/zQ5.4-++***+,)&$! !"$')-145310-($""$&.27<><865+# %>az~wqnkigb^]^bgpxkM+  +"$)++'##&&)'  "" "'(&$$###%%&')'#"0Eds^?8@A0$!#,38;>BABCDEGIJHGFEEEEE=:<@BAAE@>>HY`XN942CP@/2<>B@:9H^gslg]JB=<@DFFGEA><976:743358;887778::98:;92/23;BKMHZսʽ߫P #%),+" Jήka^^[SONKE>71--+*)+.041,$#%$,Pq{vuz~~~|vqmvH4 + +%4~عnaK?KmlNVf^FEHCB08_ZPG7AP6" G@!)*  #/>FKMOQLC4>b}lrͿįmRE8,%$#!""!"##!#$%"!%*3F[w˲qT>133-*,,+*))*),2468:;>><;:96431źwR9.0+))**+,-.($$# "&''*+-.//-+('&''+.2688773+""* #-<\}}xsnjgb_\ZZajr}eA'  &(*)%!'1* !  #$$$$&'***)($  !5Rqq[=<=9-# "*3;?ABDFFHHJIJIIFECDDD<=@ACA>;73Djvf^F--CH>72>@@915CWlv{{vo]PEADILLHEA>;:9::;;<=>=>;;98764579:996424:<@BAWɶѾw+ "  "$%&&$ FʩɹtljcYTRRRLE=81/,''*06=80(!" "%$7Tx}ui`^fm{<  +":=;\wlL=Mf]B 'ܷjPMAD[e[RaPSKLUA+1QWX;$BQU2.0 "$#'E^looteE7HWYCGYvŻι{[F:4-($!'(&&()*('%(((''$"" %&##&,=PjǬfM@41.**,..,(%&-498;EOTTRPJC?><;:ĹvQ9.0+()**+,--)$%$!!%$%&')+,./-+((((((*/256663,"!)"%-9Ww}|xtokif^]\]aju|pU?$    $*1) ! !$&&&&')+,+*'# '>\z}iT:8:5+#$-7<@??DFGHIIIHIHFEDDDDCA@DGD<563GpoaN43FG=85:=>9329G`r~zmaUOOPNKIFDB@???BBBBBBA@@?>==<;<==<;:8968;:=>>UM !!##$%$Hɴ yr}ϳzxm_ZVTPIB=8861-,,15971+%!#! ##*B_ymbZVUqöҤR'%" +-=2,ZqR:=\{dI&شhUPEJ^eWKRR`QEMA3,BU_=*[zwK )=,  "%1IarxsmbbYI==EKOXar{ɻƼǯnM851-(!#'(((),-.--&'()(&#"$! ##! "'9Kc¨~^H=2.+)(*-,)%$&/7@BIUclnoe`VNHB=:ĺtP9.1+()**+,-,)%'%"#(%%$&'*+-/.,*)**)'(,/13434-" %!(/8Rt{yurnljg``bejs~~n`C* +$*.$   !"%')(()*,-,)%  1Khp[H7463*"&0:?@>>DFFGGGFFHGFEDDDCC?>BGG>63/CluhU<9GC:77;>@>;::AWnui`YURLGCB@BBCBBGGFFEDCCEDCCBBBBBA>;;;<;9;9;>?WĽn + !!!"'MРqkktܻwlteayh_ZSME@<:;962.-/011.*'"",?`~i_Xmظq93'  $1<*#V|Y82KtÿoT+! ,Աj\VPU`eXGBOeRBNG929[qE4yϾA+?1" + +cwwV?+(.3-!"-Ved\ajzüľbC-.-+&$&())*-0234+,,,+'$#'$!!!#" # %4C\yѽxWC;1/*&'(+)($"'08CJTdtznbVL@;ĺrN7.1,)*++,-.,*'(&#%+)(')*./121/---.-**,-.0115-" *28Rv}yuqnmkfgkns{|_F' + + + %((! "%()((()***)% '=DEEFFEDCFFEDDDCB?=>?CECB5/<\zjRJM@458AABCEFCDSg{{tle]VME==?ACDDDFFFEDCCBEEEDCCBBDA=:;<@A;;7:>AZǼ׷U   # R˹klh_^qҠsdtbrxibXNE@=;9962-)))**(&#)>Xv}y~oZT\bs|Q2",,2&#T~iC0?hƿy`>08Ѳm_]_a`aYK8LePBTN=<4a~J9Ѩ^&",*% ,GVkouq`G0  *%@TWP_z±Ľѽ_@+)()#!$())+.26;?A?=:3.)%#%# "%%#!%3AXuϻuS?71.+%%'**'$$(3=GUevyiVF=ĺpL7.1,)*++,-.+*()&#%,.../1457642111110//...006.")27Or~ysponknrw}xgM4"  #))! + !#&('%%%%&''# + + .G`umN7+,.20)"%1=CB?=BCDDDCBBDDDDDCCB?@A>:;BJD88Kgse\D58=DBACJONNR^mzqfZMD><>ABDDFDEDDDDDDGGFECBA@DA=;,YwI9ke3+,0SsbO3 #*+! 6ALqϺ_C/%$&! #%)+.18>FNSVXSH>5/+(&"  $%# #(4BXtλtR;50.*$$(**(&&-8CTh|zdOCŻnJ6-1,*+,,-./++))%!$,134689::76422344421/./127/" + '06MnzuqoonszvZ>+ -.("&'&$###$%%#  + 6Pixa<& $(//&&1ABBCBBABCCDDCB@@DF>42=IJ=5@]}~lJ68?C@?BJPSSRU_uyjYK@><;<>?@BEFEEEEEEFEEECBABEC@=?CIKID869;Tڰ{7  !WU]xXwʏcnͧ|yxiYH;3:985/*&'-+'$!!!#!,Gez~yqkny~`F@X_m9# ),/Fw\@*;hƾüz\<SѱodalfMNYR6Z^36DPA)NgPGXqvy]111-H\d]?+ + &--# )4Gr˷|_E2$!"#(*.8>IS`jpsoh[NA93/*'" !! $)5AVqμtR940-)#%)++)()0=I[vƾqXJŻmI6-1,*+,,-./+,*)$"*2369::::75322234410/.1468/"  $1:Tt|wttuw}|bL8'%! '2, !&'%##"$%&%!   &B[myyV/",+"#*3;?=97=>?@AAA@@ABCCBA@?BD=539CH;6Hm|U==AA??CKQSQONYosdUKFC@?>?ACGFFEDCBB@@AAABBDDC><?@AAA?@ABCBA@;=><87:@F=>[dIFH@@CFLPPNIIVmvkbWSOLJKLLHFEDA>=;889<=@ACA@;889<DIPJ1:DZd=)3GXny\CL?-(,%$/1,$4OE+1Ad̵|`G5& &+16R^n}hTD7+(%" #'""&.8Kg̻uR94/-&"&.)*((+3AOjɷfU¹hH6./*)+-,,++&(&&&%$%+/49:7300.-./0230/0158::>0" "%# + -Ns~}iZUPG9)$0/" +$#%%&&%%$'''$  @\ft|f?  ,/ !/27::8549=@@??@ABBBBBBBA=:878:>CG?>lĶxVCA<@EJKMKIGGMZmxf`YSNMMMIGDB?=;:42259<<>?9332,+,)(&,06YȻ̀3  #[«~\fϡ_s͘}saTC<7420-+))&'&"$5Laqy{}niksuz}rx|^:M^lp`O=;1 #-1*"5VN+2BSwϹ`D/% %)0;RkhM8'"!%$ !%%!&.6GbͷuW?1((%!%/-+()+/=Or̼lSºfG6-0*)+-,,++)*((&%$#*.378620..-.0134211369;:=0" #$#$ + /Orujb\RG;0,&'+/)  + ##$$$$#$&'%$  Eblzo\< *- "/36998549=?@??@ABBBBBBB@:99::;CFHHGEBBHUh{rjaXQNLIHGGGEB=:532356683.%!""!)2:_̺v- "[}Wdϛ]uғ~ug\LF?:62.+))'%!,?Xkw|{v}nI9EbӹӼb71/'21'"!(*  "Ky÷g5!`lVC3.119AA@EQcfL?LMZI=apL5-6F]mqj`UI6! &+*;\Q &/?NpϺbF0$!&*2=ZvpV@-%#$" %%" %-4F`̶vX?1'&$ &/-*'()/=Nr;nUĺdF6.0+*,--,,,,-*)'$"!'+15640---..023554457:<;=0"#)$" +6Usxg^XPKGFFEA?:-  !$($###$$$##%&#!  + + Kjup[J5 ')#037:97448<>?>>?@AAAAAAA@88;==;9:DQh¹kK:6;>ACDEDA>?DO`rwl`UOJHGHKLKFA<75112214/-#'2>gϿ̭d# ! +]}QaϓYyЈx~xng[SJA;50,*)'!#*;Ndsy{|}|~|oofF49lüʻnD6,!//*%#'&+Ozl>,xԳ~`M<54-.1,36NrvM7GSgVFZdTG),;UeikpgP2  >^P! ,=Ig¿ϽcG1$#'+3@d{^G2*&%!$%" %,2D_̷uX>1&'$%.,)'()/>>=>@@@@@@@@?89:;;:9:?WxźdH70<>ACCCBA<=@JXjzvj^VPLIKMNMIEA;621111356/#  *5Boǽ˜P! ^|L]ȉX~Åw~{yvqh`TKA91,++(  -;O]jqpnoqsy~~^`w]@2VźL5)&"($#&&)BakD;թվʬjVE=<33640.HuzK1FZq^HGNVV.)2HTXctqV2  + + ;VJ$  *:B^ĿļѿeH1$%(+5Ck˸dL7.'%%%# $+0B]ͷvX>/&&"#,+'$&(-;Ln®pWĹ\A4.0-,.0//..+,)'# $(,/10.,,--/0133422369;:;.! "$"#:Xs{fRJGILPSWY]\]_WJ?;99:<>><93.(&'('&%%%&%&%&$#  +   %Uy|wfK1%% #!%146776448;=>==>?@@@@@@@?::9988:>;X÷^E5-@@BCDECB;;?GSbsvkc\XRQOOMKJG?:543557:>:1&!#%)*(/8EsĽ巁<! ]|L[ڼ^ɰ|yzzzxqi_TI?5.++("&9K^difa_`bjr{[^orroZ:AhǗN2.-4'##"$'#5Un|nit·q[V\epwfMTẼ̘uư{ʹpPB=<47BD7/@hpI3G`yfM;=]d9/0=FM^v}fD% +  4F?( )6:ShI2&!')+5ElҽhO:1*&$$# #)/A[͸xZ>/%%!"+(&"$&,9KlïqXźW=2-0,+-...--)*'%#!$'*/0/.,,--.//00/-.03788:.! + "')7Qpu_PGJJNQSTTT[XY]]\]`YXVWVTPLC?8/(%%%&%&&&'&'#!   + &X{|wohU=# #&235765447;=>==>?????????;9766896677:?FE>74203415;Gvh-! +Z{NYʨ|dñ~zwxzzyune\PE91+)'" +?Q`a_[WY\^ajzb_~yedl}rF0@`N\أT68;@+ "  7[ofF,)@^tT6,4EYjd]vˊ͍`mŹ~͚yyqJ@@>46FM@6:TbK:H`~nZ=7bh8/,3=J^sxiP5!.61% *53Iн¹ĬkK3&!$()*5EkӿhQ<2,(!#%#"(/?Y͹wYLfs]OKJMMORQQNNTQTY[\]b^\Z[[ZVRJF@81+)'%%&&&'&&"   'Y}tndZF1"$&334655446:===<=????????>976568=B;]aE940@ACDEDED>>@DL[lzyrmfc]XTSRQJC<86758CIGB@A?97868>K{۞P!! XzPVxj|wtvwvutphaVJ=3*'# +>MWVTUZ_ef`dnyeYwvpioL*2_}~Ѥ[=757#!%'&;^mzvi^UZtż|d_bjwkrrjՊVfDžІ_rgLGKF30?HA;6BUQDEZ~thC1XU*&#&1CT`_WK<- +%/,#%+2,CĻ¹ŭlL4&  !%)(*4DgiQ:3-*#"$##(.>X~ιxZ=.$# )%"!"(7Gi¯qYʾzN8/+.&&()*)('''&%%%$%$&*.00/.,../.-+*%%&(-1238,! !*7DO]wnYKGJONNQSRRPPNNS[[UPOSQQRSRQNHE?<:50+#$$%&%%$"   'Y}znf[N;*&%!'2344554469;<:;<=>>>????>76678:=B>^wQ8243@BCCBBBA<=?BIWhvyuolgb\XUROF>86656@EB=>BB;796:?M~֖AVzRTun}|zvstutqtqle\OB8,)# *;IMNNU_jooedchr|tp~_Nntyor~I'0Xĸ]@4.0#*16;9. Ffnzrsp}ld׏WfЋuNmVNMSJ0&2;?>59PWJARzvoC&F:&8FKGEA>:.  '3* " '+0(=ƱoM4'"!  "%(&(3DfªkS92.+$"$"#'.;U{ιyZ<,$# '# ")8Ij®pXvM731(()+/00/--*)))'$!"%'*-/01--,/0/*%""#'-2457+ !,9FRbq{jXOQUTOKIHGILPQRUYZXVUSTVXVSSUXUPKHFA;5+&! ##$  +   .[}{h[N=3! +#5")-4201244367787999;<>??=:767758<=;7^~gG515:DGIF@=;<:<>?CM_nxxvod[TPLJG@9668?=;>CEC?==99@NͻԿ- U|Sdsp||~xyxwsponokie^QC70!%*%5JIPMNXfqsqb`]^am~ɫyvkaydHEYd\bpmT<4AKu<6<:Qh{xat{w˿dqӶaU׋VVðrWk@FjVC9&..;;94@]`FIZdV5 + +"*+('*3:6( + +0<'%&)*(">o˷qL3)$  !$&#%3EeȲpQ;1)(%"!##!"(,6Owλ{]@- ! '"&.BK[iz}|wmcXOKIGC@=>=><:WOF>044:873:PS>*"   %4=;8(03,"%9,!,(#8dԱu}ϻtN4'"  ""$3DcηtR:/('%!!##!!'+5Nuм|\>0'$ )% $-5.& '0+.41///00/233434447789:9885646:><6?HMOYky{qaJ8.09B>ACB@;7458;?CIR\jt~|zrf\QHBDHHIJKGA@BEHG>DEDESzDVn_]ceq}}yvtrqnmjjfd_\XRKB<71+0BNRQQPRUZ^]WRY[blkgnzzɭ}c^OuxkN4*.323^|WQ]tDBg{ppü̾~p~ȷxjxiJ0>LOME93/87:87BA. %0577/&+.+)&(?1'1,)6VϝaGWκмuM2%   !$2BaηsS;/'&$!!"$""',6Nvн|\<1)% !)%!#*9KnŴtYūhC119==<>?@><940--.,)& "$(*-./--,*'&%%''(,/220-& + %09@FLLLNOMHFpteZUTMNNLGC@@CBBDFGIKJLMNMMNOTSPONLKJHIIIJLOQPMHC;1'! +   9l}~qh\C52+! +.+.30.-///.233333447899::9::8337=;5><75=M]c]RC5-19A;>>><95358:>BGMTan||{zytm\NCBDEILFC=;<@DEAFFGJYi0Zïp]\eis||~{wsrpoljkifd^ZULC=757:?HRTOPNQVZZXSPRU`liagsqkɭzxdXLu0781-4:=55GZ\[eqԡnWy~ƿùǿ|ļ̱xz{hD3/EFSYSG5)35>?86. $&"$! $.3598),73(##!'90*2125HեgDPƲϻtK0# %1B^̶sS<0('$""%$"!&+6Otν|^;1)$ "'" !")7Joȶw^|\A117:77:;=;970.*+,*(% !#'),...0/.*'&''(*-021/,& ! "(.8@DGHIUSPNOONNdxgYQLNTRPMFA>??BBCDGHHIGILLKJKLOLJIIHFDHIJJIKNQOOOME:-# + +  + +  +7i}yvysjS:32&%,-+.1/,,.///2333344466788::;;9438=81/&#/>INH>6/17>:;:99854689@EJNGIEIQc٭Q  dϻhW[kpv|{~|yuqolkhhkkhc]ZRI>867BTTNQRORPSXYWVTTSWcplcgv}gd|γ{n|se}WPs!(09=>;5:ANhĀTz}Ǿ½|cLPv}nXUYC5IWVO2!,0?E90%%'  " %18@6+&"!%-38+&1<+%*-753)&#$&& "$%*8Inʴxa|gXE8/,././3689872/+++)%#!$'*,-..010,(&&)*+.120.,&"!  "'-//28=MPSSPKGESTRLJLT]no\PMKILORMHCABDFEFFFFFEFCCCBBCFIGDA@AB@>CGJKHFFIEINQLA3(  +  +  1a~xrosvnP663(-,+//-*,.//0354343344556789::976;>4*.:C@=83259<;888986888:>AEIO_q||yz}}m]TI?AJDB@BDINQIGBK]pʖ:jÌgYbtwx|~~}|{xtplkifcehjgc\YQG>98;QpnUPRPUTWZXUTVYWZfuqgm~q`Zo‡otjrYV{.-2@E>51&0;XمJvýocd~sP.:u|u< 6KRQ1%*=G<0(,,+'!  !!"$(!(05J7)-7:3-4KA *9?*!!%5/.eĴڼнtK0$ $0>[|̸wX>2*(%$&)%#!&+7Ot̹dC7,(*,,& !%)+-:LoɰubRVWRQOJAB91-*&##&(-2588752.-,)%"!$'),--+/10+&##)*+/120.,'" +(4=?FJKLNTZQTVVSNKJQUUMDGWhvZKFJNLJJHC>=?CEGIIIHFDCBEEB@?BGKEB??AC@?1#!-9=><:5248?<768:;9:978;?BFIYkvy{~}|z}{lbQB@JB@??@BFJFA>Le~. kōncm}|y|~}~~{zxvrmjgec_bgjgc[WPG>:<@[YOQQZX\\YTTW\VYetpfliZScГwwrTMr)%,>D910?=:TQz{˽þÿĻuXJSwU&7x}wpn_H8-EQV7! %:G=3.)*'!#'''(*(*&"$%[{̺zZ?4*('%'*%#!&+7PtʹgI;.*/30)!$)./1>NoȬqb"(%%')%"'.379:6201/+)!!"%)++*,-+(" "%&(,023221"!!  .=IOR\]`ehjgdTPJFJRTQUQRSJIb{dQIHJJNPKC<649CIIGGGFEEDCCDCA@@ADED?88=AB@@?AED>;<=CGHNO@,    %Nwwty}}vld`dzuN.)! )* %*-,+)**-/2343311000365568:<9679820! .8;><:732355459<=;8899:;=?BAQeqw|~}|v}~qdVLGBD;6;>Niɹ{%^đ|yxwx|}}}}~~|zwtrngdb_`ff^WWTPI@89J\y~xdQMQVSVWVTU[aa\_klgr_SGVϰxSLf*'09301/3>@Srpu_jǿ¿iSMTt`59hz|`D0+$%'0P^@' "+:B=0('"0220,,04+)),.*!2K_R5)8LfpX-%.6*#/Ej̶æU6# '" ,:Vxϼ{\A4*(&$&*&#"&*5NsξkO?0,1772+,.125CXy§hV"&.43+&.35;85330,)"!"%),,*,,*& !%'*./0///% +><:8631135457;=;9::::::;>?K[gqx~~{t{~p^NDFF>9?BFQRJ?C]Ūl_ռ~~}||}~{{~~||zxtqnjdaa^^c`XSTTQJ?7;PeyugTIILNSW[\Z\`fhbcnplw{WK=ElԬ{sWZ`-(.60,.(19:Jꯄuwu{ȾmWOSm¼c8;fsf?((55.1N]C-&3:4(!  ".01/+,3:FC>97=FM6.1;96E_cR0#&+&!(7P}ħX6'#)% #/===>?<6-.45=WqpZIGLPNUY\[WVX]^[_lrr~e\OPk᷍odemxU0)+2..-&,54AuƔoeĻ~n{t]SSjļa8%*FF5/FTH5 *.( $.495.,2:ILH<02AP7-(2@IT_M9&+$#'$%3EaŨY:,!&*'$$$&1@^~ϻz[@3+)'$'+*%!$'0Iműz\L=8:?@=:8789?Pfȴz[J%%$" &,,$!(.05556751-'&%'+.//++*(%#""&'(*+,+)(# /DR]aegbXLDCINMFA@BHKJJOVXTKXanuiYRKFB?<;@HHC>=<:@CEDA>@CGHGGFDCB@?=<;;;=80)(/8<>:7564002:???GNJ>   2Xx}yvsnhcachmh\I3 +3 "'+***+-.022210/-,,-....27;:621244413326=?<321346535568:<<;<<;:875687<<@KNMCBh‚>  Wkz~~~{wv{~|yvtqlhea\XXY[YUQOQTPH<5@^{v]NNUWWY[ZUOLNQPQYkuy~xwضyhuxjI1()..12()33@s՝_U{y]QRkƼX2;bizh@.5IQ7)4CJA%"$ !''%##13)('&(++&!$'-EkɶbSC=>BECB?<<=EXnоlRA&%%% %)-)!#$#!#&)--//047640**'(,001++++++*)'()*+,++("/?P\cmlf`XQKFFJOMGBBFJKLNYcfbUZeywi\RKECCC@<42=LWYURJCEIKJEBACHIHGFECC??=<;:;;4,$%-6;=83010-.3<>>;7...3898545789;;<=<<9864577-&%)*15+&47Ev`LuUHNlčT,8agpcB49FX:$%2LM.% -9:2' 2AQP?* ')&$&,4IOHLTF+"]pG"/.6BJR^n{ѼʮdE0&!#%##&&&%&&(6HlűqR:0(('%'*+' !$'-Dhνj[KCCFHHFDA@BJ`vïy^D7++--("!"*066-&$&**+---.,**+/3331+*'(+/10+*+-./.-(()*+,,,*  0I^ikhlf]VONMMOPPMHEFHHIMYm|j`dwvfbcdaXOGCFB=851--@WlxyqaRDGLLJGGHHIHGFEDB@?==;::90)"#+4895/,,--06?A=8=IJE*  + +  )Eh|ytpjgcb_]YVL6 %-)  %((*+-.//1221/-,++*+--.27:6532001216:<>?:2,,.3:<:7346788:;<<:97544558BP^iquz}{vsrrstwy|~}{zxy{~~u[?KI?5755>HJCFi]"  Hw}xy}}yutx{|}|ytqplfc_^ZXTWWVXZVQJGCACQl}fVNKNQMORSTYbixx~~|z{}u}}pfggcjypucD9.''%#,1(&6:GwVt¾įmJ?Lm̓T+8dlpfB27Ha>$(NR4* 2AE=/&,9GG8((3@ISQF?GI=+!=|O!(AWuzn^`sѶmO5)#%(&&)''()'->QulO7-&&&$&(*& !%'-EhȰxjXMIILJIGDCEOezeM9.99:93+().2882,''-047752.)((*-..-)(%&(,..*)),./-*((()*,,-.#-Ibpqicb^VPKJKJKIGEDEFJBENeyjh|½t|ûzsiZMIHIJJGD@A:1,+/18Rls\EGKMMJHHIJHHFECB@?>><;:9.("$+2662,)*+-4;BC=69FJF3! +  +   "<`||yslfeee_UG>2(&(! +#'()+-0001110.,+**()-/037954331///07=@A@7/.-05<>:51356669;;;:97554459@KXbksvx|~zvsrppprux{|}~~}|yvuwy|}cE@A:3767?ILKNe٬G Pwztv{~~|yvuyz{zyvrplhd`^]ZXVWVUZ]WKB@AEN_v~eYVUW[U[aehnty|wxsoqrszxldjldYU[d`dhij[?:72/(&,$)7:Drxpr˲lF=OrɒU,=kuqtB*6PkA$$LK6* !-9>:/'!%*)%$'+3//5<@>@SGAIG::Em~A,LaxtdS?AYƽyY<.$$'(+-,,,-,4G]~˸cF4+#$%#$')%  "%'.DgӾ|hZQNMMJGEFGQg}ƽjR@1)FEDB:0,-0131-)&'04:?@=83,('(**)(&$""%),,+)'),,)'''&')*,,1&-Catwmc[^ZWQMIFF@=99<@EH=BPm|pp¼rp¯iN@?DE@I?658;;82,&&+5>Jh|_HHKLMIECHHGFFEDCAA@><;:8-'"$,2540+')+/6>EE>57CIF9& +   4Xy{zzzqhddfe_N:+ && + #'(),.0111120/-++*'*.0247934551/-.-5=@@?5,1106<=820265558;<;:97655359?HR[gptux|~{wtspooortwx{}}|xutvyy~jK7852787?MSTW\cdbh`TLD<8:eҠ8   /Xs{vx~}~~|ywvwxxwvtqpjfb_\[YXXYUV\_UF<!!H?3' !!$).,% 3?FGIJB03HTQKTlk.BjE68;:==UƨdB2&$'*.312234;PfĮ|[?/&"#$"!$&# $&(1GhʵvfZTQOKIHJLUh|sYD4)$SPKF@:501010.+(')0;CD@:6-+('%&&'$"!!#'*,(" $%$#&'&%%&(**++( !9M`nogd`[VTPLGECA<>BEEFIL:ATsķv{vWEB:42-*++$).0:AFY~|gPNMJFCBCEDEFGGD@CC?<=?<60" '+25-((()*06?=<<>ACF5 +  +!!;\twqqka\XPC0"  -& #'*,-/1121220/-,*),-./24675321111247:;;730112334556789:::;;<;:8632/37:>EMYemooqty|{{zwtstrrqsstrvy~||{{{yyv{|{t\)4F1+1'/IWbQ,$Fע^' !#!  6L\iz}yyzzzyzzxpmkklmlkgd`][Z\]]`_ZXWNC;;DRbn}vor~||{xtrttpnnmlkkjc`^]^__`X`da\\\ZX\WVa\H@KH@94.'!#/.CiܺſǿhORqvW,D{xPVgy@4<=@<6, %1342(!',..06<9;<=>>>>I9#  + + $+Iewyqlke_XN=&   %0' #'*,,/0111110.-,)),./13567410//13578::851.11233455899:;;<=;<;97422/158<@FPdjllot{~|zyyxvuuvstrsrtquy~}|{{{yxty{xzzo^#8M>31%*@TgO &( SܕJ!#!  +BPU^qxw|}zvuvwwwwwwoljjiigfa`\[Z[\^]a`[VQJB@DMZdmx}tmouxtpmic_^_`ikotx|vtqpqpnkkputstoiqvokpjVNJHE@<6.) +)?a{tŵ~cKPufX*:pseltwB6;MXRB6)43, $%(&  +  ..7::BLIA.-@0)14*"!&**' .&2sͼpYKC??@DDEHJOZlİwbN<,%'# #'*.;Qp¶rcTHDB><=CKRVdlhdc[SI@5,('%%uspke^WQB:0*))*+///1355420,(%$$&+*)'()))%!!'-.13221113238(-AXgpkcWNMQTGGIIHFCAGJLKFA=>EUkw`grwp\eu{X0 + &2?GSZVNKCAVm^NKJHFEDFFECDFGEDAA>;=@<6+$230.'"(.0.07?9:;;;::9B7&  + +% ':Qdqx~~zy{{uojd^WI;& )2& + "&)+,/0111221/.-+*,.02456530.-/258999862.,011245569999:;;=;<:7520/0157;>BG\beimqw{xyxvuvvuwwuutuuuvy|}|{{{{yxvxwtstnc) 3JG>5'(7LgO "83 #a׃5!""! *6DJKRdu}{trsvvtrssttttsoljhgfc`\[ZZY[\^`_]XTOE?;FUainv{{tlghihfeb`\ZYYZ^afkpsuvkigedb^[\_bdgjf^jne_b]NI@CEFFD?;06/A6)$!+$7˼sbVKFEGEFHJMZhtaOA5, !$$"%*-2AIOU\djmouvvtrstvxyvwuwww}|{{{||{zywsonpoj6$$7B?4(!+AcN + /* /ub!"! ##(=>AACJYfquuqmlospqqrppopnlhfdb_]WWXXY[\]d]WTRJA:5EZjruxwumijlllkhhffec`aRSQNJEA>2/.-,)%"!""$*0/),3-(14015:AHNPPQNQAEX҅UQ`ymõlf{ü}uuafJFh}\xc?@`d\u_N@6::DL;! (10) ',6<6)  +2M;8KXZcuklzzfbbQ6970-.,# %$9ƶ|jXKFGDEIKOXdwj`QD81+&%""  '-15>VvŻv`J8.-++,/49<@B@=:623.'#!!! vwtrnga[QH?;;>><6435760,#!"(+,,+*+*)(#!&))*-333347:;3%+EXacZTRTSLFEABBCCBAAFKMOLJIJMdytrnY_gkh]n~pP/%.!226:@EHJKDPQJ>7Hs~bRKHHHFGGIDA@@BCDC?@<:?<==CIS]ehksutrppsvxxwwwyy{~z{|}yronomhD+)=?3)(=cR !$$(GΕL!"! $$  "7JD?;=CNXdlqpjhlqpqpomllmkhfca^[YUUVWY[]^c[SPKD=<>Pfu}{tja[\[XVUMLJIIFA?873,$  +  (/7=CGMQDJX~]DIn~}vK@j˼ȼzûdYb[rWOdr\qL=IGSxmQ[YSUXD' -3, %6:2'$8# 0A-2Uhhvud\Q@;<:5,% + #9yŵyaOHFCDHKMS\emuxvqkgKC:1)'%$%"  (.28E]}ƼnV@.$$&&&(+.0010.-+**&#""#""rssqohc]UMEEHIHE>:66882-%! %*010.-+)()# #%##&-/357887.""6Qab^WOLPOHBAA@@@AAABBGJKJJKNUkyporl[`_]\SewjbVE@>2/9?;=?EJMOPHPOH>8Jvx_RIGGGGGIJECAABDDC>><:<@>7($63($")+/5::6432.++-/2662) + + "$%),$ "&+048@@BE=*  '%!#(*+./00033210/.../2566643234579:9852/-,+//12457797644579;:52/-++/039==9769=GS_gmqttqopsuwwvxy{|}~}|}~}uttpg_N5'>A3/(+8\N &(0`ܶt; !   .@ID=87:CIXaimmmnnqqpokjiigda]]ZVTTTVWZ[]^^ZUOC::BS_ovxvk^J@863+''  + +    +  !&)42=JinUG@Trv_ZJ\c>/OueS_|iWmdgsdXmQOGItz}rf^H*")1, +(75-(\I(;gyolxpbaVA34211,&! 5qfRJC@BEFEIOSVWXTNIE:5.($#%'"! )/49Ofz_I6' !"""#$'#!!!"!!!!###oppomhb]TMHILOMGE>87883.)&" !$(-4540.+)&)"!!&*169952) $=Xfc[UKEIJFAA@A?>>?@ADHKKKKNR_t~widci\_WU\\pve^ZWSF;FNCDBABEGHJLOIB>>Us_SFEFGGHIKGDBBCEEE=>;:<@>9'';7)# (*09@>4---+*+-/2==8-  "#"&,/" ")$  &# #(*+./0001110/---./2576544346789:9741.-,,./024678:865468:;952.+++,-28<<75//09GVbipttqnnquwvvxz|~~~}}xyyqbVN9"(=>101,/MC'"7tҥO#  " &6DA?;6227?QXajpronqqqnkjghc`][ZWTQTUVXZ[]^XXYO<19I_gmlh_O>)  + +  + +"/5IϑQ/):T}dR7Jƻȶ{bVgɾzbj}z]YunkZS³xtnlnhtl\P=&#++# #;>62la8  +=cnaRN[bQ?EA8@=4,($ -fƲgTK?<<@@==@EDA@<50.0+&"!$!)06;XnжiO>/$! !"!!oppqpld]PKGGIMNMGB=;;;:835640-.19:62.)%" "!!+259;2'-J`d_ZQPLGBABFAA@?=<>BCGKKKMSYkyypjbY^kaYMMgtsvcWPNLSTIGB<=FNNKFFD@>CE=5' #%(++)'& %(  #)*+.//////..-...12357877113689:::73/,++,//01345576557766630,**,-1/06::41'$%/;6.('-4CO^kpolijkllkgfecec]UQPQRTWZ[[ZYYVRG5,=XsjSDF;&  + +   +  +   @eQ*0+*X~c>CvƺƳƾ¿~n^{d[aj~mg^MM5FO+#1%#+(&( MZ3>o\,5TW@' "7?;;3-)&! (MDZdMA86434455542/+&"!"%*7F^|©tT=0& uttsrme^MHCBBDDC?965576558:9768;<;60*%!&/266.# (9OYXWYSRME<;BH@AA?==>ACGKKKLRZpz~xqkcYcpdYKMn~odVSQT[\TIA?>CILIDCCAAAMkxeWLGGIHEDHJGEBABCA@?>=>CD;.&1-"!*35774/($#'+-+,05=>>7+ + "$(*,,,- + +$'! #)++../////..-../1245787722479:::962.,+++//0124557556787552/+)*,-0/15:92-#! )6CR`hmnmmmpqnoruvy|uqpj[OR=8C39<522*! L۳\#! "-?EB862-'$',;GUbhjjkklkifdaaaa_ZSOPRRTWZ[YWVPMIE:4E]j`G61$    +    + + + +  #:BeV'0."?_{bM_ǽº¾ƷweWVekZ=*4!81# :N8Hj^= %??*%8?<@5+  >xνtYE9/-,**+--.-,)'$!!&+2AQjƵ`C1'zyxwtng_PHB=;<;841/.133258:<==?B><5.'"$-244-%(5ISOHKRSUQD63>I?@A@?>?ACGKKKKSYt|~|wsndYkvj]MRxoXZiffxsZLGDDFGFCA=>=@GYxtcTLGFHGEEGIGDB@BBA?==<8?B:-$""+^ˋ@ +"$ '8GF@210,%!!$/9DOY`fknomkhdb`]\XTONOQRTXYYVSPJDAB?>KZh`J80  +  +  +  + + +  +$Jp6(%#'1T`Ngľżºn\Jd|`C2Ahxf:!(B@) *<, 66M^]M:)  $#),.663;,  + +6uzbJ8/&%#"#$$&'%$#"""!"(.7J^{ʷhH1% |zxwtpiaWPF>;9640....0113479:;<=75.'! ",342.*1@PRF<>FPTSF62:E?@BA@@@ADGKLJLRZx{xvqg^pugX^sczqUSKHGCA?B::;@Leq`SJFEFFEEGIEB@@AB?><<;JZahkklllkloqruy}~vk`ZXE*';>FH>)%&=se/%!!0AJE:../,'"$*08AN\ehkmolhc`ZWSOLNPSTWXYWSNKIB?ACGMSecXPI6$##%!   +     # (>Vq؟X+ 1_vVMʿ¿ʺykcZoO5ch="4gze?%&5IE8( @dN )CSWQD/ ,5>810)$+ +  "IĬycO<-&" !! !! !##%,4AWlͿmT5$ "#%(()xwvtroic]TH?96300/0//01222455411('" ",10-+,:EOLA88:HNRK>57<>ACDBABBCGJKJLRZz~{xskev|orw}ǸiSJGJF?<@9:;BTqsaTKFDDDFGIID@>??A>=;;:;@?4& %'#!'19@3# ',,+(&)17:=25661'  +  "%$$$$(*-,! !#!!! #&+,,....-,,,-/01234566766579;;9761/,)(()*../0133444479964,*(')+/1579<82'#$+5?PXbgjkklikmoprvyz|}pb_b<  8BKK>''-S;͑A!"#(9EH>1+,.-("!)8ITU\eklib_XTOMMPRSVVXWTOJGG@;@IOQTcgdedP<=<6*"''&&&$  + +   + ""!6sx#%!1PtzfOõ¿|iho~U2=RwK6qG"0c{kK0*67;?79." Mk" +5FIB6%  ('+6?@6185.0& " + :mǶ}bN?1&!!!#)*/7BRiȷ_D)!#%&((*++wurrqnhc[QD;4/,),./0//0244220-(& &-0*#$+=FKF?:75AGLMF?85>ADEDCCBBEIJKLS[~|tpn{ĨӹQFGNK@78:<>G^~wdULFDBCFGIHB@=<>?>=::::>=2##)*%%-458+&/20-'#'09=@02240)   +!#  "%(+.3-%))  "$! "%(+,,...--,,,-/0233456676667:;;853/-*('')*-./0123433468730*(&&(+/269::4,##'.6ENXagiknhkmmmoruxz~wgac25DKG8""+8pڲm!#!"#3>C@6*%'**'!$1NZ]\lmjon\GKJ@0!(1886876,,,+*)&% + +  +  %*Gp׌5-ObdaǺpq[nrQPba1Kqq=4iY6;e~t`JBFA5-%/,)& +Jo.'-."1CF<496.;[cWL7# +"))$  )[κ~dK;2)#  !#'+/7CP`xtO7! #%'()))**xvsqplgaUK>4,($!$&*++-.1530/-(  %&',053('?GJFA?=:>@DLNG;0=@EFEDDC@CHIKMU\}tswȽ׸hTKMI=45:>AMh{gXNEBABFGIGA><<>>=;899:=<0!$+,')33,)$!%/540*$!'2<>>11131+# +  #$ !#&(*-30('/2.!  '($!!! $'*+--...-,,+,-/1233456675557:;:730-+(&&&()--.012333345640,('%%(,136785/&"$'-4>JU\afjilmlklnpuy|{i[T( 1CH:,(&0$GʋH "# $.>C>7,$ #%$"1:FQXZZXQOKLOQRPSQOKGC@@>86?RafdxrhhhXIOQK<+#19@?==<<67631.+*$"  + + !" +/0:f=)5QlønIV\US>`}`AAa^1[h@CchSPbk_RE?@>635ACEE2@{`0!"  + /BL>'-'&ItX4$!*,*'$ GiP8,($ "  # ""%+139EScsɷ~bC-  "&(*-02456zxtqnic]OE8-'" "&&(+/2/-,*$",2458:;7(&>HLFAAB@;;>IQN?/>AEFECCC@BGIJNU]tu}¹։iTLE;7;?BGUqjZPFCBCFHGE?=:;<=<;8889=;.#+-(,52% &/5740)#")6>>;22001-%    $%&$$%&&%&,,) !.682" + +++%##""%(+,,-...-++*,,/12334566755579;961/,*(&%&()--./1233333553.)'&%%(,145651*! !"&&0:9ASdig~p^Y\OFOXVI6#'.7>:5321;;952-*(%! + ),)-=> +  =kúW,7=O[LyhKGkW4LwiSdqpifaWRI7% !,6>:@B<,$BLMA;AGF;43>LQF9??@AABBAFDEIHGP\x|ǽƥŰmWQH97@IKShýlZNECCCHLHA:;::;:;:4::69<0&((*15*!1:92+("$)3<@<8**,153)!  + #&#'%#%&&$#)./* )5:5-# + $.*!"##"%(+,..--,,++*+,-/011134333688:;;9620*(&$$&(**+,.0234444420-,#"""&).0554/'!$$8KTX\cilidchmpty|~vnogL/ 1L@0#(&,;5#$Qۧ=#"!6GI;.! #$$$  !&+044?ADJE>CADB<8;:869EV[X`msUX\STJVWL8" &0:@=8654<:641-($   ! (32):\r0 =X}ƼNHMDpRIIgdWaqziQRYPBBFMH>;@=EJLVenr~}Q1;@7<=-.0 $,,+7Y{bB%/320-&-GjξmC1" !#&$#%)+*)('(-5>EHUat_D(  + $')-049BLV^gqxwusrni_WI>3,)**'-,-.0234::862.+)((((''%$'),-2:>;?BF@/$$,GNN@8?EF>605@HE?CCA@?>>>BBEHGGOZ|{þþo}hXSL?9;UW`vǿl]SGFDCFIG?<;:9987738969;0$)+..$'5<90'$$&,5>@94)(*/42*#  + $'$'%$%%%#")-1-% (5<;2%   +%-)"## "$(+,..-,,,+++,,./012234434689:;;951/)'%$$')+++-.01333321/,*("!!#&*/1332,%".?LS[_aabcegghmuz|qhh^> 6TA&&/-3?1%1aҿ0""!&;D@0& %''%  *335?>:@;<=;854509IXVOTaw[`c[ZOUUL9% '320259?JYecIE2)3:)#,-! + -");=F]ngG( #-6985/:Wȵx^8+""$'%%(-/00/13:AMW^myҽ{V;$ + + $(-2:>BKUcp{wvtrng^UJC>767:::9899:::==<;730-,+)))((')-..1786?CGFHQ^þ{rf^_cmƻxg[TJGD@CGE>==;97433155478. #,-*& (1:=6,"&)08?>60(&).32+% + + &(%'$#$%%##)-11+" + + (5AB8% (+'#$" "$(+-..-,,,++,-./0122245444799::9740.'&%$%(+-+,-.0123210.+(%$ !#'+0222/*" #);N^id\\dkmkotzzxx|yia_O. :[?+348A3/J}ʕS"!"!  1@A7'!!')'%   -0.342586+)1:FXd_V\j}t_elfeXRSM<'(2;CA=;;9430-(#  "##   +460.387@Xs0XM)5B^{waZ`cink`XW[IHRTX_^mrnfi}ladc_SD5+39$$ -=MVRB1"/%.KTajhR3 ###/556:NpªfL/& $')***.47:;@EKR[gtθrL2"   $*3>LTYdp~wutqng\RKFC@==@D>>=<;:9;::972/*(!!!#$&'''+,+,/.-3;B?3()0KNJ?8;?AC:-&'2@IFDA><<=>A@BEFJWgùrm´vzöm_UOLGB?AEC<>=:841/-,02144+ &-*# #'7:<80&%*2;@>4.)'(,10*$  +")*''%##%%$$'*/.*#$(!(6FK<%  $)*%%'! "$'+-/.----,,../012233455457:9:9852.,%%$%'),.,,-.012221/,)%#! !$(,1321/( " + +'D]oh`^clqruz~}xuywnd\R?#  :[8#.67/#""'('&!  + !-&'/,#&4FNYa_\ernj[grno`RRN?)'-8??;998430-)# + "&)*%!  +   -874576Jjҁ(4;V¿T ,3@GQduwwmbZSHA?:9K^gwy_?137HM;8331%+*)8Ss|V*%0'1K`v|jK-!&"),,5Hkμ~Y?,'""',/026=>@@FBBCEM]oʼh_ݿ~gXPKJGB>ADA;=;951.+*,.1144,$%((#)6C@:1)"$*4=A>4/+('*..(# + !%+-))&##$%$$'*-,)" "%#(7JP@% + + (+)%&(" !!"$'+-..---,++001123334566568::9863/,*%%%&(+-/,--.011232/+($"! "%)-1331.(  2I]bdefgjkkry|~{tlh`UC- 7R2$,38>FKDNQ"   $6>8*$&! %&'&" + $$%"0EIFCDFKXbef\isrscTSO@(#*5>=9865662/,'   "(-/0)!   '499:6531.,++**()''$#"##"&(-38;;<;:5-('%"/8AC8..5DCB?;877=:2,*/5<@@?>?@ABFB@ADM^rĻî}nӹ{eXOJHFA>@D@;:8640,)(-.2575/*'$ -=E>4*# "%,6=@<4/*&%(-.)$ +  +#%)-.*+(%##$#"'+,+&! ""(8NS?%  )-)$&)"""""%(,.//..--,,222333445677679;:9851-*)%%&')+-.--.//01131.*'$"" !#&*-0132.%*AReqpjghmqw}}qkf_UF/ $5C2&1:>AHRWLZŌ8 # '451'$)""&''%" + +  &:POF:35>KSch`jsrr`URN@&",8@?;8668630.+'$!  !*042+" +#,37ANXbg|`.6+ '/Fie8'$19C>6AJE?EVq^sF*!'+3:',ORI=;B]ܽi( )Ab_8#'(.1,.O}DZnM6#)4?EOU^hr}ða=' +  1@Sh|oqqrog]SLE>:861,%$$$$$$&%$"#%*.1369657972/./03>??@@@A@?==?CKZkź~uow~xdXOJDC@?AE@96642/,*),-05630-%!&2>>8/'"!!#)/8>>:1.&#"&,/,(  !&(,0/+-)&"#""!%'('# !"(;RS>% *-*#%(#$#""%(,///..--,,33334445578777:<;9740,)'%&'()+,---.//0111/,(%#""!"$'+-/020+# ,AXinmmowxy~vic]P>/ 03554CMLKS[^Ufߡd#" ,4.*##)"$))(&# + + +    + 4GQMA86>KS^e]fooo[SOK>#$.8AA;864752/..,+('" +%-492,")$  %-5>IXdhX[hfZI13+ !#%1BZyhM@699614<@@9@Utf<$%$ ;VX6)Kbt~~¾o*!:XtpO/ !$,+",0.;iÿªgH1!(6FS]mt~ξ_:(  $6Lgnnqqoi_ULB;885/($#$#$%%&('&(,4??@A@@?98:?CHVexxu}u~sbVNIA@@>AD@94421.-**))-130-+%$,07>83,&#""#-3:>=7/,# $,0/,  $)+.1/+/*&###"!!#$#"+=TT>% (,*$$("%#""%(,//...--,,34444455678878:<;973/+('&''(*+,,-..//0010.*'$""!"#%(+-//2/*! + /BR_gqwxxx}~~qc]U@* 94/9BS]XTX]]\pνڇH& "/6(% "'"(,-+($  +     '5HJE<7#"&0.+,25Lѿ`C-"#1BWhs̼]9)  (6QrppoppkaXNC8554,%)(*+-/1298678998>>@AA=60%#!&!3TLC><:6446873.'#9?A=:::988;AENavugr|~yxzo`UMHFB??><84320-*)((..0472' .<:72432/,)(*&")/7>B=:2$ ,  '-2>NY``^Q@577,%$  &"(-9\xnfUD60++.37:9=AFMYgr˿ÿżs@('#8N4 /vzP"5kg &39/" %$&-,.+Bxѿ]>(".AXoͽ`<' + +*=]~tsqrpkaXK@3.-+$ #%')++*+.-,*))*+*("  1YPIB?=:647874-'#6;>:89:9866>GQ_mûwqo|tqrrxzl_TMHFA>>=:64210.+*((,/2781%%5BC:0$!"%'%'+49>>:2($ #),-,  ''(*,-/0.,+(&&&&'%!3JUM9% ),*$ "%%$$'+.000/.../045566777888899:;973/,)('()+,..//../1331.,+)'$#! #%),/0//1,#    ?Zkr{~|wlb^ZPD-=D>CGKMKHHJIk`&$"  -67  "#%&'&#!!!  +EF3*,08?CKWbkmlZNF>**/:ACAB@=<=<:73.,,'"!!"%',18@FJFD;.! # !+1=JQQKF<1.1."!!&!$)1SyoeSC1,)(+/256:>BFNW^ƾm9##'@U4 +,nh==7.%!!$(+,, $&''')+-.0-,+*('(((&"  8OWK8& ()(# !%%%%(+.000//./0145566777888999::862.+)(()*,-.////./1330.+*(&$#"!$&*-/0...)  + (C]o|~zyrmcZSI:. !FD>AINKNYʡF *#""051 !##$"! "#!!"%''%#$$!!5:0*$#.15*+.:CGIKLJLLLID=85/-*)-034469=CIORONH<-"   %)-7AD?5,+)-.' %!"$!%(HyzocQA,**)()-25:L\UOIEA?<:;;95.($.36669:797:DKKJLoþuuvv||qdcflnkhecinv~~upg^VNIEB>:8763201/.,,,,,17960)$#(1;@=4,  $&,29;=:3+# "$(*,,   '*''')+,-/,,+*)***+)# %?WZJ8) !'(&#! &&&')+/010///012455667778999:999640-*)))*+-.///////1220-*)'%###"%'+.//-,+& + +*Farz{tnkfb\UI8# ';=BDDDEE?+./;EKOTVWWXYWRLFC=;;<@FGIHHHIKNQSQQMB5(  + &,4:76:??:3,*,1- "#)! !##+,.,(&(-77:;Vs®gD."&6TyvsqruuplbZQLNTYZZZXWVUSTONKIEA9530,+,-,,-,0:<88:@@>;>=;93-(%-2669=:6325@HQ]j~¸rp{vhX\aceffgorwyxsmhliaZSLFB@;654310/0/-,,--.26640+)),0452.*%"&.69::60)"! #%')+,""(*'&'(*+,-+,+**+++-)% +*I`]I7,#  $(&$$#%&'(+-/0110001244556677789:::98853/+)()*,-./000/0//122/-)(%#"###'(-00/,*(# + +   +F^gsyumeacZOC3 /ADFSVHLdk`e{M"$   !  )$ #% !"#! '5110/)-71)/*,-00101:AF@,"22=HOS[__^_``]ZVTQQRUXZZYZXVSPOPQPPMD9+ '0-08@EJMJFA=;:75/33,'&%--  #6[wj[H;111.)%(+54247;@CEGF?7:HZ¾tbbjf7 ) ,Fhn0+#3) # ''B¨eG/ %6IeŲkH3%)<_urpruxvuje`_cltxwvsoljgfa`_^^\XVOKIGIJJIJFKTVNKMSTRMMTXXSPMJEBBA@<:50,)(+279=?93--0>Qh|yzqs|}|wsomotz}zridifaZRKD?=94210..//..,-..01353/($$',.,)'&(" $(09;;93,&! !$&&(*-& $'(&&'(*++,,,+*))**,)%  /Qh`G7/(')%$&$%&()+.00110112354556677789:;;98641-)(()+-./00000000122/,('$""#$$(*.10/*)&"    (=JZhookhZJ8( ,=OV[in_`qqfnҋ.!  !"!#  ;NI #993''20')(*+,,+-/8DLG0!%34?JPT]aa`abbcba`dcfgge`\`]YUQPNOMMKF<620/.--./..-.//00353,!&,*% '#"&*-3:>=91)"!%&&'*-*&#"%'''&''(**++,++)((((*'!  1Ul_E6/*$**&$(%  %&)*,.00111123464556677789;;;97630,('(*+./001100100121/,(&#!!"%%)+021/)(%! +  )8IUYWS=0  $7ESY]ila_kkfwԷڴi" !!""  + + +  +   +?[Z0 !/45*#++$&&(+++*,1>LVO5$&36AKOT\`abaabceefiijkh`UNUSOLKJKKMNMJB7,#!@PLID@=8784+$  +263,$)+41").6WwrhVC850,+*,/031127::9B<:?FKIE38CUlxEAT^qe&" )-..* !-JĿŬgI1"" #*G`ȶpM9*! 1Hmwuqrwz{zutpqv~|yxzwuuwxwunlijlmllskjrqjiosrh][``ZLKKHFCDF@=70.-/1)07<@?5+,2Hlĺ~z{{x|wpkpnhaXPF@<61-.-+*,--,-./0/0354) +#-,$#!$+/1540*().488=:8;<<84.06:<>?@DFDDJ\quC&[y~f+!-')--%"";jƫgH1"#!!$-KdʸrO;+! 0Ijquxwwzywumiptw~~}}}zxqonmnnppqqrqqommvuog_[YYQLHDA@@CEB>:65553.7A<62,*4Yznq{ôxtuyx~rkivtnh_TF;>80,,,' +$(42&&171/2/ '-'"#&*/6FLQTX\cb_^`dgjha\WK;24,(0* '+*94CKLIB=AN[r:0jb4 '$+.)$"!'#OǿƩhH,  %4NmʷyV:##2D`ptxxy}|zphdjorz}zwrponnoprpqqrqolmrsng`\ZXQMGC@>?AEDCA>;635/6<9:7-.:du[N]fyľoszzusnos{~qkjprrnf]SL43310/*'"#*42(#'4890# +,""$'*06GLORW[^]\\]`cebZRLB613N[gmkhfemypXC:92,'.ANIC:77942/....//-05;<92-023/$ $)%0FptbQB3)&)-16:<=?@><74485501<@=AGIHD>?DLWj{> 0s`4!',.'! #! "+eŴĩiH, &5Rqʶ{W;#"/?Yzouyz}{mc_glpx}{xusrrqsstppoonnlmoplhc^[XQMIDA>>@DFHHE?6231587@>..DnVAHWhǿ}||qjpw~~rkhwvpg]RJD==>;4-(((*-0/-+*+9@5#%*-)%%(+17<@;4)"%,+*'&%##++)(&'),,-+'(,,'  *\h]G.+$%*)$#&'%&('*-../13445677775555679999987532/-+)()*,/..../010121/-*)$#"#&(((*,.02.)$   +   )61/8FNRW^fox}7%'% "#!!!  ! )31"   +&+%065202,&!$(*##" '--Mr4$-098?GLNQUYWWYYZ[\\YRIB;536EP^gie``m|w^H>IC<3)%1AMHD<9:<8.+)(&'')+/12037;83..'*.)*5[vo\I:-&"(3?MZbibd_P=204C=<<9>GGACCCB@>@DTkE*r`8#$*+$ "" ",>~ѵŪjJ.'6Sp˷|X<$#-;Okqvz|}~{mb^fnqy~}{xxvuututuqolihhimnpmje_ZUNKHEB@ABEGJJHC;713657CA,.TymOI\cx|wz}|pgb{tj`XOE=FB?;4,*,51)$)5:9'0;?1*+*&!&&')-39;=6/$  "))(&&&%$+)'$$')-**(%'+*% + 'Yf^H/+# %*)$#&'%%&(*-///23456688776556689:99986432.-+***,-/////0110110/,*)%$#$')*)*,.01-(#  +     .611>MUX[cinsv{ʁ2 $&$"" !"! *1-      (**.3/'&*-&!%*(# #%&)07Si0#+/@<=?;-*'$##%&')*+,17>>601* ".14:Qf}fRA2&"17DVkxXB>@A?:8DNayyL *l}b?+#&$"#&&#1YϮy}¿ǫlK/'5Ni͸}Z>% ! $+5EYkvsy||||yka]dnry~~~|{yyxwwwvuutoicbehmsrokf`XQJGFFDCEFFGIJJGB?03:88DA,4nnWNMWnzphckfcgli^RA9432-0630(%,8<94).>:$#()&$ !#&&'*/6:981+  !  ''&&'())*'$##'*,()%#&*'! + +&Yg`I0+! + '**%#&'%$&(+.//024456788876666789:99976420-,,++,-.00//0122010/-,*)&%$%(*+*,-/00,&!     + +426DQXZ\ceehjmsxzڪf("$" ! !#! ")+$ + + + + +  + !*')0,#&3/(#&(%#$(-)(6Icv]5+)-DBGLNMKMPPRTWWVSQJJHGIHDC72./15AMX\add\PHKMKE96>GHDA;9;=;840.*+++&&&(-/033;J_f]TQVH944533CSi{_K;89;:73:CQbw|iG,!4m{{dF2 ''%&&$$% >ЭqddxȮmL1%2Haκ~[?' ""##(.9FQY`innje_[Y[]`tyzyy|{xi]Xbkqx~||||{|{{yyxwxvuusojfeimqwupkf`XOGFFFEEFGGHIJJIGE35;=:BD7?bT]TJqyxwvtrnk^]coz{rfOHFC8,+3-6@EB:0+C/(32" ,)'$! !"%&+29:62,&  %&''(*,-(&##&(*,+)%#&)%  + + "WfaJ0*  !),*%#%'$$%(+.//03455679988666678:::9975310,,,,-./011001123110.,+*)(&%'),,,./00/*$   + )23:HRUVX]^]\]afll~ԊG#!#! !#"! '+'   +  +  "' )"%10%(70)%'%!")'-*)A^zjO;/)1CFJNONLKOPRTUVTPOFIKNQTNH4' .=CKSSL?5GMQJ>:>BCA=54698;:62/-+++((),.-.3KisXB73-(0@\~sVG;0*,'/:BB9/(.Km{_UNLJCA=3>95566334:CO[rsK.%(:89;WvkD-(A=7-##-)&  !""%+4;;2,%  $&'(*,/0*'$%)-,,.-(&),% +  + Se`K2," $+,+%#%'$#%)+.0003456779988766779:;:997520/,,,-./002111123411/-,+*))'&'*,-,0110/)! +   #,39BNSSSW`^][Y\aecxݿe4)%"$" "#"!#,.$  + +  "  *!49+'1.)%' !.(!#))1Qv\B6*.=?EJOPONNQPQSSSQNLHLOSZ^ZRH9,(# *;FQTMA61=GMJ?9:7>C>CRZtW[r_Juji˯y~wumqvmd_biprtl`TQ^uO;<9EDHvYRvq]|khs۵jp}}{qe`bfgghaZX_ly{l`F5?C4'+$"##'4:94-*  ''(+/131-**-01.,-/,*+)!   B_aO:* !*,.)&&))$#%+-////246789:::988888888;:9752/.--/012214333345621/,+*****+,./00121.*#!!  +   #/7BJU_`]^btz~|zɻ~/:6$$$$#"! !!  !!!0-     %7>0)2/!&'&(00*(7ZxmH>ELOMLPTUPONMLMLMLPV\^\UOKMJF=3)#$&'&%$#$3;A@:67:ADF?987662.-/12362134Af|S434$ .0+$#*-/+;OcsĽ`L>;:4/0.146:;=?A/.FSJCIi[?;<;9766643724:<>Ohc0&6Nq{rfL.&(,00++ /hо~bX`kʷwR5"$+4?KTY\WWSRPOONGFCA>;99999:?HT\pԾcE-%! nrsrtz|ylc^iw}zvvutttrrqpqqrqstsoonoqtvw{{}}pha_^_\WMIGGGIJJIGGEC@><837;GFNxPUwumlqwtՖU`y~zrhcbcb_lg_\aly_:359.(+&"$%&-7:7/'# !!"'(),122/,*),//-++-*'&% +>Z^N;,  ),-)&&))%#&+-///0356789:::988888888::8641/.//1233334333445621/,+**+*++-./00121-)"!"!  +   + + %1:FKU]`^_cs|ž]&40%$%%&%$"!""!  ! .*  + +     &1A5#(#%)""$!%%$/Nr{Y:!#2:=ABIMLKQUVONMLLMNPWXZ^`_[YTTSMD7,%#!$%5:>;5246ACD=8675&,4:;:771558E_|WA.)'"!"-0.($'),,:K]o~ý{SB53312513566678:5;LOB8:ZR3AF=;878764822:<=I]tXLYs~zoV6$*/-'($<{йkcbs̹zS7""+3:=?97533211/,,+)('')('(,2:AUlԿcG-%!lqttv{|zofdoz|wtqqpponnnnnoonnmmllmnptvx}vg]WY^a^WRKFEIKLIGFDB@<984-3Ek~{xsgrs\pNZvx}|{}xrlhfed`]khc`eq}ϧd\S3'32(*)%" "%)-2883+! !!#%')-110,+**,-.,*..,'&" :SXK;.$ "*-,(%&)($$&,-/000357789::::88888888997520.-123455543444555622/-+*++++,-.001120,("!#"" +  + + + (9ENOSXZYX\qyz9".*.$&')('%##"!  !!!!!!"+&  +    "+<3"%)$#++$!+*+=fd=+'4<@D?FKJJPTVNMLLLORT[ZXY[]^]\][WNC:4#'/29;950.14?@@:66769<>>:7681/6Xw=41,"!##!),("!#'0;HZmſiC4**,/4:;;;<:9784;DKIA?B6JTAG@?<:::975832:==CNs~{dC )10*$'Mn_fqλ}V9" "$%&"! $(:QrdG/&!kquuv{|zqlku{{vrnnnmmlmlllmllllkllloquxz{~~uj\SMT]c`YQJCDIMNIIFDA>:766+1?<:866;AB<7:CI-,ok^IA@=;::;879229>==B[zsT1  +,)".]ĩnonr¾ν}W:#  + ,B`ӿfI/'  gntvvz{ysppx|ytqnmmmmmmmkklmnnoonmmprux{y}~{wtl^QIHP]d`XNF@AINOMLHEA=:765*0:F>Nm=Fyznd_FWҾ}zi_ZYZ\_aa^^^cgkpyvrݜSIKAWr`."!'+-*%%*06541,% !!""%)-,)&,,--,*))-.+#   +$3DMD4*$ +&-,+(%%*)&&(-/121257789:;;;:99999999975310//2345554434567665320-,++,,-./012311.*%!#""  + +  +   6M]cZPMLKIJZj{~yph`Z\n׹D(!'/),)*+,,*('&%$###%%'&$###$$$"!# +  + +  +  " $=E>5)6-%/-&/*>VgsoT8().7>>??BGJGEHKKJKKNRVXZXVRPNLIG==;:7533;@B>636<<70*).36798559;:9769<<97EifGK^9-+-&(11)"!(19F[uþfD,),,-03587875301@A8,&-36(2`{xFJA<:;;<:87327<<::Jc~iK7% +"#&=qåqfqÿϽ~W9&  $6QrgK0& cmtvvxxxtqryzurpnnmmmnmnmmnopqqqpopprtwyw}{tnldWFCFQ^c_XIC@@GLOONJFA<9761*-5C@OĢi1A}sh`ZWKPnвvxjb_[[YYYXY[^elqsu{ukuMRcZUQcx`9#%$),,))-2;83.(" !  "&*,*(./0.+*(*/2.%  #$.AA?=DIJFBDFEFHKOSVWXSPKFB<623432/*&%*3:<99>C;5,(*28:79968::8;859FVems}~X68J>.(,&%*./(".5BZwʾzO3(+11/023667531/0651+*-./*5AKOUxj_ZVUb\Ywݰymyy~sjeca]YTSSV[^hqvtqprrfguߝ^xn;9YQ; !#"'*,+-03;60*'"  "&*,,+/020,))+-0-#  + !&"(4?<0'% *.,*'%&**('+.023336889::<<;;::::::::;96321236677776534688765431.,,,,../0133400,'# "$&$"   +  +  4JYZJ8268::]iL2(_jtutuvtrprusonpmmlmmnnmtsssqppotrponnoqqxvg^^WI:=HT^_ZUHEB@@CHLLID?:755943.::@txi^\\YLOI[๊ܩrk}pnvlfbac_WQOQW]YeovtonnoprtvrVSEEB5# #"%),-/1362,(&$! !!&*..-.221-)),$'$ + "!#%".:9/)'+0.+'%&**'(*/133336889:;;<;:::::::::;96322348899987734689865431.-,,-../0234410,(" #$&#"     + 4KZUC.&'++*4BVhwؽԸ׮U*,0/2$30-*('(()((''(**.+('%%&'&%#!   +  #-431-'  Fod7"&"5>KGNVD*$149;?DGFBBGIDABDC=AHMRRQPOKGEDDDBJOW[XNA94*!"*48791''-8@B?AB??>93Ukyjcc]XH62:;27=7## !%%"")*+3IjøtJ/('/50,0574542/,)*0.-.*#%1,6#Pw\B:99:;:7120.16:>@;Hm}^7 ,gͺ|j`_m~ĩ]@-$  + + +  *>]~ëlN3)jkmqtutrspmlloppponnmoprstuurpljupiffjmpwzrcYWM<+-HcaVSPGGD@<:3BIGHNMGkyT:..1466534:74.&!!$&%#$).*')9/),-.---.=)9b|gK+ )tiWYav¾˳jL2'"!   + +   .B\dzwZ>(  rsrsqqommlkkmoprqpomnnpprrrrpomlmlhhkpuywuk\WVJ6)+F_]SPNGHFC=::=BA@A@@>>50)'-4;EOjtmlep|oXNՒUZ̘]{oeXd`deYVXTVa_Z^[WY\_fjlmmnmpsttv{jqַnM0#&&(,/00/.+)''((((#" #*..,*('('$  + $*.'&2:6+#141/.-,+++++,/35668999999999<<<;;:::9876678988888888:::98765554210000001257863,$!#&$"     :NNK7!=[m}ŻK/"#'..(&)2.*'&'''())))('&&''%#!!#$''$!+#   #).,# +   %DUʤ:*% #0,)).6<<9:CFGHDC3-*,5;=ADTlrhghdJԏWdˏYҷrWQTUNPSNO\\V[\Z^^afhihhhkmpruuwwtκJ/$%*-/21/+('&$$&(+.+&#!"%('$! $),'&174)&2521/.-,,,---046678999999999;;;;::::98777789888888889:::9866665321112111245663,$"$&$"   +  7HE;)(D[lw}ɹ˃2 #).-*+/2-'%&('&())))('&&''%#!!#%&&$" 0+    +   +&DRʲ`;"'&05=EF?BCEFFFDC?>>@BEFFCEGJKLKLPQSUUUTRIFFHOW]aefcV?.-35)+7<;<>CN\m}_<+.660221/..159850+%!")-.-*(,,.5AXy¿cC.%'.451/2872-)%%*--.1/.153*"*/798p99==<<6.--.-,*,,%8B=U}cT[мl_RX`n}˳iJ.#   !#$%)7JbϼhG1" ! !mjea][]_gjnqqqrssroljikkmljjjlnotsqpponmkh`WTOC1+1Ma[SPKIJKKE@;86==?BEGEEGHJJKJJOQRTVVVVE?9438=@ELQM?3133!!0:<<9AQn}U>AC=4.,.000/-.047751,'$!"*153,&(,024BbpJ0%%*3661/3:71*&$%*.-./-,176*".7<1&h@;4-10/-++,+#;@4Gx|տnYSRWbs¿ʴjK.! + + !$'')/>RkªrP:(!  !"$%'YWSNLOW^nqtvtqopronkihjjlkihilnqzyurnidacfd]TJ>0/6Qd\TQKKKMMID=;8=CIJIC@CB?969COf{|d[f|Ӧe@~U}ТSy˱eVRW_op_U\RL]nolnnomhdbbdehloonjt_=- )(1221-("!" !"(0651*#"#  +  !%'"%03.$)3422/..-..///2577789::::::::9:::::::99::::99999999999::::988776544455555543331*$ "#$%#"  +   /7-  0;F_ʵw3'033/+*+--)&%'((&())))('&&''%#!!#%''&"(=>+      ,HKxҮd)29&=@BFGGIHIKJKKKLNOSVWXYOI>3(" *08;;72),#3:::DNib?*-11/.14*,/00/025541-*&$!(0860'&*//).D^nT8)'*.466105:6/)&$'+..,,+,275+".9;+"_NE@@=:3/321/++--'695Chҽn^QNR\m|˶rR1! + + +  #%')+4D[sDzaK5($  "#$%'&'()*--/JHFABJXbswywsomnmlkihijkmljjkmnqxwtqmidaaee^QC8-1:Ve[SSMNMLKIFA>;>AEFECABB>629K_u^Wf͟_>ұuNvǐlUzNHMZi{|iT`]Zjxskwvuqjea`bdhkmmmlmpqdB5,  +.)//-+&"$,320-& $" +  !# %/3,!*2312..---./0/2677778;;;;;;;;9999::::9:;;;;:9::::::::99::::99887666667777765430*$ "#$$%#! + +  )0$  %3YǿM.672,)++)())))(((())))('&&''%#!!"%((&#*>B3   +       1JHtz89>/.3@F@=HSXRRQQNKHFBA@BEHIHJJJJJJJJHJLOSVXXYTJ<, "+693$$(2998EZTAN=( 4A<0)+0110014531.+('! #-794,%(,+$!.AirN<0-01014654694-)'%(-/-+)+.353+$)83((UcRB>=:41531/+,.0.007FOk ϼr[PKKU`jv¿λ`=)#%')-2=Pg˼q\D3,'# !"#"#$&')*,/12334467:;=GEC>@K\ivz{xrmkmjigghjklnmlkmnoqqqpomkiicc^VK=2'0@?@ACDEA?96:KcxvlZVd}˜]@ƣrQrxNOgy]EEMQViqeZnofoywr}{yskd`^`ejkllnphchu|qU=0+# !2+*)'#&,-..)" %"  +  +!!'12+ *1102--,,-.//03687778;;;;;;;;88899:::9:;<<;:9::::::::99:;;::989877778889:987620*$ "#%%%%#!  $)  (Zѽ+143,%'--'$)..*((*())))('&&''%#!!"%'('$!)=B7&  + +  +   +    5LFrݐJ>><@=:9=FMPPNNNOMJHGFEDEHKKKJJIIIIIIIIKLORTVZXSG6& )4;5%"*-1884Fgh@:F@/#*:B8*/13432233331/,*)#(4;91)'('!$1HbpR4-,473-,0798784.*((*/0,*),023.+'+9,(1Fpx_D;;;64652/,-02-+)7E>My÷¥èl[MCBIRZiz®oK2"&)+-3:BNb{ƷqXE<82,..13466:>@CGJC=969HR`tp]SOIBCDGIKNOQWY\`cfijqqrtuwy{QLD>BN^jstspifffgggghiklknomnstrrrqrrnhd[TMIB7.%0J[ZXQHJMKIGFGHJ@<8328AI<@HUh}vl_WW_zϞ`Fa}fNL_oj[KF=:Fayyfbsnpwvrrpmhc_^bfkopprqqjrs`]cXE, +(12$ &(+,+& ! "#! !%!!$!'11*!!+13/,,,,---..13677789::::::::88899:::;;;;;;;;;;;;;;;;:;;;;:989:988899;::;<;861.(# !!"$&''&'#   +"  ~A("-+'$&,00.&.0,(()'(())(('$%&&%#" &&'&%"$>?@0  +  +   +8HN|F69;?62;CB??EEGIJJJIGJJHKPMEFEDDEIJKMPSTRPPOTVWSKA:8<458230!*<509:/TtGG@1)4CF:285)*06875675431.,++( *6:6,&! "#'3E]ykN=5+,/241-+/58951-++010/1/*)*/3/()/,2..C70puJ:;<85363+,53((23027@LZenponjghiggggijlmlnmkmsutwvqnibZUQMJJE<5-6N]ZWQILNMKKKLIF=73/06@G?J\n}rfYMMY{ҟ[3?fnaL?NfkaaVIG^±|wsllmkjfb_]aflqpomkxsspebe`Q1 3:5,&"'*($!#&$  + &&(21*",23/-,,--....1367778:::::::::88899:::;;;;;;;;;;;;;;;;:;;;;:989998899:;;;<=;850,'"  !#$&'''&&#     " + -źW'-*.),*(+030-$+-*()+(())((''%%&&%#"!%&&'%# )EGH8   +  :JQעc82:G>6459?ECBAABCDFFHHHJOKDDCBBEGJKMPSUTSTTQSVSNJGFC<=<412&-?70790Tp>94/-19:55;6-/26889996421.,++*#'176,&#'-6BUnlL6,).,-./.,,.36840,*,13200-(*-//-,--+0-,>1)exL>>;65385./42&&00-.27lƷȴʯ}W>875778:CP[nwþƩgJ7+"!%')+-23468;<>ADEDEFILTX[\_iuǾGE>;>JWaklmkiiijhhhhiknooomjkqtsvtld\RJEFFHKHA=6@T_ZWPJMPMMOQOG@:50,/4;>?Snzn_TJKXzǝ_33Ojtso_Uh{nif^Wdffedb`_ciosqmifzzoikidgc>"66.)% !')&"!! "(&   %%)22* %.341.--...///1467778:::::::::9999::::;;;;;;;;;;;;;;;;:;;;;:98999889::<<<==<85-*&" "#&'()('%%#  + !#! + G6(44(,,,/33/+#(*((*-(((''&&%$$%$#"!!$&&&%# /PWV@      $0-1+2@91563Yr800280/.28:745657:<;96421.-,,-("!)16/*&"),)*2IhlN3%$(0-+**+-..2561-('.353.-*'+/-)+22+*/.+6*#]yMBB:22399314/$%.-**-2^͹϶\?52440,+/7?PXfvţmXH:20//////01357<;@KXblllkkiiihhhiklopqqolmomhhd]UNF@=CFJNJCA=HY_XSOJMNMLORNB8-+*/5<@CJa}wmbVGCT{ƢnJIb}κ~v`UMQY\XY^abcccdcgkorpmjjrvhbolbjmR3'-74..+'()(%""()%!!  !'' + + )23+ '04410..//00002478789:;;;;;;;;9:::::::::;;;;<<;;;;;;;;:;;;;:98898889:;<<<=>;73*(%#"#$&**+*)'%#! +  $$!  'g˄0'++--,-//,)#%()((+-))('&&&&%%$$#"!!$$%%$" 5_keE  + + + (:I]uJ=@ILA8455:9888;<@@CEFGHGD?@ACFJPT[]_`_`bcabcb^YUQGCC;(&/-!1>81464]m1-2591-+47449:745:<<:65420..-/,(! +23/)#*+)&+:O_h`N9("%*-+*)),./0343.*%$/693-*(%+0,$)75)'-1*,!$_zLCF:76665542-*" $%#   ! !&%  + + + '11+"*24411000011222578889;;;;;;;;;;::::::::::;;<<<;;;;;;;;:;;;;:98788889:;<<<==:50('%$$&(),--,+(&$  +  #$" + +8ýźߤe/"*-+)((((()***))*,))'&&&&'%%$#""!!"$$%$" :l}uL +  +  +  *4GcթqFADC;667801245789=?@DDDDE?@BDFKRX\^___^^_`aba^VMGD?@7$#/0&.540366Yc(*31.30/64,/9:7338::966431////0,#$,62,%! $&(,16:<=:950)%&'(()*-./04430+&$$2::2)&&&+.)")86)&,6-$*f|PCF>.%27<:61)##*,)'*.1GsվδX9,'"$)-./011.08AJYev{űyulmkllmmpvy}887@7%&67,*-//223Wc*.93)22361+-68643568766542000.1/'$10-)$!#%"(07<8/)%+030,)&%&*,.00/43/,'&(*4<<0&"&)**&#*43+)*6.$#0e\GA<0&05;;6/'%*.-'%*05AcŸϴ~S4($ %*-,+*+'&,28AKV]dmt{897;CRdprolkkjfcedfgjlnoonlhhcSF>>;857?EOQPK@;EIMYYQNJCEIJLLJD=8BFHGGP_l{lb]zs}}j`[XSNMO9>A?=<;69=>;9;:735568CKU\bdfgiiinqssnmlnoiikhlojpsshR9$"+37:99894*%$$'$!"%#  +  "% ',*%+2310122223344358999:;<<<<<<<<<<<;;:::99:;;<==;;;;;;;;:;;;;:9877789:;<::;<;60*&&'(*-/0////-+)'! #$"! "%#e̴Ѻк\ !&-%-)+*)(''())*+,+*)'%$#$&(*%$#! !!!!###! >uuD& +  +  +  + (00K|۳_H>LUI4)+****++,-.3;<:=BBCA=89?EUY^a`^[[\ZWWWTPK@00,*()*,''.6969ADD@81/49FKRXXVUSWRLIIIGD=9;7)->=6&$,-**Sj,+55.***,164/0343//0577554332+/1,"%.2-'!,13/)%',*+,,--,--,++,-...+'#$*3:5=<- )1*$#(+*+.1%./044O~~U5476,0782*'(/0*"!)28?QŲݿ{L-#!"##"!%,.*'',06;AHPVYeosw~¿7985;==964422122355332101----147@T_de`_bfjklmkhgfghghhiiihkhcdf]MIJNOI?3+*043+%'./20)!%" "    +"--)%  ,22024444445455779:;<<;;:;:;:;;<;<;<;<:;:<;=<=;<;<;<;<:;:;:;:;999::;;;9::962.,#%&*+/0221///.+(%" !!!!"$##" + !"! M©޾u. #&'**+,--+*)+*('(*,.-)%$'+,+*(%"!!"""! "#" ;{eB    + + +  3:2LY1)N_A@>94.*()*,.-,.39DB>952//6;@DDDGIPI@=?A>;532.*/8>4*(484Wc%+201/+,/0..12222221256544444-274* (./,(',,+**+++,+,.10-)*&#'-32/,+)'&(/499:-$+&&"#*-*+/**,0..:OtP7;16.0230,)(/0+$$+02:Nx̽ɨ}N, "%'&#$$'*/37:;GNHEF?6<@C@;9?FIA8557523201122243210///++*,-13:P\ac`_adhijkiiffggiiijjihhfdfkiaXYWQF;1,10,)''(,131($   % + + + +  +  #-/*&!,33124444444445689;;<<;;:::::;;<<<<<<<;;;<<===<<<<<<<<;;;;;;;;999::;;;:::851-+$%'),.1221///.+(%# !!!" "####"  $" %cɽŲּ?% %%%')*+,,,+*+*('(*,-/+'&(****)%"!!"##! !#";wrO( +   + + + +   %<>5SǍT7J\PGE?6-'''&'(&%(-3<=;950,)*/35679AD=50-=U[[\TMKKKXSLEA>;=HUfyynfbXI?>:?>52796CCA;57?EG?500133322222332210/...*+*++-.5LV^a`_adegiiiihgggiijkjimhegghkngbXH:236:2'"!$%'./,$  "(   "-/*&! -3313455555555678:;;<;;;:::::;;<<<<<<<;;;;<<<<<<<<<<<<;;;;;;;;999::;;;;;:840,)%&(*,/12320//.+(%$! !!!!"""!"#$$$%$  %#"!6ҹɼn%'$"#()*+,,,,**((()+,/,(&'(((*(%#"""#"" !## 8pb= +  + + +  + +  5@>>dRFLTLKF=1(%%%$"!'-.25750*'!#$%%&(*-)%$')(%%(*($&.5+%(5=<]c$/26/+)++*,1111211123322111013564,"$-11/+*)(()+,/.-..-*''&',353/*%$%+034/14*"*%##$**)),+)).26:GaV55/631.+)))),-+&'.225GlϬS0"! !"###"#$',39=DEHIKLLLF@@HZr9;95:JZehdcfgdabdgjlkhdacdgklg\ULD6.((14-,-?W`^^XQMGBIIB6-/9Gcqrg^YPD=>??91--0223323332211/.--,-+,+,+++/DOW\]^bdbeghihhhghhiijkjqhfifadlmfWB1-5><4*$! "#   !%+ + + !-.+&!!-4423566666666779:;;;;::99999::;;;;;;;;;;;;;;<;;;;;;;;;;;;;;;;999::;;;<;:73.+('()+-/234210/.+(&%# !""""""####$$%%%&&  $#""! DʹѽۚO!&&#"#'()*+,,,*))(()*+.,)'&&%&)(%#"""""! !##!3fvX  + + + + + + + + + +#?98L{ܹW?HGJLG=1)%'$#'"'.564-)! ! ')$$*0'%##)39:_e .360+())(+/0111011222110///334783(*242,*)''(*,..--,+)'&(*0563/(#!%.564-/3*"*%!$'*))(*+)(.489ATZ11-551+'&()+*,+'(.235EfЯV1"" !!"!!! #',/.124678850.6F`:<:5:KZeidcfgeceegikjgdadefjkf]VNF:2+*1:<8,&).A[c`^VK@3)+21)",Fa~wndZRJA:8>?>95566:@HJE?8653/-./001233321000..,+*+,.-/-+*,=EMTY\`dbdeghhggfgghiiijlfehf]]dki`O;0.//0.*%   !  %+ !,.*&"!.553466666666688:;;<;;::99999::;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;999::;;;<;851-*())+-/03453100.*(&%#"!!"######"""%%%%%&((" "!!"##Rӹ±;ҾY. !#"!#%&&'')*++*))((()),,*'%$$$)(&$#""!! !##!,Zs-   +  '0@-2a˄K<@FMPK?2)($ (0551/&%! $($ "&#')()/66_h.371,))(')./00101122110/.--4226:7.%$.34.,*('()*,-,,+))))+.3551-&!!'0675.03)"*%!'*+()((++*.3757IZ-.+570(##'*+)*)')0445A^ұW2#" !!!"!#"##&'')))# '5Os9;95:JZdidbegedfefhiigedgffggc[UPI@92-0773&#*0C\c[OA3' +!#(;[xzqkbXNE>946898420/26:;74220/.-,-./012321/./.-,*))*-./0/+)*5;BIQX^aacdeefggeefgghhhcabeea`aglphT<'"%))'$!"  !#%!$*    ,.*&""/654577777777799:;<<;;998888899:::::::;;;;::::::::::::;;;;;;;;999::;;;;9740-*)*+,.013464210.*('&%$$$$$%$$$$###&%%%%&()$  !# "$%)hűδҽ-"! "%%%%%%&'()))))((((***(%##$((&%#"!!! !#$" (NñA    + +  8;8)=xqFBEKQQK=2+% (-001*'$! %,%',-+-23_i-371-*+*'(,///000122210/.-,2004881+'/30/.+*(''(***))+,.13552/+$"$)0565003' *%#+.-(('&-...02..@Y)+*35-$!"(+,&))(*0456?W~ѰX2!!(Ad58627HXbgb`cfddfeeffgggffc`__[TPPMGB:2132.&'05DZXH3  '6G^x|ulg`VKC>71235641141233133532/+(*-//01220.,.--,*))(+./0/+((-27?JRZ`bccddeffeddeffggbcbaehfaajwxiQ6$  %(((   #$!#(   + +   ,-+'##/66467888888889:;<<<;;998888899:::::::;;;::999::::::::;;;;;;;;999::;;;9852/-+*,,-/024575210.*'(''&&&&&&&%%$$$#&%$$$%()&! !!# $'' A̹IJʾƻa "$%#%$###$%&))))(('&')*($##%('&%$"!  !#$" 'DŸb5   +   $GE04TڭpSKFINOG>1+#"&*-+)(((%! +/4*#/1.,01^l-362-,-+((+../000123320/.-,0//15630%  *0211/,)&$$'())*-046763/,)$$(,0244101$($%/3/((&$-12.--'&;X'**13*" ")+-$(('*2566=PvЯV18[x253/5FVae`^bdccfeeeeeghhc_ZXVSMHQNKH@511-+%*48CVJ5 %/?Vozsjc_TJB=810//0/03835788::;85/)%&+/./121/-+--,+))((*,.0.+&&)+07BMW^`bbccefeeddeeeffehe_dmk`]fsztcO@(#+-*   !" "$" &   + *-*'##07646888888888::;<<<;;998888899:::::::;;;::999::::::::;;;;;;;;999::;;;8741/-,+,-./124575310.*'(((''''''&&%%$$$%%$#$%')'" !"$!!$)*%Rñҽйοv8!"!&% %$"!!"#$))))('&&&()($"#%''&%$#!  !#$" )=Q +  +  + +  +OJ+AjaRDBINKE70("$',,+-/.)#   "8=/  02.+/2\l-351.-.-('*-.///0124321/.--...02443)$&.3331.)%""%'((*/389972-*'#&+./02410/!%#&150(('#-34/+*$"8U%+*01( $*,-$'('*2557>=<;::99999:899::;;;<;:999::999::;;;;;;;;;;;779:::::8630-,++-/2454435442/,(&'(())(('&&''''''(''&&'()%" #$!&&'%"(&tǾ¤ԿA "%&$"$&###$$$$%'&&(**'##&((%$%'$%$%$#!  !!"%$*9xŷo6  + + + >WK3_םfDEHGJJ:2,*&$&)/230+(';C5%%(-34]g006/000/+(&(*,/00016531/.--0-,.25541+!"'/4994-)''&%',144<;73/,)&'+121136243 "!*/20)%&(01/.*% $;~S")4-,$&++(#%&(*-27:9HbϰP)   +.Rt55437DVfga`egedggcabfgd`YRIDB@;8BLUTJ=4,-'*49879 /Rqy|wqf]_XQHA=;843320137=:669:74,*(()-./221/.-,,**)))((())***)''#%'*1>=;;::99999:899::;;;=<;::::;999:::;;;;;;;;;;7899:::97630-,,,./2454434432/,)''())))('(((((((('(''''))&#"!$%"'' )'%, 8˱ʵk( "#"!##$$%%%%%$$&)+*%!"%))'%$$$$$%$#! !!"$%%2uȷZ*   + + + -IQC?pʓbK=;EJ@4+*(! !$(,./*)!"''$&+7A;' "'/67]`)+20011/+(&)+-/011265310..-/-,.25543-$ +08:72.,)((+0589>;61,)'%(,131025331(-/.(%&).000+%"7U&4+)#!(/.+!#&)-4997E^˭P) + +   -Op44329HYfhddgigdeecbdgfb]SKB;8632?KWXP@3),*.451,, ,Fgztlc[]WNF>;:9656532357645662.,+,,,,.02210.-,,)*)(((''''(''&%$"##%+5COSX\^`baa^^``aa``bba``aabca_]]bin]T=  $!  "&! +   + +*,)$ &397469889:::::;<=>>=;:::99999:89::::;;=<;::::;9999:::;::::::::7889:999652/----.02344434321.,)((()**)(())))))))()((((**)&$#$& %))"+)'/?Ϻ̽ϼƾz/  !#$%'''&%"#&)*($ !%(*(&#"#$$%$#"! !!!"$% +oʵG  + +  CRH@S켇[=;KQ@5++*#%()&$.453/-2=>2&09:`~Y*.60111/+(&*+-/011254320/.-.-,.144461) $*49:854.--06:==>:3-(&%$*-33101332.'+,+''(+./0/+& 7T&4)%" $,10-!%).4966BZɫO(  +    -Ol3321;M\fhggikiedfeeffb\WOH>731009DQUOB3)+,-/,&##E\w}wqjb\\ULB;99845663001334463.*+/231/1200/.-,+*))((''&&%%&%##"" !$)1=FNU[_a``a^]^_^_^^`_]]\]]^aceb]Z[]`eU2  !%$!$"! "%'  + +  ++-'# '38746989::;;::;<=>=<;:998888899:::::::;;:9889988999:::9999999978899988531/.../00233343321/.,*)))****))+++++***)))(()*++(&%!%("(,*#)&$,RŸʾū٠N"!!"$&()('&##$%&%$"$%''&%###$$%%$"!!  !"$%%gǶl%   + + + ,QREOlرYMOL93//-%  -6;83.+,6;6&!.69SiJ+082121/,(&)*+--/0144321/.-,,,-023473.' #-6;<:944359<=<:6/)%%&',/441/022/,(++*(),/0/-+'$ $:p}M%*0'"!"'-0.*#&*/4945?TĨ~M'  +   /Rq1200=R`fhhiikkgdiihgc\TNJD<40../4=HMIA6.***%1h}~zupkfa\WPH?97652243/,,-024563.*-0442123/.,+*)(())((''&&$$$"!!! #&)/7=JR[`b`bc___^^]^^]][[Z[Z[W\``\Z[]]hbI3("$$!"  "! !$%(  + + +  + ,,&! (28757889:;;;;:<<=>=<:9998888899:::::::98766666888999::9999999978899877320/./0011223333210.-,++*)****)),,++**)*)))(()*+.*('" %)$!+-+!#&!&Lǻ̺ȸ̽۠h5",&!#$"$%'((('&%#! "%')'$""#$%"#$%%$#" !! !"#%!"]O"   + + $QSC2.*$!"$(--'" "(*,/3756>O¥}K( +  + + + + +  3Z{02/0?Wcfgiigiliekjie^UMHD@93.,,-28@DC?92*+) >{|trmhc^[XQME=64320//-+)),/246540.-.121//0.-+*('&&((('&&%%$##!  !%),05DOY`aacdaa`__]^_\[YYWXXXZZYXVX[_ZddZOC) +! !"&(   +    -,% ")27767899:;<<;;<=>>=<:988777778:;::::997654444578889999888888887888876610/..0122222223310.-,,,,)*++++*)-,,+**)*()((((**/,*(# $)% #,.+!"$#gȾöů÷j2$ +1+###%'('%##$%&'())'# &+-(" #$&"##$%$#"!! !"#$"!R|> +  +  +5HJC[ʤ|YB>;8/'%' 1BG@1&"%+/6:5- '.(+!).//111.,*&&&'(*,.223320.-)+,--.146530*# *4:==>=;;;:750-($$'*,-0552013,**#..+*+.2460(  $+<95:90%! #&+-*##&*,./2588=K}L' +  +  + + +  9f/1./@ZffgiheglkgjjgbZQJF@=94/--.16<@@>91+-* +?~zrmjd^YUUMIB<521..-,*(&)+/15544210..0120..-+*)'%&'''&%%$$$#!  "$&+0>KV_`abebb`_^]^^ZYWWVWWW^ZVSTVXZ\``_\O3  "#%#      !.-$$)2777789:;;<<;;==>>=;9888777778:;;::999765544557788899977777777888887650/../023322212330/.,+,,-**+,,+**-,,+*)()'(''''))0,*(# #)%!$-.+ "#$cǾĮکO!,-.**,01/)$##""#&(*('$  &,,'"!###!"#$%$##!! !""%I¿U +   + + <<<;85/,(%%'*+,/452124+)+"0.))*.145/' $+63046.##).0+#"%),./15;;>Iå}M'    + Al/1..A\hffhgcellhhhf`XPJG?>;7300126<@@>8/,0.   >zspkd]XTSKFA:51/,-,+)%&*--134333330.04620//,+)(&'''''%%$$%#!  "(/:GT]_`bdcc`_]\]]ZYWWUUVVTSRUY\\Y`^]^_Q6 +  "$%#    !/-$$*1687789:;<<<<;==>>=;9888777778:;;::99987655556777889997777777788888655//../134332111330/-,+,--*++,,++*,,+*))(('''&&'()0,*(# "(%"%-.+"#&_üİ̞K )&./13783)"$" !$(+''&# !&+*&"!#$" !"#$%$$#!" !""$C£` + +  + + + +  ;OAKtдx^B4/,($1AF>2)"#"(3=5' +$/2#!+1,-/121/.''''(+-0013431/-(*--,-046640*#%/8<=?>==>=:7/-)&%&(),/453135+)+ 0.('(-023.'! #)/773/+##+21-% #(+,/04==?Hæ}L' + + +  %Gpͽ澓z}ŰԽý{nvyhPA?@@@;852,'" !" "3Xy}siXG5,"#& !#(29?NOONNKMLJD?@FLMMIFB@ABBBCEFFM[gjcdhlsvxxy{yvrt}{xuvyz|ɾ}Y2#%+06Pip]dspY<,(+39M^zƮW6$*Ihu}|wsqprwxywo^URVdz¹ytngc^^]^_\__ckqqvyxvy|}}|{{¼T:+3IflR=&! D_wZ: 7LY]aabceefhjjihjhgejjihfeeb^TLC5-*.37?GNTXZVVVVWXYZWWTQMIFDBBAA@?@@?>?>=;;:855>NZa_\Z[WVVVXVVTUUXZZXPOMKJOV^^][VPJFA@:12:>@DBMdgN. 0HXq{|ynf^UOPS\hsrkaUKD??9-"#/;CE?5-"ǻ㼔{Ͽϵworv~dN?>>>>:730+&" ! #5[}}tkZJ8-""%! "*2:@LNOQPPPNID?@FKMLJGCABCCCCEGFMZehlmprutrpnmlggkt}~{vtsvx|þżwZ:--/04K`zpbW\fu|nZI3(%'-2EUqeG33Jeu}~}zvrpprvwvrjZRPUcyÿ|vohda^]_^]]]aimmsusrux||}}zxzrK8/??==><;::9855=NYa_[YZVUUUXVVUVVYZZYSONLJNU\\\ZUOHEAA=9;@?>AESlveQHH=% *E\l||{of^VQRV_jtqh^RH@;;6+"#0/#" !(1;CIMORSSSRIE@@EJLLKHDCCEEEDFHGNZdgstxwtokh_\ZVX`ku|zvroqu}ýhVB85302AQersgWLJRVasmYNADKT]_RD7.""';Kf}cJBObu}~{|ywsrqqsuusmdTOPUcy~xskea^]^\[ZY\dgilomnqtx{~}y|~zvsy{Z<46JhzgM91/-* )Gfv`F3' + ==>>;:;:9887855=MY`^ZXYUTTTVVVUVVYZYYTPOLIKRX[[YUNHD@@>?BD=8>I^ynE$ $%16Hd{~~pf^XUVZbmurh]QG?883+#(5AIJC8.#ֶеŨsigjnty}~|~~~{iUE<::9:760,)'%!  +Ek}vodUG3' ! (1730-#'Hh~wbK>92.,)APZ`^]_abbcbcdccdb`]ddcba`__YRH=2()-02359>DGIKOSTRPNMKGDBABC>>==<;=<88987776955=MX_]XWXSSRSUVVUWVXYZYTSQNGIMUVWVRKDB<9:;>=5/7Mh[8-07:JRhre]ZYZ^fqzvmbWLC:84-&! $.9INQJ>3&ԸԵϼzlbagkorv|~}}}{xvxxyxwtrj^PD<;766640,*'&#  $4Qxÿ~wsh[N8*! ! %0==<;:<;77987676955=LW_\WUVRQQQSTUTVVWWWWRRPMEEIPSUTPIB@<74463-,JTdprc[[^^aiu}ul^SJ?;6/*$$$&'+5@OUWO@4(űԵϸ{ve_^bfjmns}~~|xtrsrpmhec^WMC=951011/+(&&$!'<\¿|wumaU@1&"" !.@EIJIGEBA@>>?@@===<;:<;8899888795482,*-/-*%#$"  ,Ff¿zvuodYG6*%$ -=GNNNNOOQRRPKEA@BDHEBACEFFDHJKR]egdc`\]fvvrjghoy}{|xwɾqX>'$''*-*$&5AFFBA>@;ACCA@>>>>>???>==<;;<<99;::::9954=<;<=>????>>=<<;<<::<;;;<;954>@DB?>?@@@>>@GPWYYQPPVf|{hcgku}xposmZH@@?=;9:998:::;==<75===<:88:@GLMLFJQ\owgciltyspospR@/$-:L`yvbO>0( #'+,+&#%-8CKF:.$#5M]ef`XVSNHEA?<8=DLVg{}zvx}|{yy{wvtrpmmkjhhhjkjjc_VH=@AAA@???=<:99999;;;<>=;650&"&-11,&!!  )4;7.# +?Zimle_c`ZTPJGCCDHMVfv}vty{{yxytvtqnjigkjhhjihf_YPEAEZn~Ǿxsnljfd^[ZVTSSQOPTVXWYW[YUSSSUTKGHO_p}|z{zskgmoL$ 9^ovözT4 *7AGDFQ^_XOKNRSVV\[]]]]\\VTSQNNOOVWYZZYYYPF:1+).4<=;:641.../13589>?ABCBA@?>=;:899::<<==?>844;84./2456528G]tzhgtxzzqu~oUB.$!!'.AK]s~||yvtnifn~mG$0Giw|}Z8%+9B?>KZ]TKGLPQTV\\\\^\ZZTSRQOMNNVWWY[ZYXQE80,*06>><<851/./02479:?@BCDCBA??>=;:;:;;>>??@?633:IRXTPOQPPOKHKIJKJIGFDDDDBA?@EFGF@8.)"*,()NixppmifQ;23Ldtuonozq\U`n||zxxx{|~}ulgc_]`ku}qbUNɽ¶xrnmkiifdeiov{}zyxuoje^VQROJE@:522,&" 6[ǿľzrmmopbVF5*&&'%#   #/>OZVVSMIEGFHIKMNNMLHFDCA=73)+-000//:Ic}njvzzxp}r[B0!!%$" #*7GSWOG>1()2?IW``ZTOLKMJ=.*07?HIA:::?K^u}{xsojggm{þkE(&?UtrouqW=.!0965DTZMEBFMOSVZZZ\][XWTQQOMLMMVVWX\]\XQC6/-/5:>?==:842223469;<@ABDDDCBA@@?><>=<<@AAAA@5118GPVSONPOPNJGJIIIHFFEDDDCB@?>CEFB<3*%")*&*TivpqrldJ5/6Oiwxpllxp\U_n{}}{xyyyz}yulc^VTS\jvwi[UùǿǼ~yronljdefiotvuuxvplg`WQTQLF?9411+%%?eþ|spoqtg\K:*$$%$"   + (6ES[XYVPLHIIGGHLPRSRLKHFA;3-$&),-/14?Pjtkvzz{uq`J4%#())& $+6?B;83(!*9Uar}~zupvwwrfVNN_iuvpd]YUfx}xulg`[Z_flyusxxxzzvtutsprnidccfghggghfb_ZNDCO]qupljjkjheb]ZTPNLKIKMPPRSPNIEBAB>;9>Kby~}|zunighkriD),H^|pmpy}eO:,! (300@QVH>=CJMSVXZ[\\YVUSRPOMLMMWTTX]_^YOB4.116;>?>><:7655678:<=?ABCDCBABAA@?>??=>ACCCCA60/5DNUSOMOMNMJGJIIIGEDCAAA@?=<=ABA?90'!"&$ 'TkzrtvphL6/8Smz|sonx}}o]Wan{~{wwwxvvoi`YTIJNYeuwk`[ɼwqnljdedgkmppqsqmkf`YTRPLF=731-(#0Orźþ~uqqsvmcS>,#   (3=GNU[ZZXSOKLLHGHLRWYYXURME;0)#&*-/5:@L[qujv~n_RB/%!!#)152-&$-39>:3251-7Fcq|wl]WVclxzsh`\`jxztkdabfhq{zuustx{uqpsrqmmljhfdeecbcdeca^UH=>LZkv~qlihhjiggd_\WRPOLLLKLMLMLJFC?>=887?Nf}~}{yxyvohfgovÿmF+0Ofz}pifmwgS=*!  &0954AMOD;:@GJPSXYZ[[XUTRRPOMNMNURTW]a_ZK=1-1159=>@?==:988889:<??=?CDEDDA60-2ALUTPMNKLKJHKIIHGDCB>>??><:9<=>:4+"+[wwvxphM<4;Un}wssx{yl^[dp|}ytwyvrnd\TNJEGNW`ku||vkbZWλĻ{sqokfgdfhjlnnpmlifb[WNMJC=733*'  + $;]}ĸþxrsvxtj[D/$""!"+:BMUXWWVXXVTNKIKJIIMTZ]\a^YRIC>:CKGE;9>EIKPWX[\[XTSTTRPPQRRUSSV]`\YG:/,/125:;=?>><;99889:;;>?ABCBA@@??>>=?>>?DEFEDC70-2?MUUQPMLJKLKKLKKIFEC==?>=;:99:<93* 5f{tpibGB8=Wqxwtvwth]\fp|~}xsqv|snf[PJEAEKQW[`hmrplf]TPNϺIJƸ}|wtpifeffgjkkigc`\WUPLHB>:63*(" (Ej­|qsv}xw~|udL6*!! #,;EU^gfcbZTWWTOJFFIKJIMRWYWYZWTI<.&!"#%(/;CTcyx}rdUKE?5-,024431039DQ]hoq]QLPLCFQfz{rg[SX]a_[UTURYdnx}}qkhjknw~usrojfabed`Zaabcfec``_`beb[UK?77BO`m{mlkmoppoljheb]XTOMKIHJKKKECDC>8404CXrzwwvuvsspmgcgsºtL88=@BFLQUYZZWVWVUTW[\YUY[YUVYVTG<1.023589;<;:98:9999:;??BBEFFDDB60-2>KRSQPOMJJLNMLKKLID@??=:8789;:73) DmynibQC77=Qk~wurxuoeVOWbiqvvutqnhcXMFEHMJQY]][\\[UNHDB=;˰Ƕʽ}|wkeeedefgieeb^ZXTOKF@>:64-($2Osðؾv^USTn|{|lS=0$ " !&+4?O[ksupi`WOSRPJEDDHMMMLPRTSVTTRI?3*",9BN]qvi^PHC?713454347:FP_n{qfdZMJRh|~vk_WRY^_ZTPMKPZcinstx~uomlmq{zsnhhb_`efc^^^_aedca``ace_UMF<7:EScnqompstvromkgc_ZVROLJIJJKJFBDC>8404G]t{xtrsrrrqplidbkzſySENnynmpxkVJFPZ`]\VU\ho~oYB+ + .BJNKFGGC:36:?@DIQUXZWVTTXWY\__[X^`[WUWQMB7,+.03578:;;;:9::99:;;<@ABBBAA@A@@?>>??ABEEEDCB5/,0=JTTQPOLJILNONMMMID@>=;87667862," )Ps|ypf`YK=23=Qj{xvvsmcTKPXbiqqqpli^ZQGCFLR[[]^`]WSIE>86641ȩǷͿ|ibaa```ad`a^[XVTNKGC?;84-)$ '>[ŸwpoqʜqN<3-Ddu]F6' !"%)3:DQco{odXOONMIEDGJOQQPPPRSSPOKG@60"!$.:CKWiywkYPGA?<72;;:637AJbp~o[NPj~zpd[SY`ed\SKIMQUZ]`adkxzsmkkpyvkbd_]]aa`^YY\_aaa__`cee\NC@:8>KYhr}qopquvwsonkhda^[VRPMJIHIHD@BA<6208Mdz}yurnlnmmlkjheabp­~YO[xsc_^ro\PKQWVTVX[frzu`K1#+=MSYUOJD=3/06:;@EPSUVUTSQXY[^`^ZX`a\WUTMH=2((-148:;=>?>=<;::::;<=@ABBBBAA@@@?>=?>@ADDDCBA4.*.;HQTQPOLIIKKPNMLKGC?86520/111/)"  :`xtle^[SD7-1?QgzyvwtndUIHP]ckmmmieYUNFDGOVfba`_YOE:61/1357ƨ͸icb__^^]_]\[YWUSMIGC@;84.)% !$$$$#" "!'0Id̷ʹ{bWTTi޾jF1&!.D`hQ=- ! "!!#$'-8BM[mw}qg\QPNJHEFGJQSUROMPRQLHFD@71$#""'/8>HP\ix~wk_RLD@?=95<@?:9BSazlVRk|sh`^clvzrbVRRQQRSTSSYdmx}unifkqw~{mab_][\__`[[]^```^]_cfdYH<97:GUan{þ{pnprvywupomjgca_XUROMIHGIBAAA;521;Sk~xtoljjjjjjgfb``fvȵc[g~o^URhwzjb_`cZ^diqxvdO6&!&8FQ[caZPD7-),379>CMQSUTTTTXZ]``^[Xa_[VVTKB8.%'-259;<>?@?@=;;;;;<==@ABBCCBBA@@?>=?>?@CDCBA@3+&)6FNQPPOJHHHKONMLJFB>631.,*+*+)"  )Kmzpf_[[UE8*1ASev~xtxtphYIFIW_ghiigbYVNGCFPVdceebZOG=989=DKMν̿վ´lfda_^]\[ZYXVVSRMJFC@;73.*&#%&(*)'$%%" "-:QoƱ|w~à|bSLH[qǼvW<+$"-B`¾t]G4%'%&$#" %'+2>:4. !%+3:=ILS]mzrcVOKEBBA>;=@CDHVk{{`Xl{ticiozsf][VSSQNLMOV\eq}yogcejr{oa^\ZYX[_d_]]\_^^\[]acaUE834?M]hvĽzomoqvxvsonliheda]YWTQLIGHBADB>:56B\t~ysokhhfhiiheb`^aj~ѻicmxhVLGWizvsqrjpxvgT:'%+?@BBBC@<<;;<=>>@ABCCCCCAA@@?>@??@CDCBA?2)#%2ALPPNLJGGGJLKIIIF@<72/+)'$#$#  !9^vyj^X]a[J<+3CTdtzy{~|tnpmjdWHDGU\defhgd_[QGBAGLX`gig_XRKHFKQZaeϽ~{~µpjgc`^]\YYXWVSQOLIFC@;73.-)$  %*.00/*'##! "!!&,9F_yǼyacsϸnf_W\e~|sdP<.# "2NsÿlT@00-,**&#"&)/6AKXdqzwpg`XSKECDCCFHGEC@DD>83365/*%.8?CJKPZk{tl]RECAACDDCGMSZbqzd_p~|ytkgpwxlb_YVURNILLOQWamuypgbadlxtfYXVRNQW^^^\\\][[Z[]][N>2.2@Qan}ļ{pnptvwvsnlkhhffd_][VSQLIJEEGFB?;?@ABCDDDDCBBA@@AA@ADDDCB@2' "-?BGKPSVdhov}{rnljhtxdZ\u{yvtnkqysjb`[YYXTOOOQQUZaemptvtme_\]er{qfd_VLJNV\ZWYYZ[[[YYVQD5*,2?Qbo~ú}zrssvwwvrkiihhfgeb`^[XSQMKGGJJGEACPi|{uohfddbabdegd`_bdhv̶dUP[hd`ZUOH;407Hd~|}|zo`J1 '/?LP]kpn`K7,'').27?CGORTWX[_bffghkmjg`\\XI8%(3699=>ACDDCA@====>?@@ABCDDDDDDCCBABBABEEEDCA4' *9EIONLIFFFHIIHIIFC?;4+%$  !>b|zcTTdqjVF/5@Pcu}|yuuvwvy{zxtsmcYUUVUPHGJRV\[]cddd`WMB>940-+'$ "(2896/+$$#$%&$% !'07@P_yĵr_L?FWn|rkv|fPGJG>2)%"!!(5MslUC7433630,%"#"&)/03;FR\gs{og[SMLHGMHA>>=96645=HNLG>9218DNSMQZhz|vqqk`VPIADGMU\ekn~xm`UNJGABMYVKJWxzwutpnsz}mfa`\\^]YTRSUTUVYZ\`glmh`[WX_ltx||seTNOUVVUTXYYZZYVQJ=/#)/>Sbn~¹¹|zuuuxyywtkiiggghgeca][WTQNIINOKIEGTl~{tmhdbaab``defc_^fhlz`J@FOMKEA@;3.*.>[x|xy}|}zocQ8" (3@MS_mrqcL:-'%(-/8>CINSTUXY_cfffhlqjf_[XR@/'2779:=ABDCB@@>===>?@@ABCDEEEEEDDCBCCBBEFFDDA3('8CHONLIGFHJHGHHJGCB;3+%! !FnybUThwoZL15=Mau|{vrpomkmkjighaXNQNQSQLLNOTYXZ_ccec[RG@@BLJDFINMLIEA?@@??Ͼ{wrsvy{ytpkfb][WVRMIGHHDDEDC>;831.*)&! $$+8<921*)')**'%!'3@GO`pɿrWA:6:CTj|~wlhegoshYJKWmrR9/,+&!))""-9Z{cM@726;:51-))&*,348;DO[hu{}xskc[WTTNLGEEDA>;AHR_gd]YI@=;FPNMR^q|wqjee]TLD=>CDR^go~}rcYK>6322''/63/AYx}zzz}zh]Z]^`ca^[\ZYVTQNJJNUZ]]YVPRW^fnuy|`QKLTSPRX[WTUUPG>5+&*3DRbr¾~{}~~yuqnjihjihfecb`[WWVRMMPOLJIOXm}~~~{xtifb``___]^``aa]]ejrY@646:984/,-013CYtxx{~|xspnVB.'-==>?@AABBCDDEFFEEDCBBCCDDGGGFFD8'&2=FGLLFDHHDFEGGKJEB<2*% + +  +"V{v_W]isuhN7;ANav~ysmidba`_XTT\\VNIMSQNMOPUTUTVVY[]^ZWRPSW]SECJPSPPMF?:533´ӿͿ|vsnid`^VTPMIFHGCDDCB>;:630,+($# '29723330/0/,**0ABDCB?=>?@AABBBCDEEFFFFEDCCDDDEGGGFFD4&'0=EFLMHFGFAEGGIKIFB:2("  +,Z}~l_X^hmqfR>COYiy{smfb_\ZY[VRSWWSNLNRPOKNRRRRRQTUWY[ZXVZ]dmg[W[``^]YUOJDA@źƱ»µ¸ywqkgb`WUPLGDEDCCEDC?=;742/.+)'#",458<@?<7632118EQ[duhPE4)&%%&.5<<9)'),01(+GfbA2./.0,' ).)$"'Bg¾v`OD=AGD?;76537:?BCFLSXblpv~}yttmjecdfffozwdTEFLGNWfz{pf^XTQJC<:7:DNevykaRNJGGGGGKIE>34Li}xtw~nbXZ\_aa`^]]\ZYUROJGFDEDEFDFC><@JSemuy|~z_RQYUONQUVVRNH=7/-*7?M[jy~wpmllnolkfbaa`^^^]UPMONMMNQXiv{}|xwvrnhb^ZYZZ[[XZ\]`^[[djvýsW8'+6979;BINOQXemw||yztqrw|~}xromcN7.7KfzlP;;=:614??@AABBBCCDEFFFGGFFEDFEEEHHGGGE4%#-:BFJNKIFDAFGHIJHDA91& /Ywze^X`ghlfXGN]hs}|wsib]YUSSTWUSSTRPNOPQNMJMPONNMMPQSWYYYZ_djqpjggiihfea]ZTOMǾɾľ}ztnic_XURLHECEDBDCB?=;85311.-*$ (15=EHHD=84466>KXcm}ӿ]@5*$"!&++(" "&'/QndD4.--/+&'+)'(<]nVLDFJIDB:9969=BDHINSX`imox{xuruwz}nZKJSOMUi|xmbXQKH=858>?ABBB@@AABBCCCCDDEFGGIHHGFFGGFFIIHGGF5)*:DHIKIGFFFEHJKJHFC:0& + !% 2Tn}wbYU]a_ef^NUbr}tkc[WRNMNPQVTWTRQRPPNNLIIKNJLLLMMPPTWWWWY^cijkkjhhighhed_\X¼¼~xokd_\XVOJECECCBAA>=;9765641.'!"*09:=>FVdmwҾzP2+'))$#$"!"#;\vkP?50-*)&'4798Hax_SIJLLJHB@@=?AEGJMOTYagkktnWGFRPR[pysh]TKC>203JR]cfhjkuz`QLPOOPOONOOI@41/35DKXco{ƿɿupqrttvohaZVUUZ^_^^WSQPJIIMYly|{~zwtqlic\XTTUUTWUWY\\]YYblujM::BLLNS[`bbjg`YQORY_cgm|~zvuo[B6=Qp{`LFLNF:6=DFKGC@I\xؽoN<646:98678<>?@@BBBBBBBCCCCCCDEFFGGJIIHGFHGGGIIIHHG;1#(;FHFGEEEHLDGJJHECB3*! + !)7EQKRbozs`USZ]ZbheYZezui\TQNKHIKPRQPTQNMNNMMKGEEGIIJJKNNNNORSRRSX\chljheeedfiigdb^³Ź{tle_^ZWPJEEDBBA@?==><9989862*%%+8EUZYQG@BFJRcqyϾqG+$'2<993(#Kf{s]M@95-.,%7GLPPVhk[OLPOORNLIGFIMNMNRTY`fghrlSAAOObk}zpj_ULC;5/08FUdt|liv|wsw}skb`\[[^]][VX[YUTUZVMHFA97:962,%&.8@GQY_bhhl~}hXNIKMLMLKKKE;1007;GOZdo|þǻwrtvxzxqf^QMLOW_b_^WTSRKHHNZp~{wzwqnjgaXSNLNMLNRTVY[\XXbjq~pWEABLNV]`dhlqkaSE?GSjs|yvtubJ>CWuhPHMNRK=8@EDIC;5Be׻nL<8@A@<9;==?@@ABBBDDDDDDDDDDDDEFGGHJIIHGFHHGHJJJIIG=5'$8DD@AAA?CH>CEED@><+#'@a}{y~u^VRX[Wajhdajwl^SJKFFFGIMNJKLLJHIJJHGFEEDDHIJKNNNNKLPQQSV[_eggeb^^[]`aa_^]±Ŀzpic`\XPJDDCBABA?==>?==<>>;7.)"#(6DV]_WLDFLS[jxμsJ/*1ARUUNA5*&&)(,,*.9BDVas{j^WPOHHG?60/1;NZ]a^_j}ÿtbSORUUYVUPNNNQRPQTWX^cdjs}iSDI[`t~xsjcVKC;4047CTcq~{ndiyzwutw~qkic^[ZZ\\][TVXUQQW\\OFC;45;=84/++/5:@HNV]fiq|}lXKFHIGGGIKKE<446>COV`it¿ĸ|xy{|~{rf[NHGJRZ]YYTTUTNJIQ]r|x}xtpnjg`VNLHIHFHNPSVZXTT_flw{dODCIP[aacgnuoh[KDL[t|xvtdQFK[wsS?=ELRNA=DD@;;;8EmʬcG=<76:6;>>;644)" 2Pz}e\VZZYbjghfowqh^TMFDBBBBBDFGIHIGGGEFFEEEEDCFHIKLLKKGIMNNPRWZ_aeffda\]_a`^^]ʹ}ź÷wnic`XQKECBDCB@>>?>B@>?@??;2-%! #'4BQY]XKEGLV_m{͸W<7EP^cmuzrmjhefe]TMLNPafdg`\dqziWRVX[^YVSPOQTTUTVWZ]caluxfVLXpw~wqkbSF>853;@M_nz{n^XcwyxvsswshgifYWVXZ[ZYSUVRNOV\ZK?;2-/9@=941014<>@GOZdj}r]KFFFDBDHLNKA=7:BFDDCCCCDEEDCECEEEEDDEFFGHHIGHEGFEGHIIKKJIH54,-6438=:1,.15:95000.& +>X{n`Z]\ZcjeggrvjdZTPLJECAAA@@AGGFGIHFEEEDFGGDBCDHHKIJHHIKKJJLOWY^elmnkeghgggeeƸ¸z~˿zrhf`XMGCBCBA??>@A@@@A@?@=74/+(%#!  #&0=PUWRMKNQ_jw­yaJ@J`q|wuuqnhc_\ZZ[dqy{|unjgfmprohddgn{¿rc[[\^`b`]XWWZ]^ZXYXW]`fstaYbs}yxvrkgaXND837=@M_mu~~iUMSbu}zurqsuusyrlhffd]XVWWWXXXXVQNNQUZOMA4.%+DMMC>>4-3.29DRalo|o\PH>@B?JTU\VOJGLUZbku}ſǽzqcZSOLMRURNNUVQOPOKTcr{~~ytqnkkkig`TMIHIKKMNRSWUTPNV^fmsw{z_MCFR\\_filprqmhipwwjXNQ]mwq^L9(,:LRVURQME86>JTgƶgSIFCBHFB@>?BECDDEFGGHGFFCCCCC@ABCDDDDEEFEFEDEEEEGGGGG671$#().+.43*$$1+$!$!  %,9N_fxrv~pd]XY^ehlgipy~p_XWWWUOKJHECA@ABBCEEFDBADDEFFFEEFFFDEEGFGGHIJJKKNRZajouwtqkilmlkȳŻ~}vxsv}~~z}ƽwkicZQHFFDCB@@?AABBBBCBA@=73/-(&#  #%-9IPVSOLSXgr}ʶyeRKUfv}|xstvy{zyyz{tjbbdkvyib_`cgdba\[Z^`a]^[ZY\_eqthgu}zvsrpkf_YPE;55;COYhsyxw~taNIQcx}ywsoqnmlkf_]__]ZXVVWXXYWWUQNNORTLI=1)!,F^cYD9/*0028CRcqw~}wl]SH?BBAL[^b_XSRX`els|ýĺ~te\SQMMRSPKMQTOLPRNXet|}{wqljigifd_RKHFIILMPSTSTQLLQYbhmqx{gQEDM[]aeiikmnnnqx}yiXLMSY]\M@80(0>KSXWWYWSL89O[fٹwf[MEFFGGHGFDCBCBBBCDEFFGFGFDCCDEBCCDDDDCDDEEDCCCEEEEGGGE?=6'$#)-*#"(&+ %-/2:EHLJXj{td]XY`glqnhhlqpt||weYQSTRRNKGFCA@?A@@ABCDDCBCCDEEDDCDCCBBCCDEEFFGHHIGLV`krz||xtquutrʰſxtuyxuuz~ztp~ĺxlhbZSMKHEBA@AAAACCCDEEDC@=952-+(&#"#"$+4?KTSPOZbr{ϿugZV_mx}}z}~z~vjecfpuqhcdhnihgb`^abebb^[XZ^dp}wtz}wtpnmjc]ULC9446BLY`jruz~xv{|iWGEQf|}wvrmlfb_ZXSSWZ[WWUVWXWWXUTQOMMNOFG=/%-Hm|qN6+),559BRdu||wtqmf\UJ@CBCQcilid__emqw}ſwg]USPOQRNHJLPMLQVU^iv|{yupjfddfca[OJFDGGKLPRPOOKHHMS\bilsw|mUFAIUZ_cgggikosw{}~|yvsplnt~}n\PMKG@4)!$).:FOW[[`debWTOOd޹rg`VFA?BEHHGCDEDCA@??A@BCEEGHFECDDEFCDEFEEDCDDDDDCCBCCEEEEGEEB9*%=[aI* + !( )330032**>Zrr`ZTU[fovuj`[\ahp}{{ywxʺkTOQPMKGFB@?==<==>=?@BBBB@AABBAA@@?>>>>?@AABCDDEECHS^lv}}{ẕ|rrvvtsw}}}ru½wlhb\VRMKGDCABBBBCDEFFEGFC@=861/,*(&$#"'/7BMPMQ^h{˶xre\Y`lw~{ofdgknmden|shfglvz¾wmffkqnmlhebcdgeea[VX[cp~|uonlig]ULB<5567)   + +@BCDEAABBBA@@>>====>>@AABCDDEADKUcq~|ӻywxwtsw{~~{y|}}v}»wngc\YUQLGECBAAAAABCDEEGFCA?;:53/*+*&""#(/;EIJQalɱsph_Z^jxyhZSRTVVRUcz~zrihkq{¿}phfkrppplieeehfhc\UW[eryunkiebXPG;75:=@DJPOSXalu|{|~reXPTar|zrrpid\TQSSTSXY[ZXXYYZYXVSSQPMIJIDF>/!$@m`A3-(*.5@NX_aYSRRWY[[WMMIHWoz{ywuuzŸwh_]^^][WQJFCCDHO[cjp{zvslhfb`^`^YVQMKIIKNOPOMKKIHGPT[`ekqv~p]LGHMW`iomnopme\UMJHGIKLJGLYiysfZVVL8'%4@JTU^eipx}z}ac۾^NLSQNJHFEB>:0'  +Qe@2KvrK$ -AOPK=4;RgwveUPJKTcq~{dI99I[bSHOazڭcSQJIE@:8775869999;<=?ACEEBBBBBA@?==<<<<==@@AABCDDBABGTbu~}|Ư~zywxzzzz|}}y{wnhc][WSLJECBAAAAABCEFFFFDBA>=:52.00(###$*29?GSdpǰsskc]_jxyfVKGFFJGM`y}tmkpu~¿vkgkrqqspmhgghhkf^WY^it|vqjfc`\TKB847<<@KYisyz{}}ti`\co{}xvpqnh_VOOSSTUVVXYY[[ZZYXVSQOLIHGGCG<-0^~jTE5+$*3>FIJDB>AGPZ`cbWUOJXp{~}}}uia`ccb`[SOGA?@CLYcmrzxspiec`^\[YWSQNJKJLNPPQPPPOLKQV[`chpt|t[OIKS\ekmprpfWH?6:@GPY`bafo{xmc^\R?.!&0:ELTYckov~vgqdOEBDD@<;999:CEHIIIJIHGFDEEFEDDEEGGGGGGKE@<3$YzVHhg1&@VYRD47MaqqdSNJLTdvyX@BCAAAA@?>=<<;::;<<>>??@ABBB?<^qoj[C0"(1:>;7..-5AO^hlk`]TMXny~ü|ujeehkjga[UKC==@HWdkpwtojfb`]\YXVSPNLIGHJKMOQTVVWURSW\`dior|k\PQTX]bkqvscP@73=KYeq|vkc_T@2!&,/38A=:9@JY`mquuuqpp͹~}zu~}uw|{vo{Ʒskda_[WNLHGDEBCABCEGGHHHGFCCC@;7486-(('##%(2FZp|­wmjibbgrz}|{{~zoigffjgkz~}vpqu|unpvsuxvsomlikple^bhoy|xpha\WROH@9?<7/-8L_krrrtwz}~tmimyzuqpqqndXLFEMOTTWVX[\^[ZWUSOMJGDBCBEEF:,#C^mwkN8#(07:5,$#%/?SbmrqfbXNWlw}ÿȿ{ulhjnqqmhb^OD=J\lxxlaYJ8*#&$" ""370)*,/06:BHKIC=:77687654345885448<@DFJKKKLKFGGGGFGFDDEEEEGGJEEG@/! 3^m}Q*&"&7GNLC/1GYdcTIFEIR`q}kF'9tعdJCED8+$$+-)!$%*,/02133224689::::9865654444566667899:?<:9?FRWaekklhgg̸yrnvzx{}Ĺ~{yuqoqrtvxyxjb_]XVSKGFCCCFGGIJLKJIJEEEDB@?><>:2.-)%$+E]vͿsligosvuxwwww}|z{||vqrux{xssvru{{ztqnlotqibdjs{~wpje\VOHFB@>ABCHFEINGGGEKU`enpruux{}~xrgehs{uqoqqtqcSE@ALKLMSUWYXZWWTQPMKIHB::=EE>3( +(D[jgUB2,,44( %5FWeotqnka\^htyĽwmjotxywod]TK@:9=OYdkuqid_\XXXVRNJIJICADFGHNQU]ehfa_``afkpt|{n^ZXXYZiqwvj[NHO`svcPD6' "%(,25MJQ\cm}\LI=5522148@DGGHD;6678720.+,-.022///37;CDHILKLJGEEDFEEDEEEEGHIKHFBC@*#48SB"  %Ov{o[;2-39;CML<4>KPNE<=DGMYn}j>!MͮaK@=8%#%" &(**,-./11//02125776544432233413565689::;;=@IMVVXX[[ZZǶ~rstv~ϼ}umg`YSJHHIMRW\krô{ne_]XUUMIHFECFHJJMMLLLLIGFFDB@?=?=631,'#+D_w·uolouz|{vwwvvyztpsx{|vuwtx}}{vrpnourlehmt|zqicVQKD@=>=??@CDDLT\bfgipttqqpqrvz|{{}|ysmg`[\hy|vxywrnmoxxsdSEADKJJLPRSUXZWWTRPNKJHC<:>CB9.$ +2HY^VJ91.0.# $+:JZclnlmohdcir}ypnsx|}{sldZNB<9>OYdlspjca\ZYVSRNJIGF@=>?BDPUZdkolgbbachlqs||pf`\Z`gvwytkd``fr~mQ8) ####2XsWG<873,.27=>=<>>>??<3-20,**))*..+++047>BFILLLJGEEDFFEEFFFFGHILIIDCB49QrzQ' + "Jyx`;.%)/18BH:/2>@<847?DIVeu~^;CjаY>0*'" !  $&'(*,,-.,**+-./2455433333222202443457CHGGHKNPOTTTSQONLIHFA=;?E>5*  +  /=HLIA711.'$(,4@N\bjjhlsqolmq}ÿŽ{uuz~zsk^TH?:>NX`gnlga_ZYWTRNKGIEB>;;BEGJǴ~sbSJF?94,)##!*3BP[ewȼƻ|k_VNOPLKKKIHGFNOQRRQUUQOOLKHHGCFEBA<3+*Gd}ĺ}|}zxwvvutuz}}wrtmkou~~yx|}yvppusplpux|vpid^VNF<8:DKKFHNYco|yunoruropnopsuxwvsmbWPOMOMP[irokijlmlotz}p\G<:>EDEDHIKJKKMKIJIIIHEA>=@B?5) #1;=B;86500448BNYcjljmvwwtsuz½|xxwqeZKB;>LW\agea\[VXVSPMHFHEB@<:<>@DKWfqsohbdehlrxzyohefegmvtx}~{z~~~~qO53BPi_1&0<@A?;:;;::99887521)))())**'&$$$(-04:AFKNMJFDFFFEGGEDFEFFGHQVPHCAX|M4&Hm}rynH2#(.7A5("#$%!$0;FQ_hx}Ի˩xE#  !$'$$"#$')+,,,,-/0/-+)+,--,+-04:?AA>@?><;9>AEGij~vjZF50*#$6HWguz{ŶȽq`TJJLJJMNKKIIQRRQRSWXTRRQPLMLFHGDC@6+.Jhľ{{xtvwxwvvy{wrnrljmr{zw~}{qpssqnrvz}tlhca^UM@64:GPLHLUer}wrsuvpjmkiimnmmnjbWOJHHGLS[aefgggffgoxqXB66;BABAEFHGFEGFFFFGHEEA?>@A>6* +"+1A?A><789;ABA?<976541..00**++,,+)&"!"$'+/27>DJKNKFDDDFGGGDDCCDEEGLSOJFDXyuP-'Dasnp}{kM5"#)09D?5+&%$+8DQaix~Ѱa6 !#"  !#%&())(*,-.,*(*,-,*)*.07>BB??=:9::?BEHʺ}¾̿|l`SE4(%#2@P[ot}ӻµwcRGEHGHMOOMKJPQQQRRVXXVVSRPONJJHDE@5)5Ro}zxwwwwvwy{yqnnojjls|»|x~sqtsrptx|zqidb_^QG;36=HMHELYjy~wwyzrjljhgjige`ZRLIHGF?GRXZ]_dedccenyqV?449??>?BCEECDDEEFGHFEDA@@@@;5,#" '.ADHFB<97??CJU`lrnowz~º~~xpeXLDAKQZZ^ZYYVTSRPNKFBA<<=<;;;<9BSetxuommopvztpqwttrusx}~\A a~K *-6@GF?93/142.+**0///,+(%!!$'*/2:?EHLKFDEEGHHHFEDCEEFGDMLHKJUloE#&?<53/016:BEHIİtfUF7.% %6C^lvyź|hRDACDEMOPNNMNOQPPSWX[WWVUSRQMJFAB?3&&=[vú~xvxxxwxz|yspoosprvvmffhiehlvĻ~y~wtvutsvz}{}wpib]YTLC<:AGIHGEOatxuz|vnlkihgdb_UMEBEGDA@BBAABCDEFGGCBAAA@?960+,+   '1AFNKHC?$ ^|r; ".7:8530142.*(&100/-+(# !$',.59?CHHGEEFFFIIFEFFGGGICIIINLO\shD0&3Md}{uoUA.%&&1=MWZQF>7+%#)/:IU^iq~ɗnUME8) !"#"#$&()*+-..-*))+59<92'""'1;FJLMżz~ɲ|aTB-  !4H]kfh~ƾiTECDFIPSSQRQPPPPPQVX[YWWUTRSNLFAB>3&$",Ed}ǿxxxxxxy{}|vne_\\\\ZYbny{z{{ulb_`dedgp{ƻ{}zvuvusxy|~}xsxtng`XPIJCDFA:=>@?ABCDBAAAA?@;:7486( &1>GNNJKJIEGLQW^finou}~¾{ul_VKEILQRSPPRSOPPSQNG?:9;>@@=;:3=Mcs|zw~|z{}ujcgmbbfnv|zQ% Nr8   $)048740*(*--./.-,)%"%*,/4:@EGIGGHHIKLJJIJIIIKGKIIPMHNTa@(/Kewtv\H4,&&0>KZeaZSMA/*(-7COWbgp̘_8542,% +   ##!!! !"!""$&),-/00/,**-5885*"/>JOQQŴ|{ɻ~gfqy~rdL?- +  ;KZ]cqyy{uejoWHCFMQW[YWTTSRTTTUXYYY[\ZWTQOMJC>93,$*:Sox{z{|zyz|urjd^YVUTRU[dloornhc``adjhiqƾ|{wuuqov|~zwusqnkgc_VNG?>8;GD<@:DWlµ~|~|wtuvomje^VMECB><<4)#'6IXhqqmcSA50.2;CFQXdku}sdʩI /1>=-% &(('&&%$"! !!&(+,/.,+,/785/# +2EPTRPū{|ȵlTXez|paR9.!    -9;>ACGMWZclpoZHdzY,76@@3+&  &*+**)(&$#"!! !%'+,,,-/420)! "5EQUTQ{|δbKTg|xm_K9   ! "##!  ';Ufid_QL@IzſxbSQTWZ_^\VUTXX\[[Z[[\Z][XTROFC>:50,(*6Kc|}zwtqqnje_\[[ZYYW[\aemowý~yurqqv||ywtuqokhfb^XPIB>=65;63;@Qj¶yvtng_SGCA??ACJS\afjlnt{iK/#,14467666552324347995328BP\^L5 *4@FMNNLMPLORUX[`cfksuvwy~{rnr½yph_XUSNIHGHIHJGOLIEA>==BDC@><3,(3F[q~ǿvX?0(8AR`ilmjuy}wsronjiea]XSI2 -S~qS-   +'19@;2)'&&&'() $(*/5>DJLNONNOPONNMLKKKDMTQIDJR`ejp~]B?OomT@/"#-FYnysaVPIGFFDBEIJQZ\]E2dzH<5;=51.  +#(*+*)(&$"!!!$(**,++)#$7GRXWT͵д_JTkxzvkZI3  + ! #"$$#&'$  + +'F^a]\SM@Guž}iZX[\_cb\VRRUX[^_^__`^]ZVPKH>9741+()/=Tmÿut{}yvsvvtoe]ZYTTWX_agkkr}ž~|tsrtz~yustsvqnjd`]XSKD?9823<;;DL]xø|rh\PDABDHLMS[bfkpsqw~mM/ )/244544321000112241.+*1?O_dS@()2:@GKNPPMNPMNRTVZ_bcgnrstx}wmkr{þzrjc]YTQKIGFHGGEHD@<;;>@EFD?<:1)&0CXo~ľy\>(*5GWbgignrw|{woif`^[ZWWVSQMG@1 4^vhM-  .9;520/-*'&' #&&*0:BJLOONMNONNNMLKJJCLTPDCThz}{tvsRDOk}kSB3++2CWjx|la\XSOKGABC@EKPQ:'Pn>105124(! "&'''&$" "%&'%$ !,;JUXVSĪV@J^ijeXI8$  ""()).34.$  1KUZ^ZVGJsƿoa_bbeif`WOMPTY^aacaa^\VPJD@91//.('+5E]vnnx{tolilorrkc^\TUZ\cfkokt~trru|{srqrsvroj_]ZTNF?9143;IOS]dqùvhTI??EKSZZ_eknrwzx}sT6 ").1223423211010/000-*'#(6H]fXH6,)2>FKPQSTTQPONMORSUX^abeklmoty|qkntĿzslea[VRNLKIJHHGD@=:;?DEIIE?;5.%"-AWo}cD*%)7FVaefhgffc`ZUSOJHHHIHGJJE?4  +$*):f}paI0###"'" + )13=<:7/(%#"!"!"$#&,7@JLNNMLMNMMMMMKJIELQMBD^{|q|lWYl~yqtlaNA8116BVlxwlg`ZSLF@@?<>DGG0!BƖI7/1/280( !   !" ! +4AOVYWTɵoH38HUUPE8, #&,.-3;<3&  5ES[]ZLNtvihlknsog\QLKNSWZ\``]YVOIC=:3,),/()/83*"*>WpĺlL2 #"*6GV]bb]WRQMHCB>:9<=@@AFIGD<&(/667RxrbL6.111.+$  $*=?B<3*&"%%&%!!!!!'39:98:>?@,$6/%(=WpȽtW=,# (7FRWWQKEEA=874348;??BHJJKH7& #1?CXnz|oi_XMC<14658<:9/-6]G1-/)$+*"&.," + + %,+*2;GR[]ZXĺ}cD'&,-+%#! +$'),*$'.+  '9@@C>Jtüxvz{vfYQEFHKLOQRNKGD?:752'%.1+.9K^uôfaiqwzzzzxxxxwuplhfeckgfilmjgfglmqpqqn~ÿvqtywspomhghhjhgdYVPIB80(8>Lo{sibdls|}~jR>41,.11../15676776795/*(&%$!$0Daz~wzwy~~yywsle_WROPRRRRV]_baeedgnuz{z~~zvsmhb\[[[YZ[ZWZZ[^adeaVPG<5-#(=Wqƽ|_G6#".>IKQJDA@=8531259>BBELMKQSE4) (7DMO^}lQ>:=>;94,(((&! &,9=:30.+,-)%!!#+5FIKJIHHIKLMNMKHFIEFHCBSj|jny{h]VSLB:8:<:;?BEF?Tkwvjb\TMD=-15699860..C\qw\2 ("##  '02*     + (--*3:GS\_]\fG/#%! +"')-(&"   "**211DpĽzwscSQG@CFGIJKGCA>;954,+/2/29Pd|ʼh`fmt|~}tswupoqlmnpppolligikllkolmmrpnlnz¼vos|xommnmdbcdgd^XVZOE@5+,3C[}~n[KA?750/.0//05746<;7>72.+*%" %2Hc{}ukaXTRSUSOQW^_baeffilpu{¿}zupjeb^_`acba^ghknpqmgWJ=3-%'?\vɼkL5("!$(1<2+.7==:2-&&,-(!  "%/6+% + #%  "'++)((3ET^`_\þ~cC* !  + )396.#  '&(>mƿ~}n^PGBBCDDDDA><<;<:A=;9857:<>@CFPNOSZ]^^YJ3 .>JQSSslUD?AAADB<62,' + ++7?=5/,)&###!!'5@HLIGHIHJJIHHGFFLFCDEFKSithgwxn_NNQB214;;>CJMMLPWfvqg^RLLF>92-/79653,$ + %*#!! + "$  +$(*,*2?N[]^Zº}`<" + ##  + /=FC5! +   7hº{kXNEEEA?=<<;<>CGIUUWXTOQXm~ıtc\aenv{|}pjkpstux~~~|usrtttommlonnni|{vw}~|xutvxz{~}tleccdcca__a_XS@JF;5+'.Qn¾zxz}~rh^XTB5%%,148<>==?=721.(##)/@Og}vh\TOMNNQWZ^[\[^__`dfmy¾»¿}zvqnkifgdhhjjllorrrngVH;2,$!3LhqT9)*BIKD?===68;<>@DGNPSW\afltlW81BPZ]bz~o^ODBCCHE@;81+&  ,:9<@EOY`jlqog_^bv˺o`_bhmsuz{lijpty}xtrsttmkjghefgfz¾xx~~yttssux|{xpib``b``][Z\YSN=FB71*-;_}utv{|~~}zrrstshZG70013=:52/351/4BK_mymbZVLHGKRW]`c`_^]_dhmwľúÿ|xusokigfgjmlmnpsurogUG;1+##4Pl½ȾfH1&>HNKD??<68:;@ESd}winlgdglhbWGEF8-6?EEDGLQQSW]gry{{te\VQMG@91134532354.( +   %+-,.:H[djgĻqR.#.43-&! + +):L[caQ8# ,P¶|ncXTPGB>=<=AIYiv{qliwIJsjiffhmstkikou}xtrrqpmjha`\^_av{zyutsux|yumga``a_^ZWUWTNI@G@1-/;Oqyssuwz}wu~zeRG?=EEB?>:555;CFHQam|rg^ZOHDFKQ[bfb^ZZ\diovǾ~zwvtnjjhilmlllortrlgTF;1+$ 5Ro¿xP5%:GSQJA=86789:?BN^w~urmkpqgYL=>D:2:CHFEGJOPRW\ahnssi^UTSOF=4-0455335132/%    +  ! $(7G]hqqǿeG%#,9AA:1*&7K\jqk\D, +  +  #>kƻvi^XRIEB==<=I\u}u{wndacjnighjpz{}~yusrpmjifc[XTWZ^t¾~}zxxx|wqjd____^[WSQROIBDG;:887778;@CLRY^adhmy~~{ubC* &;LV^bdqhYWYZXWRLDB><:81& *16/)'$"! *6BJOMJJJHHGGFEDDC9@ECAAA@FVo~y{~n\D45?;6=DHGFHKOPPX\adlrpbWMOPMB71./2566555797.#  +   +   +  %8M_kvxĿrX;+6EOPJB;.(#! "$%(/;I]kx~tgO8&  ,R}pbZTNJI?=:;G_}Ǻvd[[bfbaaafqvutvy|}|zvpononkea^[YQMJOT]t}rle`[[[\ZYURONKF?CD9,0:Mdǽž}yvttwz{{|½f]TQQQX^tzug[UPPUZQCBJPPTVUW\_jnuŶx{Ŀ~|zywqnpprsrojjmoomjcSF9/+#%:Xr[<% ->QSMFA=::888;@DKQYafjjnv|~|fO7% +(>MU[^fpnYRVZ^a]WQLE=:;4+&%$"$0.**$!!"#"$.9FMQMJJKJGGFEEDCC;?B@@CB==Lczz|t_D01<=;BGIIHKNQONT\fnw~{mTHIIG<310.11443055685.&" +    + +   +'?Ufq{|z||}|~iP42>OZ]XQJD=8359>AGLS_m{r^G6+%" $#  >wƺuf]WOMND><:F`ɹ|eWU\_Z[[Y^inloosutpkgggklmf_YTROIDCHN\tøymha]XXXYWXTNKJGB=>A5+2=QeǸǾ{qmjnv~©~vssvwj^XPUcg[C9;DHRYYZ\]fgn|˼~uz}zxywssssvvtpigjlljgbSE91+#(=Zs½eE.&*;MPKGEE;<999=I^uwnq|p^L50GR^{Ƽyrjg`[TRUXYSPLHGC<785568@TcǺý~|spidhr|˼ynh[S^pt];+.:OW`cchYabfp~ǿ¿¾}{zzxyvssuutqcfiijjf[QC7/( )=ZsžlUC8)1=KNNNKF?>><9;?BMMT[adjqpnorwwtrbXM=,&=FINVgzu_UVO[dlldXKA==7-/3+ &,,%%$$#%4EILMMKIGGFGFFFFGCFHHLOJC?EVnrfZ[ekf^FA@BDBEHNIIMPLJKW`slL::BB@AG@;8:<;9975578:<850/*& #(*    +  + +    "Gdoy~±{voosvx{~}|ywvtsqjjlorvyzz^?'%*.AN`jnllkorqnotvuqopt|xpaSKKB?71-*((+)-2.  + *eþvf[TPKG@;;FZvȳ~aPIKLJHHLT\`aacc`ZTRQXZ^b_VIB=>?:6;HRb{¾ƾtmca[VONPTRPNIHFB:5247>BHR\Ÿſƻ}{rlfbgr};~rlg\T_oqX4%'BZ`iljm]^^ahu~}{zxyvsrtsrmdehhhid[PB6-(-@^vĽjYN;)$,9DPRQOMGAA@>;=@CIKOX[^eloomnonkhlidVD/*:BCIP`zyj[JXajpnf]VLNE957/"+.-('''% (7FILMLKIHHGHGFFFFEHHHLOMGAFUhsuttbTGBJPUROLLMLGGJLHJMNJJKZgл{YA>CDAALHC@BBDC>9537:?B@<82.'!  9LWG) +    + +  + + 7\v~°zpe_^bhkpvutttsrrpmmopsvyzpT7"(/59JWhqttvxvrnloswx{vrpjc]]][UOHA95536;7( *f{j^WSQHA=;BQi}ɶgTHFEB>?BHLPQRPNJGEEELLMPOH<302445@BEIKPZ_adjpqqokhggqtunaQB8-**/339>TujIOU^hjiedaaZLFB9+!  )+*&&&'%'0=JLMMLKKJHGHGFEEEDFGFIMMICHTafffi]O@6:BNSZXYWRIHKMJMNNIJM[nӕpQFEB=>@EEE>946:@D<72*# Nt]6  +  /OrƷymd\W[acjnnmqprqqpopqrvy{}yhK1.9@EQ\krtuz|zqkb\ZZZZ```ceeginlkg`ULGECDC@1 -hmd]ZWMF@<>FXe|ʺnZNID>99<><<>@=9679;=CA??A<2+*-25;FS_pw·wj`TQKHCCEHIFFFFC?9535@QZWMGqžϼ}~wqmkoxǼ¸Ƚl[V\[NKMUWA&%4fz|}~~~g\[]cipy}{zyvrpqpnighjiiidZL?2)#$;OmƿüvjWB9=OVZWWVQKGHEDBCDGLPYcggikoqqmhdeghmqrpkaYH;-%#"(-Hmª~TKHMW]`acmoj]VRH:/" %&$!"%'+6AMNNLKKLLIHIGEEDDCEECEJLJFLWadbdih]NDDJYaa^\WOEEJLKOPNHKQe|㶔r`UJ@;:;<<;;<1,$ HwkA + +  + ">cvmd][^^dfginmonoomlmqswy|~{tcG-2>HMWamsttxz~}}zumf\TOMKJMQSW_hoqsuvtoh`[TTRMI:% 6orica]TMG@=>IRhq̿xeUOJ;5474.-041.+*,03873242,&(-4=EQ]frqqzƻtg\OJED@BDHIEFDC@=969:FV\VJAnƹ}}yvx}ĵȴse`eqo_NGGH8$-Cu{}n`^elnms~}{zyvrpppnhiiljjidZK>1'! )CYyü~xrbPFFUY\XXWRNJKIHGGIKPT`mqlkklnmjfbejkoru|zqaN6% %+Ch͹eJB@FQW[`otqgbaXL?. + $(""(4?NNNLKKMNKIIGEDCCBEDABGJJGMZfjghlplbYVWcje_YRKDGLKKPPMHNWv׼veVKCEHJLP[ahig_P?/')$'LuqJ*  +   )MsȻzofa^[[\adijigihjikmruxy||wqaE/3BOW_fqvuswxz~~zyywrkf^WROLJLQV[cmtuxx{|zuolb`]WQC. By{qlhd]UOG@?BEJIGGEA=989=ALZ]TG=ku|Dzƻ˻˸qknxsXH@?5(6R}pp}ygjv}rr|}|{yxuqpqpojkkmkkidZK>1& #/Kcɺvqooh\ROX[ZWWYUPNONNMNORTYcospnnmkigdeikrwxx~}p[@.&$+2IjȺyOA9BNTY_mvwqmleZL<) +  *59+ '3=NLMLKLNOLJJGECBBADEA@DGGFN^msnjjttojecfhaXOKGFHMKLONKISaɶyjklosypM-% "'**"!<_[;  + + +  + +   +1]ɿzog`XVVZ^cc`]_abafimpstxw|}vqaE.1EV`_ityxuxyz||yxzyuqnhda_\ZYahlrz|wz|}}|yvrkjf`ZN8#$Qyrmib[WOG@BGXf}ȿnc\XI<5667DTaa[K5&!"%'&#!"',28EPZdinpiea`alyɿvmbSE?<;1& &3Qjüлlb_`hlf]VXZZWX[XTRRTUUVX[[^fosrtvqlhggjmnu{gN;1/8BXsdTKU^``fpy}wsrlbUD1'  +=MTUA2%!%,6?JJLLLMNOLKJGECBABFHCADFFLTfyxlersrojda`UJDCGHIKKLNNKL[l¹ĠoC(,('1:<6' + &JveB+  +   +;mxof]XWW[aa^Z\]YY\`eilmvv{{tqaG. 0FZf`hswxvvw~}}|}zwutromkw}}||{zusronic^U>*"-Zǿvoje`\WLFEJ\jƻ~nb^YRB99) &FkgQ2 +  Cwÿɾ{tme^\YWWVUSOPPSUWY\^]krnieXK6%6Phssqqsy{{z}yxy||z{~~}{ytrpnsri]RB9*=lǾxoijhaTKGFO`yzphaYOKHDFUntP2 ""%,:EPRW^dknolhedgc[U[ao²{|||~~|~ve^[O=868ZzsRPWcjmkgde^ZZXVVYUTYdpwwutfds~sideovxwy~jZRPYd}~zxx{~{ytnj`M4%&2@JQKHMVX\\NHA:67;?GGHJLLLJHHHGEDCBHDCGHD?>Kd}oekmlh]P@8536>FMOMMQTNGOoZ30/4?IKICI@*  ;Wqq]K/  + Jö{skb\YVUTQOLHKNNPRTTXcgeee[M:(!:Vo}sqquz}}|}yxz|~~}~}|{}~~}yvsqonpof^XMH1!!Dtĸ}tppme[PLJO_xĿxnie^SNIEJ^{b@'#&+4?ERT\aimopmfddgcZQMP[k{þzy{ww{zyxwx}zo_XVL<436;DIJID>9:89;AECP]Q5(0i_>5Ntµoz~|ɿžwaPLNXuqbaj}v{~|{yxwtrnjjmlkjdYF;/#(8Yy¿qONTajkjgdc\Z\\YWXTV^oustlhlptuyqe^\gr~|zuoi`Q<-/9GQYOBABDEHC?=;;>CHKIJJJJIGGFGFDCCBFCDHHEDEVozqlqlf]OC6/04;DKPQOTTTPM\|᷆M=49FNOMKOF. ';M`tuhhWA& $;oƺzph`YURQNKGIIMRUUUSTYXX\aZO=*#2' &4Rp߫nLIR^gjgfdc][^`]XVQS^szoklqsz||ymilx~ysokaTD9;EOUWF4+*+03747:?GLPPLKIIHGFFEEDCBBBCEHKJHLRe}wsrqh\M>3*&,4@IPSRTXWVUZn۴{W>CQQNOUVL6'#!!*7@BGUdmdqthUG.    + .azpga]VUQLJLNSZ`aa^ZVNMRYUK:*"6Oiw]_eoy~|{{yuokgfeegjmonoommpuwxxywvsqonni_Z`gm]F09]Ĺ|ti^YTS`vvrtsrnaZOIOb|fK969>DJLNJSXaimnljidcglj_TJFFKTX_j}}uqmighhfehkoi]OIIF?66)*:txP>BaaG@Fd|ýǺºvipvbanptuoccgixywuplicYM@3'!(5KeƿݧiGEM]difeff`]ac_XTQS]r~tosu{wsvzqpy}{ysok_UIEGNUYL;+'(*.0/15:DJRSPKJHHHHFDCCBABBCDFJLJIR]oyljkcYL>1+%$-8ENRRVZ]ZX\iѩsKLXTNQ\\R?320)2;EG=6=JdsueV]jt|mP, +   + 3ļzqje^\WRPMPV^hlmkdXHBFKE@3%,=OXGMYhu~~}|zwrje_^]^`cfgfdcbbchmttvxxvssqpk`^ixv]DFgɾype^ZZdwwuuy||zung_\ao|j]\]`bc`ZVZ]elpokhfbbjrqeYKD?ADEHQdjrx¾~yqkgbcb`_`bfjcUGBCDB?@CIQQLGB<67759>MIFA/")?w_NSkú|dTNXpŸwkqd[]bfmmg__bfrľ|zsnibWN>.!(6EZ{ľڢdCCL]fheefhb_ba^ZXWX`p|{{}tmpx{tv~}|xvrlh^XPOSZ^^G8-/48:9136>HMRNLHHHIIIHCBBAABCDGIMNLNZh|k[UTJC;4-+,-5=GNOSY`^[\h~ȉWS]XTX`_UD;=;5:BLI<008Q[ifPAPk{dC$   +   =ytmfa^[YVX]hsy|yn^H:862,*!%+/3/9L`s|{zxslhcccdehjkmkieabehrtwzyxutqrla_l}{fQVpºvne``h{»ukimwvsprxzqjcegmrusnjfablvvi\JA<>@??ETZ`djowwkd_^\[YYZ_cf\L?:;@BEGJPVTLF=83567CKMPRYc^]cxיd\ca`ca^VIDHD::?EH?202CHZeN07Xmi^F* +    !#&Qź}vojfca_bep|ydL:/(# ""$)@\s}||}}{wtrrsttuvtwurolkjkuwy{{xusoofWNWhupbV`z}ulgck|ûwi\TZewxrnmnruurnihbcmxwiZH@<@DCBFMSWY[_ejs|¿~ui_YWWURRSY^`TC613:?EGLRURIA;64679>EHA82('4IiL=R|ķϼzh^SV\fzzpd[VQPSOSL??KTVX[_[XX_cfkyzzyxyvsog\M<* +2@[wſ՟eEGQenlhhjgdcdcfr{wurkhjv~wmjllqy~~|{wsnhbb``binqmUB1/4888879@KQSNEDGJLKIFCBB@ACFJOOQV[ev|fRE;20-++,17:DGNORSX_acmtdedfia^VLKOJ>9:AIH=526;L[L2/AGIE7#  #!-AmÿȻ|upnjjcegq}lR<.&!!'& :Ys{{{~}||}~~~~{zyzwuttsy{|}|xsqki]H<=LU`XUb~ķypjel{ƾscTKDP]u|wustuwuqmimggq{yhXC<:?EDDFLNPRRTW]bgnsv~}se\UUROLLNTZYN=0+-442.+*+17>GJORTUX]aes칃jgfhib_YOQUNA<:@KPI=618FSO?47-//' $3S½|xtrsnmjnv}vfSA4'#'+-0+! + 2Ql}zxz~{~~}|~~~}}zurnlb`P6$ ,:AFN`}ȷzc`bdjv·}vqhnyǼ~ugVLIPYj}xrpmopsw|zhSCA?>@AEFGHLLNMNQTX]adhnvxnc[TQKHGFDJQPF:,!(6FGNPNJA=7658><6.2'!%.IR_hnv~}z{kP,(-Iy˶ȿiM99C[lojgjk]C447453/2m̶ĸfM8:G\lka[[`XB3/,)+))1CS^^]f]MEFO`dn|ewý}|~yzzobJ9&*9DUiýӢbKMYlqkdehkdbffjz{vsuzxnmt~|ulefoswzyxvvutmjkt~ÿ|xxvuqllnib_^^\\^eg^VPORUTTPONNRTTQLKLKJFCBBCEHKNQQHHKVmxe\XPIE;60--18=IMPSTWZ\dw|^bkhdddd^TLIGHJIIJPSQOOOH:0,''$   'Cpƿvvsrvy}|}uk_VIA5..(!';Tfrusrsw}~|xvspma[L6#&6DVmqcXQHGCCCGLU\mzͿuu}wj`XRYcpwwpo|~ztx~taPCDCDEEEECDDHJNQRTWYYWWY]dhjnqstuxz}~¼|yung_ZOJJIEADIHC=/!*8@EHKG@72,*,-232-)! " (19F\o|qhkotyufXL<0L^gbUKLQOB83.).,/=AADFILONEGL\uo^Z\VI>741027<@LLKMOSY`s͒kegd`ekf\QIFIKKGBES__]ZR?0,2/+%  +   %4Zƾ~vp_R@53,$-CXiqqorv|}xtrqmj]TF6'!&1AHWiyoaTLGFAFDEEFJPV]fvŴ|zveUSX`dkusfdh~uz|m\OBDFGGFFFEEDGIKOPVVXXYYY\^`aabcdfiknpu{ſ~|yvqlc^PKIHD@?CHHE8)!*3=BFGD<51--/379;:;5238630)+.*&! !"+9ETbwslikkrplg^PDDWsª}uôxbMCFOZ[TG=?AEFJI>19:BNY\^_g\EIWdhq~}k½|wsrtttpomnljf]RC6&  *8DWtÿګjQVcwyofgllhhjjiow{xusyyplnrx|~}xwstyroha\UROOMNORXfrvomjknmhbba___djonkfec_ZUXWWWVVWSOIHC@=97;>BFHKKMGIRd~wgXVXPC932137=BEJHHKQU\eആkcc^bfbZQJDIHD?<>A@@@CEFHLOSX`q˻»}}ld_][\es{dY]c|}~sbPGAEGIHFDFIHGGHIKLQQTVXYZZ[]\YXWWYY\bdeintż~}}{xvtpg`SMKIC><>GKMB3(*+5;@A>84/.168=AFGLGEDHKKK>AFC?71.3489@IZd{|qjfdfgiliaTIGSrƶsm~nXGPPPOKF>567CUfdK39@MVWTXaofHEQ^elv|~s¾ľ|vqmnputrojbYSKB8."  &1CUnܮmTZgy|ukimlkmopmmp{ysps|{qkihflottxy{|tmd[VQMJDEJJJMZfx¸rkihmoke_`aacdhnrwtrqkbYSVVXXWVXUOIGB>8537;@DGHGHKNYn{i^UPKC=<53149?DFJILPTV^lӥu`]^^\XWVQGIC>9.($#/=BDIWgqolf`XSQNIE@;5237::;;ACFGJKLLSao|´ļyohedlq}qf`]^elwvbWY\xſ|ugUE?@CHIFECGKKLIIIIIMMNPUWVUUTTQOMLLKOVWY[^bt}}}zxvuqibTNJG@87:DKND8-(%,068733227?DEHNSUVUSUZabdddb`\YXPNMIFADBXpulb][\cmsl]M<:Tp~gcv~hUGZUOFACA===Lf{vU8;BPWRIR_upUOU]hkty~ž{ý{smnorvvrng`V?7,$ +  $6QjܰoW`ky~yqoppqsuwvuw|rigpvi_YQV^gov{~woaXVTSSHKQNIEO\sƾtifgknjd``bbbcjruw|}oaWVY\[YVWUPKFB<6328:@EHIGIMVcxn[VRKC<;><656;AEFMMRXYXez侈eX\YWQV[VKKB;9>HLLH=2-('&(30)    /Kxn\O?3("8RboryzsogZP?0#""#-;@JV`d_VPLKGHKKGC>:63333.89@DFFEEGGMY`duǹog_ZYYbit~xpf`\\drtfZUTbprhZKB?>CGEBACHMORPONKKMLMNSSQMLJLIHFDECGLNRTX\fjo|º|{}xutsoh`UMGA9215@EF>6/( &-26448:BIQUVW\acimjkr{~|{xvtmhc^XOF>>SxznbZUV`p{uk[C18KqįwfbuseZ^[QFFPTTVQWk}|gTYZ`aTGM]x{zy~~~~ÿÿyrqw}~~vh]RH<)"    /;LlݲsZkpwzwtsttvvx}zmb`frz|m]K;9FU`ny}rcZZ]`bY\aZNCIUn¾jbafjhfggd`^`fryy}}n`WTW[YWTUUQMIE?974:?DILLJKNZjzeOLKJC<B?<70((''(*220)   $&'3DXxubTD;3"3M^hltzxqk^PD4&!%'0;CReleTE?DCLVUQ[n|ɼ|phd]WVWYclllqx|ocUOUanvxxwrh[OJHUetyi_UJDB>CEDA@CHNSTUSRNMRNNORPMGFEFFFDBCADHIMRY^\Y^pŰ~vyyvrssog`VMF>5--2B4.-1;HOSHLU]]eɟkGNTNJPRMGDA@>:4/.*)+,,04234.%  + "&07;=FThtÿxi]OF>."&6M^kkorv}~vnfZPH/%!)8DSluZ@>;@HICDKLRURLHA8<>BCC?<:=AILNPT\i~øxme_\YWUZbmuwqorpo{}t^GCPXX_`djmfXLNMSdwmYMKJC=B@@@ABDHOSSTRRQQPMNNPMKHCCEDA?>@;BFGNW[X[[]l|sy~{wmjqpe_aSG?>800;DGB6-)' !*59;?HP\bmops{wjbMOVjtkd`ais{~{scK6NmƲ{{vǿp\PQXismi`_iv|s^X^zÿyw¿}q\K;,%# ++@Oqvcrtx|zz{zxz}zsupc^ccq}vY;.-5FZky{l_aff]Xcmj^QNPbn~ƴ~j`emkjmki`YURUW]gh\MIJLKOTVTQQRQOKGECAADGMPTRQQV]k~q]NGEHF@=>:4018BJNRNR]cnz]?FIIPLNIFDBA>85-++,-1588960&%+4@EIMUbl}Ľ}peVLD6)" +;Qakkmoqv|~wqjd_VIA) $2@_zmQ>CGILOT\n~|{yzuqjd^ZYUTTXdp{~yupot|}gOEEFDNRZfmi^UOOUfu|~m`QIGD@<@@AAACEIOTTRSQQQNNLNNNJHDCEB@=?A=CHIOVYWXX\j}}~w~suxxsiinnd^bSHBC?7:EKKC4+('!#+5=BISZbit{ypbXNRfxqlfdnv~|bH=Vuux¾q]RRZkuog\X`nsvx~~|sdbkvºxso]G7,# #! '0E`wdrty}|z{|z{~}|zlb^ZhxlO2.3CXhxrb[[VMN]mqg\UV]hvȹqdhpmkkkh_UNHCCJOL?67=AHLQQPPPSQRMIHGGFKMRUVWVUW^j{tcSNLNLCAA@976:BHNPMQ\jϛh@@DIOJNJHFEDA=:200/148;<<:3,$ !#$+1;CLSVY`lx{qaVLB5-*4BWfkjkkkmpsy|xha\YWPC:% *>dd@:8978GYpum`[TMGBA>:<=AFIILOYk¶}vpplprrqnjgfccbb_]ZYVQPPVeuzytnv{sbQA63;AL]knh`TTYiv{|{trtz~{pfTNFB@@>;BBAACDFJPSSSTRRRPOMONMKGCCDCA@BBBGKLPUVUUW[gystvvwrrrnghkkd`cWNJJF@COQOE4(%%$&-9EOZehmt~yfN@GareehnzpT0ASlyti\YV_k{ȾziirrmkjfaXK?3,771$ &29EHLNOPQTRPNKJJMOSUWYZYYYZ]guxl^ZZZVMJGIC@<=AHNRQT[sĆN@DJMGMKIGFFC@=731159>?@A@:60-*0+-012;ANU_edgnvte^cj¾pcWOB95DGEEHKVlzoea`_bcba_][]YYZYXYZYSOKKS`q~tvvvy~~xgN<9:?HYipmh\Z]iy|vplicYR?@?@??>?CCBCDEGIPQTRRRRRQPNONMJGBDDDBBEFFLPTUWXYXY\`luluw}yolljggmmhdg`YURLGIRUPD4(#$%(/\x˷req~|jSB@GZif^M=9=<:<>;9642>Lcy̵uqtaJ6$"#" %))(&# -Kw}hrv}}|od_dpxwy{n[TXhhD:8CXj}}hQ@95;Qk}}n\TPWbrſmkssmjfee^TE7,3.&'4=DEHJMOQUOPMJKNPSVWXY[ZZZ\`fp{{uljjhd^YTTNHB@BGLSTV^|ީcFFMODMKHGEFEC?:766;>CDFEEB@;:;=:95>Onuh[MD>CM^krpokgdddjkkhebaacacdb[VROLKNRPIA5#.HmmW@/3F\to[LB<<<::>BEBCFHKWvti^WTUUYVWWYZZ[WVVUUTSRQMIFKTbm{sljmqu}gVSMNR]ionja]^k|~n`SKD@6:>AABBDBBBCBDEINPRQQRRPQPNNOMJGABDEDFIMPTX^^^_bfgfabmou}ww~ohfhhjmliikjc]WNIINSMA4("#&/7ETfs|~u^H?Vn}mWP`lj]?44LjκudpwdJ617Na^VD0&$!!$(('$"$2@WrʻŻtnývaN=/#!!! ""!  $%'+0333/,($ "#)MvŁlpu|oZOQ]dbhrl[TQYq|gMB?J_rjP>45FVm}}mYNMT^l{qipsohbdedaVJ@92)(,4;@@>ADILNOMMJJKMPRRRRSTTVX[_birz~}zyyxtqle]VNIEDEKOSXeſpJDKMELIHHFHEC>;88:=BFFGGHGGEFGGEGJNPV^ehorrrtwu}zkV:%2`Ŀ{fWMEIQ`ltrqnifeeeffbZRKGIFKONGDCFFJOVXYVSJ@8/0D[t^H8D`z~ePA9698:;?@AAGIGL`~~zwvqj_UPKMMLMLPSX[ZYWUQQONMOMGCCFOWivzlb_^`qu}yqphfejoqlg`[]jzlXIA=<9???;9;=CEJIIGHHGIJJHHHJKNPTY\_cjt|}th]TLLJHHKR^tſzRCCKEKIHGFFFB>;8<=BDDEGFHHJKMOQPTY^_ejnouuwvwwt~|iJ0 >~n`TLNTbmtssplighfhieZMB;3028:69=AFOXckquz}xgVVgxq`WgſnUB61357899=A@@@@CDEAAABACDGJKMMNNNOPONMMKHDEHKLPTZ`fgnstt|obiv{q}l^ZZ`eeefgiieaVMIEGOF9/(%-8JUeox}rVHInĺz{d`quoqmf`TZoͽvxpj\D1-2DSNE:-%#'6GSZ]\XZ`gqôõieÿtbO@2/351--0.+,+))))+-1358>ABDBA;5.(&+'!#5Wy΋ujum]USOILSUPC;:DOTVZOEDSi|n^MIK^aeig^SMNV_ejurcelmjgggkqqmhVLDGLJC@<89;BDHEBABBCBBA@==?ADGNTWYZblxocWQSRMIMUhЍcICKHMJHGFEE@;98=?DDCADFHIKLPRWW^djkpuvv{{}{|xw~}dI$5lƻ½ueYRQWdntsuqmjijimok`PB9'"#).-4=BIV`myxv}zu[E6./266548ACEGEA:0+!#$!8VЍwkt~{{td\RJIJHG?859>?GOLBCTk}yncWTW_]\]\WQKOV`ack{raahllplkmsvqodXORVRHD?=;>DIKG>?==:8767;>DIMQRTXdr{tgYVYYSNV^txWKQORQONMLIGB>=BFGGE@DDFGJLQSXY_gklswvw|}~~~zwz}}u`=,'>kѿĿwm_WSZgpwvyxvtqomorsm]I:* +4=CJR`jsýdL6%(,11/.05;7353>_ö~xrkd[TOPRVUTPIB<8;>GLSSSQQPNKLLONGFGDA=A@>>@ACDGHFFFGHIJJKKKJHFDCFHMS[dlqxz{wwniv\KHOPLMSUQTWWTQRONOH;0+-:GZes{}{kRQg¶ʷzlPPUbs°vg]XJ?1,6CEA9=>:ARah}vnkij}e`|r_MB=??=:?AEF@725;>@GWl}mb^\ZWZRORSMIITW`ffgto]X^krrnllmooqdaZYXTLB@>>DLNKG@?B@A>=:555579=AGKOOPVduvj`[\__``s̜w^TW^]\\]]YSLIFGHJIHDEDEEDFLQPU\chkrsww{zxzz{xaXU`y͹|sg]\aov|{|{wurpnoquthUF.&")6@IPU]jryÿpW@-&*,.*('*10/0.1Kgȹyrjb]TLIJMQRONIA<98547:>;9535;>>=??BCEFGGFDFFGGIJGGIHFECBDFNV`jty}y~xnvxZE?FGEELNKLRUUVYXUQG<103BO^fqx~q[MXqİuinv~ymdqzιn^RKA6-(5CFC7BKGFMY`kkhcYLC=D_q|Ⱦc^yyhWG@A@BA>CHLIFEB@<::830..05;?DDEFFB<720-++& +/Ou֩ot}rgZ[j|zfTGA??HMNF:10268CXtvf[XXVSUMGGHFDBNUdnonvoa_cjmspommmkjeb]ZWSKEFEFGLLLIDBDA?=;986769:<@CGNOOSdtxpihhgfenÜ{b^fghjnnke]UQQOOMKGFEDB?@FILOW^chmpttx}~|{|~~xqnxȵƿ~~wofdiu{}yvsqmlnuztcT8107CLTZbiszzqp}ºeI2#%&(&!$'+-++<>?CGJMPPNNNONOMKKGB>;=CJPYciijjlpuy|}~~{tkbZX\frzqbURMJGB:2,*-059<:4237=@@?ABEFGGGEFDFFGGHHEEFEDCBBDGPYdny~rp}zY?7<>?AHIGKRWY\_]YQF:143.-13@YwsiZQPRRQSG>=><;:DRiz~}|meghgdlkmnookjigc\UOIGKKJIJIKJJFEA?=;9:797:;<=CHNPNP_o}vpnnoqrὑl`emqx}~{vo_[USPONKJGC?;DNSY^kqzpeesz|ȿsP4!  !&)))3Bb̽zqh`VOHDDEIJKHFC?===?@DFILMNOPOOMJLHD?;=BHV`mtutpossrqquy}~zsjeeirx}|wk_QNH@941.(*.37;;8226;ACDCBDGIIHFDEDFGGGGGDDEDCCCCEHR[fs{yrywu|X;268;:98887899;AGMMKLYg{vqpv|Сwghrzib]XSRRNMHC?::@CFIPV]chmqtw|~yvvtyɻľ~yyz|yvuic`hrtk`QJLQVZagrw}x~xnhkgcn{xY<'   !#$,8Txne[RLHECCDEFDBA>===>>BDHKMNOPOOLJKIFC><=AR\lx}xridejmx}~}xvsstwvspng]RNH=3./0-0488864028=BDDEDEHJJIGDEDFGGFFEDCDCCCDEGKU^ht|wuw{u[@258<=AFKQX^bfe]RE7,*7DVba_bjz~zocSHGWwȿ{{{kf`^`dfgpiPA9:92-/9CMQUTSYgs~lejn[KB88<=GQSRZ`f^N:0/%! %)E`xý{aViþm\M<8?ACCA?=@A;/'&((&&+*%$(-2c¿辔kyzz}wi^L;68?APW`a\PE@>A?;3-,-14>M`q}pcQGGJMNA:666323AWs}yqmpwxog]_flqssqkgaYNGDBCFGEEDHNQMHC@===;9:8::::AFKOPOZfy~{yz~ݲpisqld_[XVSOHC<88>?BELRY_fkqtvz|}~}usrqx}zxwib]ajokc[VX]aenu|zqsx~tj\U`p}}ƼoS8+!!"+Fuòtj^WNIFDCBADDCA?<<>>@ACFIJLMMNMMLJIHGE?;:5.35/'&0;?ELMKLSZbmuzsdbkkTB727BGS^bba^\SC,  +UjehyŽ|e]n{e[O?;?BL[cmv}}yxxwtsqpjhedb[RJDB??@AA@89@JU\XOH:96/(&&(04?FLT\bhnqsx{|}|xwxw{ȺȽ}{yyle^^fmolga_bgjqy~vuuvxxjccgq{zºrS>) %9jű}of[PJFGECACCCB@?<<<=>ADEHJLLKKJLKJFFEC>;:74334641.01249;=>@BEEFGHHIHDCGHGEDC@?@?@ADEKOYdq{x|wx|[C26::32?PY`glok\M9-',>KU[Z[`gv~{vkaVLDEPfùkUKLPW_cb`_bc]PA5//4861/5<>DKMLKNRY_dit|td^`n~fN;/.7FNZejjc]XM:  0^lXYy¹xf]mǿq[UM>940/.0453/)''1?kլly{}}qbHA:;CIKG;67@PWPF540*%$$%13FOX_ejmpv|{~Ǹ¸}{zznh`_emttmheehiow~vxzobXbqsszƹgN1#!!$&0`ðzl`UMGEFFDBDFDBB??=9:<>BDFHLLJIHJKJEDCA<;;?EKT`mzwh]WZagfisy{~zpaTOKELLLKF>9624540/3379<=>?ADEDEFFHIIDCGHGEDB>=>=>@BDJQ[htvwvU<16:8-+;PcinqqjXG8-(/BNVYZ\biu{tgYPD<7?Pjƿ¶r[DFMXchea^_]WMB949:767=BILMNPSZ]]anwo^[`p{eN:./9IQ\fjjb^ZN7 #:akXgvaWexȽnWQJ<;AETkx}shbYQNMNLJHIKNJB;8<>=:5/*+56Uׯr|{~}p`MD=@JRRNC4*2EMG??DDEFFGGGECFEDBA?=<=<=>@AHQ]kyy}lL7*.0/)+;LerywqhVD1,,4DLUZ\]`dq~zjZVLE=?DN]tyogca_]X]cb^VQPOMJHD=3.-85E}Ż߾}q^KD?DR[\XK:)&09<:++*%$$(,/6E[vlZJDDA<:;;<;9=N_xylaUKHIPWZ\hwtvxvsquwokghh`YVX\bglprqiddbba_[`\ZWXVYYaba]WQMJKQ^p}luztneYRKB:464,/:ENU\`kqzǹĹ}||~|zojcbgq|{uonpx}}}{z|xmYICIWhȿzY?5/(##!I~̼rdXRMIFDDCFIIHDA=:75325??CDEEFFGFDCEEDB@?<;<;<=?@LS`n~{}iG2&*-.)+9IapzzujUA/+.7GOUY[\agtsh\VOF?=CVhĿzbO66:DPWVSRSVXVQJFEB?>?@><;>AEHJKKKHHMUZZX\fu|dK8,/9EQcjr}ub@   /O^khtÿpYOSggQKE=>CM_s|yvrpuxysjec\ZVUQH;738-6lȾǙ~o]I@:AR^`[K:( '163-+)&$%(+09I`yrWKABGGDCBBCCAFVgui]RHBAINOR^ltx{{vrstmklopmjiinsy{somifcb_][ZZ[]^_^YPHD@ABOcwxs{~xodXRLE<87713??CCDEEEEECBDDCA?>99:99;<>MUcr~|eD* $),)+7D[lz}zmU=-*0:>N]sľ¾{gP@/039@EGGGKQVVSNKKFBBDD?;;=?ACDEEB@?CJOQQYbp|{cI4),7CM]espK! /$ +6V_hk{ƾnXOSd{bKHD<>DO`t~xtljfd_UFA:<-4hӰy}}yi[G=6?Q_b^O<( '../,+(&$',1>;7>Tl¿¾ɐux{mbVQMGA=;:7:AHR\fm{¾̶~||{ytoifitzttz}|}zrt}}vpkgc`fSEFRe{ĿhOA86,%1]ijufYOPMKJIIIIIHEB>98540/18>>BBCDDDDCBACCB@>=767779:=LVfu|y{wc@)%++,5?SfxrV<++3@PUWXW[dn~~zwutx|l[PC<8:BJVboolfa_TND<79HVk}}jUB713568:=?=AGKLKJINLJGDA><<<<=>>???=;=AFHIT]iqttstv`C.#'3>DQZlzV*-<.$>[_hqɼ{kWMSlžv^IFA:=:::=KT^hsxna_YSLLZq{ttoeTK>;AHMLOIEEHKKHB<524>BBCBBBBAA?BB@>=<6565679,,4BQVWWV\fq}naYTSVZbrfP92-04;FPTX`dhhc^TMC:6:KZl}mZH<8:;<:99;>8;>?>>@BMQRK@9:>>=<::;<=A?==?BDEOWafeddfqrsmY;&".8;FN`}^3"-:00Ha`iyȽwjYOSyžqZHE=79AQ_r}{yuo`QG::18hϚv|wqgZTD>8=KUWUNA1#$))*+,*,/2;<>BA=;;;====AABAAAA?@>A@?=<:5454568;ERcq{wrnojZ?*%04447CXo~|`D/.4APTWWX^hr~xkXH>75;AL`s|]E.*-7ALW]ea_^fjf`UMD:9AWhxq]OB<>?@@>==>?:<<:669=KQSJ;38AA?<:9:<=CBBABDFGLSZ\ZY[_fegeQ4 *37AGXsh>%"/( 1CTddoû|ui[QVÿǾmXHE=47APat~}}zteUK@<.3c÷٨}uphYQNC@;7759421358;CDEFFGEC=>@A==?DYl}wi[J?BLQOOQVakkaVQGD?<9:=?CDFFEHMOOJHFEDE?=;;;====A@AA@@?>?=@@><;:5454567;CPbox}rnlhbR9'(49855=Ri{gL304>MRVXZ`jr{~ztjYJ<1*-2=UkmYEABKSZ`dnf^X_eebYPF=?Kf{½_PIB?B<<=>?@A@?BC@:8:=HLMD83:CDA>;:;>?CDFGHIKLLRWWSSX^_]__L. *38DJXp~vO, +CTdihsmepysi^TZƾhUDB=59CQbv}|{|{vhWM@<.3aȷ༗yog[LFGBCBCCFHJHG?2#!%+18>CHQVSPT]]fjwyh^bfa]^cheZRMH?AIU\YUPNRaoxyh_do{wXKUarldfga\XQNPRTV]co}èκ~|z~~~|}|tlfglsrmaYRPZdpy{}vo{}dB)4dp^SKDBCFHNOQOLHD>;77574101367@BDEDECC;=@@@BFLcw|p^LFXnth]FAFRYSMNDC@<8788>AFIJLTXXTQNMHE@@??=?===>@@??>?=>???><:9545456:=DRdpv{olid^K4#!*7?=8576>BDJNPPJE?<99664/-./036;=AAA@>=>@BFQ]fuwjUQ^TC?>;96<@GOUY^acdaZQLFCEECA?><;<<<<<<>>@?=<:999421359<=HZlvz|tigaP=0#$+499;>B@GXpybQ>73;DJRZ_gs{{vqnrpqtvrh`L>435=Sh}oga^\][YVVXY\]QI78LiþyfQDEHGC25897:?DCKQQKFEFEED>8:BJMJFA<;:;<=<=DK[gz{uxzxvjXJ@51Ca¸ƣ}xl\PHC>CDCC?;?IWh{ʲ|xrtv򳒈w^Wciklgcgqulkowȭ|y~vu}~wm^WRSZ`a`^]`hqtrlqnjc\UX[ksqfcacozfK/%My|l]QIC??=>@CGKLNKGA?;96853..--/379<=>=<;;>BIVhswiSUgurp]@/1:=;;8;AJQVX]^iif^SICAHHGDA?=;9999;;;===<;:765111269;>I]ox~{~vkhaJ7*%-47:;AF>DTjzuaQA;6>CGOZdmx}vmkoolljbWNG>:>DLau{xqmha^\^`j]P:;Mløg[MFEGD?8;==;=AEFJNLGBCEFEC>;?HOOLFA:866237@HNNKFILKKNV\[Y]^M/(6DFLZluzR,& &5PfdZjqTLMSWZdp}z{xqc[_¾pTD::<Skҧ{wl\QKE@A@?=935=QarlU8)!!*1>GNJD?=AHSfts]]es{xtttsqmhda_XLB=98;DJRc}˼vy{xyw}¢oXTdqtwrot~|z~ȯ|wz̶xsv|yufWJGNX[\ebcgklc\YTPKGBEFRZWKJOZjy~vm^ND5$BjsbVOKE?==?@CEIJNLJFC?:574311.,,0458:;::;:>DOcx~o^Rax}L,$-05566:<:BNYafmqxvsi\MEDLIIEB?=:777799;;9:<;;741-.258:;?AA??ACGHJFA>@CECA?AFMROLF?:621,,/6>FHHADFGGKRXXZ``L-&4CHN[lv_<5,)+2FXWObpZVW]_]_dpx{x{~wg\_|½yaK>9:<;DO_k|~{z{{vrhUD2*%0>M^nga`gieek{㷒vrj\RMFA;=<94/5@XmgI5)$&09GOQJ>74>I[qxiY_n~}zwtplifcbYJ<5228BLO]}ʶ|rx}vx߾nTUhzйvw{{sv}uyȹ|zzyzwqcQCBIQVhedcb[RJD?=<>?DHN]\QLFGP^a\MA>5*+%<]{jYQMLGB>?@BCEHJONLJIB;6534310,+01135777:=BM^t~r`Q`xX/"(-16?DAEPavyeSIGMLIGD><:7555779989<<;62/-068;<;>Nbu~{{qm^?)%+048:@C>AHU__RI:89@BFQasz~se^RPJGGFECRU\glowlY:8QvžoVLMOQQNIF@ABC@@??DEFB>:;@BGKNOLIC=8410.--04:=@@BDEEHMRSYa_J,,IUdp~||yspcP?1%!/AVfb^`efa]bmprvҭvpmfYQJDA89850.9GdzuWB3/1:ER[UJ81/;Nc|~k]`j{wrpnlifa]KC=;8206EK^Ȳyy}wux~yuuvwyz~ܶpWXj~ƣjmu{rt~ztnuɰҶ}}{|}{}xuvtuk[KACNVhec^WMC<<86:=DNVfuueVC6;BC6$6SwrcTMNMHD=@DFFDFIMMLKJC;6023421.+../113568GGJWsiRHEOLIGC><9666666889<>>;50-,18===?BUiz}}}zoiZ<)$!"(049;>?DBCIONE@434=AHVhz~~te^LGA?BHOTfku}~iGAUyҽyXNMPPPOMJIBCCEEDB@>?A@<8658:@EJKJGHE?:753331..269;DDEEEGJLRZb]H+&8EKP\evx\B5/02ASYiowzxnfgmx}|wmelx¿}yqi^TRQLC=42:?CMXit~|{wok^L:,.Gaorrrtrlgjnkc\ZaqŤqnj`SKFC?;:51./>9.%&=Lfƴ~zvw{xqkha_`aemv~gdtҲsqwzpr|{utp{ϪytsvyyywnmknjdUKIT`jii_THA?B>=>DJYev^C2265*  +,Eg~yk\QJJKGD=CIIIFEHIJIJIE>8//1120--,,,--0376=K\pth_ZzƼwH#  +6=JTṉ|eRLJMJGEB?=;66666688<<><84/,.3;=?=@F[n~xh_R;.00-057;<>>FB??BC?<30/9BM]o~|ph]XSPS[dkt{]P_}ӾgKJMLHGFFFDCCDGIHEA9:<;953049AGHGCAB@;87787541137;=FEEEFGHHT\c]H, !8HLMT]gshK:477I\iw{|ummw~yxuolts{~½xpid_YOGEEEC>2/8AFP]r}}{voh\J9"5Riw{{|yupmputpjdbdgp|ȨskeZLCB@?GB;65:IVlzztk[IEFO^cUA*%+A]una^m|uiijlng\SHA<70%6KjĽ¸{z||yxpjg_ZWTW\dm|yuƨ|v{pqyzsprylfpɾ|vtvuvyvkeaeef_[X_dhik^OCADIFFGJTgxeD0/56/   +  +1RmidXNGEDCB?DKLJFEHFFFGGD>811111/--.-*+-046=>;61,),4<=>=AH_r~|p_TK;5;;==@@D=769=?@:1-8DRcu|wurpqv}o]d|Ź_HDHD@>??>>?@CGJIEA766542206;:99:<:98779=@DDDEFHHHRZ`\L4 7ILHKR[k~sZE=@AOiv|xwz~~xsprpnlutuqpppsv~{rkfb_ZVUSRSSE6.;FOWc{~xoh^L:5Wo{{utuw}}|vnlfl~վvjdVE<>?@LB86;GXdku~i^SPZ]O:# ,Fh}{hadtugcdef`WMC<5/) 5MgȾ~||{y{}yvtic]YX[ahu񺓕սs~rrwtkio~r[YbŴ|zxwuøxh_X`bfeeefd\bdWD8:ANLMMQ\snH.*575+%$!#   @\Z`ULFB@@A?EMMKGEHABDEFC>93320/-,+.-**,/48DHRbvujgo|õrQ5'&!3BNSe̷tPCEIR[LHFDC?<;86668899?==96/+',3;<<=>BD@:427=CE>3-8FUgwrbezͿx]KAC>99;=:8<;?DHHC?85200022:?ED?;=@?=;:9;;<::=?BABDFHIHMU]\Q=% +3IKEEK]lfNDEEUn~~uuzurvxxxxtnhhmlihqvtkfb_bit|~{{|~xpokfdfgfddbO;3=NW_jy}zrk_M="3Xv}}}tnghv˷zldTA:;6.*(12:??:BPl{z{um`KC<46FOVUSLD;>E@90,9KW\RD9=FUh{q\^Ǿ˽iYM755344552789;<;97//234467<;=@@>;;>>BDDCA>=>@BDFGFDCKRZ^]R:#$>KKLQepi]PLR`my|~}wuyulinstplhb``^^aeorwuk_Z`iu}}{{~~|vvsuvxuqiZ:4GW^kqxronopptwwuv|yrmbP>) 6[{}}~}psyidTB<>>:8559EVl|ϲre`]O54Rpyjbdn~se_XONOLD:6339>:6@Qc{ĺ|x}{vsrprv{|vplns{ờԨ{xuqaQUb}lYT[decba^YZ_buƽ~ʹyi\QS[dgkkh\IDA9,)6FUWVSWhsT@7AKQKGF<./," 3AJMRJA?>>>>@BGGGFFGFCA>=;952020.)$#!%+18;GUfq}~wuƿw[E9755+*:SdkrzeO<3(%-?QYTOJEB?<:86334677=>?<70-+/39?>>GUn}xurmeYG;4*->GQPONG=>B=:69J_lodUGHMXi{oX[~˺`TM:31///12112434431..358:<<=?CCA><ADB@>=>EKKNORY]WUW_jķz|zuroopsuzzxyuprv{⽞ܳ{wskYIO^~vR;8COTPOTWVWZL]~·³uf]VT[cgnok]G9+%"(7FTXZYaq{`OGHQZVTQH;<6+  + -BHRLE?=;:9:>BFIIIHFB><;9:63230,' !'08@CO^oyȼn\L@=?924CXhpxzpYE9../..9MYWQMIE@=:531157:8;<>;731003;?@CM]s~~}{wnjhb\S?4)!19ABGLI?==<;>H^tyiZXY^jypWWrǰyOJK71.+*+-,++*+,./..-.5:?ACC?@CB?=<=CCCA=;9::@BEFGFFEJR\ghZI&&9MU\`is~yphcdhnrjmlnw{td`_\]XVSLIIIMRX_lqtvvvxz}}}|uk_R;>Ufpx{zvk]RJFE=>?>>BIPLPXbjqssstrrrtx}}|}wtqklh[L7'"?a~|ȿ}tlaXQH<;@N]p~׻wbC.7Kcytgfp}tfYJ>45Mfxͽȴ||}}xtolggeeedccehqyᾞ⿙}}tpfUIQctP:5BLQJGKONLMHRiȷte_]WZ`gork^D/  +9FRV]`gwiYNKSYYXVMFH@4'  8CPQIC@=<879=BGJKIF@<986<83320*& "&.:DNR\gwǵwh`TD?C9:@JU^hvttm_PEBA74;KYYVRNIB?;521157::==?>;66437=BEKUasy~}xurmhhr~ynir{zy{vphc]WRL@7+ #(,8CJC?==BHVlsgfeflv{y_Ud{Ľe<=D43.)&&'%%&'&),01312:@DFGFCCEB>;;=@AA>:6225:>AA>:9=>ACEFGGIJNVckfZ8..:LW_eiq}ytolmmopefgn{~vgb^\WTQMHFGGLQZ^egnw||||{zxpcUJ9@ZkuyyyteVJCAA@>:4/.2658@MYdknkic_]_dkosrpkghkgecdgg_R=, +Fhƻ{vgZRPE7BXtdzrO:DXjzyphlz~xm\J=15Zµʸ}|{zulf]YUSPNLLQYemsyzqktġͦ|sodTLUdvT<5=DIA>DHGECIMZmɷxha_WY]bilfW=(!.:CPU_fpp_RSWZYYXUPNG:,",;NRLHC@A<66:>AEHFB=9653;73441*&&*1BDDDCDDEA<97:=@@>941016;??=;:<=?ACDEFNMKNXdfaH>:?KU]cgp|~xtqqmig]_cl|~zpifa[VQKJHHKOT]a_aju~|z|~}|tfYI;G`oy}y{raOB=<>HC;1*&&'')/;J[gnhcXMFEHNRVTRNMOSRQRV^c_U>-$1Ol}vsupj\OKJ>7RxȾXEN_lz}rnmu}z|}xmZE91:aʺƹ~{|th`VQOLGFCEJR^fjolb^jɥܷ{rlbUOVa~\B4464/09@CDDGHLXkƷzk_YRUTUY\VK4#%.:CRWcjutd[\]^]\[YXQK?3(  +3JROJIEF@967:=>DC@<9543855464/),3>LZgnrrxŹng`[RKHLRTSNE@HS\RE:55;>:4++5DSZ\[ZXSMFA=:8789;:ACDA?;;<:?DJRZ[WQI;0.-,+*0C`|o]Ve~{zwwxphaZOHEEIOG0  "=PTOJMS]jx{tlipplkpw{}jcdt{L/2<771)# !#$(*,16;>>99=>><;:??A>:646;>A@;621169<=;::;<=>@ABCMMJHNY``VMHEJQY_is}ztohaYVQW^l{~ysrlg_VOMKJMPV]_`bkv~~{~yn_PGRgs{zzq_L>644?;4,'$## "'4DYjsldTC5-+.353337;=>@BHU^_U@.$2Qo}xslfggd]NEBB?Eh_LWfoyvlmu~ywzzum[G>?OrĽĽ|y~|uf^WSSSMMJKMT^egff[Xf}¼Шásjd\UTY`zeG4/.%#%1:>@EDCDJVguprx}{j[QJLKFDFD:, &1=IY^glrv{vqmgbbbeed`_[UNF8/& +)CNMKKHIC<889::@@?<:8656446972.1:GXhrwyz~vcf_VRW]aaYOE:104@9327<==0+)0@P[a`__^ZTMHC@<:<<:;CDEA?;;<=@BJW^UJ<1")Dgyfaq~||yytkb\TF@??GUQ<." :OUPLV]fstkhnnjiotx}|z{z»fB,,664.% "%'*-157:<:8676532036:963136;>?:62026:=;::;;;;<=>?@EIJGIR[^\WSKJOX\fpz~}}xvpibZQHEIR\m}wm_XRPOOPV[]bdnx|y{}tfYP[ku|ywqbRD931&# "*9Lbt~xn[D. '+.015=N[^W?+,Mk¼ynnf]WXYWQC=:@M^|½ŶgM[mszrho}yvxsmj\PO_xżyvzwic^]ac^]]\Z^dihffZWew¿լǤhaZVVY]dveG2+(" %-79;@@@?BHSf|wkbciq|zhXKEGC;664.)"")2BQ`dhjhhjknga_`dffhimomgc_UOG=1'  %AMKKLJJD=99:;;?A@>=:875548;;514>L]nxz|r`eaUUcryrbNB:.&"1+).5:84,,/:HU]_cccb_YRLIFA>?><=EFDB?=;=EKIGNWZ`^YOGIQV\fruuuspnjaZTMD@KUeuyj_VTSPRU[[`cmw|z}zn^T\ksz}vupfZOC94&%#$&())"'1BYnzfJ0   $&(),8IY\XB+'Gi}}}¼ypgd]TLNSOKB:9EZoǹlOasx|}ofpzxupgcYRXrdzwuxuic`ensqosplntvtrj_[hxذͤ[ROTSPYhs{`I9/'!&)--,-7Pbhjg]UPMNJGHO\hoqsrnjg`XQNHA4& $=MSQLDGEEDB@@?>?ABDA=7589:86322=O_kry|{mfedYVqsVGB=.',0145('1;<:3:Ry~~|od[VK=:>6CPQJ@0# +0HJBFLNOORb_VJGGGCFMV_cefkmlhcZNILXetqbXQMIIMSRZclmp{~}l_TQar{{yxwpcYRICA?>?>=97.06AWt}\;#  &**'&/CTXR@0%?dvmkikqttvywomlhZLGMPPLBCFQhϽvRiyz||mft~ukaZYX_wԶxtz}|kjeemy|yvuwxz{rpqxۺ԰YKEJPPV_q~}bK9.''&++/0039>BFFGJM\oȺtd\TUbnx|z}wj\H93792,%'$.%%&+2@M_flkeYUOLIHKTanvyyupmld\WTK?1#%=JQOJFFECCDEGFFFEFEC>:78::97534>O_jrx~}¸i`\[imYTK8%'/369?CDKQ\cb__[fhgcbb]YURPJIEEFIHE>88:>AHMOYcaYWN@>FMLIGM`{teYQLC426=JXYPC4%6IOJG\vuia\^cdhot{}~|{~i:(++*)! !#*07;431010//0110.*#!"'++*(',/10.++,02469;<<;=>@AEPazfG1""$$%0DTUNA2%)BdyofYWZcmpw}zofedbYQNPOMJINT_u}{εiUkxtrnhmv{m`hw~~}|zrh_WSRWj|vu{}{khfdjt||}|}xvw㿡ֶkVD=AIKNVjvfL8/.--//11469?EIIILQT_jpt~xl[XTWdnrvsuvodYG8*-/-+&&",(,/38CNYcnsqhd^XWW[dq~yxwndb\PB3% &=IONLFFEEEGHKLHGCB@?:788:99776;DR_iqw~}Żn_V_}rnbI2(+049=>?KR]dgdebfiiffgc_ZWUPPNOQLKHB===@DHKN]lrppj_[_a]Y^dt~si[PID;,(-ES`aYK;.&%.BRXUTd}wf^\`c`dkqyz|y}~~T($++((#!$-49951,,121.//-+(% !&)('&(+,--,+*+/024579:??@?@???@@BCCDFKV[YSOLC>;?BFGD>@HJLQVW[dpwyh\PIJLNINWejlotv{ync`fpw|ofXNHIJKPSZdprWD6.*031)#!$$',:MYWMB5+/Ge~~zre\POS_n{}sjb`^[XTQOKGGU_iw|usuyʩ]Uhoe\SMTq}yjXW]cdcilqtuog^TKHKT^r{~Ǹwtux}zlmlggknox|}zyzƧʚpUMB<EJLRVZ_bbdku{}qh]ZZ[fkpqstrmcXJ:(&*,-'$#,/7;>AGNT^mw|}|yomlnt|~sghcWJ<-#  ,CQTROHKIHGHILMIGDA@=<8;:9::;;=DKXbksy~{s_XiƷx\A.+*.3469DMYaffhglmljikkf`][YZ[_cZZ[WRNHGDEHM`uzvusmhqvylcVLFB8*'.LZgg`SE977?JSYXYjzf``ce`airy||wz~~~{M,35.,)'*/2285001221-,)&#!"')'&',---,,,+,-.//2468==@@BA?<@@><<=BHSY\WQOGB@@=>?=89BBAIRZdnz~wgZLFHJJFIN]gmqvz}~x~wlhjpv~yka\]]_fjpw~ycTIA:==:534749AN]d\PB607Oj}yvnaWQPVdy|wqib_^YYXSMJIK\jx|vuuzyȥ|^XdeWKDCPs|vo`LGHLPUY\elojd]RB<=99Rqx|ƿнwrrvz{prpkggggsz~}{y}Ȫ⽅[GFB@=;:CNYfyjL946::86533409FRZcipuwx||x~zupkfa`bglqrvvrjcYJ:($(+*%#$0:FKLKNQY_lzuhjf_SD4(!  !3KX[YRIKJIGGIKKMJEBCBB>=<::;?CGRXahotz~|}v~ɻwimȳnR>3''+049BIV_dgllusokimomfdbaeipunrutndVNBAENd{}y|xsh`RID@7**2P]hf^TJCCFKNQUYYpưpllid_bjrz~}xx|~Z$ &27...+''+.8874/-14*(&# &*,)(+/10/../--+++,/02468;=@@?>@?<99=CJV\^WRNIFF?87;>;>@@AJWcq{ocTHABFKGCESanx~}wztnmqv}}|}md\VPKDACINRRW\emncU@;:CZr}wum_TMMSc{{wsnhb__[[XSNMPT^n}tlkpu{Ģh^c\MEDPd}{uaRC>AGMUVY`ee_ZTN<3/%!97?IQ^qkP=8997555:@CakyxrnkikligginprsspicXF7(#%+) #(;HY\[[ZXbhozujljdYI7+! %6LWXVNFGFGHJLKLMKGDDBA?>=;<>ELO\bipux{}z}~vqxưDzgYE2.15:AINY_einqwwtnlqrqkigglt~r]P?>DRj~upkd^NE@<3)-8T_e`VNKGNSXYX]cg|ʵ|yxoe__fnz~zy~l9 "')(%$)/3673,*+0$$#"!!!!$(-,+*,/10/0230.--,+-/13248;?@@>=<868>EN\bbYRNJHE<329<=?=?BPar}~vme_UKCBGONEAIVbhpzwyzroru~wspljbWSW`gkpttvwtfXEACOdv}~{uqj\RIJPcz{vrlgc`[[[[VMKLQValxug`cjrxʺp`]PEDK_xyq]PCCIRX_adeeaZVRG:/&.Rſ̼xlhry}{wtstomjnqtxxvtvu}ɮĽûΚcA4::?CMVgyhP?;::97;FWjvź~ungdfkkijloqroomgbXF3'%(-*!(2HXklihechlpz}wrrnfXF5(!  %1CJLKF@ADHORUWWSPNKJGB@?=<>BKRXdkqwyzyyvy{}|wqovͼϿw\E?BDGOUW\_cioqsuurrvuroljioxrYJ==FXqyoje^ZKB=91)0>U^`VIDFDNX``_isxѾud[[_hv|~z{fH2# $')+,+++*'&$% !"#$$%))*,,,**-.-1573121....011269<>??9877:BKR`gg^TOIFA8028;965:DWlz~vkc\WOG>;>JMH?DOTVYay|ywst}y|uqrty~}~{tppu{{xqdWJIMZlz~}{{zsngXLEGOcz}xuohb^ZVVYWOIEGJLU]ccelrtk`TS[djnzp_XKBJWmsgXK@CLUY]^_`[VRQPA91&%ByƿƯwminxyvyzsohkmossqptt|½ϴ¾ɿÏ\>2===<<=@?JQ`p|{fPB;;ACCMa~ͼzojjijmnppqqmnjfcXE5*&*1-%.>AENW^jpv{|zxxvvy}}zsllsŸƸ½nVOQNQWZ]``adkomrxxyzxrrollqxlSC==H\u~ulfaZVKB=81+4CY_]PA=?@DP\]_lxƴzeYWZerz|z}dG.',*(#!!#$ #%'''**')++((**+17:61641..-123479;=??4445;CLTajjbWMIC?6039:2/08E[q{|oc[UHB:0+-BNWXZam}wmkdfp{~|{wqrruy{tnaSOOU_oz}~}|{{yrlbSH@AK`wywtld_[XTVTSJCBAAA@DFCCMY^RICFQ\aer{ne]OJWf{wh\M?48BJLMMMMJFCFI=;5& 6oз{ronv{vy|smfjjmrpnkqr{¿չ¿ƼԮ|R=6:45=DBA@EJVbozveO<CN[guȽqb\[cmsz{{rw|[:-$&+'$#!&)---+*('&''&(+/3577563/+++024589:9:70,0;DKWckjge_TJB<8771)&,.?NYbkoopzrf]RHA:1'!$17;=K]fdejr{}}|rj^Xan{zvvz{}vttnms{}voe]XST[dpy}w|~zytrokg]PGCIUhxysqrh^]]ZPLLMF@=;8751)%(3@G@75?IRX^rʿwnaZXdwwj`YF<25@FB9>><844;@<;2& 5mwomlllptw~ؿsfps}z|umnjoxwqmkn{ؾýɟmH97:219CEBA?CNWbn{ygPAGUm{Ʒ~somrwumd_adfcYLC<;CJG;:ASdx{wsplmsyqc^elow}}vhZL<0( &6;@HPUdhr{~wne`TKLT\dnwy}~|zyzxxx{yupnkp{ř|ƾk_cZU\_bd``dkkjnswwvvwtsttuuvv}zjWD:=FS_p}wpf^XRPG?:5/.8GZZRF@>?:=:4'$:IQRPQQOT[hutc[RHA<5.$ #06==Nhx{yu|vm_X^it}}zyzxwwxywtsmmsy|wpe]XSU]hsz~}x||wvroke`WPMNS^o|yqlkb][^YLDHF@<8798/'#087107CIQ\tǼ{mgiw{sha[SI?@FG?5121.,.5887+$ 4iwodWLHFEFJOPWiqtx|~ŧzlps|~|wopms{ztoio{ӻºԶX:23;209CECA=?DKS`mv{kXRau|wsw|vk]Z\^bb]SJFKU^YJAAHZputrqpqvzgZOLMTdv}|ypfXI8/% ,?IQ[ekz~yocYZ`gnw|}{z{zyx{xsnijtؾt{znmbX\`deaadjkhknqrrsuvvyzyvtruxysfWH@DKU^n~{voe]VOKE>81-/;ITSNHFDD>@BKXhvŵwj_Z^gmvz|xplph`UN[ptfXWo|r~tT6!%('""!#&*+-,,,,+)'&(*,/01212-'#$%*-569;;;:974:GU^fkmkgb\SJEA>9.*NXZQC80,-1;Mg~vcTIB<72,$ -45=Qo}{tnswf\]dmu~zvqpqvytrmmsx~~~|vpe]XUV_lw|~}y||xuromha[VUW[akxsig^YY]WG;A=601278/((11..4;CO^yupv}unhfef\SPQMB8677667;>95(#""6jiZQG:2./15:?BHUUSW]abbkmqx|̲spox~{vwty}rgn|½˷̿ʥrF/*.945=BCBB@?@EKWemyyvqlvӺyjZUVX[a_VPNTbmiVE=6.+2>KQOKFGIIFHIO]kzͼteZTXbirw|zuqql_VRXRNB6BVZTMUvzx\9''"" !$'*,.//-*('()*---/,-)#! #(+36:;<<;89:BP`hmooje_XRID>:6&*Acll^H3#-He~ncRD<50+)"$+-=Wo~ttpls}mc`cipyurquztrnosw|yvw}|z{~zuoe]XQVaox~~}x{~~xtqnnlic^Z^bjpw~}ni`YVXOA562(&(,3950& %.55427=FWjȾzxxoijorsj`ZWRIABBDFHIII@:+')%):q}jTFA=61238>AGFFDCGS`ituz~§teWSPQU]]VPQYjutcM?7CP[eoy}|tme]VPL]TG<6>Re{z~kR<% '3AOcmwwposx}~}{|xvtusngai|ȩ˽w\UX`fb^`cebdffgjmquw||zuy~vla[TUX\jw~~~wommmv|}{zvqh_WMIFB7-,6BMOLFFHJMPSSWbp~­o]TNS^fpty~{vqia]VJCACHL>)+?GB@Qxwuu_7!!"!$),/22.+**)))++*,*.*%##&+.2379::99>CMXenqmlgb\VPID:3,!?Zu~}nT<( 3NltjUK@94.(! $:Wiopia_ekpt{~ujfgjp}}xttztrpqtuy~yunklnqv{xttuxvsoe]XOR_my~|zvx{zuqolnmmjddglqw|~xk`UOLC8.+' )1874/*+.6>><<<:777=AAENV^fiqνwkjnuy}cmźڼʪhVF9#"*49>ENOMIFJS_gu}|m_ROIKOUXPILWk{p[H<@IQ_nxyrfWK@956NMJFFN^k|yZ>"#5AUbu|ytw{|~{zyzvsqsqlf`i~мɸ^RQZb_ZZ_a_acdfgjmqsxzx{yrjf_]\\gqwuwyurmkhgfgecfnuw~{xtld[QLHE9//:FNNKGIHJPV[]`gq~ϿwdTLJS_fnqv~xtrlibXQLF>::;DM@&%5==9Jnjgp~R)!""!%*.10,**,**)*)((()&#!"%')238:;;::ALXbjpoigc_ZTMD?5-# 1RkvcO;/#%8Tpwl^S?83/+)!%4FRRGBDGQbmtvx{|upnoq}~vpzzvrqpqrrtyz}~~vrnmgc`]ZY[ft~{wohcchlrv|zrqme]WNS_lw{xurtwvronkononlkmpv{|{|{vptzf^SG@7/)&(19;95359AGMJCBIXs½xjceqz{tfZPKGEHIOYbd^ZQM=7925Fr^WKE<53344>ADD?830,0552,-06;CJQVY`|˾vigjow{bnѹÿȳtW-&%-9CKUXVRMPWajzȭ{h[SMFGJPQG=>Mey|hUHFIO_lql^O=2,(+1>FPYblv}]= +>Lbozwz|yyxzvqoqplf_i}ȶ[KJT^[VU[^\_bcefgjnnqsy|~~|wtppkf`]dknjlnoqrqml_ZNFK^mvy}}zwpi`UPKH=33?INKKMPLJP[abfhmzɺn\OJKVbglms}xpkf^YPIEDB=:;=GQF-->CA9>Xjnryi`ks^OTh|a6"$%"$(,-,(&)-,+*)('''(&$$%&(*3579===GU_WTMHHNX`gkqz|unnle^XTW`ksurompsspnnlqnllmortwzzvuvnfhxvb\TF;2.+$ *5;C?957=HR[SHGPdýug`dq~{qhb_^^^clvtiaQM@:815H~t^LGBCA<:=DKW]bb[TNI=::71-**15<@GJMTn|ɾygcfluy~{|~dsʸпuA0%);GNR\\WTW_jsֺ|h]XOIFHOK@52C]wsaVSPVfrqhTD2)&'0:5BTgva1Xvj>! ##&'$ $%),)%%).-,+)('&&/.-.//12468:;<;;IZinmnjga^[XOF=6)%>[v|vvumecSA1$ 3Lh~n]PB4+)! #8QdohH49<*+8M^hkpxwonoy~iadihmnonmnnllmmkjimnrlgdffc_OH<2/5AJA;614?LT[^grz}zxvoijib\X\^fmssojknqpolmmsmjjnruuxzysooh`aqpa`[PC965+& #,6<@;2-1;GTf]OMYqýľ{qe`gv~|{qrsyyi_LH>8939Ovt_I96ACECCKWbksz~{tpl_RD:41/-+.28;=@F\mu_]agrw}|^p˾ſk<(23>EGF??Nh|ӿX9+ "-E[p}|{~}yvuvqmigfedbditƼxluyRBBIMKJOX]`__bdhikjiijmrwzz|~~}zvtwyytkcaba`dq~k\PS`kuyvtty{kea\OB89EQXVSVZ_dltxtru|ɼ}mie`dne\^sz}slaWTVNDGXd^OGWeo`B?P\^L3(-;GNLJS_i{~W1 (0DqA +#&(.+'! "&(-,,)',5>?EJKQXUOMA4246@JYbjhegfa^`[OEA5+!0Yu~yrkhac_VOG@8LfnUE;0&! -OpwmF)5ES`nts{|spkmpx|}}yoh`X]kywtwqghif_[]\YY[^dhlnqibUMFC?<:414?JUXYWX^ekmmeffc^ZWU^hplioqommlmnnlkoorrqppprpligc``]_bmzvbVRSTD6% /;60*'&/BW_XKNduicgt}|vmaZMD<87>M\kaXQI@>B?:=O]gt~xrnjd]UNA91**03?DN]pbNEV\cosr[m˿¸vH"%5?KZeehiioҮhYMIFGB9,'/A\t~ukdky|seM?8=HNSP8;JbvŔ]=1&!!%.G_o~~{}{wutsqnjgfecaaeoµ}thqtQD?DHDCJUZ^^`cghjijiihkmtwxz|}~{xv|~~xqhdeeehp}{lc\_iow{wux}~yscZOEGMW\YYZ_gnuz{}Ŷxpjejnf]`x{wkbZMEBDFYr}nTDVeseB7FP[E,*9B>8>HShuoD% '-=cE!%')'# "%(**+)(+5;JNUW_hieVJ=::>EPZdhgcca^_`VJB>3)8`{ypjihjiee`VNMdxy_F8/$  1@EI]Y%(2@N[krt|~wrkhjquvyzrgaY_myyxysjefbZWVSPRU\blquy}vj^VOID?<>ALV]_^WRRX]_____]ZVTT\hnmmnroolmnnnmkoqqqqonlnjgb`]Z[ZVSXfvxia]\H:'*71*$ !+>QYSJPh¼|qhfny|vi]TH@;;BCQhzvoWK<.*)*1;CK[dnïѩ|XCJObx~~y{qdVkŽ}M (8L^lnroik~ět[FABFA5'"*>Yr|mdahtthZD94;ELQR58Hbu~ǖ`@5+##%1Kdr}|||~}yurqqrokhgeb`^`iwh_ukvsUMAEF@>ES\Z]`bffgfgfffikqruvxz|zxw}|rjfghiiikkkjdbbeikqwxmeZOOQX\[\^blu}}zzϾ~ohikhbdmzm^SL?4/;Jk^B:FVI#%:+):D<0.5CZg^:" ).8SuI"$#!"$&&))(*25>@GJUbjjcYMHFJQ[ahjhca]Z]ZOD>:/%+Kmxplnlorwvmfr{|gP7+% ,Hkſi-!"*6DRcmry}ysplprswzpd^V\ivxyysjceaXUTQMJNW`lsx|~ztle_ZWVTWZbilmi]QLNTXYWWWVUSRRXcjlnosopmooppnmoqponjhfeda]\XUUXRKL[p{ndZE5$*72*"(8KPLIRl¼wqigksz}~~zseYQE=;=?BDGF@;3+)1QguK!! "&&((*,((,0:IY`f_VRPT[bfiihc^YWWQF@;3('A^wwnloimr{q^N@0%  !=[|l4!#$.O_`a^aiosxqfcgs̽udy}yppqu{}zwh^OA529FQbv|jF/#  (;P\U8,5Od\B &0BN^xuO-##$&%$$ $4GSXXVUV[`effefa\VVNJB?8, 2Rm|vlimopt~|~pXE940" #>eǻh9%!!#*8ETalqx{tookmtyqjcdjswyvohhjg`][VRUW]clqvz}yvt|vqnnopl_OC@BGJJIHJMOOOT[eovvvvtsqqsqolmnlie`]ZVUSQPOLLNLGFLYrrZ=.,QYfnoxM%   3KYK/&1M`S4 (/?]dK4%  ! *8AIPUY`dffc`b_XRRIF?:1%!>at|vlhkrsv}vlgYG9..- /Mf{\<,%&%*7BNZfpu{wsohhm}~wpigiotvslggjha_]XTVVXX^aegoqvwxwxv~ztmhgilhaWLDBEHKHGINRQPTXcqwxvvurqpqnkhihea]YTSPMLKKJHKTPF@>Hby}^?, '8?<94.-7JZer|r^C5;Ncnof^^dmtvuplc\PF@=85761..0,,0;Lht[D9'2N[_bkxƱջiL[|wzztng|¼õ{|zrnpmNC<*2Pk~qZQHB?;84.& *2CP_kt|}yrnryy}Ϥu\[SLD:;Nf|||{}~~|xspmlkfdccca^[WU\m¿\]̷kMEJZe\LA<;KRZ_``fhijjijkllhghillmmrvzxsnmmyveVSUhnuuniruaJ3"6RTNA?FGDIGDJSauĹl_zld][^a^[ND4(#(9KR^b`kZ*%7D6$8G=#!(DO>0&  )8IU]ehgga]_[SLMHD=6)-Lnzz|vnjkqstxgYOB6.')'@_wm]\^L9/(+'+7@HS_jmrz}wqgcft{xqjhfkptqmhgjicb`\WOMJGJKOQTY`degknnlib]Z[]\^^XNJMRPLJLRWWURU`pwwttromkjhebaa^ZWQNLIIGFHHGGROG<5:QhdF5))#%3;>B>85AUjx~whV=/4Iaotne^Z^ekgc^VQF>875684-)()+4CWjp[N?) =h~˸ǭjaw~z~{toǽ{nijmvvqsңyRC:* 4Rmq_UK@=99560*'#$,4O]jty~{volqwvzѨ}d`XQI=:Lc~~~}|xsomlkbaaaa`\ZUSZl°\ZȺ|\?73ETRC;99GNVZ[^chllmlnmplhefgijjkmqvtpkkm{uifht{zrxyo`QG:,#-GIB5/553>>;CN\ożzxsQS~f\RORTSQE8'$1>EV][hT%  !"*%  2>4(&  /EU_ikhh`[]YOHIIC:2#9Yx~yv~}vplkqtwy}x^L@0(&%!8dzq_ONQB2+$.),7?ENXbejqx~zre_`kqxyqgebelqomkkllfed`[MID>?@DFNSYYXXZ]YXWSMGEFHR[ZRNRYTPMPV[[YPS^pwvrtokjhgc_^\[XVQMJGGECBEEDFHFB9/0AUtjO>22* %38AIJA?Lbw{tfZKCHYmx{vmaTRX_WTQJG?94159:7+%$$.C^uyh`Q2$D|Þʼdlr~ztþrkle]eh~îuy۸]I<*8Xo~ze[RE@:@C8) $2:=6.-+,8;;AIUbjyļuXI=KqqdSFEEA=8/#$((6PelvF  "  +  $*( $   ,H\glifec\VMIHJJA:5!,J]tzvr|yxwrnswwzydL<.**"!6_ƹyfVE?A93.%)+*3@CEP]afkpxwnd`hkowxof`_empmkjklmkhc`_OLJFGHJKUUXY[YTPNMKID=747ANUXY\`YVVZ^^YTRW`krvtrlhedc`\YUSOMKJGGAACCDCABAEA6,+6B]ulNHB>6--1AGKMOR[iĽun^_adjs}{n_QMPTJIIC?753138<:-!(:UrzroeH7RŪǢ¾}x{}{Ŀȼľurrh\TRgw~ßvYC,  9Yp{ulaWPNQR[[YVW[belt|}wsou{}ͪi]PB<68K`u}}{xurpnmgfddb_ZWMR^qjfxzoi^OPOTY^]VOCAEKQU\biloqpooliedcbceehhhjmlhent|zsnlhnqmr|nZMA5*(+47.  ,;BB90/-.7<@FKPTWhyŽucO7:[svl^K<4/-0026::74E\nwD +&%     " ! ! #8Qcknje_]XSKGDCD;60"3Q`ptpr|~zyytqvxx{sX>0''&"Dv¸~~kWB:<4.'&*,6CEDNX\cint{uiedgiq}vmb\Z`knkiijjlkjfdd_\[Y]`egomljjfa[POPMH@60*2=ISZ_b\\]]][XUPV_hlnmljfd`_\YVRNLHGDC@>>@@A?>@>@=4+&.3AWm{r`OMLIB;>FMR[^_agv¿|qichpxq_OHHKDB@:71/.25:93)(-;Jdz}vpiSE_Ʈzy~{ƾ~wrorvyx{{m\D4.*"(IGCKOU\chmtxqkghhmwuk_YV\fjhfeefhggeefkklmty{wwspmb`a^YN@5/18EUadd\^``\WSQLS]ccdeed`^\ZXTQJIFBB?=:==>=><:<9:81*""!*8GQ[b_UNQUTNJP][foqprwujaXan{weSIEE?<920,++2694,*7HWbr}}z|zwrtb\pÿ}fnƶytu}ļŷ~yqjedksxo^B3:FXkiw}|lcaab_cgrˮ}O2"%Bf~|~wmaZXXW_biotvy{}~z|~~ͭh^PA9:G^qy~~|zvttsqnkigeba`]YUTV`tùy|p[@;8=@DNV[`hmnmmie`bbbcfgkiiijihfmpv}{tmkifonT>#"#+;MWZZihicYOKI=@C@<865=AFIHA=8DTl^@98\p{bC.(-=Pivz{}~}T/  % +    ##!$#    "$$(*%!'0GVfmkh`[WTMIDBA@;." 0EX[`acfnsttrrqpmkkloysaM4 =qdz|cM,!$'& /8?IPH?EIOW_egnpx{xrkjhkt~yl_XTXafdb```a``_`bkmrw~~}yutrndWLGBAKYcb^WZ^_\ULGGPZ_]\_c_]ZVTQMIDA?<=;:8:9;::777663-)# '27AKQNNSZYSS\hir|~}ļ|qf^LR\fov|vk]SKHA<700-../11.-4I\osxxvzz{~yttssrvmnxuȰehzİvjr}п~~ysmkpuysbF.+/@VZlv}~{{zzyϵs]UH=2,)&&+2d~||siaZWT^bkrwz}}~~~ʮgYN>:@Phy}}~}|xtttspmjhfda`_]ZUVYdy¾uw|zcP?958:=FNTZafkklhc_`acfjkpmkiihebilr{~|xpJ1*5>L^q~qcYT@AEGB;65=?A@?;96;G\xƻ{W;%7MnucM=9>[qr[B." #  %&"$( ""!%(()**+*))).9EXcmnhc\WYSJDABBA9*$7HRTX\_bfhoonnmigehkseN6& #M~yxw~^D +$**?HNTUG:>BHPX^ahjsvz}zkiehpy|oeZTV^cb^]^]][ZYZ]gktz~}|}zyxwrmf^VPRZ^[TTV[_^VI>DMV[YY]`\XURPLGD?<<:;;;:99:87445741,)#)/9EKMRY_[TV`lnv|ź{wmb[QQRQQTY]ddfgbZQKE>8110002/+,3?Rdx|~zsry~zzxsu}|xxvokkmppnw}ki|z˷smogh~ȴhpu|wxww~tbA&*>GXlquvqmjjlٻwW>/+(%" "!%09XvÖ_3 =;864=QlÿmH)/Mt|mbVOU_u{bVMIA.#  !!')" #%(',0110141-*-9HTfmqme`ZWXQFB?@?>3$+;INOTV[\_`ihhigebcjr{rU>& + .Yxupoo}{^<&16PXZ\WE58>CKPW\bepsw{lifgmw|{rf[TT\b`[Y^\[WVUWZeirx}zwsqssvurnnnonnppqmg`]]\XTSW]_\RF>EKSWWWZ\WTOLIE@=:8768887666430//20-(%)4@HORV^_XQU^hkqv}ǹ~|wrkb]]XQG?;;8120/-8/),8GVcwzvokjqrspsz~xwvpnokkjknjlzykcp~sdlxtfyħfbw¼ǽyaXXh}zvsx{n\9-5GX^flkgbaszXB1 )@\tĢqB&*Fi~|umaYRW[chpw~~­xd`]_jw{|}{yz|~~||zxvrttvwvspmigedgc_[XUQLOZp½lO@ACDFFNTUPHB?>84345;AFKTZ`cgf^[\^cfiklkjjifa][`hq}g7(;Th}sk`ZRMLJG;553:BHHB;859Ib|fJ'#+Lrrf`ZZj{~yaNIKTVJB:,&$"""%(  '),*+,--/165106FYdkpph^ZWVRLC@>=84*(6AJGILMQSXZ]__`_]__hs~}q[@,! 7^|zrlhuy|wxxY5(5CJ[ba_VB25:>CJPU[bjmryrokjouy}wndZRRX`_ZWZXVRQQTXbelotrpnijnqrojfcfiebadhomib[VTSS[a]PEAAILNRTUUUROKHE@;89631211/22210-**)*)$*5@EJNTXUKHMUZfhq~ɺú|z{}vplfb^^[UJ?61/28DR[]XRG?8241.+4,&+:K]kwx||uokfjlonrz{rppkffhrtpmkly|kd_lweT[giikasjEAPpzy{zwpknpcQ3*0BHOZdgc^]džd;&'+& +:Sz̳]@5AYu{sg[VNQX^gpy}~stw}}{{{zwwy~~}|{{wtqmmpttusokgeddke_ZTOKHL]uĿjG$ %)022357:311025<HJCDEDFIOTSUVWWY[`coxr_G-"  :[{zmeiq||tP. %8DU^^fd_W?047;?ELQ[`einu{|{zzvpnprsu~}tkbWOOX``\YTRPNLOSW`aegihhgjmsy{xrkdhjd[VY]jii^UKKKR]cXD7;DLLLPSSQONKGD@<75751./-,*2220/+()#&(# $07:=AKLH>DJOSV\\_cfhkllmnnlhdb`bfmv_HTu~uka[SOGB;60+-6CMRNIC=8;FXq{[D&,G]dc_M94Jcjo|tiYG4-/07H\aZPC6(!#',#!2662   "%+*,''('&+266:EOYjxqke`[VQNMJIGD;3. "2@GGB@@ABDFINRRTSTW[cmsiQ4  (A[u}vuzwk\ekqwfK& ?Z_flec[WR?1549?ELQ[`dhnruuvz~}yunjijpz}wpid\QNV__[YUQONLNRU`bddddefnsz|vsmijbX\gke]QKHLNUXXQHA??DFFEHMNJGGFC@;764530/////1200-*('%" *24:CJNOPMJQapſ||{shYRRV_baYPHA>CJV^ed]SH@84440/-& 0H`mutsprxxnfjqqx~xzzww|tidr}seanzwi\VVbomwyft{¾pfNUinjnvmiecgimmbVKIJC:94/.5@HQV`de`ZV^hÞqO7 7QxӽzvmaWSQPS\elnvyǻ{xxutsxustvy|~||yzxytqigcefjjmjigd`VLHHD?@LYjx}zttwwssX2 "%')**0/+()+/1249>EJNQY[^bfikllmmmkifdabfks|p`lypha[UMD<4/*.3?GJJLLE=9;G\x~xaA%#4SUP90Obm{whYPE7-($&1CU`^ZM@2("'/( :UbR   #'*),(()'&*/46BQZ`ksoic^ZVPMMLJFB:1( &5?FF@@>>=>?BIKMNOQW\ahk`I. ,BYn|rinsj[Ybkntr`I3Jfpvzgd]\YD2246>@DECCFFCGFC@<8444421/./013321.**'$#06;ALR]_bdem~ƿ}|}|sbTJGHbee`ZUSPQW`eecYNGA72210.+' '=;::;95/----)' !1HWjpvx|xz}|yx{vpqxopzzj^WXcxyvthZfzujgjwNhqb\KADDC<;BMSSO<1'(/7CM`jw|znh^RP\kxÜqK,!%$##&%#&$ "5V|ӻ{tkcZUQPV\ceprx|ø}}{zztnkotvwy|zyvusrpmhcaadec_ZUSV]n̿sjhquqoT3 !#"##&%%%&&$%$&(+,159=DHJNQU[`ehijjihhjkliiiiijkkooppqsuvsjozvrj^QE;2.2489;BNWOF901@`{~{}}`>   0IJRX^cikeR;#"(!(5DNWZ][WSPF90,' #&(V²z=$&*)*((&''#$,3@Ufmmkifa]ZVRMHGDB?8+&-6:=;=;:77757ADKQ\bffb[OBA;1,*)*+,'"1DQahqw}~~}|}{z|zrjb`W^vsju~pajdKUh`UU_tTlraF4.&% %2<@?8308BN]l|xpbSRbr}ĿŖd=&"%&"!%&%$$# !!0MsĹzqj]WQQV]egosx|ǿ|zyrpnotvwy}zxwtplkklkg`^__^ZYWTU]pmclu~{rov}weI*"#"#"$""#!#%&&''(*/2681$ +16797;9875566:;=AFNYbfaU@-  "1@LWhv{nXOOJ<;93+.>Tbm`colmuxzN*#-16;@GMRW[`dfhkmwxxwrmfffkpw}}yurnjg^YUX[_aZRKGEEEB@AFOVZ]_acgmpnnoprsnhhldUMLXuR)+<@=>?GLGB@?=;;84402232/...-..01.,(&&#!,6BFLRYcoy½yqeXLB;98@AA=<=DSl}yts}xbA$4ADD@GSc~a4 !'.6,%#'. Nu˞`& +"#%'))(&#!"!*5HR^bcdda\ZWVUOJEA<81* $.354558665656679>CHP[df`P:' '0;EQbpuyxq_OD?9:/%%6PjzxwyM)#-.38=CIMUX\_adgimoqpnjffeils}~zvtqola\XTY`d^QKHHHE?:38?FLRX\]_a`]_eijnole_UKOVf~tM*(4:;=DJKD>;8487753322331.--.--//.-(&%!!$/;BHKPV]gqy{smcZUONNJNSUUWX]kmjaYPC871)"!',2),;DFJXhv~y~k^]dnkjoreba_QKRP?FSMHGUuȲZhk[O@9/& &4CKYasl[\my{pF+!!"!$()'(')272)$%&%#!0BWbhmppȺzre]VRU]fjoptx}}}ƿztnjmoqpnlptz||yxssoqiebfed_YXVUVXZZFMf~{wgS@3(#!#'(%'''&%$#"!$%''$!! #',5>DFABFLRVZ[]^`cfilnnoomjea^][XWWTOKJHQgz}{ul[I?6346;=;989AM[i{zqq~~ytgL3$ ,8;9;BSjk9#,/:EOQOMGIKNLDDJH@71*!"+ 6f}G  !"#$%&'%"!""!0>R[ba`aa^YXVVSPKE?94-''1431445322468769@EJS]faXG1   ,17?L]gkijj_K85:7( .OqqM-&*+049>DIORWZ]aefeghiifegdcdjv~}zwtrqla^YRU]d_PJIJJE<4%(+/5=FLRTSRQTZaacedYLGJZcnpme`^\H4038=89887542332/.-+,../0.,'$$#%%*3=HNQTX]bjryƽzvojb^`deiouyxurnqrqj_SJ>32-%&-2)!'2:=L^qynjnvymlony~ozxhagsrsn{aUW[OMJFFMRRNJSs弚Xg|wiaTF<>IZelz{jZ]ozzݹfJ0%$! !""!"&%,.2:IQJ?++)&" +  '1?LS_efuȳ}tiaWTU[dimorw|~}zzʾ~yvplkloqokgltyyzvupplngebea^XYYWTQPNO9EeƽžiJ2#!%*'$"%+/+%**))(&%$#$# !(09AD??DIOTWXZ\_bfilmlmnnlieba_\[ZVOIA>I`v~sbMA53/4:=9505CXk||}ww}ujfaQ?..387349Nhh7"+027AKNMKIFEB><@LID<70'#" ! Dp{ҫc"#$!!""$&'&#"##$4EW`fa^_^ZVUVTSPIE<82*%)3540353111358769@GMU_fZRB, "156;GW_b[\`ZD++94%!:fxslN1*')-26;AEJMRW[_deaaceecce`_^bny}|{{xtqnnjc^WNQ\c`QIIJKE:0")3:DGHHGKSXUUWWI;=J\gmaK;>DaXLB<<==:<<88;;6:9:8742220.---,,/01/+)%$%',3>GPUYZ^cinw{Ĺ|uqmidchqv{|utqpg[OF;2/*#(.1+$!'05Mav{gZPNWcn||fXTVRYiykhvtkmtywkz\LOYOOF@KQRXSLRr͘ox|K_ywllr{|rg^_fp}sC2&&+,%!&!&!$#**@`y|bG4%$&"!"" +"/`¿~U6# ,*12)*+$'(()'%" "+6?B8;@CEIOUVW[beehnklmnmkhfeb][XTMH<9>;=5*+.6J`zQ*)488EJHLXZJOo{x~߸zJfvvmcboDVozqka[Xamv~ypsw{zdO6*"#(&# !)#,4Y]B)%--(%'&#'5CNSRMHQdsɶwmdZUUZ]_`elsuyz{y|~ywv{|y|~ytmefiknosw}{wtqmif``_\YWVX\_XOHCCCD]½~bM:,$#!*+$&*#"#$"  + '2:<68=?@DJPRTZ`aagoppomkhfdb_[XVSNI;31>WqycS=3,/8>@AGO^o}{wuv}ussg`\L?>6=6)/;L^|mL,!"%-569@FJG@9>CIH@823>>:83201-(" (Da}ȧvL4) ##!$%! "(2?MWb`]]\[WUSTSQOKD@:93,$ %*+,,,+,-.135658=CIU_ddYL5%"1:;9ABCJONK>*%'#/T{xeddhq~vkj^F/%&(+059<>FIMQUZ_a]\_``__`Y\]^`fnwytrqrnigdc_ZWQHIS_aQIGHIC7-# !$&(+.1-+%"=[orS40&.Ps`ZRI90-.,+310//+++)**++*,.0240-('((1;HT^gjrsx}Ž~{xyrjec`]]dnu{|xomkcWLD;0(% &+,-"'09AKU]]UOPSNKHMUVZ[Y`mv|xul]Zbjf^W]n~tpou~||uxk^bx}mWEDKJ=:BHGKUZJOoxz֩oCbyvbSNUdv7E^wuh_YUT[hw|~uc^VPTSH<6.)*+'%"&24;=/.=;6-'  !"#&'(&%'*.13669=DIT_dfUF0" 1;=9:54AQVJ3&*-%8Zmi]VOQS^lx~vf^bV7#%).37;<81*)*DYcjbJLV\]QMGLX^o˫piaXRQSSTY_hmruy~xvx{~~vssvwxzz|~|{vvpmgfb`\][\[_ULNWh»~T0!  +!$-/2346?CQalru\QQ[O,!#&*05:=CFKNQTWZ\\__^]Z\UZ_]\]fs}wsrrnkifb`^XNFEQ_bNHFFF@6.)#   + +.Nd^S<.*$;ewe^P@0/(%&)%!*+*(((+.0230.,+-9CO[chkms|˿}zyqh`WQHBACGJMRXZWTRQQL@7.%%/45.&  $/>=CN`kijhX@:Iguwwsuvbd`Rj}ric`VJFK?::CKKKNWGPrpdmܯrBVWWPOZquy%'=c~uh]UTUekv|zv{r[RLLQURQOLKJD;557ImgSRlwaOKMIHG<@<,#$&!,3=81,-04>98<;3( *.;Rp©iJ/  !!-=P]dd\YWVUUQOHEDEEB?>CA;2)" #$*...137?GKTZ\YG6" #2<<7**JolIBD:.+-9G@*$.426BLRX^C;?J@)!,+)*-169AEIMORTW\\]]\[ZZV\`_]^co{~yutqomjgcbYNDCMY_PLIGE?711+# =U_WG7/+,JrucRL<*"! &'&''(+./020.,/2?IU`hkopw~̿~zypd]NH>4.+*-37=>>:88:6-% )277/($#4ION<$$2:Pl|uaQ0 '5732;UaTD8+?lvhsxlgp~}e^VJcxi\ZccZOM@=?HQUWZ_OXw{gaqm5:52@HOVZZX]\X]^Yc̼zm_SMKJMQV]diquy{~|yxz|wuwxʿ~wrkggfd_aVLSpɹznho~ÿþqL +  + +&*,.36?BHNOTaoqmhb`acekie^YVWVQHCERdt}~kS?9@WjzyxtfXF@A:=Qdyyidgiowpko|{jTHB@=@EILRSVURMIGLLJC;669EEA<6213:68@EB;61:Ld|}nS6   " %,BGKMORV[[]]\ZYYZ_dd`^^dlxxwuqolkd`ZOCCLWYUOKFB=7362+%   )N\YUE4-)7^uV3""#%%%&'((--1///35CL[fpuz|}{vuk^UJC8-#!$&&&# !  !.687.(%!39;4%$((4DJA. 2JO?3"35' (Lynbjxwkc_gsrWHHasfXVauygUOC@ENZckllY`x|o`hxv< -Nvzxa`h}ſ+$0Y|ue^YX\cilsqqtwx~qdXPLRURORVTTXZXVUXr|c_ttdYU\xvQEDAIJOTZ^_aefdhg^c~˾udTKJKKLSY_dlptuxwuux{vqqv}öxrmf][UMTwxdWM`{}W   +  + &)+/2;;?FKR^kokfa^_abiifa[XYZOLJJP]mxwdUOUi|{wrj[OC?=4:RfuypicdkqhfmyvbIBCFFKMOQUW[ZUOJHJKIC:425BEHHGD@A:89<==CIHVj~y}|xubE* $%#)5IZefc`[VVVVTRNJEEDDFEEB>91% + %'(''-9AJPRTKD7+  -8CIG3 6ggZD,+((,15656+)+0+!!*#&%%0COTI<0)),09=CHKMOS[[]]ZYXY[_cfea\_fs|yxvtpmib\RGFOY[ZSLE?;7552-)&" 9]`RL?1($GORRPP>=;4.0?Ol}uwrsz|yuvnP2 "#"*9N`ec_ZYVUTVTRNGCBACCCE@?90% &*+*-3;FOSUQG>3(  +18DQRA-EypbI18/./28<4++.36.! )%1944@QZYO@1*+047:87/-+)(&"!  +AdbM?5/%">iY:001,110/*&%'(+,-/48CMYgqz~}ij~zxvofYOG@81)  !+5:94' +  +Qyz_;& .Pw}qfkoqkdb]WYWYl¸bLLZn~k[`XVSU^lswn]apned`ky͛\.!'Br~o\OVjz/,<`{{xz}~tmbTHDHVgrspnigny{ulfWSOPUY\[[Z^cdceih{qebo|b[YPcjRINPT[`cfklopu}~psp`TROMLPU[`ehmmnnmmpssruw}~Ƶp_NLHhxi]OD=9Try½e(    &,048GQZbeQMHDHS`lue`ejrxyvrpgU9  !&# %3?O\_\\[XVSRRPNJHFCCEDCD?:2+ + + + %,/49@HOTWVMB:+! +*:KX\THZh[NC?;9:<9312574,%#&9BGFLYbabTE7/+-3;=?BEHOQRTWVUSTW\_agie^^flq{~zxuqjbZSMLRY^fjbZQHA:410/,)%" -LfcQC2'',8Z|qP@<<=CC?931201255421;ER_ju}{wx~·~}{xsh]UMD@=82,'&  !'09@@@5&     3`nJ)  ,Rtuumqqnga_cb^_hswUO\iz||{tmfc`]^acfhkefaZX^efo{ģsD%&@fr^LIP[q/.Bg{zx{xjc^VICBKWgonkighoz}wqid]YVX^bc`_]^bc``fkj[aqt[USJ^iMBKPU\behmlkovuyϿ|k]WRONRUZaehjllkjloprptw}~ɯr]SH`xi[OA6-1Nmwwm+  + %.4;BEP]joljgca_a`b^^^aa`_YTMLLOZdsyyw{}uple^VH@?8>MRehome`]]^ab\UKFCFJRVZZ[Z]\[Z[[[[WOA6/.1446BDINPONSRSTUW\^bfif__bhkr|yttrne[RMGHR]ejkb[SKD=84-+)&# 3Qc^PB3(*+5Tr`JA?HLOJG@@>>>CR]hjhfcehozztnlmlgb`\Y[afecebad`\[`n]K\vs[TPG[kF7DOT\bhjmnlrzv}ľzj^RPMPTX_ccefhghhkmklrw~~}|{ӸoYDTwuoreWJ?2')Hh{}qtq/$$  +&,4;=FVgpgd_ZZZ`bca^^bbcb[SNMJLVapw{snkd\VIA=>Sgfnlnlgc`^\\YQKDCDJPX]a``_^]\[[[\]UL@4./4868<@EP]hqrs|}uj\QPTYgntrlfinsfS?1+.059>91.37BJV]^ZVTTPMLLJGEBAAA@?>=71(! ".6>DMSTSQKD=7+!  -CVekhdqymcYSMEB@=638541+&).iu{wuz}xjYH90),258=@CHNQMLQPQRSUZ]bgjhcdcffiq}zursokcWNIDHWhnpnc]WPIA;6,+(%" :V_XN?5-/-2Mg}rSCAOSWTSOPNNLLHHDDCFLU\`elq|ywz|{wndYOJFDDE@<51(%"!%)0:ELOQND6,(# +  ,PsvR7 + .Yttz|~~n`X^r~zm`Q?:FXinifeb____^[UPR\gjwzͻqU;& Ee}fM>;>L`~&N|}xqopsvvv{yrg[RRRPHC?=9>HZfhe`_`ekqyyunb\X^figee`\^ejkhjgdd^XUYjM8X|{cYOCZm@-=JQ[cjmpolsz}v»zhWSMPRX\]`bbdceeiheemt{}|{zϤ~^BNtvrg]OC9,!!Aaw}qr~~qtym3!**##" + )/27AR]bb^ZWUZ`dfdaaddd`ZUPMLLT\kt~~zrmjbZSJB;Fj}wsomjhd`\YULGCFINT[aba`_[[\][[YWOG;1-08;<=>;;CP]lnprusnkXOC=;:81( +#0;DMSWVQKF@:6.%  -BVgiljt}tld^VLEA>:54111/.3:u}ygXF5,$',26;@DHMPLMOQPPSVZ\chlkikgfbagr{smjheaZPJD?G\qxtna]XRME=:230+'#  @YZPL<512.2G[t|VC?LORTUUTUSROLIGFHIMTZ`ens|wv{{umbWQJGHIIF@95.+(#!$)-4>GMQTTMA;73*%  6YvlWC) *Wxlmvnjlndciuuj\PJNX^`jeb_ZWVUXUNIN\hmv~x{~yz|{smp~ܻ`N9* 'PolM8./7Jaq!Svqmhda```cfeaVKDDFHC=7:9BM`jhaZY^fmqutj^PJJUbfghgdbchnrroigd\SOQc|@(Uk]M=V~~g7"4DLYdkorqlty|}xxbWRRSUXYY]^bbbbfd^_gpxyyxx䷎jGQw|zg\PE9*4Smyqn}zvu|vcLCPaxm8$+*"#! + + ,.2:JZ^][YYY[`dgjheddba^[TQOMLR[js}~~yrlhaYNH@>NyzsplheaZXTLHFKORX]cb``]X[^_\XPLF@9203:>@?>95===:654-$ +$2@JQVYUNHB>;80(  -@Ucciltyrmi`TKID@<4026:;:61-'#! BYUJI:400.0@Oi|WD?DEILPRRRMKHECBCEIPTZajt}wtyù|tlaWRNKJLLIC<863,'" "%(.27>CHKNOKCBAA;7.+#  + +.D`zl[N9%'S{pfj~eQKJSbqxvmgca][]_bhd`YTOMKOLGEM\gjsz{vprtuojjkjb]`r׶`C'"(XusQ6&!&2FTb|&^~jfb[XSPOLNPQPJEABCE@7.25COakh`YXZdmornbSF@ER``ceccgfijprrlhbYMIHa|7Ul^K9Qy~~{w`3!2DMYgnqsrjquy~˾t_WWTUUUUZZ^^_`b`Z[biquvvwƠZ^}|xg`XNC3#-DZgb`ourmjq|fG*'?[uv?%'$  + '(,8M_b^\^ejnnonmjgfeb^[ZURRPNRZeo{yqjf^UIC?BTz}unhda]VVVQOMQUY[`b`__\ZZ]^XPFB;86347<>=::89ALUWTO<+ &')3DTbijhhnttqjid_^_^ZWSWZYVQPSSSTRTPMJMJHHGEB@<;<;:731,&  + (5AIQUWSKEB??=4+ *>S\[dmw|wuqh]VQNJE85:CJPU[nutmnsun]OA7-''+/48=AEHIGIMNNORSV\dhkkmqmmd^Z`ks}upf\TOHDC@>=47Jg}sf^YUSOMGEA@;83-)$% ,I[VJD93+*)-7A\pZGB??AEIKJIA>;99;=AMQVY_ht|wrv̾~{rj`YSPNOPOLE?:960+'##! ""#%),36:=>ACFJGBBGIIIC>6*  + +$)I[hlmktqleb`dhb]YRLGDBBA?@KXacmssojhif^YWYWPLPeҰW0  (-_wcH5)$*4:Ea6lyfc^VRNLKDEHIIIJLMJH?2',3AK\fe^YXVbkjmmbRE@GT]Y[`_grsojmoqmf`VIDCf}7Wzi_M:Pu~z|xoZ6(8HP]joqqogmpvֿh^\XWUTRVWYZ\\^\YX\emoqru}˯zv{rda``YM<3,8AHKEKajhdeo~jI).OnF&" + + + + +  $2I`jkrx{rliffdb]ZYTRSQORZ`jy~zqid[SC<>FUr{tka\VUUY][[XYZ`bcba__]YWVSLD;700348:51/*(%#$',.42753248=ANQPORYbhowulnxø|ypg^WSQTTSQNG@>961+($%"!"!!!$*.47:;::=AHD@@FLPTTRJ?5,&! &+04=BKUewyc`UE8.)&Ab}{}zzylHA6-9Vcc`bn~uV9BiJ'  +   "0Gbsztjgedec_[WRSRPNQY]fu~|yogaXOA9>GRj~ywpf\RONW]dgfbaaffeda^`_VROG@71-(,26:>?=5004=BIMUQKD;/'!+.4:BLW\hlvxwrnjZTPQSTPNCIRUSNLKLLIHJLJJHFCCCA>;987772,*!  "*7AGMPPMGAAADE<3% &3GKHZo}~|}xrhcb][SIGP`jmopQOHBIYa[LA:2.&(**.49;=AAADFIIJMOQX_cedgkljcXQPV[fli]SOC553211/.*-6Oopb^XVRRQQOJIHE@<;7863237<@@AHWb^OA@1! #%AYv{{~]D=B><<=;730.--06:6249?EMUY]aj|{ecZME@>:Nk|wsrq{qTF:;H\kxsd\YYWUKHE?9521.148EPTQX_`YTQLH?8432/.4Nm翊Y6#2Vk}x|tdQJI@=Ncq{9Xxrh\UUWWPLMRVTZa`TE4% (0?<339=?@BFKMLDA>7.259;?HTZkqwtrssmbYSQTWVUKOSOHCEJIJIHEFGHFEDCB?:5555551,) + #)19?BDGFIIIIGC@@7( $/3>CMk}wwwwod_`^]VLSY]frpdH=44>HLI953-+'))'),159<==@FHJIJLQW^aca_adec]SNKKNSUQC6,(%).32/)#&7Urufc_[WUTTUMMKJHFFDDFHHFFFGCKOOW^UEBF4"0Lmz~~{sv\B9:=>=82-+,-.0368LWgwm]]ixĿ~~xlaZVPPSVWTRMGEC74/*&" "$%%%'+.9;>><=AEHFB=@JST_^]WRPQQQMQY^`gndfm{|haXSTUUQhzyvywqjw~}re@.%-D\q|~rieXJEIEB<630-.,/3=FHHJMVULDC>91($$%$(2IgКd<  +(L]rupnpovv|sogh_[bp{GbqbZWVVWSSZ^[[\WK=/ &7CO]__\\XZ]`floeZOLMRRNT`zvurnf[NKN~SCm{~skcaiw~upgZY_dgkpstoi\[\dֿsjjg[SQRORWXW^aXUZ_cfjllptxſwlhjowsrw|wiYJEILG@>HZbbVeqogoD,!" + +  + $4Ng|ƶqplhda_]ZVTVTTSSU[^hs}{zule_UK:7>KY_dhnje\ROORZ]cdeehmjhfa[UOI;1*)& ##+5>@?=9138:;>@BFNSNF@82369@ADBEHJLLIGA9,  )/8;Hjxqpqpia\\][TVYYVYbbY:404:=:31-+)(''&%)-268:9:=CGIHJLQU\```__fhe]SH@@EIMI@:?KUU\ZWSRU\a_^dmokilgmvpi_ZZ___pyrorrnis}yodI7*1CZkwzqiaUECF?=:8533255:>BCBBJNLA62.'! $"&0FgກI(  + ;Nejd`bbgjpv}|}Xlzkb]WUWVZbgc^[VB4+#;HS^^\YYVY]`dlqjaTPNNHEP`þ||wuqh]]`^Uv{|tmhjv|phhjllnquxxtmg][]b~Мrokc[WUQSVWV^d[W\^cfghiknqwo_YYmxymZPE;-*3DLK@V`Y`D1)( +  +  + + + )Qe˲{rroke`Z\\UUWWVUSSXZdnx|}{tlf`UH;=GUbfghje`WQQSW]^a`bdhkgb\VOF=7&!!&-4<>>:51289::<>COYUKB<659>ADHOT_gkjggidf^WTUVWVPLIC@@DGLMKHFDCCC@A?A=;624443,&# + + + !%(.048;>?BDFJLONLG@:/ $+11Bnyqljhf`ZVTUURWXTKIPTP;50/1/+$)#"!$&%%"'.144678:@CEGIKPTZ]]]]`ehhcWI;4798/$+461)$$5Tqzmmgb]\^dgeb\YWWZ[__`bc`YSNKLPPKILZ]M=3 + Al}|vvwxw{zy~oS>5..0)#"#'(/02.,+$%$&(/8?BIS[ep{|bSU]iz¶~{|}{xqaROPRRSYWTNKFB?62/*&" $&()*-158;>?>AFKPI>9@NXW[XTQRZejihmtuojiiowvnc^_dfgwwpjglookozxrjaR?27EWfmokdXI<??<9@A<0&!#&+2Ggԧl6  $1DZ^XSRSX\enu|Ľgo}{tmf^[U[emoid`[>,)!!:JS\[YXXUWZ_ckple\YTMA>@BFKLJGECBAA@A?A=<833342,$ %*-117:>@DHORQQPNIC?90  $')(?r}slgc_^ZRONKJJKNMD@FNOK>.##$!#%'# $*--03657<@CDIJMQVXYZ\^_ae`XLA83/) '/42,&!&4Kew}xrrokhfgghif`^]`cemiec`WI>55ARVMMY\^TKA)@FKRLB>FSXUXTRMPU`fjjknppnnhhluxqlecdggh|pjddilnmmswurnh_SB8;IS^a``ZJ;455899:=<:;@AA?A@>956/& &+3;Lh׿S( +8IOQNJEJOXaiosutyvrw}wlca\htvrifcY8$&%'8GPYZXWWUUX]`fnnihaZO>5AUy{wz~jcu{y~xpjlv~xyulp||}ukc`hs}̪righiYTQRRSZc^\acffca_``cgnux}widgn}}uaI:6887.;OeaA)"! !1OnŪ~zqnle[VY\[ZZYVSONQPXerz}|qf_YL=9KeypdXTRUW[^a_abYOB6*'# %,095112320559:99=>EJKKLKC9;?EGGHKMW`ffefhd^[WUY\_a[SH@@ACEJKJIGECBCAA?A>=954442)"  "(-/027<=BGNLGEKTVPSPQNPR[`ijlpstpl_WV_lrkcZ[^chkki{{jeaafknnqoklruocRC;?JOTSRUO=236599;=?=>80-.12266999:=<96431.&""&*.2139>CINQTRNKJIFB:2'   )#'7Xzpkea[WSOJD?<;=GNRROKFBHB:0'#$$#&&#%)**&).4/059?CHKMMOPPSWZ`^]ZWPHB0(#,.1.*&')*+1?FHHFHLE42:@:==>>??AA?DGBGNOG;4-+'"!*,+')1=FVi̠H6.1+'(#  ,:DE=>ADGKNQS]er|td^eorogb\UKB6,+,,4?IR]]ZYXUQTXY^fliojf`RGLZpx{zyyxoorw|}upns|zzwsmebZhwǬvic^]VTTSQU\]^elnld_YVW[adggikqy}~~|{xv}yu}~~vkefkrw{Y=.10)&8Qi~wu}¦{pkhca^[XTRRQQPPQPJLWfs}~ylb]YK;5MmzndZUURTW_a`fgXE* %"),('.58<5,*.23235879:;61.)&" !## !Adx||~xvaLG>*'=]uxpnqmeace`ZWVSLA71/,%! "%(('$!%%%"+4=Lbvqa^Y]gu{~tmmsx{ypomjfbZVQLMT[\\_TOFABEEA:8631/,-034558??<:;>A;-1AH@@???ABEGFLNGIRRKD<563,)*/33.-4?EVhΦQHN]bdgcL;'   '29:=<;8:;@BMWfrz}n\\h|xoggg]QB?:6.-7ALWab]\ZVRTWW[chikihf\RU_e{|}wotz~{vidq|yvsojd`bo{Ӿsd[^YYXTRW[^ahnpmd_YWY[`cbdeglqx{}|~~}{yxxvtqtvvwv}~yqsztW<.1.)#"&''# &7Oi~Թ{lgca_\YTIGGHIJLMNIFQamx~}}vi`]WK;*@]p{}uri_WVVVUW]`_ei\H1&&02%+35/.5;=82,+0342234667:=;CA=;;:8664.+(# "%)-267;?ACBBBA=:89>??4(  #%"%-V|wogb_ZSLLJFC?==CLMNPK=," *.,%  "%$"""".6?<4,++*+048=CGKLKKLNQTXXZ\\VLD94+$"%((/13/)$%'*%!!&++*2/-,((%#&CbyjNKH4#$6SikeflUOOW]YSMHGC:1+(%"!)+*% )'"$06=G\mslddflv}yst{~|yvypihmqspmkkie^WPJHMV[]\`RJC>ADEC;:75210/347688>?=<>;;74529;428ADRiϭǽjD# )/650+').1=HZhqv|~衝sddmzuskf`P=;4+(.69JS^a_^][SSSU[_afgknmhda_dxs}z}wlvxkdq{uqmia_dq϶}h[\]]VTXYR\^horlf_ZWX[_bbbcgilrv|}}|}}{z}{zyvtrpspnknw{ypPA301-(#)**%!#)07Vy׶|nib\[ZSE<958;>BAJJLQ[iw|z{~|xodaa\M<06BR]cda^ZWVUWYZVZ`YP[`V@<:4-+/2321113578:=@CHKJFDCCADJNOMLOU\bgklkge`^_difhi_SIFJIJLID>;9BB@;7569530'!!$%#"#"'.57=BDFB=63132349<>1) &627,$3gtmhc^XRNNJFB?>=ADLKCA=-"'$! !(($! /7AD<2//)*/016=;9755:9;;=<=;=;;89;AEMPVZWOMPPQRPNNSVWZ_cgjnnfZG969?@DFP_ikmov}{|w^MC;663?=.5HOAEDCDDEIJMRPHHNSQICA@A=<=<=:58AGHSgƨkG(2+##+..+'&()8?MVbkv{Ү}zyqms}tnk`]WJ8*+7HR_``\\XURSTY\^ailonnkgb^r~qsxz}~{qhtvow~ztqmjedhuĤo`__^XWZYSZ`gnpkfa\YXZ]^^]`cginryz|zyz{wvqvvvwwuqoomigoxɼ}yjKB731.04552'#3AZuֹsoh\XUMC<6/-048:CGKQZes~~|{~zrleaa\NB48>DHHJIJKPRWY\[UVUONPOLKE@DIJC60.03420024658:?ABDIHFFEDCDIMOMIMS[bgllllhdbbdgfghaYOKJGHHHD?<:AA>9534621-#!')'%%$(.6::>A=93+),.146553/' EXMF4''+Js~rkf`\VPLLKGDB@@CENLEEF:'$'%#!"'(&#).794+-.*+/22483251,($$%&%!$+,% !"$&%$ "*08;@ENUcsnf^`dfdc\VRSNIEIOPRUX\^_a`a`[UNIEJPRY_]YVPHECABDA@?==<:8:;<=====<<;:9931:D@?7*#+DYw~ܿ|ypbXQLFA8.((*.1FRMJOV[VQFJKEADGFB94247764465769;@ABBHGGHHDBCHLMLGJPX^chhlmkgfddeeddb_WOHBCCEB?=:?><71.010,%")++))''.364651-'$$).4671+%,$(e{jT7+(Aixokf`]XSPRONJGEEGKPOILNE5 $+)'$$%()&$%#$*)+021025;?ADGHJKQPQRVTROD?8559::851+'',1871+$$%'*&$$'***'$ !"'&$#Ppontr`QV``UHDGKE>8751.-+(&%##$$('(*+' &+,++&')')))*/5;=>BHNUcxvh\[bcb^ZURL?3,*27@HMRTVZYYXTOGDCLW\^a`^]VPLGA?@BAA@>=<;==>????>===<<>BEPW`bXMKQQQQONORU[\^birx~zulc^^ehlinppfdax~iXOIFDAFD>9:<:>?CFKMOOOQMBAJOLEAACGFFHJJD>>CFJXgҹs]E0#!$$&(+16@KZaefjloqv}Ъzqpt|vlicXWYUI*'9IS`a_YWQUSTSUUX[ihkrz{vodfutaiyxn{yzm__u~pv~}zupmjhhkwŠlc]YWUVTQY\ckmmjga^YVUTSU]]^`bdgillmoojgbehlnmhdb\`frŷxrx{utvn`GBA=:8?I@>814F`wȩ{j]RPNI@9.*(()3AGKNNLJDJ?CXI8MRTX_hpnj[ZXQOMLHD>:8:;;9557689:@DFGILLLOQRQND@:77:;:961+((/3873/+)*++)''+//0)&!$'('(& W~ymq_?,%$)-.+)-/.'%%%###")*+)' $,221/./001000038:=@EIKWmp`]_^ZXVWWO>, #.9@FKOSPROKGEBCQ`efegef`ZTKA;;CBBAA??>>??@@@??=>?>>@CEQZdfYLJPQPNMLNPRUXahosrsuwxvsuz|xzxukih{~o]UQOKJHHE;0/39;AGLQRRPQJ>>HNKFACEHHIKMKG@?CIPcvhB !$//104>KSOQUX]_fkywstvaZ]^X[b_P+':LVba^XVPTSTSSRUZdcgmwywshal}ehwvkykl|n`[b}tfiw~|xrligim{Ϭwg^WVVVUSY^ahlmlkeb]YUSRT\\\]^`cdgehjlgeaadihe`^]WaoƱlghs~zrrtl]JCB@A=<=545?Of|ԵraSPQPKF<4-)'.8DMR]my}{~}yvrnf[NDGQlv~wcOA==>=;6688::;=AA@BFGIIJHCBFIKJEGLRW^cdjkonkgedea`eieWJ@>;:;<;9<:620,(('! (---(" #'()+)((),,12562,$  #Se]@1f~smkfc_\XUXWWURPMMIKLLLD5&(,%" &#"%+) "$*240/+*/29?BEHLKMMPTURRJC=97::9961,()/34410..//*(&'*.00'$  #)+)'%"Wtp}vQ5#)/,)+*'+)((%$"#%%(%%"#!&(0361/+1220/+)'&)-36;@CDNb}md]UKDMSVPA/"*/8BGJHKHEDFEIWfkllmknjc[O@65AAA@A?@@@@AAAA@?>?ABABDFPZfh\MJPPNKJKLNNRW`gnrrsz}yprtu`ZXUOMIIE:,*-49?GLQRRMMF<=GLGGCCGKJKNPJE@>BJUrҼ~T5  '320+*.7<>FECBBBDD>EADOIOpԳw^NFIDC@?<<:6678:sspnhea_[XZYYYWTQOKKMMJ?-+2-!$"$)& !'/40++(+.59@CILNPSVY[XUPHA;9:<;962-++0430.-00.-)'()+--,$"!#(--(%%#PxwnroN0".200-)0-+*&$"#!%*.18763.("((&#!!)/4:;8BVrsbO>6CKMLB3!#)5<>@BAACILQ]inoqqpvrleWE:7BBBBBBBACCDDCCBA@CFGFFHIQZfj`SNRQNJIJLMMVWY_gow}~~ytrpmkqyvaYYSMIHEB:0./46=;4.,/9Kby|yʵwk[LGFMOPLD<5649@FOZfo}|yxvywvskgd`TEHTostk]LEB??@?@?AA@CFDDPsʶmUKGCC?>9765679;=@CA@BCGHGHJGBBEHGFHIMRX^dejkmmnklkhb^_ed]TF>41156420-**'$!!&,2/%#'+/26887542-'   + + "R}vspkhdb]Z^]\\ZWVSROOQNA0$%+690"#" !%% %-//+((&(-27;BEMPTZ]^[WQI>767;;8730--0330..00-*('))**'%#"!!"$&))-+'%''#*Iixwhcr{h<(585221.+)$"!"!(/46<81)!  &+/2*4FarVA:FJJGA:) !,1559;=CMRYbklnrttxxvpbPDBEEEEEECCEEFFEDCCCFIKJJJMS[gmgZTUSOKJLNNMTUV[akrxwriaZWTRPMLNPUcpu\SSOGBDB>;;;746;?DFFH?A;49GIFIGFIKHIJMGDELWnáuN-&,-.,&"! )18>EIOQSWY\^gxsggg`qiH,*8?GITX_ZUPPLHJMKIHMQ[\^adjqwvhbjxxiis~{qhl|jSbpxojjjimsuxvsqoszϹo_WVRSXXZ]`chijkiic\VTTWWVUVXZZ^\[XXWTRWYVPKMV^n~ık^VT`r{z|}|}~yru|xmOF?;6/++6CYo~|y{urqryл~rjbWKEFHKMJD?;;9<@CNVaj|~}xutruutrgccaTA?I`^\SIA?B<<>>>==;?AJF?Zýӯ{XGECA>;7424469;?CC@@BDHIGGHEAAFFGEIJMRY_efjlnonmnmid^^cb^XH>4./153.,))(&!$#'-41%&,279<==7442-&  )`vuqnhfb`\_``_^[ZUYTRTQG9/58<>5( "!!!$$ !!#% ",..+)'$%)+/4:@LPV[_^\XOF;436;<96510.13520/0-)'()))+)%"###%&(*-(+)#"')'2G^psaXekqwuxH"(7:4/10,)&"! ""!#*/102-$  %(('8Rv~aLELOJDDA2"## "*./258447KS\fr}|yvusvutrl`XUL<6:PLIC?;867899;99:@:A<=mໝ辉WB><<;6442137BB@>:2111.'  B{kutqliecbeca_^\\ZVSTVSLE@JE:/&""& ')( !$&# (+$*-*&&'("20BDIOVUQNC=658;>><72.596//1232,'$)')--$!%%-,*0,'$% (6=;9>93/7BIJKLHFKMKGMDEXtŨH((&,)! ,/3:842//5567877696;85cѻޱQ?<:=;84554335;?CDFABFFCEIGFDBDEFEKNRUY_gjklqtqpppplhcb_]\TJ>1++.1.)%%'%  "$&.,*% !.<>5('6;>:B\X\ivvtsoi_PD?A>==,5<7118<5532-*%%$%&*(""#!))*2,'"$('-49:MjwiZUZ\\XSLHCUgvXB?UR:140-,% $%&-0/*$ "$ %%()**&"1Hcsm\G?BC:1&#-7:214/02016@HQPW`gipx{zpbRNMNNOMJHHJKKHFFFKNRTTRQTW^fihda`[UOKLNQUWWX\]P<. + +  :Y|zzjTF?<;;<;@EKH@:4116996:6209CHHMOLJMMKIGN\sõqK,#!"/14;ABB@?<9656=DLWahpxv|ocYZ^`dehiokgcb\VPOONORSUUOKNNPMLHIEEGHFJOWWWY]bhmfgaX`xzyunc_`cefjljmx˹~paSPSSUZ^bbcaecc`\VPK@;:=ENSWSPPSQJEDQOKFFQh~bPKIIJMWckrrsqmihgny{x~~eJ=:CTdgeflqne[mqtu}|mcbjokaXlϧwgTLKQWSG?>=?>@@=;40.19DQ^r~|}{ywtqnpmkhfZPJB737765542001133545445:31RǗmD468=;635672./6>BDHCCEECBCFCCBCEFHIMSW]agimosutsrrpmkieba__VH8,'+/,)%$$$ #&*+/0/*##2CC7&");BEHDCBBEC?<5-$ Ct~vommjjijkeeca`^^\ZXVTSPJA9970*$!#,$ !!$$" .1Caeƽd@+(7D48;401579731,)('$$$&$  %*(,'&1$!&-13449F\iha^ZTMD?95197:10,&%*46=FNU^epu||qeXSRRTTPKKOQOJGILQTXYXWVY[_b`\Z^b_WMGGLQW^][ZVF0   *E_zysu}zl[I>744;>>===;6/,,05875302?>?@=;61,.3;JZq{{vx~|zywsplmifcbXMD=53752446421//00223365854C_qrU6-38;931347/*+4;@BJFDDFFEBB??@DHIIKNSV[`fjmptvvuttpookkgc`c\O>-&(,+*(&%##(.1220*&'5ED5 "(0=CLNKIHFMIF@;2' O}tonmkkjljfdba_]][_[WTTSLD5563,# !'()!'+$ 1DLRfvκvnkbO6:?:76526522/---,'$%# %,6LYSB'#!(146619FP]dd_`WK@<8306CS[ZWVW[fX:--+,+&"$%('' #(+()($$%&'()))(()*(%""+>XpcA;A><>:4230*'("!).3CFLPV\_^WRNLGFIJMJJGFCDGIFINPTWZ]bceihcZZixqne\W[]aimmo}ľļm[YZLO[emoppqlf`YQMH=::=DJMOKJGFEFEEEDDITeĿzaVSNOSWZZVW\bhjkjiklmuvXC>EQ]d`]XVL@7KS_ixy_TSSTUM@:_ݫ|^SLCR^[RLKHDBB???;8840./5EUjuzvsw~|zywsojjfc`^UJ@:436//001/,+----..112337=?AFHGVx~kZI?//13761.003/,-4:=>JEB@DHHD=;:-'16?GTXXSQNRNLG@5*" Yyrrpnjjhjjhfdca__]a_ZVWVOD5674-#)1'.//',@bܟtYe|xcWkŽKFII?89>?002344221*" !&4Ald*#*0223560:FMYba[aZOGD?:68;AEIOTW\dT8,)&'*((,+($%#!!"$%&'()('(('$! +::?5)  $! ,2CYnyxobZ[^edXPLMRVUSX[]^\[\^adeaZWY]ULA;>HT[de_ZXVND9425:9<9732DHRTXY[\\]|tme_ZUK;,/7AGLNQTUZ\\TNKHDBEEHGHFFCEHJGJQSTWZ^`bcie`YYcqzn`^YSSW]clpor½ɽvc[SIHS]ejmmokcZTNJG><CED=>BO_t~gYWSSTTSQQQTX]][XUUXap~uZD9?KU[XTMG=3,CLWaphJCFBC@95=hŎeNF>@Wg\MHLKGEC?>;:69642//=Ocnvssw~}~~~}|zyxuqmhhc`]XQG<73230..--)('++**+,/0*-,2@;18;9InՇP=513).+,/0/00.0---148;ID>:>FHC<89a~ƁАVKY\UPM`ko|sG,0AHE1/2445322(!2NcȰu/19=:62451:GQZ_[Y^[TLHD@=:66:BMWYbfU:-(#$*)*,*# +""#$# !!#$&'()+)('(&#!%3C[nrV>:><64.&&+! "7M[fmysledejl`VNPX][W]_``_^^adghfa\XWKC:6;GSZcd`WX\YRMKLSYZ^`gghe`_djs|{soklwzwsolg\PHCBCHC<9=DHEB=;899?@?>97?IMIBCDC;8G[ɹL" $''*/)&%#"""!!!%)/4:>DGJNRTWX{xrle^TJ@GJPSTTTUSUVSOJHEA>??BBFEFCFJKIKRSVXZ^_cdea__cmwzeQMONPY^eorrsvdUEBJPVZ]_a\SLGCB?:78;?BDDB@=8:?A@88AVp}cTTQPONOOQPSUYVRMKNXftrY@3X}wgY{y"0x⹄b]figKB7+%>{fF@FC<865201//.#(Fpȧl,+9>>8688548GS[[Y\^]XOIEDD=868@MZaghU9-)%)-(%$   "%'(%"  "#$&'),-+)'''%#!&5EVgv`O<37:5. "!'.)+'%   &0=F]bjmmknmh_WVZ^^\abdcaaaeiiihf`XRC=539DOU\_\TV_^W[\dnuvyz{{xpgdehmx~}|ysljggqywnkc`YSICCFJKPPLGIPSNIFC?>;?@AB@@GMMD<;?A;=Uqƺg4 + &"! "" !&+0369<@GLQS{voe_YXSRSQOKJMPQRQPMJF?=;;>ACDFFFKLJKQQSUW[]`ccbbkw~`FDJMS\afpsrsúxbHCEJKPSTTOIA<875867:?@CA@?=79=>968D^|½uRONNLJKNQMMS\ac_]W]m|wlR6+6QbhZI91&-Ncouyzz{wgC!&"3:8A[ɈQ;96-:UdYMMKBDA=;;;879<<8.*3DTeptuz~~~}|zxwxxxwvtsrqkgdb^ZWMJB92/0,.+('%%%%&#$$%'+*&,&#+$%?@ARrl4*-35*,&/43.+,-)$&/8TL@6:FICA=>@DILNLQVZ\_cgknruwtusrpnnmjihb`^WM<'%&&# #'$$%)+///7=C@1#!&")18CKPTTQQPSUVVRG9-&  Ptrusromjiiigfdb``^`cec[^aUB220)$$/Jl}p|yiizԪE0Flæ|[NVL5Be~dD9=D@930./03(4YƜ_'379646>=578DS[XW^`_ZRJGHKA@==AN\eeeP6-)*/-' "%(+-($"#$&()++)&$"##')1FZjxxVK:15;6- #*0)!/631/)! (AOcprpqnqjd`]_a`defedefiljhjje[RA;54:AKQV[[TX_aW_bm|{pfbbahs}|xvuupjedcdlt{|zpibZSJD<:AHLNRVVSQVVSNKHD@<=??BDGKOIB@AFIEJhýI  ! """! $(+/149?EJM}wsk^RZXQIA??CIRYYXVLB>::9=@DEGGILKKJIMOOQTUY\]]]ny]GCELWckmqttyr_OHFFCCDDGE;0))+-05:>@BB@><8555349LknKEFIKMQUZ\_cbdhnvr{}n\B.%/I`jbSC;0#"FaejqlhlhX9 "#1@Naީd<463+BNSTTG>?@>>;;:99::;;6/19I[jrx~~|zxwusrstsqlnlibccZLGC?:4/-*+(%##''(""#$%%''%$%$$(,3@301!)253.(+&$))0BZWK<8?ED><>CHMMPPV[_acbbilquvvvttqolkihg^\^\S<%! !$&('&%'*-,+7EKB-!%(,9>AEHHHEILSVTI<3)  0kvquywspnkkkgeecaaaa^``[^_Q@5.0+"##FOk{^OIullS #/DǸwS9/A{THKFA;6103:7/,@iȽU943)(2;68>;>;982..0( + "3LZbhnsyvrlgfhihhgfdgimnkjkh`UJ:723:BHLRV\_a\YU[`m{}mbaa_adgqyzxwtqhe_ZY_dhsrkb\YPF<308GQROPU`b\RS[ZSMFB>;;=;@JONOUVLHJMY{¿s( +  #$"! #&'*,17=AC~~|sng[ROLE?:8AEGIIJLLLIILKNNQSUXXVVj~eSNPU[elnrttxp]OHE?==?BA9.'$(+/3:=?B@@>;621002?WvǿiHBDHJPTZ`bdeb`afkrzzhXE<-"?[npnidZH8,Lcdcd[[^`S:%!'2BVdv丈S60/02IPOOOD:;=;;;::<<=<><7//5HYirx~~}{ywvsrpqqpnkjie_`^WKFD?;71,('$! !$&%!""#$%&&'$&(,0348:Wձo@5;-*,!"',..,)'(%#)*2Db_UHBEHD=<>DIMPPRX]acccbgjnsssutsqoliheg]]_]R=( #%(,.,)&%(*--9FLD2"')*/37238?LV[ZWW\ZWQLIIHEFIHLT\_]cO.$'(,& !),00-)'&"!!"#$%&((()))))&$$$!,AXl~qO@;96DVS_eo|pMLGILLPQJB97<=78:5),;L\lvzyurolnmkiihiimnnmkgbWKA4224;DIKNQW]a^ZTLPZekihhaWRTX[_gkt{{wvtogb[UUV\_ef`XSOH<5/1;;@?CKPRV`]PCBOk;  !  ""$'-06:<~||yywnje[UQNGA=>DJ[chge`VI>::9=AEGIIJLLMLLJJLNPQSUSNMbqb]^[]ekmptty˼nZME=8789:6-($&,/38:;=;>;73.,,.6KjbE21+ ,DWdu~xeRBFWa\XUKMRXUG96;IZp~ߺb@2*")6RUNHIB88<::;====?>?>91/3GYjtz~~}|zwusqonnnligdb_YYVQIDC@<70*%!!" ! #$%$(#$(043-*3ZԿ[7.2$ &'(++('''%&!&(/Aa^XLFED?<;>CIMPRTY]_bbccfimrsrtssqnlihfe]`a^TA."(/5:84,((),-3=EA1"#")+.4;@DELJLJGB?;1' +#U}y}wtvxvrpnlllffddbbbbbca_ceVC2*)'$" #*ItSM\eq}~X!!--,-) 1Kf־mD9|sF47BJE7/-BOVOEAFLRSTRT`rqO4+46?NY[[XW_\VPNKHFFHMNQV[[_cN.###'% #)010-)%""!#%&''+++***((%#"!&9Mg{gG>=@@SnuŚrvsh\]fh`WLIQWSSWMB4*%  ++F`puxyxuqqqnnmlooppmli_UG<4+)-3;DHKJLPX`^XP@@DGIEDDB?BJPYeosz~zxupfaYQNMQRSTPID?91**4EZd_VPQXadabfa]VNGB?>EGOW[[^caSDE_R" +  !!"%')/4:<>~||uvslhe_[^ZQJFJOVbjmieaWJ?;:9=AFHKKLMONONKKMLMNOPOGAToxx|wjda]_fjloqsyȸhYND>;;=<93-+)015689989630,)-3A[}uZB7;BGOU]dmnia^_ir~zp`I6045, *J[u}kg]]YNLNGGLX_^WVYbqdJ84&#:\YMFGA88;;;?@<404GZku{~yz~~}|zxurponlkjheb][WRPMKHDC@;6.'"!"$$%#!#'*'%#)K|d;&$&%!'%%"#'%%#$*:XWPJDAA><;?CJORTVY]_acdeehnqssstrppmjged_bb_VG3$(2>HID=62,)(+1;9,  +#!'+05;BFIKGDB???>6+   +fxvzwuwvurppnnmhhffccccdecafhXD/'&$#Wn`YTZy׵wC13;>@<>MVOC2'*-++20Puհ\37DOK;10Id~nWG?BFKUg~oM2(/4@P[\[WV_[URSPKEGKOSUVXYbdO0#!#" !#(+/1/,($! "%'''&.-,+*)''#! %1CWo|ZBBITcvȦf_emrwigs|x|tfWLA3$)FZmwyrruspooqrqqkhbVG7-("%*271+%!):Pgqj]QOS[begije_WNHGFHR\ehc\ZYSQ]h1 $$%$+,03:=AC}}~zzwoif`\^ZPIFLV_koqmgbYM@:99=BFHLKLLNNPNLLKMMMKJMC=Mcebnyld^X[efhknqzī{kaVNKFFEB<50/335577997320*)4@UnkR<47>BIOW_hjf``fr{~vk]P<*#-0,%#'@Maq}xlma^YMMPKHMZjtutv|˗fL:22%$>`]OEGC:<<=?@@ACD?>AC?858L^nuy{|zuw|~}~|}|{xuromnljhgd`]VSPKIEGIHE?82+$  ""#"!  #'(#5ShkY9+%''!# !$)#"!1NKKJHGIHHDCFKQTYX[_^_aefegmprrrsqppmjgdb`dd^XM=- &4DSXXUKB6.(+-13)  &&*,18>CFIDB=;::<>;1& + /nvuz|{vuvuurrrpqpkkihfeeedda`hiXB,#"! =Ŀl>Hkn˺U3*0Rcf\anj\VJAA:*':Nmӿüi@=BNOC>?Txl\W_huwYF4'*5AR\\YUT\YTRSRNKKNSTWXZZegS6'#&)-1311-*&#! #$&'('&%.-,+)'%%  .:N_stVHO_vżÙdPN[oviXC2" + +(8]s~powusqqssqpfbYI:.(%##(/9@EGGFKT_cb[TJ@83/28?FOXbny~~yuskf\WQIEAACB=72)! /F[nwpdXRQW_cgjpokcYQNOS[chjf_WW\nt>   + %(*),,/29<@B|{||sjd]ZZUKEGMZepuvnje\QA;98=CGJNNKKNONMLMLKJIHFIA=Oa]Yh~{ndZRWbbdfjo{θxmd_WVSLE<62667799997330-/?Rmv^G8149;ADJRbed`_eqyvobPC8)"-128@BCGN[ee]YT\^UTVPLN\r÷lK:/,+#/J^\PGIB;@>>@@@ACC?=?CB>4-&" !"#$"!#).*.471133.'" %(!*?AGQXY]_[SLIINUZ[]__]_dedgmpsssrrqrokfc`bfe]XRE7##3ES_ac_VH=82.-," + "#*-28=>?@98889:;=?8,% 6w}xvxwurruuuttusssoolkihggfea`hhV>( "6sV;Xƣp?6FSZ\k}wyonige`YSUM:* 9VrЀRC>FKFGMg{hcdTC=6/18DU^\VSU[ZVTTSRPMOSUXX\[egV=.#&+058731+($"#$%$()))('&&,+*)'%#""2@Vdu|~nVRasѐT?6>Y{ʽhU7& Ecspwwsqqrsnj`WK=3,*)))+/6=CCCBFO\fklf]VPKJLOU]djqy~~||vojh_XMLHCA>AA>91)!(;ScpxsgaYSW[_ekrsslaXTV^aeiqtpfdr|N +   %((*,/27;?A|vuwzwmg`^[ULDFO[gswvoje]RC><;=CILONMLLMMLMKMKJFDCD>=P^WTe|ui[QU_^`cfm{Ƴwnjd[PG@9988799;;934416NfoS>0025589=EV\\ZVTWZSMA1(#&.BFDDIaoyywttqttwxxxzz{zxuqmjhgeb_]YUQJGFDA=FQUM>0'! !"$$$#%&')( % 195*'" "$#&7=Pdruy{rfWLHLRX__`^]]beeflprrrqrqrokgcagkg]WVL=''0=JW_gid\UP?5-) $*.367653/1479:::A;3,& ;}y{zxrpnpsuvuvwvvurronkjjigd`^eeS:&   0uVOqʬ~X:=Ukz~z~~}p]I7#.4[ȷqWGJPNRZo}xohcrudJ=43:=IY`]WTU[[XSQPRTQRSTVY]`beXC7* $,/267620-*'')+,+,+**))))))'&%#! !1@Ucsxy}}dWath5610HntS7+Luyuxysqpqqkf[O?2/03340..29?@@>@FQ]inmjkmljjmptxz}zsqkb[XQI?>>===AA?70(2I`imrqkj`VSSU`iprvqf]XX_en{~s}ļ^'   !"&'+/49<>ztrtw{ypkfd]WLDCKXdptulhb\PE?<9;:9;;=;<6575;XrhM6,0132237>FLPMF<75+'&>gtZMVgolWWfh__gfWVa|mC1672*# .F\OTOHI?;C>>>=?>>=@==BGGINiv}{wsspttvvvwyz{zxuqligdb^\YUPMHDEC@rݘUQHLaymQ1! +!9eu[[^]`g^^benuwukQThwhG2.:DM\c^XVW[_[TPNQSQQQSSX^b^bXG=0%*012444101.++/11/-,+**+,-'&&$#" /46/D`ƿjF#9g{xztrqqohdVH7./389:62/27=@@<;=DP_gopy}}xmjcXROG?6677;;AAA91,"&8RhjkopjlbUOKN[emswsj_YZ[gzvxh3!  +  "$+-33xlb_aZSHBBJUalprnkaXLB??@DIJLOOLIKQTQQKKLI@<;5;:;@Su}bB1-./+!&#"%'$!""""CvlJDWhjXX`gidac^cmyN4-.10*$'6L\TLJIKI@:=>=>@ABA=?@??ES^twxwvrolpqvwwvvurqpnligeZZ[[TKHJJG?48Keue<''$ !#"#%$%##" &+1/.+)'$$%%$$&&&% -D`}mO?BP[_\[Y[_ghhhkmoqsrromkjiijie___[PG-%#*0:CMQX\^`cd[VJ8)'+489;<@EDB?;61.58>DGC<88<9*"!(Ow~xwvtqonmnpstwywwvvvsrpoolgic[dkU2  +%GĊ~~cXbhuxfK) -rwYSG57IBBYe[LIWx̪]06AP\ed]XWWV[[XUSSUSRQQRV[__``T8!!02101340.0/-,-/24110/.,++&'(('$ "7HVYellnrwfON[mzz~Ği4#.872KqY8N~wywyzwm`WG?848@FG>85335;@?<87;CS_jr}xpjkg^PB<<<832?HF98-'&# *CO^jrurmi`WRX`b]`gqush^Y_Sapjpzxpyƿv8 + + + +  + !''vj`^`YRGAAIV_iklic\QJB?ADFLMNPNLKMSUSOLLPLDAABIMS\XXb|xfUJJPVZ`l~uprǾcVRNHEDHFEA>;:@Mex]A2/,("  + 0Lt_FGV\SPT[]\_cgmwzM4+-,)&&-=NZSLHHJE@:<=<>@ACA=?A@AIWbruuutqpmopuvvuutqpolifcbZYYXRIFID@:4@Vo|a7 #"'#! "" !$&&'%$##"$$%%&# !&+2421.++(*(***)+)&'"!% *LhkO?CNX[\Z[]`fgffimoprrqnljjiihhd`_^[QI4,$%+/9BGJPSVY\_e^TF90./:AINOPOPKIHDB=98>AEIJE?;5;5( *Px|xutronmlmpttwywwvvusroonlhic[dhR/ Zȟٽ^PTgzyeJ/ +RҺĵ|Z?2!&70(9GDBMjπE98U^fc_ZYYWY[XVSTSRQPPQTZ]_abW;",/.,-//,*--,-./1210/.-,++(()('$!#7HRWafiinspL7AUtrvwN(.:;5CKNA<9644:>B<623DLRSRPQMKJFC@>BMWco|tF)!# );NWXRMGEDA>=;<<=ACBADDGGJR\ekmmlnnppnotttttsonlhd`\ZXTRPLDAB<88@YrkH-$%%*$!  "$&&)(((**,.47;?@>>?887763445564778614116/,6X|qYC=GPWQTX\^aaaedhkmmonmjhfffgeeb]\^[SOE:.&&,38==BDHMRVWUSLE>:89<@DEEFEIGEA><<;@@??=7-'+1.!  2Vyzxqqnmlkklruvxywwvuurqnmljgfc^daE$ +.6`θY:Ac{{hR71͸}mfU<0#&58:BVi{TPXcikfa`_]YZYVVTTSPPQQRUY]^ae_G+ &('$$&'$#'),.00///.-,+*)))('%#" "$#(6BKNUY\`flsq_;.MczpTITdpzvsoeWB<?>?ABBAGGJJMS\cfhiilloomnrssrsronkgc^[XVRONJB>>68?Mh~nT@4$"$0)$!$%&#"! "$(*)+/2544166:<>>=;<<;:99::7787:;<:;B?:8-)5V}|iQ?=JSWMPSX\^]^cehikkmkkhfdeeffca\Z\ZUQKA3($*/278<>BHNQQOOMID?::9::<>@ACA@=:9;;>=::4/&"'+(  4Wvvuppnmlljlsvvxywwuutrpmlkhdb`]b^? !!!&TbQ.(Jy~peW="xwRP^\K/"'0:HQyᴃ^T]knlfca``\ZXUUTTTRRSSTVY[\_ebM2$'(&##%'%$'),/00/---,+*)('(&$"!! !""$'&*6@IMRUX\ckncE$ &;P[]YUE>ISSTKA82-&.?ILA1$$8gÜyU3!08'2W|th[OGC>8../*&%),&&8@B:/++)3;FMNQUY^dfcdmruvm_VQOMMEFKH@0"%7JMB301IVdijljfecZNHOZbxqbVUeȐJ.4--(!"$%&.:EReyüÜP)-,,&" +  + + zz|{{|~}umd\[WSHA?CLU[]]VPLJIPU[\ZVUTUWULJMPRZ[\ZVVdsobfvpM78Mmpj±ý]D:67<=:61-36C`~xfO5% "  + + ,=HWbm|zkgc`^VK?&%&+..17EQanrttvzrD$ 1IX\ULIHECA=>@@??@@@>FGJMPTY]befgjjlljkoppopomlifa]YWTPMNJB;90:L_xxaOA,!$'.'!"$'% ! "&+/469<==:74+)((('%""$$#$##"%%$&'()(*1323,.=g~iO?BNWVIMPTXZ[Zabehijihiffdcddec`\YZVUSRJ;,(+..45:FUa}ݳa<@63+" +:EzğU-/-,&#   |}~}{{}~vof][XTIBAEMSY^\UONPRWZ_^YTPOLPOHFJOS]`c_VQYf}yxkbhvnRPeʿǴ;cH<66972-*'3;Pmq^G/$! #*-+$!'& '-8Kbp~~bTGBED@:(&')*'(-8AP_eijkrym? (>T^[SHGFFDB>?AA@???>@ACBCCB?:6,*%$'*++....-+*)%$#!!# 4Ws}ppllkkjjiltxwyzxwuutqokjif`]]^cW8 *-(!8r` (Fcx~sk{tQ(.cלgXV_vuspfcccc_\XVVWVUTTVTUVX[`afeT9(&&$"#'+++-./00/.-++*)('&%(&#""$')*'&))-6AJLMORVaifR. &%#-) !*-(+3393*'&% #(';VsɾĢZ01..(&"  +   +~}|z~ypi`\YRJCCGLUZ]\VRRW[Z^b`WPNKDGICBFOS\bhdWKOYrvqoqgagunm¼кrWI:874/(&#;Ga|nXA.%$"(-0,$#+-)(+.,'-6>M`x~fT@42133,()*)$&)/9GS]bbcjpuyf8 ,FZb[OFDFED@?@CB@???<C@8588, (-JPR?6+'%()((''),.+) +#3CKB41-'##!.:CU_[]kwzkc[[^^WPKF?5) '5GY`O5'*2N[hljkkkc[J3%! 2." VCA::6/*&#!"&4Kdt¾úŦ`8831,)$   ~~~ytmd[UPIEFJPUZZWWW[^`d^ZUMFC>?>>HU[ckgVFGOaeggdbbbs|Ŀÿ|`SHBC@8+)/BVm{lR;,%##$',-+%!(06851/+:?IWfxk]L=,$3./,'$)04;DLRRTTbmsswyrzsV1 !8N_aXIA@ACEBAACFD@<;<=BFMT[]]]gjqssojgaacdedb_```^\YVULJMTOA9:FZ|zM:*"'!$ $+*(4589;6.)  +(=Vtx[HGORM?ADDGJNRZ[[\\]^^_][\^`ccb^ZURQRSUPG>513388;;98:=@EHC>=;61+$#%&!"%&# .Qisdhgfgghklmnnqtuusrqqqnlkid]WW]dZ7".3, 1xoL2Cy|x||lXA'>xʶyojljfa\YYVTTXWVVVZ\`_]bgbQ=+!"%&##(+-//213/0-,**')')'('')-0325.'%%'2F>631+/,%&6CRW\aluumeXRZa[NFD@8.$#3EUWVJ6(+3U^hjkkid_R@,  " 6d}E@82430-,)&   ?W}ƾ¾ŬnLKC>5.)%!  |uqi`XRKHGKNS\Z[Y\`ede]XPH@=9;76:87?KX_fcTEEM[`cba_cdowؾ}iaXRSQG:79H_wfL8,&#!%%$#/2:;;;==CHS^myxndYK=//5<61.(%'-69AFIKLMZemmoxzulqiK()BT`aWG<;>BFD?ADGFB@<=?BFOV^`bbjpuyyuokca___^\Z[[[[YWUTMJLQJ=7:Mfo@)&"&% +24579872' + &/C`zoYKLOLE>=@CDHMQX[YY[Z[[\Z[Z\^a``]YVRPPPSQKD;66258::8779AHJF@=:63-&&(("  +MgpchedeeghkjmmprttrqnnnmjhgbWSX^dX8!*1,"/taA6Lz}rhS7=BEA>?AEHHDAB?7,#,11<>,  $7<3.+*,0479;;<<=;84,),/'"+5?C:223/1.(""+;GV[`elrof\SPX]UIA;5/)&)7GYUOB2)-7[bmligfd[QD/ +#'%%*.# "IxfIRN@=85332/*&   *AWiȺqTWL>72*&"  +xskb[ULHGJMR\[\[_befaXPF?964532444:AKQWWI?AIZ\_`__dfnr{ywzؾtqjhjg^RMLXmsV>2+&$" ! "$(*49AHNPSTUY`gqyuqje]WOPTK?3.)&$'.17:=AEHQ\dddjomch\>  +4O`d_TE:9<@CA=@EHIFC>>?DHQY`aackqx||wpkea]ZYXVTSSTTTSRRMIJMF;:AYxh4'$'(%$(.58930+&  + +   +  (J^odVJHKIC>>AADGLPUXVVXWWWYWXYY\\]^\YWSPMLNPNJ@73-/2795457@GID>:600+)&(&"  &Gbmchbbcbeehgjilnoommkkjjged_RRY_cT4"'+)%1q{K4Eg~xxgI:I̽ݼ˒|zpmmifeb]][YX\WXWZ[^``gfgf^N7)&,0.,/00.../.-,,/.-++**++*+.4787)$".>BJLFGR\^WB3/2:@668=A=559EDA::?CB=?DHHGECADB<0%%) $ $282,**,02320130.+*("").,$%,:AB7148631-)*3BMY_chmng^ROPUTK@:2+%#(.=LWOF<3/27V_mkhccc[VN9#"#)/+$1QxŦuJNfcLC94778696/' +   4XwƾpWYN=73.*$!  + zulb[ULHHJMRWXYZ]abbZRI?9865:88677;=?CGG?8>F\`b`aagjmpwÿj_Y`qϿzz~|vlf`lxiJ4-*'$(&%"#(/4;=FQXXY[\`ehlpvz}rkfelossWE3+(&"!"$*.4IMW[__^`krx}{ulfgb[VSRPOKKLMNNOOKGHIC;AMgh0!*%%*)+-/.*&%    +  + +     (<70' $7KaŹpXUG7222-(((!  +{uka]UMFGIMRUWXYY[]\QKC<8:==AAB?@?><;8660/8C\^`_ackppu{|lXNR`x̽yq{~~dE/'%##"$$'/;CIFGMRRUZaeijjjnr|xmdds\F/%#!"&.9DKMU[ZWY_bc^K* ,FaibUJA=73047=CEIJJGBA@JNX[]]`blsy|zsjde_XRNLKJFFGGHIJKJFDC;7CUtd+'0&%*.21+    +!# #$#-' (+& !  1@POECIL@@A@CEGKRRRRQTTTUUUWXXZXWVVVRNJJEPXQ=.+)(+1433478@EA:740*)('&""Ccn``a```bbccddefggffeeeeba`[VPRZ]L)"&(3RP4Au}z|dM:AnΚͭ{zqnmjgeca`_ZY\Z[Z\]`ccedcffZC23;?<7652-+,*+)+)-*,)+*--3104:;62%0@?FKIMYa`M5(+18A<69@EB;;>448@DBH_lfVB0*++/2::84.&!   +(>Rg´nVQ@.*-11**,%!  + +}vlb^VLEDHLOUWWXWVVTID>;;AFJKMNHGFB;3*#$2>[\^_`entvy~|sgUGEbƳ{~~w_B-%!$',4@IMB=BFIQ[fkoolknquwjdn{`H.! #*4@GLPTUUY]ag_G" 2Haf^RHD:4.*-4>GEHIHEDDDINXZ[[_blpvyxrjea[TOKIGFEDDDDEFGID@<32DZb( ,4'',01.!  +   &5CMLF>?>?A>:61*" !.;:;CDA85<><653.)#   '?MRA9.(&(,-+---++++"07:54::5767;CNY^bcinlc[XXYTH=741'"(9UlweI2# ,6Wbig\RE==CNL2#')!  2GS^hhcWB,"&34553/,*&#  + !,@`{ϾiQI:)$'450,+)'#! ~xmeb[ODADFJRTTROLJIB>;:=DLRWZYRQNF=, (>Oceeaadmry|vo`ROVf˸{|fQ:)$!"&&##*./&,6.)*18?BEEFDDFGOS[[XWY[bhnssojfb^XSPNLJHGEDDDEFGB?;47Pii.#.4'+-.)     7HXblvhTQOLIJD?7))% (56575) *6DGB@AA@@@?@ACHKLLLMMOOPPRRUUUSRQQQPOONNQVVO=("&(&*03=BB<7652-,+)%#"" ;\l`a]]^]]]]^^^^^^_^_^___]\[YPNSWP:%#&0379=957::78:;>@>;;@DILF;8=<47421/,)%!! 9R_QI?6333245334430) "06844;<799;AKV`digilh^XXUWSG?;61& 2G]lul]I6.9EZ^^WQH=36;IL8%382%!#'(&!.>O\eeaf]F- )+/233320,(&(&"  #1Xv`G?2+%+8A:1.+'%$ ~zohe]QF@@BFNOPMIEA??=:;@HPU`ca[VUMA/#%;Xmrpmgccjn{}}{uibPDRlüv|~SD3'%$%# ##BISY`eVL2$8H[]WQMJD<3+),/5ADDBBBFKW]`^WQQTZ^djljgeda\XVTQOIHFDCCCDB?><8@]{u:$(03'.,*"  >[gCFB<984-''+  + #L<("9HC=737;;??@?@@BFGJIIKMMNONPRQRQOOPPPOPPQRRSXZG)  ! %,296682(&=JDILJMWYT=*%($"-2<87::8:?;@<;<>EP\ehnjjkeZVXPTQGA=7/(#=UdjikleRFHTTRNHEA:169HRA *9EC=@GJIFB><=?BKNU^[ZhhQ6#  $)-1255420020+& + + /DWpѼY93(0*/@LD93+(&$"{ne_YPG>8:BHJLI@979:;>EJLU]ZZ]\PB>A04?Qjshfkmqr|xyoaWVTUlſnzqP8'$"$  )FY^[ilonjilovx{ujhospZA2(# $'+18:8;EJORY^U>! -82/136???=AEKRZ[ZWRNMLQV\acc`^ZXWWXUPKIGDA??@A@=;;;HeqA118;)%$ +(4,'  ChSW^K.$,20%"(  &KNF50?VacYPF>:::<<>=>@CHJIFEILNMNOPPMOPQQNONOQQSSXUX^M-!/?F>10/*,+,)%%''$!   0Tff_]][[\]ZYWVUTTUVWWWWWVVVTOQZ\F+"%#/49Lfy{vux|rpp^D.*5Kqٳɨ}ywtqmmkliecaaa`a`bbdeddegg]M7&&-/-,18:000--/-)*+,.0357?7356,! *;88788;<=>>=;;>ACCBBCBA=963300121/.,"%()'$%"*K\\ZSLF@;8>82*''$ "/9;E@::>BA>BCHQ[eklkhfca[WTOKHED>71%%AZa^bkrqf\Y[]SF?<:7515ESI, /ARSQNPVSPNNMMMUYZ]_accdWC+  +!',16884//32-' +  2EVnƷjI7%1>IOPIA940-+&!!#zmd`YOE?7;AFHIF@978@>CMTWWZa]]]XLHHO[pwihptw{wut||ucWPV\fʿ|ozkF0$"!""!"9P]bimppkjlovx{xolqtiU@4,'$%$%)*-1676;;<@FMTZ][XRLJJJMQTVWVUUSRSTRMIFD@><<=><98;APkp=(.=C-$!.AKC1& +0s}S# (4- !%" $ ,P]fdgr~}qh_TKC?<:=AAB@@CGHFFJLMMNMONLKMMMLNOPRRSTYWZ_P3)>H>/..(*(+)%%((%!   .Rdd_^\ZZ\ZYXUTRQQRSTTTUUTTUUQS[ZF*!!"27;Lbt|{wuux~}soo`E-$(Ao˪׽{}~}zxuqnmnljhddbcbabbdceeeegf]M8)&,.('-575552131,,-.03589>5000& *=CEFGGOXSH6#"$&0079=<96665589;<=>==?ABCAAAA?;7412000110//(*,*)&&%)HYYWTOLIDD@:2)$! ",:EGJA@DFD@<;:88?O\a``\YZ`iox}Ƕ|lku~{qnmux~|yqe\TR[ju}Ƹyq}{`:'  '-49AED7,)9N_gjnrrmklouwz|ustr^N>60-**++///2568=FLORUXL4 8GOZWRMIEFDCB@<97:99:?FOXZ\YVPLIFACCDEGHHKKKMMLHE@?<989:;8445.' 7inH %-;G=$ + +-, )0'*?Vmy}smdXNE@=?BDDB@@BEFGKMLJKLLLJIJJJIKMOPQSTYZ]`W:"  $=H@/**'(%''$$(*' ! -O`b^]]\Z[YXUQPONNOOPPPQRQRRSRRYUC+!3:>>;5321/0134431-/0/,(((#'DSRQRSSQOOJD9/("$).9HQVNA=EHAAHKR]hpturhd`[WRPMIFDA;4/( .?LQPT[fmnjd]ZPB83/.,22>MRC1((4J]c^][XYZ]]^^`beeba_^_`_WD*%-3360*(,-)$ +  4C\yoWXdb]WTNE=940*!!  %*/3|ski]LA825:;ADCBC@=;=@BFGLLJGJJJJHGGEFFIKMPRRUVZ^]ZF+  "=I?+$$"#!%&"#'(% + +#  +,M]_\\]\Z[XUSOMLKJKKLLLMNMNOONPSO@)18=JZionhimnsxzoha[PG??ADT\glooprfJ*+dľz}|{zxuroonokjighgddcdcddcdded]N8*%'#(/33694433-215598;:8-%" -@GGGHHNTNA1"&.+46::745411457:=>BCCDA?><;<<:5221.-0234443441,**(%$?IHHLMQRQRRKB90)&'(07=DOUWO>:FH>@LR[hsxywsid^XTNMKIHF?8/*%)7BGJKMQW_ge^WTL?5/,,,008GSJ8)%1EZdb_\VUY^`acfijhd`][Z\bbQ8  %/434-%"&'$   + /WsusiYZVPHB=70(&'(&#! $'.4:@@>>>?B@9879?GRZXYUSPIC?64.*),03:=?AA@>=;98679;<945Gfg4!"?hx]H@:7/ "1:6 1OXOJML@'&"!"%)& .Pw|sppni`WRMLHFCB?>?AEGKJJEGIJKGECBBCGJLOQRVT[^X\P3  %AN@%!"!$$   #! .JX\\\]\[[XURNMKJIIIJIIJKJKKLLMOJ<-,6@BCCCA?;9:;;97543-,0245656653-+()'#9ABACGKMMOSLD=4.-16@EFFJLMJ:7BE=APZcowywtpia]UQLKJKKH@8/(#!3ADEFGGEELUWRLKE:3-,+,,-29:CJNNJH:!0ERRSNHDC?>=::;>CC;:::AHQXWWTSQLD=4/'!!&*58;=<:9:875568;=:68Jlk>.2TfA2# % ,2 )OfN?6BQR7 " "'=htnlnonhc_ZVPLHEB??@BEHIHDGHIJFDAA?@EILOSRVPYZP[X:  *ER@  + !"2KV[[]^]\\YURONLKJJJKHHHIGGHJJKMF>2%'29CTagg`cktqcWPLKOPS[j|pS:)  #%.18=<;9+   -?FGFGGMRJ=)''2599745554568;>@ABBA@=9779986543.-1234567761-))((!5ADFIKNG?:5,-7AHMIEDCAE95=@?HWdksvtpnjh_ZRMJJIOMKA8-&!*=GGCBDC=:A=93.+*,(+,6HN@-")5J[_a`YY[_cgilomic`[YX[acYL:" /:;52'   8gynmhb\WPKKEB:51/.46:AGLQSupeW@4206FJJFA17LTSSLGFFB?<<<=?DC==>>DIMSVVRRQME=4.&"&269:8667432247:<;89KnnME@Ow{zaG5% $ '*.))$-F]dD62@UYH3&')))" 4Wo{qnoqrnkifaZTQLB=>@ACGGGCFGIJFBA@=?EIOPSTXOVUHY\< -IU@    +!6LUZ[^__^^ZURRPNMLLLLHHHHEEEGIJKHA9-#$05?NZ`a]`ir{yxsaWF5(!,08BTl{Y=,&#(1=GQY]SK?43AVfiT:$8_~xyywwvtspmlmlkjikjkfeeccca_`^^]VH6)$&$!"! *344699==>>=:74!  + *;BCBDDJOG:%#&0367534365657:=?ABBA>;75466544521.1456658851.*+++#5:<:::=@EGG@961(+8CJMGB??=B;79>FS_nrusmiige\TLHGHHPOLB7*$ (6GNJCAA?955::84:982.*(($(+2GQF2%(1BV_ceb`acfloqqmjeb`]]]a`XSH2)=GF>1%  +    + &EVrungd`\ZUSLHC@>CDGNTY^_}sncR>3028@HQSOQUPCGHRfʳ~sw|unlmj_TVTQNMLNNNJNRYVLBNSYYVPLH@6+",Sȴҿemz}sswʴ|y]=$   1Iewxzytkb\Zahruuspprvy}~s]E=;85.,+/155544213;BIHB<+:OVUTOIHHEAAAABCED@?@CFJNQUURRRNE=71(!#'159974452101259;;9:KmoG<>@EFECDGIJFD@?>@CJMPQSWLTPDW_? .LWB  + + !$ #8LTY[^``^][URSRPNMMMMIIHGDDCEJJLID>4* +/:GS[\[]ekmcTHB8) + $1DbgK:615AP`ny~wgK2)4L`gVA' +0[zvwzvvtspmjijijhihjkggeeccb`_]][TG5&%'& &0337:99:;:851-  ):@BCCDKOG7%%,1553122755458<>@@A@=:6413432243325677877752-+-,+$6::6456:>CD;75-$(5?<86835673/9884/*(("*-4GWK8#%+=Q_fhjgfeimqqplidba``]_\UTP:$#2FQMF/#  +   + ((Avxqqqpgdd`\WROOPUZ_cfh~unaXE4.16:ABDFIF>5ASn~z|xv|xsfQUPPOGIMECFLLOPHBJKNMF=77/-('U~Ʋ˶u|ƽxsxԬzzjL1! + 0Olzvh^[bgpvzzwsstx|kQB<71//36:88431/-.3;85.($%')048:976676433467:9>Om`5@l~uQ:/>OQNQZYRC+  "!#,6=47LdldWGFU]WSUP8BEEQYI'"(:Qhvzzsolklprpqpjf`TKF?9=FHDCFDFHIGA=?@ADGJLMOOHELZUI!4KaD + + (*&*>GOXYZ]^^[YVUSRRRQQPPLKIGEEFFJSMHNL=2)"#! '!0AMW^ZVY_YB& !,@^ƺxZF<@CM\n~}pZD9@@?AD@96:CPaoxupkgdca][ULDCFJOID<-!%;GPMD=AG?;767852=?;3.,*'(+/4FRH7!0GYdhjjjkjijihffed`_^`XSSUPA5+)6GOWVH.     ".DdtryxrlhgfghlmmmmwrgYF62576>=?=3/@WoǮ}}}}q[YPROGGKDDGIJMOLFJFD>700464,)XȾϲ~wttuzԫvy{dD-!%+$0Olzyka^chpw{{zvrsw{~fL>;51/169;:861/-+07=?BB90% +!?PWUUQKIKPMKJJKJGEFDFINQRQQQOOOJC=:81,(')*14798767543235799:>Mi|{gA!@RO;7;KVVVZVO@0 6KRA6CWYJ8CGU[PIJE7<@KaqgJ%"2G]nrsnljhhijorsqoj]RI?:>DFECCCDGHFC?A@AEGHIKJJGFPZTE% :\gF     "+-(,>GOWUYZ]][YVUUUUUUTRQNMKJGGGHNZTJPSD4+#'&%*#(:HS[^YUQF0 ).4:=<850*&*9V~wXF;7=GPZahlmfZMDGOW^bT3 %Ltlopomjgd`_`cedccdbcaa````^\YVSTQG5((*&  #)12/0,%"   &:DHJLMTYP@*"!%,,+,*+,++,--00223456998776331.+,04466777764355752010%%*)(),/357:@?:7775279>@A@BEC<:ALXgruqmihfdaZVSLFCFHJE@8+!!(?GLJD?DGD@:88864<=:2-.,+)+,1CQI8%";P[ahijkjfgeecdd`_][]WVUWPC;:9ET[]WH-  +  #@f}ywssvvwxyzyrjZF611-*1/8@=>[ʰfZRTRKKPJEFGEIKLHIB90'$)3<;5#4aľ|ÿɨ~y{ztrojhuحyos}qY<)"#(**5@9()"2Qn{~~oecdipvz{zwstx{~_D:743157:>=8420/.4:ABA=3+ *FTWTRMHGIMKJHHJIHDDDGINQRQOOLKJF@<<;61-+**.03433452222479;:<@Lc}kb^L-+/5FYcc`_]O@*6RVA.6FLA48?RZMC?70-4JdqjT-  (=Rdiokjhfdddjottvsg^MC<>DFFEBBDFGFC?@ACEGGHJHGEFQXO?+ 9glK  +  + !"%--*!+?FMURXYZ[[YWVWXYZYXUTQPNMJJJJTfaOTZJ4-&**'.' 4FV_^WL>/#%-wqhlnnnkhea`_cdcbaa__]]\\\\ZXUQPQNF6+)+&&'$! $8CJMNOTZQA.#!,;?;6+*&&*-/.//./2345444433330.,+/36685410.0/34310/10#!%$#"&+0369@A??@=:8;?CEDDEHIBCM[fousmhgijf`URQMHFGIE?91(#&-DGHFEDIJKE=98886;<8/+-0/+*).AOL>+ /FU^efjjieeccddeb`^\]Z\[[SIDJJWgjg]L1# + +  'Ks~wodVF8.)&'+)0BYuðmYQRVPQVQGHHFFJIDF>K\WE<5*'9Xr~tjheipvz|{xrsvy|xV=5434479;@=8534667=EGC;1,.HTVQOJEBGJIHGGHHGECBEJORQQOMLHGC?=<<840-+**,.../02112469<>=@CK^ysUCBLC,!->Wnoh`ZQG5 +,5'%2-BfqQ   +  "# )./)+=EJRPWYZ[[ZXWYZ[\[ZWURRQPNNMM[pkUX_N40)..,/*.G[ee[H/*;GUgu{woiQF7--@cy\H=93( %,1:FQ^ho||^</imdinpnlhfcbaaba_^^\\ZZYYYYWUVQNMKE:0*)%   ! ":FDJMPVZL=/#!1IPJA0,&&,132-.-./032102123331.,.1576751.+*,,/0210.-)  "&*-04>@A@@=<;?BEFEEEHKHLYiquvpieejlg`TQROMKKKB<4*$$+3HEEEIMPQPG?777549:4.*.120,',>NOJ1 )BV^`bhjigeceeggeca_``ba\UMIMQappl]J3&    + +  +(Bc{}ul]SF6& *6@IV{Ÿv^UX^XUYTOPOLLMID>4(!2FON7Foĸ~v{}w||okı|}~yursw}wprupibΞvk_eu{|o^H511:HQOXgfUQJ<8D_wynjeipw{|{wrtvy|~mL900247::<:74225:=;AJLE;32#2KUVPMHDADFHFEFHIGEABFINPONMMLJIDA?;<951.+*+-/001355679EFDTbaU?(!);EDEE-# $.33./!AFNOWXZ[[YXWXXYYYXUTQRRRQPPP]ur[Z`P85.21.2--H]gnbI)&8HS`ijfa^KE>76Db}hXPM@2&" %)3ARet|jK*&e|kcglmljffa`_`_^\[[YYYYXXXXVTVPKHFC;521,$    +" ! 6B?GNT[^N=-"!5PZSK;4*')-/-+----.0/0/11223110/.14532/+(&%'(,/440+*$ "" #'*-/9=@??<;:ADEDCCEGOMTcrvusmgcdikf^SPPONLKIB;0$ '19JGGIQWZZRH?656329:4.+.232-'+8HNN9$%C?ENOG:59=) 7NUTOKFBAACGFEGJIGEDBGLNPONLNOKIDA?;;841/-,147888:;;;=>@BCDHIIL[sxY2*QT;,$)AO`mnkibYND<652/**##056;?H@L_igV<,''))&.5/-/26:<:;#$>Sbifeefeb`_egghovxt`TDCGIKLHHIJKIC?>@CGGECACABCHJHFA'M\    $!!)140#&8D>?HMVWYYXVTSTTTSSRQQOPQSRRRT_wxb\\N>;330.2,/I^eg\D(,8EIJF=510:<>>>Hawxoj\SLJMLG?:739:4,&&%# + + #$""/;CLSZ`cS?+!#7R]YRJA4*('&%.-,----.1112200.2.-,101/*(&$%&(*13750*'  #% $)*.:=@@?=<<@BCCABDIQS\kuvrplgeehhc]SNMLKIGEB:-+9ALKJPX^_\QH=643218960-0220,%'.2)# ,`u}`býunmopw{{wwx~}yxvqifgkov|z||woi}svtm\]ejt|qYD8,)+5?GC>BINY[UNPcx~qgbis{~zwtsuwz}vT?;57;>???<63.,08BHEIQQF759D4 =QUTNKGDA@@GFFGJJJFGGKNRQONILONKD@=;;84200059=????@AABCDDDDJIGIXowvxoV5/ZY<2,/IYblnjhda\YSKFABC;=7,&-476-*3AOY[ZMS`gjbP<;:87;@BFCECBDEHJ-)AU_c_^^_^]\\cegiouvrgWGDGJLOJIHJIHC>>@CFFDB@>@FIIGHIH("XT + + +  !$#,585.5FL=8CJTTVUTQOMPOMKKLLMKLORRSTV`z~j_WMF@740-2,4QekeZE/&*13562*  ?@CCACFJTXcpvsomkhhffd`[VPMKJHFC@8*1BKOPRX]_^ZQH>7642.6861/1210,'&)0@MF1 &=MYZ`bcdefgfdeehhikjljh`WQXYfqjaR?,'"!""  +  +  )D`x~vmY@*!(Alzrosromqvxc[gvtkigigaYY[]YI9/' -c|wllqllr|{su}}~rbXRI@7//28>IOYgu}~}~}~uרthqup]\ahrzlQ<-%"#,7BB?BO]UYVPQav{qfahs}zvsuvvypM<;9;7103.">SURLIFCB?>GFFGKJJHKJNSUURPHKPPJD?>><8522336:?BBAAAEEFFFFEEKHEGWl{}tqqjV<+2_`C@89Q[`hjc[YZhfaWMINTbopc_qbJMlyhdea_[KHOW^jsurgb_YUUUXT6%/GT]^][[[[[]\^beintqljYJDGKNPIJIJHEA<=?CEGDA@8>HMKFGIA Dy|{H +  "#  $-9=:7@QS=4?FPRSRPMKIMKHFFGIJHJNQRSTVazqcTLKD950,0*7YntthR;0-) #%$%,8APW_a\\jyui]XX]_bfpudYB*'U|~{sjhihhhgda_^[YWVVVWVVUUTTTTRPIKPPL@5+),*((**)# #$!!'++(%"(-4>Mamhie]ZVG3)%*;MX[][SH8/,/4.-++)(*'200-+(&&+)'%(&'#((*,.35963.&  %*05<@A@;9:6( 5IQQRV[]]ZVPF=8651/7983122.1/,''-SWY\_accdhedbdfgjkiijjcXTUUckf_RC.,)+-,%!! +  + +  + (C_x|}xnR:'+Huغi^WWSKKNV_cdm_Zeqqt{wqi`[bkf\TH/ 'Txkehxqrswzl_TB71%*6GV]fr{|vyuwlnhb^Z\coy}|bD,"-8==CTc`ZQKRcu~vkcjt~zvvux~fI=CGGIJID@>76468@HMPWQKG:239),LXSTQOHB??AIEEGFCGLILRUUSPNIMOMGB?@998666668<@BCDEFGJLMNNONPOMMXhstqolieXD5FZ]I;5D[]dge_\[[db`^_es~~|qrgXXZPBGO]l{{ihjifb^ZZB29JU[ZZWVWXXZZabcippmke[OIMOPOGHIID@>>@BFGFB?@??@CHKKJD @izw^J4 + + + !! $-7;?BBEZ_C9C>LKMMOMLIHFDBBCDEDEGJLQTXd|of\ME?=;73.#'FessrfTC;6+ !&+2@LY`feaclu~qgelq{vcQB4-H`~~uojiggfedca^ZZURQQQONRRQQPPNKKCN`aXL;71'!"()'# "%$!!$****/32@KS\dici^SNG<62$)4BNV^c[UNC@;8710-+)(*(++-*'###""$$'(.//7;:8:=;71& #*.4:<;<:;;;=?BCDDJN\elmnomhdceca_]YVSRNNNIA9.')3@NXQRUZ]_]ZOF>85533566420223/($&.:DI6  ;QXVUW[\^^gffdefilokjikg_XRV^bb\PI<6235840+*'$"    +F_}}~{siJ:7Jq˺}YI?>:0/17==9@KQNPLWhkqzyqkb_ipnfXI0=wl``guuxz|fR>0(  &19GUkw{tysұqjnf`]ZZbksyrW7!'7>@I[ld\ROUdr{{|{{}}ticjt~|xywz~cG>GJKLLIFB@8879358$2NWVROLKGEDDKFEHHCEIKKQUVSPOJNPMHBA@:98766668;?BCCEILMNOPQQPPONOYgmmgcbcbYMCKZWA74D\bfhgec_\QPVcvrYNJF@EIR^kqqkihhigd`^ZH;BQ[]ZVUTUVVVW]^beloljf\PJMQROGIIFA>=;@AGFFB@??>?BGKMME) Tyzj^YF + +  + !! %-7>ADHNa`E;B>FEFGHGECCB@??@ACBCEHKPUYby{neYLE?<:40+$  .OlwtkcVKGC8.+.1689AKV`kmjjqy~tbRC6/;Tyvliggfhfecba^YWTQOPPMLOONNNNLJKDRkqof[LA0!#$$! %''&#$&&)09ANYacb_VMG<2+'! "&+7EPW\_`YTMIEA@630,(''&,,/-*$%#! "$).8=AEIE?>;95-!$/1+#"(/3;====<<>>@DEEINR_gmmmnkfbbcb`][XUSRNOOJB7,(.;98=?DDDA???>?BFJKKA5 lg+ !""!$)0:?A@LUeaKAC@@@AABCC>>=;:;=>@@ABEHOV\eyyi`THE>;50-*%# /Rowpfc^YYVK@ACFJIFJQ_kxztptzrbSE7/1Kn}uibdfghggdb_^[VUROMMNKJJJJJKLJIGAWyk\D*!! "'$ +$'((&&$'/:CRWWRJB6,2)!(1>?????>@BDEFKRYdjnlkkhb``a`^[YVSRQOOOJB3*)5GT\`[[Z[_^_[TLB;744266642245540(!#.8F;*6L]YXRRTY[`begggjjjiilmh`ZQV[``\TOBA?DLOLHC@>:50+&" !"$"  + *G`{}{ufWZ`v¥vaRPGFR]_`dbc`ZZVG3*%/=?FKJJHJP]gkic[P:5hRQcpy~ziTA) +  + 5L`hlqngrvÎrglnc\^[X\bgkknronkjknsx~zfE%"1@P^fgYQKMXbhfpqrtxzrhdjt~~x]CCORQNKHEA@<>>BGMQTTM@?NNC=9$BMRWMJKKLKHDCAEKRTVV]\]\YTOLLMMKHDB@<;:876668:>@ACFJPRSTTUTTPPQV`gbXXTPMOQUV\YE**4I_ihge`WVXeorfZXaknka_bcb_\ZYWVZ^_\VOMNLNNOPVWY^bghkh`TMMPTRMMJD;876;=@BA?>>>?BEHIFC;6"ou1  ##" !#&+1=BA?@BCC>=:989<=???@CGOW^iyudYMDC>92**(&(!%HgmeeillnkbXYYY[ZZbkz{suyrbUF5+3Hhurz{~znf][_fihhfc_^ZXUSPLKKLIHGGGHJKJHA=ZxaG2)$ ''  "+**')+/2971*'#!  + .6@GKQUU[YXWVTPMF@7-(%$$+/45420./0351((# $C]g^I73+#&/6ABCBB@@@ACEEIOW]glnjhgd_^^_^[YWTQPQNOOIA0(*:O[^]\[[\_`_^XMD;653367864267540( %0B>4&0EZ\YRNPW[`dikkjhffgiklic\VZ\`_[TN@@@IRYWSLIE@;40.-++**% + ,Ib|}zr`P`qѾ}mf]VUOR`ighjkmljkeR:) &/27:79:Whg]PJGLW`dbmoprwzsidjt~||y`GFTQMKHDB@@>@CGJNQSPG9@@??@CEGLMHA;70 Q|V +#%##"$$*.4?C?6I\e]RJDEB@?ABDD@>;:9:=>@??@DHQY`n{s`TF>A=6.&')*-)" @]c\clty|}{uqnkkms|ux~reWF2$7Leibm{yyx}yjZWUW_ghhgd`^[WTRQNKIJJGFFFFHJKJI>;;;?ADFINTVWYWQF-(-@T][X[Z\^bdcbZOE;664476975489651'&:><0 *=T[ZPKPWYbgkmlhedcegjkgc`___`_ZRN?@CLV][XPKGA>851432/,%  + 1Ld|{yn\Kg÷qbacd`YTYfkihmuzzx|yjV+ %').+347;>;<<*1LJ'%"0BgiQ^nv}~p_N8$ +  + +  +  +3Ulmc^[iٵjdklbab[XZ]_`__[PMJINU^frxxq[@' &*('$(*7Tii[TQPT\bcbkmnqvyrhdjt}|{fPLWMKIFCBCCDFJNOPQQND7;QVJB7 .FKLQPNID?<=?ENYaju~yqg]UONKJIFHEC?>;97544479<>?BFLPRSSSSRRPNPZksj[ROIA?GS]edTAFLWdfgjfVJUe~lWIN[hic_bbb_]ZR]ec]YYUSPNMKKIIMORV\bglhbWOLOQRPPLF>652569;;<=>DFILLE<59.!%`}M)   %'###'$,15@F=2Haf]XOFHC@@ABDECA><;<>@A@@BGKS[aqxmYL>:?<4+#$+0691"&>U]W[fs{wuz~|rg[G/9Oc`R_swsv{n^JPWagjgdfc^[XURPNMJHIIFEFFFHIJIH>;Zt`L@2(   (//& )8DONMTWVUTTTTSROLG@9521259@CEFHHLOQSTTTSSTRJD9/$';Ua]QIE6.'%&+4:DEGHHDB@@CGJNT]chjic``_[\[\[YWTQNNNLLJC:-*3FX^ZU\\]agffcYPE;645568:976:;961(!09?7)$2GSXQIOVZdfjllfda`begifdbedb_]YSNDCFOZ`a^TOJC@<:77762.'   !7Qg|ÿxujXIqxndaeiklc`enplnx{}}x~zl3# !%",-164,&'+SZ8/>8CE``Vkvx|}z{~r]D- + +    :N^h]U]kxЪzibhhaabZXX[[][XUHFDEKS^fnt|}umM6# '+**'*)0Jeohgeddfgggjkmouwpgekt~|{x}{mYSZNLIGEFHIKMORSSQOOE8;PTF=/#$8LPNMOMJA75;AVbnqu}teZSOOKIGDGEC>=:86432279;=?BGLQSSTTSSRPNO[o{sdRPJA=CP[fnkaecbfbacaWQ`vzkZMP[gld`cdd`]]Uaje\XZXTQOLJHFFIKPSW^dkgbWOKLOQNNKF>53//268899;>?AC@;4.>4( @b'  (($#')%.26@G<-Jgh][SFJDCBCDFGFD@?==?@BACFKOV\bmqeRF98?;2&!#,4;D>..?PUNU^ksshior{ypnpyxqj_J/;Tf[GPeijpwv^KFTetvrjdeb]ZWTOMNMJHHIFEFFFGHIGF=6UvhaRB0$#! $-/(  !  :JYXW[[VVRPPRQOLMJE@><<<@CHLNOQSSTXYUTSQONLE?5+ '.?NJ;27@1-)')/6;FGIIHFCACEJNRW^degf`]__[[[\[YVTQMMMKJG@5-.:M]`]Y`acgljhcXOD;6466769:87<==7/'$ (4>>0 (8JVPHNUW`cghidc`^`cdfdcehfc`^[VRKHIQ[bb_UOHA?<:86884/'!)?Zn¿|upgUGwέofcdhnqqqpklmkdhtz~~D1'&! # "&,2-#,ZeD>QKCAY}]^x|{wusu{tfL- +     +  /Je`SV]bȢuh`cd_bcYYZYZZXTNGCDFKVajlrx||~{rkA.$(()),),Catvxwvtomlkhjknsvoeektvty{q_Z\OMKIHJMOPRVXYVSQQH:3/;Ecr~~tdXQNOKHDDEEA>:975321179;<>@EJSTUUUTSSPOP]t{mXVOD<@MWfu{y{tie\WY\ZYm}kn{v{}yurfYPPXfhdccda_\ZUdng\[\[UQOLHFFEFJOQUZdkjdYQJKNPKLJE>61/-.24568:877853.+@;12M ))$$'*'/38AI<-Pnm_`WHLJGEFGJKHCA?=>?AADFJMTX]dik_L@65@:2' #-5=C?2/=KLBRZenyycYZ^adit|}rcX\_dmz~{upkbN1?XkYADY]cirzziRAL^uymfdb]YVTQNNKJFIGFDDDEDDEFB:1O~{wq]E4' $*/+! +"'+784% :N`a_a^VUQNMONLJNLIGFEDEJKORSRUWRTVVSRRQLLF?80$ $0.:A5 ):0,+*.3:>EGIJHEBBDGLPTY_dcdd^\]^[[[ZYYTTQMLMJHF=3.1>Q^a_^cdhlomhcXNC:557787:888:>@8.)&"!/<@0!!,AQPIPWV^aegfedc_aabccdeffc`]ZUSLHGLV^__RNF@>;:95874-%  !/E^r}}|y|omcFHqͮtbaiuzvpkkpoquqlp{{~\>/- %*"'*%;SWRPNGC5Hxsbp|~|wnpru~|rbL/ +  +   + + 4RUVWL\~”m`ZX]cc_Z_[WUTVSPKKNRV\_afkruvwx{~}uj<%-.".Vuzwpknmfaemplebhq||slq|ubX]NJHIMONLQUYZXTRQNHBDLQG:((4GQQMLH>4,,1EWs|}oaRJLULIE@???=765545446:;=<<@ESTTTTUUTKVLUx_VNIDCIQ`w~ugW\_ZTZl}jRMT_lc\akquwzphkptxyniquolia^^WQMP\ab^\\\ZYWNbnf^_aZOPNJGGGGJOQTV[bjlf]TONNNJIGD?83-(),/0/-,34,*52'%247QY&  **%$%%&+3;EF9+Qrne]RUMJIJIHIHE@=>?ABBEFJMRVZ]efYNG<1064/)&(,')-/)'2CGDOYeps_OCBF@FR^]QD?HJR]ejxztlfaS<$;GslC5@PX\enk[JBUqxvafc_ZXTRMKJJHGDB???ACGGB<@*>]|r`PA2%" ##! %&#  +Jd_bW>" 8MZY_a\]ZZYWVSOMOOOOQRSQRSVVVVUVSQMNQTVUNLJG8(!35&,,%,*#6-+,.05<@CEHHIGGIEHLPW\\^b`][[ZYX]\\[[WSNLIILI>3.-;ER`bahhghkqpjbUJ>79:;8=<97889;<7.*(%-;>7*!%0AQTSV\Y[cfgffeib[[_ccadda^ZWTSQLFHOVZ[NKECBA=8?;60+&  ,=Rcr|Æ~~{wykiaFHoѳxi_inwyuswz}{}|]L?.,/)$$%(($%(2I]_[YSI9(@vrct~vhhlru|}tfK3 !#! + +  + 5KVdPGZܷmYSSYad_Y`\WTTSQOMOQVX\^_aemosruy{|tj8'$ ?g{{snlsmfcfnqleafp{nfjutbY[QMGEHNTWVX[[XTRSMIDGPQF8--9KTTPP@1"'7NcqvqaRMLNJFA><<<:7645556689==<<@DNRRSTSSTUYNZbZQLIFIP`u~ufTZ]\WZfpurhXKJLOWMEIOUX[b`^`ddfba`a`a^\`UURJEJW_d_]ZZZXWM^jd^_`ZMNMJHKKKJNTUVYagoi_URNNMFEC@;71-((+-.,,+-,"*)#$335BG  + + ++&%&'%189AH;&OokbZPSNLLKJIHIF@==>>@ACFIMRU[_feSC>90+,.,*&&#$$'1>B@LSZfxv]I<0*)+2?KH9(!/=R`b_hs~yxtlecXC.7GwtF0/9LS^e^PGD[}psefc^YWURNJHGFDC?>==>BCC?<5'6Km~ynbXG6("##%#!#''$ 0EYrwY1 5N\\_a_b[[[YXUQOPPPORSTRVVWWSRSRSRSSUUSOLHHD:-%$4@?$&.90--/049=BCHIJHHIHIMQX[\]_^[YZZYX]\[[ZVQNLIIMK?2++=JUbbaikklosqh_OF=79;=:?<97889:<5/))%%2::2% ,>MTRUUTW]cefhfhb[Y\abbdc^WUUVWTLDCKQRSJGD@B@;8:84-(!  + 1G`p|~ă~|{xtugg`GHpϵyjjlrtxwwzjVA;=:0+(+./25FUbca]TI3"9oqiy~viVajty{scQ2  "$$"%*.-+(#  DUl_HEkͨkVONVae_X]ZVSSRQORTVZ[\]]Z^eglmpsv}}vm;!%Uxrgbdnkfdiprleafoyh[\hne[ZPMKHHLRWWX[YUQNOKHGMTQE835APWRKH3 &C_qpty}p\OPNIHD?<:::8656657789;<=<=@CJMOSSQPPTTO^c\TPMHIKYk||wmbUY\\YZ`d`[TMJMIDF<36:==?LU]ab`_[\_UPXPFOJNNG@DT`ea^[[[[ZM\c_[\]XNNKHEHIFFKRWUW^bni_USNNKCBA>:61-(')**('&$"!!113 3zo,   +  +!++'&()'299?B5#Llh^VLQLMLLKLKLHD>><<>>@DIMUZ_bf^J756/& #$&&&$!(+1:??GKPZmfI6-#%1. 9Zli[Z\lu{ursmga`WE4-ByzH+ #:AMTNDBCb{hnifc\YVROLIGFECB>>=<>@@@><0(/3X~}{ywrcP@*$#'#  %((*1>Xuh> 3O`]]]]c```_^ZVTRRTTTUVT\[ZXVRSUYXZ\\YRKIGGE?512FLG,"  )-08720/..158@DIKLJIIJJNTXZ[[[[XWXYYY\[ZZYVQMLHHMK?.&/DT\bbdnpnqtundZIB;6:?<<:98:;<60+(%!)5><- )8JTRQNPRW\_bhggaZWZ_bbd_XQORW[XPGCHLJIFA>>==:5542.)" +%:Vm}}|z{ywvuuopce^EIsɲyjgoxvx{{u_URQND<8;AEHJPW]]^YOA6);a~ts{sf]S`mz|weL7" + "(),./,05::962)'$#" /<\hdZiƟiVNNWchbYZXUSRQQQXX[\]ZYXUY^chimpt}}xrC)"$Gsyf_]^gifekqrlfcgnxwbVUakh`[HLRTSOMMWXZWSONOJIKSYSF>;BMTSI<4 /RkytsuxpUJRPGFA=8877577787888;;=>?@BCEJNRSPOQMQWme\UROHFFKWgnpiaWYZ\[YZ^a_YTMMMG@B:379843;NcijiicWZA8QK7?BJOI@AO\daa__\YWLU][WXZUOOJFDEB@EKTWXXZ]hd\TSONLDCA>:730('('&#"! "0144wf!  + "**((**-.5>B8*#NlfZQINJKKKLKMLJC==;:;>AEJU^dfedTC4.0)!%),&""/5118@BFFISbu}nW>/( +  +FgyvdWQVaqz{vqpgfc__VE5#:uxH*-19DFCABjxglkgb]WUROJHGFECB@?===>=====6,G}|~yux{}vi\E:*$"(/DO`unR7 +0N][WTV^_^```]YVUUWWWXYW][]ZXX[\^_`_^ZSMLHFFE@?DMOE0#(22%!3;?=01/0//27:ADJMNLJILOSVYZZZWWUUWYYYZYXXXUPLJFFJH:,#6N]^cditrrtsqg\QB<859:77644686789::=HSYUOK]YWUTW\__[VKFEB?A;8>@=410Lhory{ubV-;?06CMTPECMZ`aeff_WRKPUTSUVQPOLHHIFADLW[[XXY`^XSSPPMEDA>:841*))'%" #!+04 ?t+ +  #++)),,5(/DF-&NmgZQHLHIIIJLMMJB=989;@BFN\jqof`K@6/)! *4335>>507DIDCGO[ju||zx|sZL<0'%1>=<:;=?KG-<~{xstwyyvqaQ9# /?[ds~}jZ>*  )HXTNKMVWY\^^\ZXWWXXYZ][[Z^\]`deda`_^\WRPKIKLJLOOMC/*3BIA34?DD<,/.0245;>ACLOOMLMQQUX[[XWUUSSVXYYXWWWWTOLHEDF@5*#?Xc_adlxvrsoi^SI<8658<@B@?=;;<==<93-+(%%"$'+2520,*0?JLMMRRTUW]belg`][]^__\VPMMNPVPIGJLHE;84476401231,($$)-(    + 3Kct~||zwtrpokfh_eaGGzͷt^Xaejq~şjUei`^\USXYZZ]SQKLOMA746:@YstrsfLG[jkrvkV<$ )4:?EGKOSSQNMNOOQHB93/*'$"?TZU`zhWSV]de`ZXXXVTTVYZ[\ZZWVTVW[aiprsw~XE(!(=ZYIDR]^`fdeinolhiknt{vf]VUZabcdSQPQPQVY[]`^ZVVWPMR[[QJJNUXO=)Ieqttrrtw|~eOIOPHA=944532578899<<==@CFGGDBFLOPNNRNXsdWRQNHC@0*+6ABEJ[YSONQXZ^]VIA@CB;64;@<617Wsx}~e2!+NWZTFDNZ_bfjjcWMJJKMNPQNNMKJMRRLIR\aa]YZ\ZWSURROFDA=9630+*)'$!!#)/5#Fs.  + +   +$++(-..8(-FF(%KjeYRIMIGGJIMLMJA<:78;@EHRaoureXE@90$ )5=?BHB3,4ENDAEMV[flwtqs}tfRMF=1##)7CQZgpuq^M@EQ_hkgd\^^[XN=.)>tp?##!2DIC;89=ARR2 3s|~~}}}x|xwtstxyrcM6&#?<:50-*('('(((,/3/.2>>?ADJKJE?DJMLJNSTZwgWPONHCB1 +5DS[[UPKKQU[XPC<;>=4-+07764Bbz{~Z4(;^a^TFCN\`dhjjbXNHEEHKKLJKKIKPVVROXdjhb\[]\YVWTSPJHD?:741,,*($" !'*2#,?l^'  + +   &,)+.124.4CA-BdbYSKPKHHJJNMNME?;889?CMTalrl`RB>7-! + *CNX9'_k{}{zyyy{{{vqosxypaP?0$ .HYba\SNKA7.  4PXOF=59;@GNTVUTTTVVVWXWTW[]^^ac_\\[_]\YXONQRRQRVUN@8@P]_X[WIC;+..348;ACCFKNPPRSUUY\][XVUUSSUXXXUTTUURNKHGD?4*-6Rirlnprvrnh]SGA<8899;;?C@@?==>?@=;71,)())*(&%'*.--2=FILPQRRSUX\_fdb_]]_^^YSNJGFIMKHKQOHC=:769952023/*)+285(  "6Ni{yvtokigebfaicFFv車k`VS]dgsȺgRfkeja[XVRNT[VOJHIC:5206@Ok|wmYHAATinvo`E+!+1=CKQX\^ckrtmcYWZ`ec^UKE<60&&#!%0GKIGRʺpd]]^dggd`^WXYXUVY]^]\ZZYYZWX[clsxxy~~m8,3#!&=OZdecbeikkjjjjlpv||k^SVXUPNX`sh[SQRUU]_b`\UPPRNOVTKIPHJA- 1Rfpsswyxvxu`URMEAC>9553224887;;>>??BFLMLD>@IJHIMT__{iYQQPKFD9 +.G]^_]TLJOTWPH9563/1($*069:Gdyuzb7/JdjhaQDCP^aggjhaXPG@ADIIHILKKJQVVPT^kolf_^_^\XYUSPOLHC>;76/,*(&#!  "&(0')27TK!  "'*+,044.6=>;1%>__XTLRMIIKKOOONHC>:7:?CQW`gmi]NC:3(  .BNSZWG3'-:AC<=DHIS^ifcbgfZLJKNOK=3--4DUZVRRMRV[gqnfMD +N]v{||zwwzzsw|xpmqw}xocS>.""4KX_XJ:4/! 8E\`QC5()%)2;BEEEQQSSSTUUVW\\]Z[ZZY[\_`^ZZTPRTQNNUWSH?DT_echaMA9,,.147:?ADGKMOPSUVX[]][WUVUSSUWXXTTTTTRNJIIF>0)1;Tnxsutrome^QF>769::;:;>CA@?>=>?@=;82-))))($$&'&'(,3?FHJNPPPRTY]````a_^__^XRJGFHIKHHLPOG?@<;9:;744651--28<5$ !/I]sutrpligdc`bfjcUIzӡoWVOP]hr|ƤfWcdga]XUTUUTQPNKFC>=?:?=;LestjU;3D^ptoiR+&3?JNSZ]\`lsvvpfca^_dcaYPH?964-&# (0*V]]WKÏcge[flqpmjd^a^[[\]\\^_`^^\[ZZ\]ckqvy}?,0)9NX`aZZbhggjjjjjmptvug_\SV[VNMV\sqnc\ZYU[_cb]O?8FTXQIKKGG=/ :Yjqtqy|tpxuc\RKJFG@956521798699;=??BEIJKH?AIJIIQZ]efVQJKLE7& 6Ra^[USUKIVWN@,%(+-* %4..?SalhlyaWlw~_IEFCJ\`cbfgaUJB??>ACDFIJJJOUWTVboqoi^W][ZX[YXUMJFD@>852/-)('#! "$%*0@C76!  +#-.)/3267DI?40&9Vc]YSMPLJJJNOOLKFB>==CGS[bb^VPG652&  +:NbhiP1&(4B>>AACGLQ`YUXa`TIFKPPJ?5.1AVemj]OFGJPZba_H>9BMRTTQMHA6-&"'Hol< !1@B?;kkcaZURNKHEDFGHGD@@BF@>;847=BT_=(Ztv{wv{zuyttvsomnpzwrkaO@4"(?OO@/  ++ARgibTG>2%""'.228>CIOQQPSUZY[Z[WURWVWVWWXWTQOPSTSRTWUPLQ`lqqkXB2/2-.159=CEHHLOTUWW\\\ZZWWVSTTVXYXVVSQQQOJE@JF8*&5QcmyyslmnfZO?62347:=<77=DCC@?@AA@=940/.-,-,'#"!#(+/48CLNNPMMOUZZWY[^_[[\]\XSOKGEDFHKOQPKGABFC=9432579;;;:7/ + *8Ymusromkgffdgloj\QzдeOWSYfs{ǣgVcaf]YSWX]ZWQTQMHB@=?=@=;IbprgP74Icssf[B""+5?HMPV\`hrrnolkjgc``\WPF<4/,)%##!%,63`oulV~ùvEVegmrvspmidda^\]]]\``a__]\Z\\`gmswvzE%(' ;PX]`[\dihhkkkjjloqsw{}xla[XW[]WNJPWlorlgc\VWZ\]XOA;PZ[PGGD=5* 8Wjqtosrjmvc_WMLJKB;66522677679;=?ABFILLICDIJILS]cq;o_NGD:9-??@CEMQQOQUVTZfrqnhb]][ZY\ZYVPMJGDA;852/.+)%# # ',5FL<4$./*1439APTB4/((%'*4?CE<67CRUUSNIB9/("!$>a]32@D?:gkb^WSOLHDCCBBDCA???@<;7426=BO_AOnuxuszwsuppqpommmqpnidZNH2)-;2( &4DUgtytgZRL>0((+00,/3=BHJKLPTXUUQPNMKJKLJJJLLJHHJORROQUWVTYentnaM6,-1,-1389F\kn`I49Tmto]H,!"'.6;?FLU`jrngfkrspi_Z^XOC91,*$#$)+*18;@CGJMOJEFJLLOVaoɫw\KA265+ (DX]QSPQTMMY]UA(1HJG@CNYZcsuptxy|bL41CTXW\_chibUI?=<==?BCNUYVSVZ[cq{vlec`_\[Z][[XTQMJGD?<:721.,(&" $&0=SZM8  %00+245?NbaE./-#A\ic`YRTOMJJJLLIIHDDDGKNSTPKB=<80-)  +;M_opZ8(#)389=>>?DGJHJS^]QEB=7221115?LV`c_VNG;1--05108GUUOJFA70)$5NJ(  0@D>9b}kb]VROKGB?>=>?====985410/5>DN`F$ @cmronqqjokkmoooljdefffb\ZI;'! +(6Naq}wg][XK;32550'%&.4>?>:<=;97::<<;AEEEBA@BBA>:51/.-,*)'&$#%&%)1;FMOPLJIMPSSQRV[][Z\\YVSPMJGEIHJMNMIFLOQH<10326>IQNA7# !*7I[rvvuutqponnruxvspӮfac^Yap~žcSaad\YTYdpri`^ZTMHCCCEC<8ASaiYB4DfvqdV9 $ "'-15:ALW^cb^_jsvqfXNYTJ@71/..,-/22;A2% 6[pttkonqǭ}`baTQPPE<66543121247:=?ADHKNPMJIMNMS\gζu_K//74(1K\^TVTSVLK[e\J.+D?605>LR\jbZnwop[N:2BVZUY^egg^QI<;<<=?ABJT[XUZ`do~pfcb`]\[^]\YVSOLIFA>;9620,)&!!$%3Gcna@  "&0.,46;H_qlE+-/%C^ifd^VWQNKIIJHFHHIHJKMORNF;2.2/-'!  +9JZkoZ<*!#-/17:;=ABEFKU^YK>873.,-26/8ERev~y`D-!-/;KVOD<95.)&",=9! 0BD?9\v~oc^UPMHC>:8::978:940,,,-/7BIPcJ' 1Xfjgdjhdfgginqrnh`aadedbb]M6  !2?>?>DGGDBAABBB?;52//.-))('''&("&1>IMPPJIILNQQPMQW\[XZYWUUQNKGEIIIJNMIHQVWK>12604=MWQ<, + '3DXl}wwvvurronnpswy}~׽dR[fham~ŷ^Saae[VQT_lqjb]ZVOIGFEEB<8@LZaP@:Rt|m[N4&('+%&&)-38;7BNkzwjxz4%_y~yyxvqmhdb`][\[ZXXWXY[^cipsrps{d9&52, + +C[\Y^bfimprsnoqrssrpic^[\_bd`]ZRNLMNJOSWbmqoc^WRPRTV\_WKA<1$3Vhlihq|ϵde`WROOF<675610/./35;@CJSZUOS\auuicb`]\[_]]ZVSOLIFA><850/+'$  %"3Kn~sJ$   + +#)//.6;FYq}nF--0*F`khgbXWRMJHGHFDHIKMMNOPNH=1)')+(  *4BR`hX<*&%'.358=?CFNX^UC3..,%#*:K[essP,+/5-+))(& $/+0BD>9Vn}rf_WPMHB=865663455/+&'*-2?BJTVPLQZ`|mida\[[_]][URNLHF@=;831-+%!! 3OstM'   '+112>FUojE/./+E_jhgbZWRMHEDCBBEIKNNNMKHC8.%#%'$ &0=A<:DJ>4,%!1EB?PdaXPJTURJHKT\]_a\SF:3,/26:=>AHRUSXds|rmg`[[Z^]]ZURNLHF@=:820,)$ 2QszjJ' */457EPfbE50,)E]hghdYVRMGBA???AFILKKIF@;6,%""#   + $-5AGVO7& $*-18GTYL7&+%"1DT]cfedd]UE<1" $56=FJD;7/)"!'(# "  -;=84BZpwrf_XSMG@:5223530-,+,+/4:>DKPMXG62UYUU[WTZWZ^abddfhklic[WY_c]L4 */8Lj~u|{jXL?1)3FX\RJG92*%! &/8FRVOD;+&$*066227=HOY_``__^WSPLHA7,%'$)*/16:@FMRTVYY[ZUTUSSPONLKKLMNLJKLKGB?@BB>/'*,6HHB:1*')+)-16;>CDHFGFHIJKHFDDDFEEA=630/.-//.,,)++**7IQIFECFIKIGGFIJPQPPQRRTWXVRMIFDCEIMOQUWWPC6.+ ")+" +5CO[hxpnnljhedbhpwzèg`hnqum}ǽg[gdcZQOOQUXXXXVWUTSOLCBFINPSZC?Jf|znh`_[TPMHA@BFLQTSSZH7'&9PccXI4!)-2:DKQRPMIHEBBHM^\`e_cj_) 4n|zxunjd`^\ZXVUQOOPRSVW]empqpv|Q39#3Ymkjiopkjrxywvyxtoic]VRV^bc_`\Y[_cfgd`XSTWTMVTPKF<2.KUWLA=;64&*Hcwâ}bVWTDD>;:995/+*,.158<@BGKOPTSRTVWZexɇ`J:=CFP]YXPJHAH^kswoc[SOJPOOUPLSSG<3$)?;-ATF:@COMLJKMV`_`_YPC81*-16:=?AHPX`ntnia[\\^^\ZUSOKIF@=962.,)$!6Trt^E(""" +  .488=@EHJJIFB<:4-&"  +  #+2=AQK5  #&(1BRVJ5$ "-2372% + 3?>@FG@856,! "&&#!" *684/:Rktoe^WTNHA:5213540+(+,04:=BFJLHRE:'MQOOUVQVSVZ\\\acdfiha[WW[c`Q8!$/49JbucjePDKU]^VJ@/("&-5735=FTZbggb__]YURNE9-(&&#'+-27<@GORTXY[\]UVUVTQQOKJIJKKIGKKJFA>@BA:+#)(-;>:2+$$&*+.3:>BFGIIGGHJKKHFEDFGGEA=730/.-11/,*((+++6IPHCDADHJGFEFILOONNRSSUYYXRMIEBBCIMNPUVTNA3(",3?M]ht~ooqqljggimt}Ɯy]btwrjuw¢i\hejeZVVX]^\ZUWYYXSPND@EKLJNV62DgwlekkhdcaWK@ABFKMLHFKD?7/'%(:Uqzr^@&-//0247798=EMTVVMP]_QNURN% +>s}wspnje`\\ZRPONNPRTZXXajstszĤ|^> &7WtpnstrsqsvwwwzvpifbXOPZdc_]]\^aabce^acc^[]]YRLF@86:SZWJABFHF=2&:dĭcZZRD;=A=40/1/.00358;CCFKPSSPX[_]\f|ѳbJP\XUYZVLMQFDRimqokdbb[\_bffebcO@6%$@5310.3DVWPMOOKMTZ]\XPB3$(1:;=@EJFQ^rзsoiea__a_\ZXQKIJGD?951,*(%#!"#"'Cc{tZ:(*.#(0%-7;?A>Ji}SB<:4&AEFIJEB@9751+$  ".58BMF, "(=QXN9)    + + ?]dSDAA;-#$++%!#'%"%" %00+)0D]mmc^]QKFA>943461,)*/2;>DFGFEEDHI:BMMJQSRQNNSW[_decba__`^a\bcR4 #5@DINTMJB3" 2T^TOUNOQOMMLNORYad^NB4* '6CS^koha`ce\Z[VE81(( &"('',3>CGGLQTW^b_Y\YUUTTSOIFEEGIHHJJHC?>AE@<84///3584)#"#",/:JOHA=EDEGC??CLLPPPOQQUW[\XSKF?=?CIMNNPMIGF;#  +   *-@P^itztqqwlnppmllmoszǽy^^iqrrxuyţhZhgkda\[^acb^[[YXTPMJFBCHIEINB>H_kfdhnheda\QJFEB@=95346:><658E^xzhM4=:4-)&$$ (2:BKV^OLSWOLMDB!!K{|wsolhc`[XWQONLMOSUZYZ_gnqr|üuD.  + + '>^unmwwustsuuwwwuqid^YSW_fba__^_```bb]`eda]]]`WMD927?OSSG>>BDLFCA@7+!-KrƵiXXQE:Pdwqigcbaa`][XRLJIHD>940-+)&$$" !$%%"(Dc}{aM;/*,36,&!!&&# 0;8<@FWysKDA<5*@EEFEDB?;973+%  ,45>GE4! &5ISP=.*."'&1TqyeNA:/##('!$'&''! "15-&*=Vjkb]ZPLGB>:32351/-038>ACFEEDDFHH89EFDLPMNIFMOSX]____]^^^^UXYK3 +$5:611300,# 3R[SQWZ]][XUUVTTY`c[OD91(#!"%-=FS[ehc`_ajb`aZF94)'%#*,/47.##&(%10.,,/4798=@DGJJKJIJKJHFIKJIHHIHA>:610/2583)#!##,1=KNGA.(7HRXWLDADGHLT^e]I8B]rVTSH;:<95224544468=>BEJKKNX^\Y]h{̵hOP\MJGKTKDIU[fjiea^_enrww{~vpg_UJHKC9/)'-;HQQSVUQRW]UYR4,3--*,9BA?AdŬ{qljdccdc_]XTNLIHD?:40-,*'%'%##$&'%&@^~lbU8'2=9520155/% 4@79@Pjd?EG<3+;R]Y[XRPMHGDA?<=@BBA@>>=9762,%   +*0065*##" $$&% 290Mdjc]WOLFB=931255548<@CDDDAABCGFF8 2;:8BHCC?=DFJNSTVWXZZZYXONJB2 14+  9RXST\___\YVVTUUX]`[RJD<63.((+)+.29ALSVY]^_^]]ebcf_NB?4,).*-*.39=ENU[[[X]bc_[XVUTTQKHGGHJJIGBB@><=@B;3,#%&%!*.3345=??BGGGHLOQNLJKIHIHJIIGGHGC@<94210683)$%((26BNPH?89@JPI?:>HKLNMORRUVX[YVQNDBABFGJLKIGGH>%  +0/9IVdt}|vnhdc_UQQNE@9548:;?IPYh}jkjjlptx~º~nfchqtnoy½ádUdjmafccdefhghd_ZSOKJIGFGGEFGUVRKIR]`c^ZY\]_^UL;+$7FF>:CSFF@BLF>APXbge`[W_fptxx~{zrid]TLL@4.-0:DMQWZYUVX]W`Y1")$!#+7<:;::7630)" +  *,,,.7A7 + !5NWOCZjL+0331.*/;LWjsvh]bunR?4*%% "!,4/(/E^jg_WSNJE@;63578::>ADEEB@<<>@ECC7 .743>A?<75<>AFJLNNQSTTSQLG@80+1% -CUXSV^^^]WUPOMQRVZ\ZUNJFCB>89=>@BFLUZ\YVWZ[^]\_\aieXSS@-&*+./4?CEFLPXZZX\aa_ZURRRRNGHFGIKJHF>==<<>@A<3($')'#*08:::AG@EKMKKNQTRPOOLIGHJJKIIIGEC>;9411895,(*,,5;EORH=31:HQL?;;HIJLLNRSWXZYYVRPFDDBCBDFHFCFG=$  %! &7@CIPYbloqplnqrold\SLLMLEBBB:2,)((()(-/5CWmkllmmrx}tidgnlt¿ȩjWeipefeeggiiihe`ZTPKJJJHGHIIIJNI@?JVX[VSSVZ_b_TE6+'')1:HRQIEFTeu||n^[ZYVQIC?889:;@HMNJPUQQPG;:875566567;=BDGEHNX[ZVT]l|ԶM26FFF>;C?9NV^`]ZZYc^`S. $ #5Iewolgffdca^WUROJGC>940.-+)'''%$##$%+$):TyswZ=;81857>HNH@:* +@H>>Ig\6IN9--9KQNTVQRPKJHEC>=BA=:888730/,%  + + "+,(#!)6/  1JXSKavaE78KLTRNIKQ]gztim}w\F5%!#!#)& !)*+#-ABCBB=:778;@@@7" ,41.6:851068;?DEGILMNNMLKD:1*#+" &*31%#+/0./8@B?>DIAEMNLLNSVVVUTOHCJLJKKKKIGD>;:8419;70+-/05>HNPG:-(2CMK?;;GHIKKNSTZZ[ZYUQOGFGCA??AFFB@@3 #5;<:?LXVLNPSPOLMP[ab_WNJGHIGCBB@7'!(3DQXlmnpqv}~qkoowּ}_cfpjffjkkjllgd`\VQNLKJHHJOLI??=@HKS[]XVX^ly~td`aa^[VQMIFEFKOPNNMUWPPUPL?Hdx|yuplifc^XSRPMLJKLMPRW]eggjqwz{ݪb" =ezzmw~xsoqrtrqtwunha\^fnnkifbcabceeffbbccb_[VTLA2&%7M]\ULECKWd~ϼsZRQB?<986656667;>CDIGHQ[^ZTVfzҲV4,1DG@:?;7;=EOXYYZ[^ckosswyvrh_\WLC=60-,-4=P[ce`][[e_P:"'=.-Cszpnhfeeb_\WUSOIEA=63/-,+)'%&'%#!!"-&*7QvxxjTB1+5.3/! 2AFB@Qs\6EH3)*4DJJRVQPQOLJID?=BB=76442/-+(! + + + #**&'!  +@OQPbyjWNJY\gfd_^ain|tnuyaK7' $#$"  )%'-)+2I^gc\VRNKF@<:>==?BB@?==953259???8! '1/)--+,,,047:>AAACFHIGGH@7+ +49:?HOSTUVVSPKGFHKKOW^a`[VNKHFB?FNZZ\^_``]XTSTX]acffjnhbir_>2=:3-'0;JTXWVUX^cccfgf_YTUWWQGCBEHJHD@;:9;>AA@?/#'4<>=;@EFCCHKCHMQPOQTVWYXWOGALMLMMMKIJC>;;963<><312245@IPOF8(")8EFA=?DFHHJLRV\\]]\WSOJLLGC=<=DED>8* %7JLF>FPI8:9876598?HQY_b_`[ZZ[\WTPLKKNOSQU^eeegkvtdfdb`\XUT[XWWZZVSXRYZRSZVUGRn|ywsmigdb]XSPOONLLMNQTW]ejlotx{{֙X0 =[t}v~voiegikhimrofa^_gnsqonjbdeefhgggeca`a]XSOD5*&+?96:9>FMQTXZY[bgoprrtlc]XND?62.*)+8EUbjha]][]\C,)1oc_sŸrqjhgfb^ZUUSOHC><52.,+*(&$')($! *%)6MuxtgH.,0.3BA><99632158@AB9 &20%%""&'(-0149<:;=>@BCD@:3$  )16825:BLRSQMJE@>?DGRYdjkg`ZSLFA<:AK^`bbca_\RQRTV[afpnoogbm~`BG_^PF79=GPZ`df^egdcghh]WQRUUKC@BEIKID@<::<@BB?>,#.@IJHGHIHIJPQLORUVUTSWWXVUNHCKLKLMLJHJB<:<;85=:977778=6279=DGJNSURTY`jmnmkbYVPA760,($"&8JXfmjba^\ZcH6?)>ǽwsljfeb]ZTUSOHB=;41-++*'&$'+*&" )$(4MuvvqL.-/.2:CIE<60#)5>?;=<=>BC?:64330047ADE: &31&#$%&*.037:998:86>IX\_`_\ZWOQRSUX_euqpnfcq~eymSQPQW\acdggb_befZQLMRPF=>@DHJHC>;98;?AA=;,'5IQPNOMKJLOTUUVWY[ZVRXUUSRMHCIJJKLKIHJD<8;=;8>BC=88757BPRPH7$#3?ACC@?BCFIOS[[_a`]XTRTVQJA=;?FJG>4+!#*8GNJDEWQON?(!"-:DRbvvw{{uuvr^L*#  adhnvƿwaT[q|SUuceeknnggigff`ZUSSJMIEHMMH@@BM[gkihfhed]VRPT[_bbbbT[djkkkmsw{sdfdb`]]dlklnmmkihg[XXTW\TNFMh}|xtqmkgba^YWSPNLOPPPQUX\`gkosx|||ٻ{i^amtx{ume`bfe`acgh_W\gruxxvpnkffeeffggcca]]\SJ@3($)5FZtºhN>GIIB>=>;::9:?BGINRW[UQXgxͪo;!7:=8557798:861&",6>>7@cS&/-%%/4;ILIMQQQMIC=<85/*'#""   + + "'#  -BV]\ZY[agmrtxyz}yx}|xzwkT<& # + )4EUM- ($))%&4ISSSONJHD@=>>><;;97543335;?GGF?& -4*#!!'.4679;:98/.@BA@<7311ARQOK=." #+8@CA??BCEILPUXZ]^^[ZUVXSME?==BFFB;:>9DZntkWJHMNI9$&.=QnsV:0$ `cgnv~übLOhʶ͠qKPpebbgllgeggec`[VUUMMKHKPPKDBBKW`ca]]`beb]ZV[aehhhi`gptqligfkr{yjcbfouvy}wtrpollleXTURVYQE>Fb~||yuqnjhea`\YVROONPQQQRVY]bgkouz||}ֺxollwrlgdegeccfd_Z_istyyuqmlggfffefebc`\\ZRH;/&&.;L_~ſvU@CDBDABGSWXUQPKD>4-)%$%$+7JWinpne_[\^dXRbgoɿwkhjkgcaXTNJEB<:41-+**)'%'((&$$$*#,EhypcI2-2=>>><::86656556;>FEF?& ,5.#!! %,357:<::=BA=3,! 3=7/'!!4N^[PF>;@FKRV[enoopnie_VK;1/3@LUUWYYWWWZ\^bgkvwxtom{}ǹvj_cjwxobejZUOPUTLDA@DIJC=<778;>@@>6.2?PXWTPNKKOQRRPOPTZ\\Y\ZZZUMNOMKJIIJJKIC<9>?B@CCA@<72/0BRTPK?4(%%+5>@A>@ABCGIMTWZ]__^\XTTPLFA>=;>CKPW_]myXA221-'  #+5BY|gB90(  _afnwy]Xkٵs^^y[@Hhg_\agjgededc`\XXWQQOJMQROJE@FPXZVNSY_efedadjmmnprqxyogc_fpva_hy{tpoooaSOPPUVL;5?[u}{{xurolhfc_]]YUQNNPSTUTUZ]`dimqw|~}¨~snqmje`_ceb`^\]\bjrvzzvrnmhghfeefecda][XND3)"'4CSfŰc9CGFBAAA=>>>@ADIMMXa_VR_tƓ\7855510012148;=>=<9:=FHHECC?94-'$$$&'/>Satvuoe^[^^\J8CkĻ|niikhedXTMID?<:41-++*)(%%$%&&$"("/Nxznl\='5BEADGB64)&+7AE@FFKOQROLF@=40)#  +!(# ,Jfh_UOORVZ`fpwz|~~zurojssgR:'&,37AKQP<=1$)%!#1ALMKKJHB><<<<:998789<<;;=@FGG>& -84)!!  %,1459:::=;5)$ !7A:/$,HZVJIA?ELPTXX_fhknokje^TD701;ENQTWXX[^adeinqz{|zvuɳlejvxpefjb\WUVQHA<;?FID@>999<>@?;3.6EUZXTQOLLPQTQMKLRY^]]`_^YRJNVNKJIIIKLKF?>@ACGKPRX\^_`^YTOKJGEB=79BP^lx~|O1&+3;GcsHC<5' +`chpyv{‘gKCEYUN@7Eac[YZdihdaabb`\[ZZTQQNOPRRLD<=IPSOKOU]bgnprrtssvz~}qieditz]^gw{vqonbUQRRVXN=7@Zqywxspnkhec`\[ZWSPMMSTVVVW\_bejnty~͸{ib`_\Z]_]WRSX_gnrtyyvsonihhffddcab_[XTJ?-%",>NZjʾt>CDEDDBA?A@AACGKLNUZUPThحrD768<93+'---036879777==<:::73/*&$%%(*5F[k{|xnd]]b`M5'\slkmkihZTMFC?<:52.+++)((%#$'(&"&,NzpogG(6CFCIOK<4,'.;DG@=B[u[/$#&)9ADJMOPOKEA;2-&   )% "(FhlbVMHHILQZgosuuuooomjgefoocN7(  (4AILNKE96&#*(!%6EGIIIFB?>>=;:;:<9;7.)*178::==?@DFKOUY]`aa[TMKLLJG=9:FR`tuE%)2;BPiƾǽ{OLF>/ `cipzýspshjŞqRMUV9,.-1BTYWUXcheb_____\\\[VQRPOPSWLB78DNROORUY]dnt}{yvx|}rkhhjrkZZ]els~|uoldXVVSW\UIBF\qustpokheb`][ZWURPMLSVXYYZ^acfmrvzŧm_YYZYZZZQHISbkppsxxurnmihheeccdbb`[XSE:+#$3HW^iʹMFCDFGECACCCDGHKLNPOKP`wS0-5AD9,$+'&),16696647541430-+'$#%(*.8I\kxyulc]^cX:%-M¶wnlnkifZTNGD?:852.,++*(*'$%()'$#%DouphM36@DENWRE6-*1=FG?:>ShyZ2##%3=@GKMOMIDA;.(#  +   "('  !!%>`haXNDAAELS^ejjiia_][XWY`lm_G3)#$9NUOHA;71"!()#-=@DHIFCAA??<;==@>?AGGHEDEHIF9$*;;2*'& '+-*++% ,2)""),'!1FJCMNPLG=?EQ[glomcYTPNMG@<>DDDFLOX^`dhlnprtxz|z}~ҹ|md_^\YTNHHG?:9>B@=<87678851.3BT_]YUUTTUZ\]\c_XZahiiimofUHMUPMMLLLLLJGB?ACEFKGC>9."!AIRdĨ~H#'1?JZuʩWSME5$ bekr{¾vrxhejsPO}ȟy`]rv?&)+.>CLUSX`ea^^\^^^[[[ZXRQQPNSYL@56CPUTTVWWZ_ip{{{{~ymfdedhuqXMLLPT]kz}ukec[\[TW_[XOPaqrnokkgdb_]ZXWURQNLMRVXYY[_bdhosw{ͳm]WVTVY]QDETisrnqtvsplkgfgedddc`a^YUOA5)#%9Q_bi|cJECGHGDEDDEFHIKMQJEH[tʚh($,=E<.'(##"'/7:976340.,.-*'%" &(+.9EXeprof^WX\L97aµû~sppkgb\TPJGA;762.,,+*)+)'&''&%$!9_ukVF:>@JV\WM:0+2>HH?88KYh|zV4!#09?EIKMKHCA9-$   +  #&'(*% + %!3S_^[PE?@EIOVY[ZYVRMLIFFNYnl\@.*%  !7NRI=631-$ !&'%$07?ADBCEIKIGGGIID5! (:<3,('" (+*$$).0+&" *>NPILMNKB9:?NV`fhcWJ?>@EEBCEGECFJOYabfjmpruv~yy{}~ǹvb\^]XMC>BFE<7:>=;:6543430.-3FV^ZTQSRRTYZZYqg__flmjcjneNAFQOLNNNLJIGEA?@BEHLFA<5*7SWNKKLKA4("&-4258;;>@CILOUY[]^XUSSTSQMFBFKQlɛ_/!% !->RgӲ`XQJ;) +bejqy~vos|uicfhFGqkQXu]<=6-43@NNV_`[ZZ[]]]ZYZYXSSTROU]QD55DSYYQTWVWX_dlqz~m^SOMKMZlnX?213=EP^kvwyxrjc^`\_]RS^^`VWdnlijgfb`_]YVUUSQOMLMRUWXZ\_bgjqvz~ܯucXT\ghXGDXpyvkoqsqlihfefddddc_`]XSM>1'!&=VdfkzġzQFBFHGGHEFHIKKMMRHCPrԱ1&'7?:1.'!%0;A<:964/.-+*&" $&),4>MXegfaYQPSYjvŹ»vsqkd][URMJC;763/,,,*)+*)&#"#%&0R|ob\A<=N[\UP@5.4BKJ@86ENVfvtjQ6 !08==?;>?@BN]up[;((&! ++:GF>4.,((%$ !#%!#.6=A@>?AA??>?BEDFHKMKIIIJIB1&9;3-*)($   +..))*,,*((3CTdi_QJHFHG@?BFINQSOF<14:EIFFFFCBHNQXaekpttwwx{tw~ƣ{yuiTA8>DH?66;<<<753220-))1ETZTNKONMNQQRPg\QPW^_[U\`T<1:IKJMNOKGDFEB@?BFIKE>92%6UXLFHJME5(!$+2/36:;>@CJLOSWXZ[STWXWSPLJFILLdŎ\799@OUB(!+QU@'.@NY`klmmhb\Y^]d_SS_af\[fnkhgdc_]]ZVSTTSQQQONSVWXXX\_bfmqvz۹yd]l~r`KI\u}xgjopmjhgeffdddcd^_]WRK>/%&?ZiimũVIBFHGEGFFGHJLKMSIG^ſȠC3,4;877(#%1?EB@>950/.)(&#!&(,.2;GP_bc_VNIM{ĸĽ¯{vvmb\ZWSOJB;562/-,,+))+*&!!$)-Mz{noK>3,4BKJA<9EIJVb`\G/#28;BFGIHE@<5%  + +  + + !*//-55(  %-#'B^fj_G759665/)%$$/-3;@EUg|v\9'%'!  ;CFB:4/,#%& ""#*2:?>==@@>>=?BFGHJLMLKJKKI@-%8:3/-,*&  + +#181/.---..:3+1;HNJGEB?BKRSYahmsxy{~yxtpxѽoRDFNOB88;=>@75320.+&'/ATXQJGMJHHJIFEQE97?DEAFMOC+"/CJIMQPNHEHGECCEJNOI@:4&4UXKCEGMF6)"#+1/17:=@ADJMNRUXZZPSYZWQLKIEFIGS뽓bbdrh=$+:NjžpaVND7*! hjouz~ſbU]jmiaabmN/,E[`W4*.Ny`-/<:GQ[^`_]XVY[^`^]\VSTVYXVRLQ<3JUT\a`[XWWY[efkry}~}|hTF8-%#)4=92,(9DGNUafgfjjaTchg\W\bdchlllkkhcb`]ZTQPNSVVUWY\USQTY]YTQ\hkilxͱzF@`ptwmomjiiijhhecab`^^]]\RI?71-&Kff^j\8S[HJDBLKHCEJONGL`{€V@2%?R:.!%'&2DFHH>61,')'''&'&(-10139>CEY]ZSBMyrpqlcZWSOIC=9610..,,*'**& %,#&'/O{xeI14?>?B>DC85@DBCAILIRZUF4  &-17=ACDB<4-$  + +   " "+563.+" $++-.ER`c\P@4/*('"%2AMMKVfrqO2""$%2;762-**+' &+2:>@>=<=?=<>BDFGKOPPLKFD;-)44+$"   ",2-0*(/2AXx~[J>BF@?DCE=55626;:FQVSJB=9DNOMQ`mpsw{yyz|xzȴydYX<-:A99B=76860*&%4FNIA9=976357::84221104;A9+&.6FIKLPX[Y^XfvkG:GIF?50)3OSMJJGG@4($%(',-15=DHHDEIJMSY\QTVYWSNKC<:?BLgѶʟxQAEZtogVB0)% egkptx{||~½{ZIO[]][^cbP:/45/'"':^q75BEKR[__b_\YY]^__^]WVUWWWSPKN=3HRT]cb]ZWYZ\abfkrvuvwymUF?9/)%'-1//,319DIIMS[`ddee`Vbgf]X[achmqmlkjg^][XTSPPNRUVWY\_YWVUTTTTPYeiin~żsHCastuimiiilkkiheb`a`^^\`_WH<1,&+Mcc_lǡb@VYGHHJOICFKLKGHXoϡqM9-9G>3,'&-@KKF>51,''%''()*,124334699KONMJdwqrnf]XSNHB=941...-,+'*+'! $++.2:[{iM22=AEMQSL=7=?=BCIKISXSD0  + &-28?ABC?70)   + + )2651-&  %+++.8DV`c^RD92/,(#(/IVa_^er{wcE)  2><72,)'(*(   $*29=@><;<;<;>=5& '4;=9520-,*+-/521/.,*(.6<4)"(/<=@@HT_ajm|]@6CA:2.) 5RUNLJEG?4+%&'))-27<4*')-27AG?=BFEA@DNV]_^\YT_bb[WY]_djkd___]XWTQOOQSQRUUSUY[ZY[VRQTYZ`gkp~¯cHLesrrimjlmponkgdb`a`__[_]WH7*#"4P]^brƿʬnKTWIKPSRFBMTNFAF`}٨vJ;737>686'):MKC;53.('&''&()+/13320126@A>EVyoook^YTMF@<;740..--+(*-*%#$'(.5AeoT=?LT_kpkZD9;>>AAFHIT\UD2  + $,28>AAA?8/*   + !!!&-2543- +$((&&*2CTdibUPGC=;9BH\dmjhhoshV;$ + &>G@9/'$#&((  + !'/59<<;9::;;86/)" "#$(7=BDBA>=@ELU^_`^ehov{}~}uttruȶuK685(149:4)'(#!!"&-111/+*''&)/--+*'# )182%#(110.5DSZXbt{W620,'&#7UVONKBD=3,''''%,4889>AADINQQSRPRTVRMEA=89?AAGT}ß~k羛vphVC5.+&QSW[_chipsw{vUCELNORZa^gjaK5)#*;^j1-7AJRY\]cdc^\^]^___YZZ[ZXVTQMBNXQQVWQIC?BMZ`]XSQYZ[WTTVX_ffZRSWWWUQNLLORSSSRQQSTXY\XUUVZdegnһfQMZkrnmmmkmorqolheb`a```[XWTJ6$(@UZ]gyƱ~\SPMRVWOEFTWI@CMkytݥqE?H7+26<;*,5MIA9651*()((&'()*.464213>;34Hn¼}okli_[SNF@=:741./--+)*,+(%#%+9Lm²{eRTaiww\D8;@C@>BGHSZTB2 + ")09?EBA<5.*#  +   +"""%+0567/" + "# &)2D\ki]cZTLLNX]cflif`a`XG0 1CKE:.#!!%('  +  !#&,279=<9:=<>?ADGHKMLLKJE>5' '34)!! %"(BXǮ~`r}[IFKG@:, &).4;7-!#-61*"$,.31-+'&$&)())'##,52( $'/+'!%3AEAITfoA&&&&(% 5SUOOJ?@;3,'&%%",58538=AFLSSSPPPSSTOJA=>:;DGDFMjļݳݵvoeVC60+#BDHMTZ^`hksx}qS@AIKNPSWT^ff]ROMJTkf:10;IQX[]cfe`^^]^`ab^``a_][ZUMGBBFPSYXWWUWYZWWX[_bcccc[MFDHKFEEB?0 ):EKF;-"!"%($  "$%'*/36;<9;>>@ACEHHJKJKJHD<3$ '35-# ):AFY|˹dOoULPVUK7(&"!$()+1459>EKNLHHQaklinsx{yricsonwøpRG7!$:LIA/ $%)(%%##!#&'''%!&11)$'*/.*##.47?@CRzo<%&)-30#.IPNNI@>91+&$#!*57206;BENUVURRRTTRNG>9777>DGJNKhrooxo՟ѫqi`P@4/*"459>FMRT\ajqw|jO:;CFLNPTSV]bglmmiktfI6(0ENUY\cee_]]\]`ceceggdbaaZNLIABPRTUWYXXXXVUVX\]_^c[MB@GRY^\\WOGIOdgjlkdUF?GVa_TMJQLLONLKM\fePBITYWVPKIGHJGEFGMRVXVUWXZZ[[abkڿzC@avsohhtnkjkmkjifcb_a_]]YMEHE4=Y`bku˸Ū\T][^SUUWTFCSkwutzʌR?KRJ<,**''&+*?CE@:960.-,)('&'(,/1,(%&+$?rƿtlc]YTPKE?:;640/..,*((+,,(%*@Tf|xx|lJ0'*16>:?DDLOD5'  !)1=DGA90+))' + +    #'+**,25693% + "6KWWZVNGIPUVUPORPH?:)    '6?FHA8+""$&'! $(&'(+04:;;8/(" '03//5:ADLSUVUVVWVSNF<9566;BGMPAJTVL<4/9-Oܢɢme[L>3.+&!+,/39?FIRW_gpv|bJ76=?EILNRSU]hptvrtz{fU7)?HQVY`ba\ZZYZ_cffiklgeee^OPOA@PQRUY]\[YWWVUWZZ\\aTE@JU^agdda[SRVgjlry{n]GIR\ZPKLLHGMLIGIT_[B18GMSSNKGDEFDBADJPTVWYZVUW]bksɪùsGGkzqrmhpnjihjhhfb_^[][[YWLEF=*&Hdgiv}Ƚͻm_dZ_W[[UHASx}zt؛bA?ZcH.&&(& %,6?GE?97421.+*(&&'*-.*&%$*'?f¾rd[XVSMFA<=87320.,-)()-0+(8M_m|yvyy}sY8!!(-87=BEKK@." #+6>FF=2("$''   +  + %&).1.-13598+  #2>CGF?9;BDA<42791'$  %6ABB?;2("$%%$  %*()()-1799:>ACCEEGFGFEEDB<5+ &27,   %<;5' *FkʽyKVgQONSPD=;5/18<-*1,'@KGCF>7-%"*,,.49?BHOQUWZYZYWOF>856668=DFA<BFHKKMT_hlkkqzsni]<*;DNTW^_^ZWWVX]begkmmiffgaPSRA?QQPU[``^ZWVUTUWYY[aPBH[ghcc_]YSIFHKMPYjtl]OMQWVNKMKEFKMFEJR^X=+1AERPLHECCCGDBBHKMOZ]^VOQ^k|̣j~ȲiBLpynusilnigefeec_\ZXYXXVVMIF7!/Qjlo}³|jhY`\[YP?Afźuly¹~O:\hB3)'*%$00=IHA;9742/,)''$#',.+))+6=`vdZXXVPID@?<9541.,.(&(/3/-H\jt}Ż{roprw{dL+&,329ADKJ>+ "'08DKF=.# %'   +  $*'*131,146;9/# + + +!.3772,.44//&#*-' + -@D?956.%!$%%"  &+'(((,/579;?ACDFFEEFEDBA?81' +&25+ '5:>1'7OkȽѾqMeɒr[QJNRJA>6.08;;;=>CKQVUQQQNMS_hgc]XXZ`eiѾ|{p_4!  !((# #+.+&)/444/03+ %21' :JDBH>7,#$()-48>@FKPTZ\\\\XRG>:.10.-0466-).3/11(:82,*($')),5;@DNY_clvy{W;42346;AGHMTTUUX[\alxwoc^]kjF#0=MW\`bb\ZYWVZ`ejjhhfggg`]VJECJOLTZ[]_^[XVTUXZ[[\UNZvykbXH@@?8:C>4/5HZbbPPSUSNIFGBFMQMNP^d\F.&/9CJKC?BDACDGGHJKP\^^VNSfxϷqgqų|VSemsrtuskkhhb\Y]`a\XUWURONLI?."4Wb\nuaZX`WNEE`§uhk÷΍g`WR@:05*!"$4?AB>=??><81-,)*&(%(*,+1;L`l^[XWRLHDA>;730*(+,((/,+7Pewô{opjkqq\;$"")*26:52( '25*  +"/=98234;>\sɳ¿ʾZZ՛o^SKII<3('*,(&)-29BIOPJLOQU[digXNNPQ_q˿c>' ""$! !"(+./1142& )35""'0;BDB@6*!!"#%)15;>CHNSZ\^\][WMC;73--'##&1*!-:;2$"+4Pqmk}ɽεxobXQMIHC=;:5.)"$&(-.:=GQW[dory~pN;30/138>ABIOQQQVYWWZakonlTUYkmM)"-;JUZ^ab_]\YX[`dggefddee]\VMHCGJJRWXZ]\YXVTUXZ\\[TMXokUH=3-/6:?GJ=-+4CNOKLPTTRPOLILQSNOT\daM5-19AHGB<=?=CEGJMNMPQ[a_^e{¬hhxƵdSfpnnntxshkgd]WX\`_[WTUSNKLGA2%#.@\fbo|vpҮj[TVTRQ_~pdnĽզpS67/4/1<56DCB==@A><81.++*'&'()%'6G\}scba^WOKIC@=851+()--.3,)5WixƷ~znlkeT2!&%%%.28FG:'%1@JKIG8'%(#    +"*-+).231/04:6.$ +!$&&"  +8GA62530$!( + %+()('(+138872/%  )34'"'15GMR[ejpv{_A92-*-168:;DMOLMSXSQQT\```HMVjoS/',7EPUZ^bb``\Z\`cddbcabbb\[WOJCCBHOTUWYYVYWVWY[]][TKSbUCJOSVOS[euؿfHhŻYQrzohirzreke_XUUZ^\XUTSPKFI@5$,?Rbebijdi׻t^MLNZl}nfz÷Լc6,(.+?XF3HEB==AB?<820.,,*%(+'!#:Sl|khd^UMIGEB=962,*'/126-*9^n{sngYH) $  )/4BE7'%5FPMHE6' #%$     + %+-,)-021/.165/*!!  =G=42650" ( + #'())(&'.346:<<=ADC@>>@=:5.*  *33& +%-6@M`tòd}ܴv^PT^ZPB7//036;CGMMLLHDESch^THCGR`oǽoK,$##"$)/446;6*  ')'" "'07;;81)%$')),.+%)2WL<1285-++./3=KYnnmvʹ~{yrmhca[SM"',0028@EIS_eiouy~S651*'*14547?KLJHQWQOQXZZSNDNWfnU5+*2>KPU[bcbb^\\^abbaa`aaba_YPJA?=93/../,'(*'!%:Ssýuk`VRNJFGD?;830,)344723Eiuǹz^TRdwvqgO>',1>B7'!%$ (6EKLJ@5'  $%      &+,/,++-/0.-0553.$!!$(#  +  %?C:1285/ )   + !$(--'""*-027:;FQUVUZ]\]``]SH?<523104BEMY`flruy||I-0/)&(/4305=HJIGNPNNQWYWNIKSY`gS7,'-7DJOWbcbc`]\]^bbaa`abbhd\QJ@<9ELPPRUVTWVXZ^__^\UIFH92:YznS=7>EOTZ]gnojxoqzxwyyrhbb`ZMA916>DINQT^dsŪgW]fĶrcrwsrtvuoi_[[YWTSSRPQRSOGB8/& (>:4101/-)'''%(6HrƶlZOQROJGE?<952.-53487AVz¾pJ.+3Lj{vhN2  $*.:A8+%$&*'!(7DJJJI>3'  "#!! +  ,.,-,,++-/.-03443'&&).*  +   + + + +AA6-274.)   !+..(!#'-/4788;<>;98:850'! + !&270#)7DUs˾ůvcZ^bdc_YQORWcgigaXQMOV^\TMLOWbxuA ! '' ('*-,))),29<8,! + +  %+--.)%$%'&$!"&/;BJMQV^c^]^[VL@540032138PVSA66CJ?GJJVm|þ~x#&&''*-5=@BHRZ`gmpux{rE+)-)'(-//-28BEGFKKHEDINQONPZZ[aT<0%(0>DITbcbdb_]]^ab`aabbclg^TMC>8DJNMOSTRUUX[`ba`^QB>A3.:UjscQGC=TNE802:DW_dhrzyr}~Ż|pjhfWH?6=EHFCEKjӹrVOb{plywz}yrmkXUWVUSPLMLNPQKB<.(#%+5?IRZZVK@B@@;72100,*%%*,.6AjǶkUIKONIIEA<:64/1601:@MdyM2")RpykS1  #((7A:/--00+#!2ISSLD@:2)"""   &/0-,/-+),/..13553')*+12)" +    /A=2-260+(   *,-(# !"(*/35566:776540,! ""(4:1%!*IVVG68FRKQTWey7+!).-&)2;@@ELSZ`fiotw|~g@+&(&'&(***-09?FGJF?:8/!%9A?- ",9GSempqxylx̷|mkldUMCFF>:BTi϶{eXWnut}yz|uleeTPPPQNLHJILMLE;4*"!*6>?AENMD<=cŽ}έǾw= $:AJGCDFCA<72100,*&'+/29C^ȸ{eTLGEBIGC?;75145.0=DQfc=.@i{o]A$ "$3@;86:AB=411=KRQH@;60)#" +   #-00,*..+*,./.02344+/006:4.   +  1?8//33,(' + +  &'*(&%$"$&*.00005110//+& %/88.'%4Nnþ|neb`^\YVUW_dd`YVWYY]__gvƾg3!" + !$)*'&)+1791+&  + +"$$$" !#$"  %.//2=BIPU[bejosz|y\?,%"$&'$%')(*08ADD?7337, + %9M`mpx{wz}rdҤpmqoc[TPF64Kv̺qZTW`xwt~wtsoc]ZQMIJKLKHKJLLIB5-(!-AGQURKICEFFEA>:4/)& !$ !   + ,401+),.+*,//113343,1328>:4(    +  +   0<4-.12'%' +  "%&())&$#&*,//.-1/-,.+($ +'8=6)'-R¾§{ZZWVWXWYbed_XWZ_cfn~ż¹K$  !#"&)-*%!%)+/1,,*!" !$%# !-)&'-45789972.$%*2=JSTLINZ`ils½{P1#%.'-.2;EHAINU[agjnv{|}nR:, !&())+,+-29=<84/..02544:CMS[YF2$$3>EQ`_bhkjhghbdcb``acbcb`ZPC<5@GGIMONRQT[flkhbP:7<)  (8K`ouyyyyvsptŹܾ}mjgdaa]TIRp}z}Ⱦi`ZRT`{~{}yqlgaZTLHGHKMMKKLKIC8-(&((/7>=9=7.0DtùĿٮe3' -DTRIGGAA<942233,25.*.35ErŽƳjWPNMJHGFC@?9648?HWm\8""5HYuaL- (29;@EIMPPQPFEDC@>:72/+%!$''&##  %,00()*+-+++.02342/0126:>><;4 +  + + + #,3--10+%  !'+*# $+000.-0,+)*'%! + &00.6HWʮueWTROOS[bec`bhmu¾nG$  !! (*+($"$)./.+*%    ## ($ "#0332)! &4>IQVX]doyxV6!"+2766;EIGJMTZ_dikqvwy}hM6)!')**-0127:<:3.+++-///.6>GQXTC2%#1>DLWY]ehlikkdedd```ba_`]ZOD<7@GFHKNKOPSZflliiZE>;#2?NXcpvvvssqoqqxب|ϿĨshb``polm||usysh_\ZYSQ[u~{}xrlgaYSKIHIKMMLIIF@;1)%$3<8/.9C9,%:jƿĿ㾖зvF4 2DQOJIHA><964364133-,//.>güĴ|i[QMLLIHGFD=:8:>K_xsD($(8NcxeO1 + )29::?BDFGEEAAA@?<63/-+&$%))$"# + &-1/(**+-+++0245440/2259==<;8# +   ,1++0/+$ !" "&*)$!"(.00/-,,)'(&&#  %%(4Ln½dz~g[VPRZcgkkknu~Ȼ^5  + "! !(*+($"%(,.,*(#  !""$'+.,"  + $1??:1,*)*,---+19DOSPA3( !-:?EKRW`ejjlmfgfea`_a`^`^\RG@:AEEHJLJLNRYbilklcQF;  !1Xbmquwuprmliimpzיχسγ~laaddcai{vqppw}|m`WQMPUXTQ[s~yslgbZUOMLLMNKJD@:4/(#"!-74+'2>.%,[ý̽ٵʻ࿉`L2'4BMNMMKC@>;8657531//3741;]Ͻ}hXLHHFEDFHA>==APkY*!(9Ri{cN3  )066589;;;87799:;840.,)%#&)&"  + )/1/)*++----/14566322348==;T^gnwƠ~T:16;=<9;98974/.2:;YwθÿwfOJFA<=AECA?>EUuP(/;Sn~umjljdUC-   (146565431/./258:83-++*&%%'& + "*/0.*+,./-//034687543247;==<=0 ')   +!(.1002/+#!"$&$  + ',-)%')*'&$!" "'1Lpſþ¾ùóǘh6 +  %()'$#&),..*(&!! + #%   + #.''5JQILMVfpsuplkjgdeefhilr𷩣xi`][[gc^X_inpjiltyxxxz}zwwg]VW]]SIFEBCQgy~wqjd_WTUSPNLIC@61'!)'3/#'WƿȲ⺔k>")5CMVVPJIFBA?=<:<98217ADA@G_uͷvf^RF=:?BGB?AJ\zU5J\rp[PLKID>/!  (/355530-*)')-15:81-*((&&&(&%*//,+,.01/1.0245885523369:;<7/& ,+   +#)/01111.+!"#')'! &,0.,-)'##" !/Gl½K!   $&(&$#&*,//+)'! !)%  #*(# +  #0>KWlvǨ|`<76=EJOPONQSSUZ[adeehors~jJ2'$ !#%&*.6<;?@@91,''(+/20/-(-8BD?;=<3$ (7BILPW\`aaacccc^[XYYUXZ`[PEB==AEEGJJKORW[_ab_SKD4/:Nbh_^^enssqicdc`^`bfghfi۴ܸvg`a^ZXUZ[Z[bfgjjowzvtssz~wpkhg_UPQXVK@B?:=Qkyy{unf`[TSRRNLIC;8.*!%"$&!(M»ŵ̫T@KY\\[VOHGD@@?>>=><;669<;MZf}ǵ`L99BKPPOOOQQSYZ_accelnnzzbC,###$$((,1AA=4+&$%&*-12/-(+5>@9:B?9+$'2?FHNUZ^^^^__``\YVVXUW[b^THB<9>CCFIIKOPRUY\]WIGLFESh{~okhilookc]]][\^_`bb`apkjlld]ZRX]`cgjijhkptqqptz|rnmf`ZUS\TLFC>97;>=@Rkvqvy|}}~yrkc]XSPNNJGA:2,$!#*$0W¼~}ɿym|lZPMIGB>>>??>@><<>>:4:Gdy}prн͹}}na[YQEAOg}ucvvpi^PB7.&$.46430)(&%'*,.131-)&%'''&&# +  ))(,-),./13320/236655232014678.+'%$ .6482)((*(!  +  #''%$+18645630+#&+.("  *6;=3,$   !O`nzǻjH>ENQRMOOPQSXZ]`aafknmyrZ=&"##'&**.4?GBDC<3)$#!#(.01/,&*2==7;C@;.%&/:BFLSY]]]]\]]^ZXUT[WZ^fcYM@;8>CBFJIJMOOQUXWOAESTWdvxqkfhilkd__`^\]]]\][^a`yo{œuc_cmuqe]XQSTV\ccbca`gklopy||tlgd`ZTMHFSOE7,%(.5=ACQgqmptwvx|}wpgaZVQOJIGB=5+%  '*$"U|wstxǾϴvWJKKG@<=>???AA<=AA:5@Pmh]yѽvnlVGDVvvwhZRI=4,(  #-3453/+*(**+,-01/+'$%(('%&! +  +('+-)-.013320/135754252114457/+%'& $/56><1-.32.& "%))'(.3:64584/,$',/(" + *6=A6.#  ?oþ½ļȿkD#  +!!! !"##&%#$'+,00,)*)(+#).!#&&" +!!"!%&'!   %1=O`qʳ^IFIJMMQSSRSS\acadjmmv|}iO:)"!%)&(,6=EGEA<5.($"!$&*--*)*.168:>CA=4.+/6;AGOW^`_^]\ZZWYZ]`bffljbVKB==?AEILLNLKKMPVNDN`dhvsjd_eeca___]XYZ\ZWST]bft{Ç߫d__]ZYYXVV[`[RMMPQY_cdhns{{yvpha\YWPG>96KE8("#()3>@AA?;;D<3AS`jjkdUUmƻzux}hKK^~tgWE>:0(" ! #.2540,)'"&*-+)*..*%$#%'))& + + )&$(-,..253/.2-0468874300./0/27/&%% $17DA79>8=91.6@>3, $+-*+3:>:66983,#(*(# + *34($''# &S¿¿ƾʿS +  #$# #!!"$&()+00*')&")& ($(+.,("  +#$ "&#! #,9I]pʡ¿ǩ|YIKNPNNOOSXZY]a_bimksy|}ybL8)"#&)'),5=DG?=92,%!"%')*((-./3:?BEC=4.+.24;AITZ]`^_][ZY\aeghllpndWJB=<==AHKKLJJJLOQOJVffhtzla][[\[[\\ZXWWXWYYZ\Ygsxtlǁ£ub`ZVVX\]ZXUQLMPTU]hjjijlvsnmje^YTQNE;311;92(%(-.8><7BWa]`dkrzxtnia\YTLHBA;2)""&'(&%(""4Y½ulggmurw̘iY\igc]XRI>>;99=@CCD;01Kk{ua]WPSdôvpr~}qOPewzzocWJ;55$ $%%$ #+/1/+'%$#'-.+)),-)$&&'(*(%   #(%#',,/.033,-/02698876100..-./5,&'))*0>KXQ?AOSJB63BU\V;( !(-/,.5;>955983-!(*(# +  )1;BA:4/,(!  &)8dľ»r?,!!"#%$#" !"$&(*+/.*(($)&!!('(.10)!#$!!%#" +$-9GWj~ϢΨxWKHIJJLNQTTUW[]afjiotzz~s]H6)""()&'(18?A:63-)#"%%'((1.,3>EGE@<2/132.672@V]WZ^hpzysoie]YVRKE=92*#$)*+,-)7`Ĺ{ia_cipzwz՟hNL]gpj]QKF@>;<>ADDH:?>>=67Td\mtOGHRTOWmĻévxz~knwZfoeL@3*##**(' ',0,%!%)12/*&&&$#&')'&$#! (((&$$(+0...+%%)2579;<;:55200/./5.)*.+&"7Zyc\TMJQcxyjI, #(.0./36;733762+&+*$ + +  + +!&,4;EKE8+$" "'$3Mj¾Ǽ˾ǺM# !#"(*&" !#%(*,,+*++')'$ !#$'*+)# !!#")(#'3AO_qȿfECCEIOQPNTSTZaegflqvvyp[C4*&$%$ "&+/2,)&!  #"##%&%&.)*1>GHD95149:5.8=DLQUVUY[^bbefhoopnplbUB82149?DEGKKLKKNT]_^^SLS`ecUHEJOORRSUSSQPQSTXXZ\a\PTjȜˠpSPQVYYUQMIOWZTKB<=ER[`a_\d\RLJIJIGB:.%"(/1.&#(*/457H[\PT[hx}{zxtolie^ZVPGA71+$$""#().46147.^¬zyogkrw||}QA\n|ubRNL==<;<=BC>Dfr[]maHGOYRFI_ƺǰ|zx|tsx_r]M5)%++)$ %+1,$#(-2/*%###$$%'%$"" ,*)&&&(,.,,+($$(3589;<<=;:7664335/+.2. )NnYOOZol[=' &)/20137:73464/)&**%  +  %.8FPM<," 36/@[yƼʻȻåj; +""$*+(#!"#%(*+,**,+%%#" #')%! !# '('  "/GPTSOPX`becgmrruy{{nXA4+'%%%""%'*.-# %%%&%%#"&&+1:=>>>;7597508:107jɲ|vqpmmu|ݽW>PT\fqrfUMJEAAHS[kenn[UWJGJTYREEUzǽð}wvw{wtvÐeyxA, #+-/% + + %-3/$$)1/,&#"#"#'+(% + $0*()*'(,-+)(&"#'337:<=>@??>;98876/-187&8kr\TS\c]RG2)$(%),154488964462+$&)(%  !)8EPOD0% &9;7HdüǹźǺa +$!#'*($##$&()*+*+-)"#!! !!!%+,"  !$#!'( %5EXguû]Q>45>IPRLLU^_a^_elkmrtuiS=1+'''$!#&(()&"%&&'%##-24259@>;787868;AGJMMLILQWZ]^agefchjf]O<++5987;AIMNJFDRdje]PKQQQLB>@@@EEEEEHJLNPUWYWVTXfaVQThcQVXVSONMNOQNLKMLMKIHILNPPPOKE@A@@=91(" ""''"'/0 +26DX]TT^puqnmmlifc`][ZUMFA;5222/-)-8A<8CVϽ{wsrty~ֻgITMHPcmgWVURNLOX^sng`WOGBDKTUQJGLeýw{yx|z~vpmsʞi{d.  (-/# + +$.64&#//+&$"!#(+/,$  +/('*,((,,*('% "'0268;><<:70-1@Toÿ¿ùŰ' '!##$((&$$%&'()**-.("" "$#!&-+ !! #"#+& $8J\toaL?=@FIQJKT]]\Z[bihgloodN8/+*(*!!"%('%!%&&('&""/3/+/5<99778???BFKOOPTVXWWVYe`TRQTakymZ\VTVXXYWROMJECGNPMEHFFIMOMMFC=::9987/'##%$$)*% $,//(01@TZU]fx{snljigeb_\ZZZWOIGB>=BC@>::>BAGdɵ}zy|ƻӾ~`wlZIGLOKRSWVQKKJHONMLEAKDKNOPOIFT|z|u~{y|x{wtqtŧo}V)" " "((!  '1:7*-/+'%#!!-140#  (%  + !11)),/+*,-)''% "(/136:>?DKNLJKKKLNU^gjjd\]eheQ@.*05535CGJLNORSRQOOX[_]YWVUXUQNOSW[Z[[XWTPOLKLLOOMJHDDGMPNLC@9522365/'#$%%&(%&%)2-")16BNUUbs~vtjddda^^ZWSRRRQNJKF@COLA847=E_ƴΰyvvifW^o}ڿsUJBHCKLOQMFA>38@HJJJJMKKJHEBHYl{}zxy~{|qmnq}«jH,'.& + + "" + !$2@9,53"'%&)-*    ,,20.+,+-,/+++)$&(02368:;=@@=<:8522.+/:?5$&/IzɽlQ;,$#%.,+-*# ",/376424024894*&"#'+)#  +-2ADGHILNONNS\ehgaZZaecRB2+06877=EJOPRSS^jmjgd^WG;53012//59>BGHIJNPPPOOSUXZZXWVSSSRSTTTWWXXWXYWWTTTTSRRHDBEJKJFF@81/-053/&"#%'&+(*&!(0( &18DQWWizzsrhbba]YYTQNLKKIHAC?;BHD70-1A[ʷζ}fGOP;;7=GO_wö;eZNME@@@>;75438BHMOPQQONJHEDKQ`tžzxuy|uy~{rmnqL. %.3(   "&(/5;."'24&!(&  &%  +#+-)0//,-,-,/+++)%&+113479;;?==:7420-+*.8=6(.3GqdO:10--,&&'+*$#%,0576321.15883+%#$'*+$  %)/5??><>BGLPSQNPX`ec]XW^bbVI:.06;<;?EHNPUUU[bgijf^QB71/,,-.0269=ABFHKMPQQQQPSUWYZYQSVWVRNKOONOQQSRRPONMOSSMJGFIHE@C<4-*,-2/)!"")(*&$*$%0:IW][rzspoe_^]WSRMJFCBA><44209@:."!+Kx̿ľձzfWD1HQ=?>0//;;8541/'*+/695.59EcfE4(+3652%%'+*%%(+/57631/025983*$#$'*,& '-..06<@=966552'#*EoĿ¿ƿƺb*''"('&'('''*,+*+* +-*&',.)% + +! ## $ 0H^reKCHRSVXZZXSTVXZYVTQD;3+'"" "'*(%(*-.57=>BADHD>CEE?99>FLRWUPPV]`]XVV[_`YPC3.3:?=@EFHMQUSVY\bge[M@40.,*+0/0258<=FHKORTUUSOLLOSXYTUXXWURPRSTUUUURPNLGEFJMRPNMOKC>:60*))+.+&!(&)&'$,8I\dc{|solmc]\ZTNLHEA><963)'$%/84/$8cƺ˿Ŏo[@442VjaXG50+0>COgӎlf`]QMHE@=:=?@CJNRVZ[WUSNKIHNY[]lĺĶrkmolt}tlidht{A0;73,  %,5CCFKIDIMMF><@HLSYYUSW\ZWTUVY\^YWM:/29?ABBAAEJOQQQS[b`UJ>410.-,112357<=IKNRVXXXUPIFIOUX_^`adhloqruxxvspnicYRNMMMKLNPLD611/--064451)()+0576310357981' !%%&(,*$  +#'()+*)'% $JĽÿ¾zx}¼ža>,#&!&'$()*)((*,)**$))&!"%'#   !  $%&#""  #9Phzſͽv]SUVTUZ^]\\YYZYZVPIAA>2)## + ""%,.//57:JLNPSTSSRQNMMRZaooru|}tld\KHHILIB;,+*('&'(("# !%+:8RxüQ79-)<;IKMNOOQSQPONLHFJUTNRbýǯwohclxvmib[ZeylN.#-:91%  + + "%3PxƢk7+&!%(%****)))*-++,*'(,22345687755310..&'+11138@FG?<=?>@:751,-197783*)*.1576422568:70&"&%&(+*&  +!$&-,&!$! &L¾¿ulmƽĶV1%+ $%$()*)(')+**&  )(%#$  +!!!!"$&'(%#$" +?Vl}þ°h]]_\[_b]]_^]]]\XRJIIG7+$!     &--.-249;?==BB@JPVWTSSWY[_bb^XTPMPX[YXZ[ebM7268?@>=;?CHMKJIPUQIE;56653387678;?AIJKLMLJIQX_bbemv}uc[SMKGC=4/+&%%)+'!!#2Rtvmkjf]WTVWRLKIGDB?;62,'#(9G^mپgK57KѵB4=0(Jv`[kجkRURTQLGB=;;DHLLMLMNMNOMLJFHSSOMUmĭð}picjvtmiaXXbr~tG,+=@70  + + +  '8TֹD '40$ %-*)('()*/--/-)+/1234566764211///)')01018>DC?;==;9569942432352++-13665445679:7/%#'%&'**(  +!#('$ #$%",OƿĿþ¼rgfȿo;0$)!!$%*+,*))*,.+%%)(#"# ""$&(((,(%&$  1EYn|½±pedhcbfgaaccaaba]TLNRN=-"    &,,-+029:=97;=;GMV[\\[]_`bdeaWPNKPZ\YWX\jjQ:235==<;9>CGKJIIMRMGC<679656:888:>ACFFFHFDABQ^muvxtdWNHB>=6-&$&+-% *NvsjjfcYSQTUQLKJHECA=86)&! 1Ce{յ{TE49\զr;2>1)W_SݼtUVUPLHA=98;AFJKLKKJJKMNNKGHVVRLOdʴriajwunicXW`oy{nihoO9!5D:,)  +    $1Jss;99#,0,)'&)*,1//11-/34345767664211///+'(.1.06:>=<=@<44.08=:42++.21,-035665467689:7/$#'%&')*(   "!" #(++'!#2R»ƿþqfdǾĿ|D:''#! #%*++*((*,/*##'))$"#!!#$'+-,,0+()%#  "5H\n|ξ}srmrjhlkc`ace`_cZQTR]gC(%  %,,-+02;78679609HNS\^[a]_`b`[SNJMQSRTWY^_c\J3,129;86<@AGEDEIKGDBA<98:;:A@>>?A@>>BFJKKMNcr}qaVQOMJPOPVap~m]TG=6,$$$#)2& + 0Ux}tnjecYWURPNMMJIHFC<41%& "#4Q~ȹ̱k?H>?hŠU:3;APzڷR`fV\TSRSNG>63/8CHJJKLMLLKKJHJOOQTTZxλrfcjorlqhSQbqr~|ue]\YSH??EA1   + ++@nʼn6,&+22,'1((.-))04037505:::88655531/..,-/.-+,1344/59:98797640.-..2343113346664579?;:<7+!#&'(&&**#   .-;BWųzpnĿƻ³hE2'" #"!$+-,*'(,00,#$&#$! $"!#%&''(.020/,&*,## + $6K^o~Ŀyquuwnkhdjunjcbh`VX^nwL*( !&---,13;89645424@DIW[Y_VVVVVTPNLMOPORW[]^a\L4&%*1865:?CBBACFGED<;877;>ADCFFGDA?@BHOV^cfox|o`XOC80--*(+*+/7BMT`istqgVB3-'('$%'% +5\|~wrjd`\ZWTQONMJIGFC>74+*#(-!/Y²ƪf=G>;^xOFGDPs֜bY}n[ZROLLIE@942:CGIJKLPNMIHFCEGJPURTj˼veacjmjngVSdrs||te^YVQSLLKD.  +  &(#5YڽmQ2)-377*(+/0.03:76:97:><<;@A?@AB>=99;@EF@FKLKGEEBGR`mv{|~~pdT@/'! +  )9Reok]O7-%$&&(*!  >i~zskc[_]ZVROMLJHEDA=863.)3;-&2eǵçf=D==\ӢhLREEg{Wey_TLKFEEE@><9?=>@ID@ABA:1862..-/1/--...-,&&(-276587631132457664676787679;?;:<7+!!$&'('(**# )>Shlci¿žŷý¹¿ʺb?.'!!$$"!$*++('(+.+' $&$  !#!$%&(,+(*04213&/.)&!#! (;Qcsǻyx|sfcghlkmphafhN # + $)../.4676:7107@DD?COK>>89:;=?BEHIKLKNSVXVZ]ZE)%,)'*287<@@<;=@B@;:;?DGJMMIC?@CGSet}~r_H6( +&5BLRUO=+"),  !Fs|yrka\`^ZVQMKJFDA?=;76/-*5<1/Boj>>AMmڼaPUHUʕf_ɉgQIGDEFC@DI>?BCEHKMNKHECA?>?CLTTNS_Ʀpb[[[^b_TUerutpgZQOQR_`_WD/  $.3)*;WtP*,65+,49229=;9AD?8:6442222.-.-.+**)+./0035654113245575547889:988:CMWRWOBEJMLMOPSRU]bS5 "-548<<:9:=?=;:<@BEXVPE>??DGJKIGDBA@?>@CJORRV]p̴uh^YU[_^VZhtxyqdUHCGMbdbVB/" " "+25)(Pvt@,-7>4;<21;CD8CSbklic^TJEJLHB:9897530.-.--+,,39>7.(-443311134556443689;;;9:<>?;:<7+! %''&()*+*% +  8gvtǸĻĻ¼þX?+%"&&"!$+,)((*,-("!$%# $%(.1/+%"$/14ATneF(!.,"  ,@Ter||gUObnvyvienxG$#   %*.---48405842;ILJEKP?'%%,3889:<>BHLLLLMOPT_jaD'*0-1589;<>>>>?BFHKLJFBEM[ervyupr|xn`N<"  +   (B>7/*)'% 8^}}{upljeb^[WRMIFDA?=<:721+*''%3`Ü|yʈ\PIAe٩tXd֨yOLIGJMG@FSC>>>CFGHEC@>?=@?A@EIQUX\cͻ~ujaXS[a`]bkx}~rcRB9>D\]XH7)%# + + %,20*#'Gޫܽ_;16-!'0000//13566644379;<=<;;=??;:<7+!"')'%(*,,*%    Dz~|¼ȺºÿbD-&$&&"!$++''(*++' """!!'/48<:/*(#*Hi´s>&/  0AWgs}ž~r^T]finslipF"$     %)-,,,474.26406CFC?EH6!"(.6999;>=AFIHIKLMOT`njP2!$$'+19>@@>>@BEGJK;==BEEDDB?<=<>=>ERRK;.&!%(!  +34("1S{nةnC.57?CFM^mɼlN9B?<:9897.*-+-/6:DJK>+"*/000/2348785549;<=>=<<>A?;:<7+!#)*'%)+-,*&!  Z¾½ɽƼlI-&$(&"!$+*&&(*+*&" #*38?E?-*2):uѪa59  + "3DZjt~}yxyxyĶmaW[[bpqou~E#" +  %)-+**153-.43,2=@?:>@-,28:9:=A?ADFEGKNLOT`mmS6",8ADD;;==>>>>;=CLXckopllow{{xmj_M;) +  + +  +  + ),+*+&# !  +%,Ps~|yuqlida\XVQMIFEGFFHE@95.'!&(&G|ѻiPDTp㺈`IQ}ŏZVWGAGIB=>B=<=BDEBEBA<<<=<><=AKQQP\­znic]XX]``bju{njaZMCFOQOI:1.,')*) ,67'*NˠӧnF$*?Zm~̻~jOHB;88;<...,,07?IIG<,$.//0258:<<:968:==>?>==?CA=<>9+#$)*'%),--*&" +  %m~ž¼ijú½|U/(&((#!$*'$#&(()' # #*07AJB,,:0`ܪݻg0- +'7H\lv{usuv{}ſd^XPUejquA#!    %&+*$"&,.1++/1/02=521+ '4?A>>@@BDDDEGJMIQTVcmZ=)'3;@E><:9;:522=N`igb_eht~yuvhW@*   +  + +  + "%&    )(>a~zxurnic`[WRMHFFFHHILJC<81+% ,)Cѭy]K5KҔ_CJ\wؤqZ\MCGLH>5;;??ABFHEDD@?>>=;>CELRQMRv{olke]\ab`dntqld_]YSPSYNB5/.147."! #529VýֳT+HS|ǫuro|ο{^EBD@:;70))),6?HIHA@=<;:<=?=??AAACD?=>;.&#$&&''')+*($  +  ;us¾ɾǼ¾ǼǺú\9+.$%+ ##$$!#&&#!$$""!%,098=@5&&3Íݾh1;" ,<970>TgqngahnwzxrliSB*    +     +"!  )1Hi}{ytqmhb_YVPKHFHHIILLJD>81*%!/2ṆoVL@@BBDCD@>?:/&$$&'('()**'$   +  + M|nlŸºƻ´õǜlD--)&($#"" $%!$$$! #'/584(!):ѸǕٲa08% +.@Rfv|~{oiiilqwyyxvxt`RMGFao>%!   +!)+,+%!&,.0,*131.0/+% +7EJIJIHHIKLKLPRSWVVakbN0  +  /6EHIGA=<=8EWfnonkjsxrkf\O;+ +      +"" +%8Vq}}zzzwrnkfa^YUOJGGIKJLMMLF=7/)>aǕ^HB8HsrVI18l͗kKPPLHHA5<=AAAAEGFDECA@?>=@CELRRNOkº|song_^behnuwrje`_^\``VH://3=;989<9.% %%'(&&()*)'# +%! + 6d~lhü¾ȽĿȹʽԭS-*+(#%"#""%% $#!! $..#,=ȷܴȖS+,  0BThx}ykaaaejpnlrl\]¼o^UA;_k=%  +  + "*,-+%!&-00,*253..+*# '3=GJJLMLJLNOMOSUTXXYckfV4   )8LONH>558HPVZ^forlrqe_YF,%   "!   0%  + " !?cx{xwxxsnkhda]XTNIGGKNMMMLKD<6-))!*CuĊQ=7.6MgqwrkeZQT@C=AAAADFEDDCB@A>=>ADJQQNOd~³{rnmg`]_djrwyvsngeddgf[L;238AD:+ # %!,@rɼhPLGJO[bYH?@BKIFZƻjJDB>76330*.4::9761.+,--.5zľ{nbGFne:&  +   "),.+% &-00+*263,+'(# %5=DGFGKMMMOOPPRSVSXZ]ekfZ8  + );LMI;,##(PVYUV`lpnoi[VM3  + !%())*++($   &:F3 +  Gn}zvwxspkheb`\VSOJJJMNNMLJHB:5+(+%LִtA2/.2;A>;=GJ?25.KcnyDPSKHNJ?>?BABBCECDDDCA@>:?A=94469962268;>@BCCB@?<9:82("#)(,,*(*+)(($ "#$ +,]xϻ}YLFO]`XPUgĽ}sʸʭ̼Ŷ}."+ ! "# !"# "$%%)%/8*LĢ|U5)41 '8L]ny|}s_QQTVLX^WdiK>`nxqM/%     +$,,)"$,0.)'173)$!'&$3<;@A@@FJJJLMNMORSVXZ\_fgeR0$!+7:2#.DSTUZ\X`ZP?-%+154540,$"5BA/  +0Yy|uvvpnjfc``]\UTQNMJKJMLKHE?72+ (%:{ǕT.,4Qpwzzz|yqhff_Fg[MHJMKFACDCAA@ABCEGFCB=77?BFIGHJLMKMPSXXWX[chj]<,/)"-45* +!6FIKSXTTPD1  ")/45640+"&$!&15'   + :_{ztvulmieb__\[UTRPNKIJNKJGD=61-%)JNJP29PưÜz@2u`KHLKHEACDCA@?ABCEGFED?88:=DMOMPNYļrijjidZUY_`^`ejlkouxqaVKFDC>5,%   TľhDFanQ@4@WҴxD@U׮zV?/*1;<40+2793149434466530.,+/5@BCC?=;:8881($&+*,+)')*+*($! $$ +/Zvnw\C@IB=?Paiji^LAMj¿sɵǷΖB.0!!"$$""# "!#%%#"!(3L͘D;BE:;4 *;O_myzz|}~uaQNQBEJQX[YXVD^ͺeYE2&! +    "*+( !+1,)'.56-&%*(&3:,3;@DEDEHJLNOPSSUUZbbbenbD1.)&(#"/>A=8,9@<>ACEGGGFB=98=BILPSMPx{mhkmpe[UX]^_bhrtnpwzrbYNILK@3-($"$'$!'-|ԦjRzƘH9\@6|аyNGR`Q4/IF3"  +.7386/! &()061)# *.$"  $Nitturmmhfa]\\\]YTUTPHHMMLKED@9,!#Ez{ZGQrǝ^8&CҢgCHMJHFGEEEBA>=@ABCDDDB?=>AGKNOQOUv{mhkmolaX[`adhqz{wx{ocWOOND5.*'"#%%%-*"E͓o|:;_OQ͠iEGϱ{Y<5AD?8120/.0454=<;961-+%$,0:EC?>EE@B>045783(')*+-,)'),..-'  " 0f}tjsӦoTE@>BIF2.Jsذ`KI^ɿһȼբa6.()+ $$&&&#  %))# %!(;RŠ?;@HB/! + +.>O^kwwwy{¼zZB?FEHJHHIMRMI@D`pdac]UG3$   + "(%'-.,*)066.()..&"$(**/7=?>??ACGJKNRUVVX_`bekiPC@711-025;DMQSK7' 6>>5//*" !%->A8* !.0'"  $($ -Sluqpmikeb^ZYZ^^[XVSOHHKOMICCB<1 #YeRP`~جr<,1UٶuIFHIGCEEFECB?=???@BCDDC?CILNOOMMTmɺ{mhknpulaagknp{zocWURF962,)''('(3mټ~j\\_^\^[WYf|^ݞi:@VWpܴkPKj͒Q4.>DC@:D:2/4984@?=:4/-*++29B@B@FG?@>2/3:8.$$'-,.-)(+.++)  + + ## &AyjiΦtQC==EWa\D3N٧pQHQoǿͰʻͨvH.$+/%'&)((#!!"$&%" %!HwഀB>?C=+  />O]kvww{|Ľ~Y>:EIJJFCBIPMJ<+2Kaj}zsdXUZ]\VH2!  + + +"&!*.-,++166.*)-/,(&&&+06;<=;<>AEIKNSVUVW\^beifPIG>68878;><9;AOHB:+$;??83/)"%   !!/JPE4  + %-0,!#$" (,("4Xmwqokgjc`[WVX]^\XUROLKJMKE>?A>5(/lޮ_LMdR1;TuญoiWYfŃNEEDF@BDFGFA@>AA@@ACGFCCILNPNONKRfofp¾|okoqtwkhntw{|rje^P?=3-**& K¡x[K9&$ ':P_]ψbHDD_꾴dXMTyߞT50?FEA:E?98=??8D@<83//.1"$49DRYJCED>@D=58=91**)/./-*(*+)'% +#&#1OofyΥrHJEHN^zwR8QyWFGbùƻ¿Ƨɷʱ[1!*1''(*+)!#%%$#!(L͟o?;;<3$ /@P]ktuu{}\@ADHLPTWUVUX\ceg`NLLB;@A@BC?0! '9=EJC749CDB=:6/($! + ! -N]TA' #).+%&$   */*$ 7Vnxsnidha\WTUW]^YVVRQONKKHC<>@@8.-Iڷڪ{oʝbJIb͜c>;Vz˜oSOJMV{ҏXEBBE@BBDEEBBACBDCEIMLFHLOONNNQOSbeRRm~squwyrmr{taL:*$),&#!`۷\9,+,'! %/461.+->_ƒŢiYUA5kݣnUL?`nK=FHB908;?BDCD?D>:61024.(1@HZzSGEF@BD?<::65694/,,++('&+&$#$# + #(& CABB33GV]_]YSE/"    " ,0-,-.465/-*+.11-+-259<:988=@CGKOSVVVTUZcedZLLLA=DIMMKE/+2?IHA>@JHEB?80*$!"+QhcQ5"!#%'!$(()%$"#(/32)(% !+.+(!4Qjytphbb^ZVTVX]_XVUPQROJHFB<>@?7.>eԵiZ`q{HBTex޺Ӳ[CAeqA4GkaMNhsw~ܜcKB@C@CBBCCBDDGGIIMNQRKORRQPPPQQRZ_J>IZÿzx{{|sns}mU5(#,2-#%!jϴkF)!"#!#! '1760&!#2LqС߽\WZG>~گܥobW9W|T?BC@921=KQQNLIA<962023-/:BFddPIHDA>4774.28=7,),-.+(&*#!'(! + #*'")Jf~b@DMN`ñJ:^}aJ?`uüپ¾ÿɷ|;'--*')--'!!%''%!#+&0KfrgO8//.*"   4BR`mwwwyz~¼`?8@AA?>;97657dYMTypRC@C>CA@@BBFGIJMNRRTVTWZXWTVWUZVX]N=?=4DT^\XUP=;:961-+-4<:?jfNG@><2;?<32493'%*/31-)("  + &+&!%6Zvɱ{S=P^[s٬oGAlnWHFl`j½ÞmdjvзɾƇD//,,(+.-'##!"%)&"##%0<<4( (*)#  +!5DTboxyyxz}ü[;17@>>=>;8338>AFB6''9FKB9)  +  ",20,.05852/50.23//335896556:=BEFJNRUUTRYcfbYNOPB=>925<>;94/) !.-/-'+#1E`uslbWXYXYZ[\]^\\WPNOLDACCAAB;1.IkюS?DXjc^ǍUB]ytڼ־ݳ~RRFX{B/RƊZN[УryXE?A?CA??@DGILMORUWXW\]_]ZZ[]`gebfZHDNUuɿ|yyxojp|}y^E1''+'$.(&yO/ "#"%+//,*,/233258741)!:UlkT;Baˣu\OW@f޾hB:;?ED7CR[[WRJ9:>@<3*%*6>9Gش^J@AD?NVUF945/ (18851/*!#  + $'"%?c~{ƣlN=S^\zcGEvܖZKFKwbJfȟr^RKMXoĽбĻ¿ҏL83-0(+0.' &%$!'**""#"$ #$ #"!4CQ`mwxxx{z¿}W7-046=DIIC=9<>DUcYC1  !-,   +  +  ! (156//2679773322454474367548;>AEHKOOUUXXY\afaJSHEREHIRPB:2261>UcfPKFEFD?92+((((/98:=@AA@@B;96+%;]~w^C658A>:88;?DB>97:<<96.%  + + %22/021(*-I]sq`XSOUY\^_^^]ZWTQNKFBBEFCCB;2&Caj6/UdkXWöu|ɳӭeHH^ѺiJIQmْP8Foי^P^ps\I<;??=<:9>BGLMNRSWZ[__a^\[`dedfrxg^miDVʺļ}wtrmhhptxvyxuy~{o\G7)&$# #GڶJ$%$'''*-159;>?;;?B;03550)#%((8W}UI34a澠xVLETxƧ~UFGECE=6KYMKRI27:853,"%=7>b鵀bZZen{ZA* *-9@:412/&#"  ,Rv~—WIHEJ^[CN߻yIDKa`MkҦ͜iRbnlbZVmȮüŨ¼ܤe?/4,**12(!"%$ $(+) $ #&"!  &  .>=>@DHKID>;>><95/% &363486//2EZml^UPOTY^`a^][ZWQOMJFCHIFCBA<1%;Ohb'9fܬpmUX~rxbR;+3Tçr[JR`|˂==Lr٢cN_޹xp]K9:=<::9872/056?DJIFEGILORPI>8>O]u}|iP?74;=BGMRVZVPIDDB@;5.$ + + '5534871119Mfi^WQOTY^`_]ZYZWQOMLIGNMGB@?;0%0=Kef'@>943667663267559?BDGILOQQUX\\]`aflJ)>MCHNUSPL=26;?8()9EEIDDBDBA?73126:?CEDGINRVXTRH97FT[nzq[F;4;>GOX\`a`ZPLJGD=4,"  &4433563410D]b]WTPSWZ][\YXZWQOONMKOME@>>9/&+6>Iut55_mzщ^Bރcɖ`6[rH:t̰R=@ILTzȜb18=H_wT`ϐݛj\M832/03544579;AHOTXYZ]`a]\^adluvCxÿvjdjgdjv}|kWB50.-*.(/ĞrM %$+76238>EKOU]eqy|xqjd^WSONJC6-) !**4G\xɝiMNKC;BUa_UIHO[dkmmFFikWIFEAFJIHJE14:;;:9:IVsӳU6%#*/'%+7?@=3/+)+,)&"!! #" Hq}yqomlmgZO`zS@IRLW|SEYoU`mǟQKRwܪۃ_f֪uY\ov_ֽaSN`eRW|þ¢״i./2/-,) ## !#" #$" + !'3?LXfqtu~}{ún\]hgefgd`[UQX_addc_Z\[P>'      #,498468:;>BDA=6257776336866:ADFHJLNQPTX]^bfgfpE,;GWWRJPWL:735-4GGJEC?@>?>;855:@BCFIQW_cef\YK99JY\hxwcL?5=@JPY[_`\WNJGD@:2+  '343247560(=U^ZWTORTWXYXWVZWRQQQOMMJB>>=6+!);=AoÂB0Rwաk9oauIB{dI}گaC>CGGJ}ݯ{VCCA5:[uʀVZٓܟmZK;4,*+.10002362...+$ CÝi4 "('0;4)%&*.28EWet{~ypcXUQRSOD;+%"!! &Gr|QHMLDIUsǓJBZvdeuњN=NοЙsa⽑q`VkתrdśbHSpdMaҹžn).51-+& #"! $$   !&+:EQ\isuv~}{þxhhppmlie^XRQTY[[Z\YV[^WJ9%    #-4:857:;>>DIG>6379:67448988@A@=?>94.& *64313678/#7PXYZVQQSUUVVWVYXUTTSPMJHB@@=3%$PlΉXRxԌvXIB;)'(,-,.//049>FKOQWY^_]^bfjr|ŜQfѻvjdmmmspXD7111-! !dĐ\().%"&-/(&9J]emsz}vnlfb__\TN?93/)%9DktLBAHT^nղqI>TeOLDMNOZR>0,1@FCBHRzxE=7/3<.((8Tqs`H7/1450*# 5_{~zwrkeei6=XvґAAVhka[bmʒS6M̖qqۤxk`XzŒbgۭ{RRwƉ`gžͲǿ|4450,*& # "!"&+*# %%#  + $*1?IU`ktuw|}{zmknqmkgc_ZTTTSUUVVVVXWQNJC;+ +  + +!$-5:858;=>?EKIB748;<88559;::>DGHJKLNPQTXZ^cinkpI%)ucBT}~[A/2*(GZUJD>96:?DEFDBKRUNY\beed_[YXQKIMTWi{mYJAJIIIHHHH@:64774/+$ $-75423687-1LVY\\WSSUUVWXYYYWWWUPLKJEDD>/!;>DεٕT/DwBeѐjǼۡCNwȞ\Twv֛g??IF?E`PH`nC76QӖeWqƁ꺁XHKD)'&)*)+-/027;BGLLRTXYX[`ehuUf̷tjemllsp]J=41-(&EcnZ.  + (/,++# !  &9EPXcmrqsme`ZWQOH>3,% 9wgA/DlˡV7;boY]Wnu{tmfWMEBFUgєʛjSXYYSG71/Ch|cN>710+'" ! Bi~~}zwhzoyҍ>FSTNR`~ڼN>QǔwzҔaZ\fy]wϐ\K]ʎgjĽɭĽ֔LA0.+*' " #""&+-'!"$&%   %.5CMWblsst|}{ylgfmjgfca]X]XWWYWY[[WQJN[a`O7 +  +  !$.6:969@HOMD96:=>:;66:<;;?EGIKKLNPSUWY\agnnpN1*î~WkwV58/ -LXOHB<65:BHFEEENWZQYY[YVOJEIGILKKQUl~q]OGPNJFCA@@84024631*$!%''&(2;8751487-0KX]cc^WUWWXYZ[YYXYYUPKLLHHG?, :@JA?LuȳJGjcA/GؤuctӽzŊYHQJ*''())*.//169."!!!@Ri?8]ٹN6=iyep{ŻfOKTi}yΟqw\C;7Lw˲rWC5/+(&%" +%Kp|{U\}پȊ@FLJLeв{DLUÑvvȉPFZtКee{FGoÐpvýƪþƶyydK,-+*' !"! !!%*%"%% #/4ENWajqqsz}{~oaaf``cgigb\ZYY[_`_[]VOMSZaeZY?   + + +%+16=?=9>A;;ZnJCA?C=>:98768:=@DGKNPSU[][X]ggcg|W-(ƼRmZF88==DONEBCD?9:?FKNNT[a_WQLMSUSOOF@ELQVZp~~gSIIOSUVWRJGC;6451+#& +.)'5GF:993/374'(?R`ca[ZXWWVWWZY\[ZZYSLFHGGD<-2CSӯ]ziDFݶr׼x>ZۏnyKRwTQxٿMieHsϥ[658GkߺcHSv֨p9)?ˊUfϼu՛[KQI51%*, &/#./48=AFGKMOOQTZalshcwjbWZ]ahpuvv{}|ywtssqgN4("!ZlR8 ! %%()+19@ONKA4&'-5@KU\_d]SK@5'   /=UfThרdP?JŲ}vѹ˼kcpEcַ~~{_AfĻW9!).% +2\zb^o͂8;@[qڒcTRcżֵ̝NAMǏXyЙlIRmt๣ʾɯúⶠwn`]^bʒN,,,&!!!&)++'"##"  !.4HQZclqqs{|vdVXaeefhiiebWXZ]cdedc]ZXZ\`bhfR, +  %,16=?C;9::Dl{WNIFE<=7655579=BFILNPSTX[\Z^ffdk{T*wcvr@DPPCDLFFCEF@8:?INOPS\``UNJMY]\WQKIMRTX[qhUKKQW\cfbZRMD9551*(+"$22+,CXSA=;2.151%'?S`ed_ZYWVVWZ[[^\ZZZTMLMIFA9) 5Sp—HizC?{֭jʄ>O΅fv=@dk]oʮYrűnGcռoF@GbѣpH:Z֪v?0EԐW]oݤbMNH:0#).%)/&-.37FKKKKE<3,)//5>OY^`e[PC7*  +  :GK_wk̰ƆM@ChŰĨƫOY٬٢ž]콣ðT1+-!! + + #=c}qflµ͈<-AySPXeحĒvMCaɤ~k€]J^۹z}ϣǬºёnrvjqm`VRdəT+-*" !(***%"##! %/8IR]ensru{}{xp[MS_VVX[`cb`]]\]`cbb^`aabbcd`dZB% +&-37>>B:78IMNOQY]\ROOT`db][VWYYW[ap}{eTLIMRYcjh^YRE8441-/1(*>;14NcX=>;4./3.$$;Pbgf`^YWWWZ]^^_][ZYTMPPLG@5$ +5d8YʐK>sϤhڔ@Amza}:5VˑdW|by˼TUydB><78=BOqyWQMHIA>979;4255355,! 6MLA@ScR7=;3-,/+##8N`jke`\ZYZ^bd__\YXWRKMOMIB4  5ks8\է^GpØdE:^maľJ8OֳvIfkkv`Og̿Ҟs]JKwzL1Kw̱g]g|upwQFJR=-(/-(+.-.26;>BCDEIHKNV[cju½x[NJGGIOV^dknxvvwywpgk^L5%\slX`ZA)19<:867<=:7?=;4*"'(0;Ocs{r`F. !!" 3@?CLdʨmVPP_aw㽀P4:ayþ`f]NP[΢yĿϯt^tإ\LMTXmY9;;/'& ",Gaqu|zry¿͇29Wd@MAGZcUO]hjŭݣcRQfҾe}˞VASضczà˩eg¹vXU}ϫZ%.& "   %(((&"!!)3@HS[dipwwx}pYGIRWZ]bhgdbnkigknqqtttpidcekout[2 )17:>>969?DQnpNKKJKCC:9;>@CEILOQTTUVWVWZ[]bmxr`> +Gӯѯ|PE]eWNGDEKKD::>DFHFIPRQ[clibVRTPLHA95=GVY\TJABDLHB?FPURLG<31795580))$*AZ]TP[cQ6>;3+()%$5K^lpic_ZZ^afh`^ZVUTOHFKLKD5 +>xԞj@esOg^K9U~^dϣ]@HwϜVWaTes\EVȇ\WWk̩iQKqƚtc[cmWDL]RA/*)%'0/035:=@AABGFIMUZ`ht}¿tVGHDDGLSXahlwsruwri`\P=)!! XtdQXK/  &2;CGE=5.)##*5>LazkG(+8:97! + '9BCETqYGKOc`՚]92Iyô`oúM``Wd}֎sβQ>MxܚP>@MMRlP72,') + 3Rhtx{z}xsΉ63\_BHRWeh[UXWOػ껦ՔTGY}spֲYFYϙq|ҋgntȿƦfgж\\t۰`*.%!  "&'&%"%/8DLZbjqx}}}}mVB>DJPZfs{wqmmkkjkkigghjrpwwjJ$  *39;>=<76:BUsgIJLMPGD;:=?BEFINQSVWWYZZWY[aclymQ55hĬʱ[H_h^VPIGKLH@@BDGGHJQRQ^fnj]QPRPI@7,%+3?A@:46@JPLC:;CJKJE=5388547502-0H]fa^cfY@A=5+&%""0F\mqke^[Z]`hja^YUSRMF@FIIC4,RƏY?l݆UTh~n]U;K`b^tаyMEkjRG@XgQN?PȾzKIU~“QEOÂ泂aOVxʒ`FMcg[<&&&$-./248<@>=>CCFJSX_fr{þpRHIFBDKOT[ahlmnopj`XJ?/"!$! +YweVP<"/9@HKH@3& &*29CFN`|wO+$7DDA>-%"6B?8JrtRIUWor׷}P-8bĕhfQW]ot}wq͌dQINO}\BDYWFGL|xA(.0+ " ;[ox{}{sfsDž:0ZԠ^KMjvveZMOԩ뾭UG\tnН]WjҶziЧ̻}ƾж_fƐijxl7-$ "! "%('%# %,4>GPclryyjVD=?EMZozupnhhimnqqqideinbC& + ! +5:=@CEGIKORUWXY[]]XY^dbgn\<*$(P||w_\gjilgPIIKLGGGCGGHJQUT\^`]WTW\aXL=0%%+-0100:KY\YPB:01TϯxG5h^FF[bj]=BJTo˹_CZױqT=9D~k_OHVIV{SQ_ò|<6Hp|]JYآlHKbtnG%%)#'+,/048;:89>>BFOU\dnu|lQIKGDFNPSY`gilnnjbWP>3&#"kqj`P6  *7AEKMJA7($%)*,19=ILQQXj~W4  &%&(-*#  0AC8IncSR_[ogH.>qϼzڼXOZשty{~lYqz|NhrOOorWA7Qxb961-#&Abs{}lZeȿ|:3Sѵ̖[NT|xcORߪ|ķצx]ISq~wsБoWjرixʼſʴtƽƊekzŝvmvz=-""  "#"$" &)+)%# %,39?GOWhrz~viYJDFAAC?FpɺmW?>9b[KJHOh[`ݢ˚k;@RdkȐYG^vLJ^wtL#&+$$*+.037:966;=?DKPZbkryȾiPKKEIKOQTX^fhlomcYMF8-$9szkP=' & -=CHJNLG=1('/5157:>EOUXVWV`u^?,%"$)"&+)& %?OILgxZVXeXd֪wT:4AoҾٳ۞[N`{yZdme{[jY@;PQ;&-#.Kj|hOW~ƽw:0NպƒSJVѧdMYђmwź͐mbKI[^dm͆XIvƍsiԵ˻ƿǰnŽĽДnmkӺ~qtغ@.!##%&)'('$ + #),+($""%"!$,=GLPT[`fpx~þzkYQSXGEAI_zrnpkgkqfR$ '$#"""  *38:;:819>@TuY(>LSNUJCCHKMNNNOQTWZ[]]W_aY`lcQ1%!+67<>_hmnrmcd`VXgoi]VHNMIPSPQHFEJNRPNOLGIS`mrrqhWPOE4203>KYkuxupk]LA:6,3=3/59>DKNLIINW]ZY`bUD@>94,)*)"-AUdgc`^\[^efcbc`_]WQKIF>6):^u}lI/1kƍD57al9.8h齬f79U|w_@CVUME2?Qenhlþ|REX|ҦVgȊMOey[QMf}W'+-*(,0022567758:@GLTYcltzƾ~aK@CFCFMRUZbglqpg^UK@2(+$1v}|nPE7 '4) 1BILOQVVPE?ACC=>BDEIPXb\[aqdL<67=@6& )0(  &>IM_wlLUMNPhսT0;59O`r·۳VN^ĉ֍֭Xwߙi|sʻmJEs~D"%$ >byeRVuĽo<4Tź趇bLgݡvT\nֈ^nahMHJMX~d?Q}oe¼˺ym¼ձszƁduտU/"#)%)300.$ " $)./*% " %+034-/357:>FXaipv{z{z{ƺ|l\ROUEDDM_py{ȼsvtkjlfY6  +('""!#"!*269<<916<7300/" )8L]ccaa^]_`afghca`YQNNI@7' :D>DJB;9jܧY8=?Z}rT:Me}}ĺڼhJNpѼ`wҼxNRgϟpTGA^jQ-+'&(*/223577788<@FJOV_got{Ž}aJA>?CGLORT[`fijaYPF:&-(!!F{qfJ9)+3% 1CMPWZ\bd^SJ@7:::[¸豁bRpהjRbԅ_ج`TaTX\gĐT>Kuzdxжǿɴsk¢ڕmhßo5"!'%-520.$ !##!!%*/0+$ "&()08<@BCHPVYZ[anxĺzm]TRTNHDL[iopjnvνtmh_O6 $("!!$##+269<<=38?G^yG:IQNXPHILPTTVUTVXY\\]\[]WSW\P?#&6=IKJWsp^R]i\BDMOXYHFCBELMID9;AIWeqvxxvvzh\\dq~yl\J@37>607>;821.%! %2CW^a_`^\]]]fghca\UOQMI?2!)NJ55DF@;^ݮe:CՉE)Iݺw]QKA@<->\lTxl`epyv}{y|ժX=KyЮwj[HK]׮dUH?OPJ:-"!$+.058;8889;>FHLQYahmsw|ƿtYH?<;?DGGILRV\_^VNE<1-.!%XrbZC0$ 74 6HRV^`blsrh^PEHFEHQ\flww{~raZQLC<6/*($!!+14)&=WpcIMNRzvF6;K\U>2BTrdRX~˕ڞkSNgllvuq]:JW1! '=^}i[[lʺaEIeƹu^]͂ZJgzYҢYGW\kvhSJHgxn`nƲźɾũliſοґl_̰|= !.2.,)! """""'*//,*&(,04=>@>;53.-$!$,9MZ_^_^]ZXW^_a_\ZSJOKF<- +IxxvnYB5I{Μ`>JƃI0IȨknql[SVYs{qZPYchgkfdejoqpwy|||z|~yզZ?MΟhKFGCNy忏pieZHI?JM6$'-26:>778:<>DGKNW]bflpz¼iQE@7578;9;=@CJMMG@;3*"&#'AeeXQA2(  47&(JLH:,:i˪ׅVKNBGVJJKMOPI@9?ENXgs}trt{zrtqghl`KCA87AHIB@B>9613*%%'1DS[]^^\YVTWY]\[XQKJE?4& 0mè~Y<5U|Q?MץrL>KuѲwŮhVQMOU\aa_^aflruuxsopsuw}ްqNTζwvWPWYJEf׻{zi]GPU;)' %,048:8::<==CEKMV[_cilvx|¼aG=6-))*+))+--48:751,%#!/c|yk_ZM>8!"*)# -BPYainrw|~|khdZNI=0*+,,+-1:?<+8YtdZKQiα{L6?ko_::|靷̨nD'""$$%!&1:=<:836BMXuA0CQPYPKGGLTVTROQVY^_bb^]]\R9!%-7AGHCIC;?SYINHIPLMORQMGEDJNU_jwwomgb]YSRSL@;DOXeqjTJG;;DJG8. DײW6;n[DAMU?7DeΘ˵p^MEO[WIBHPhw{tnh`\am}⿚gO^v\^f^vx`GLq|tz˼jeaG2+#%)...019;<>>@CFKMSX\`gjrtx{ǿX=1*  !%*-,,.,%## =xcc_J<4 *2%!.BQ]gqy{{jekkb^TF=<=@@KNPOB+"9WugXKTsǏ\NLVӮh=<{Τ좿ҶL;n֭m{ۚߪdKSQk߿uϷ[UmFy7Hke$&>uxtf]k}58dϲڊPP}ˤiSRuÒ`byeZYGNŷ|LNTNn{_ORmϸļŶj_kÿֻc]nϬU)#& #### &'$#(/59?CKQWakt|»xssty{|ǼwgYME@DEKI??\Ͷwou÷saS?&"(&#$)17:;;;=CG?5,5HXYO?20564255:?BB@@<90+'""3GPRX\YSQNOTXWVUNG@:5+QܴYKfhaZUsfPFDGRūyzǷpbSG?BMYVKGNYw~widWKHN[iŒcRL[bMQu~qbJTahsn{ݺrS7!#&*-..01;=?@@AEFILRW[`ehnsxzŽ·vP3'!#'')-,&%!)[ra_XH;,%64#$2DS`kw}z|hbmxwtlcZWVX[a_^WH. %7Np^IQ|vIRar׭cFQԺտV@m͝bݖ|sXZK[Ɍ^vۻcGըj4:`g($D~xvgWgɵx7@fͶ~MW㵑d[[zyYkďifPFBYOZѺкoM;Wxk\``pѷĻžijb[jþȹwpxҳ`6)!!',*& $*1:@HPZcmvusqtxz}ǿ~vi\NB::BOOBCgϹmp˯̽_aүocT:% +"*(#(+0469<@JDFUp> #:LQZOLHGLSUQMSTX\]^]_eca[D%)0:BFFIJB5,/SԕUCI?:BLNMG@DSbgcXG:5596.&(-2432'"0-"6f{rhZSTICCD533CZc[E>104734639?BDCB@<1,("/CMPVYXSOKMQSTRQIA@:3*ZٯpvĚbenj_gruYGYk}teͼ\OUTKA9;@KZjv|tsrsv{{qkfaWE64?LRkد{c^\IQO[kӻcY]hyŬ|J'$*-0234<>@BACEHIKPUY^cgekswz|ǹĸjD+ %$(*+&% #Qyi[ULF<(#(47.+7GT`jw}|pztpzh`n~}|xrmijjjb^[K4&3EijIR̪hATmӤv\NfӶҿ_HlĐ^xugy侂gaDKњa\UvKLǦ|V7:_t*%E|vvfUeέn9LlμwOeݦa]`|hSoʰvYeY@?^XcܺfP4eüԞ\_d\jƩl]ZXTVoĹû»±]XiüϵxmjA-%.-+& %/7?IS_iu~urosxz|Ƚ~|{{qaWNE>>B;1KսhDHgvиZ\ͱj[V7 + &+% )//4=:9EGDHYl44PXIPPJGMUTOMTX]][\]aed`Q;%$.26>FIGKD3&0M`˼޹V2C<>;DIMFAGUcigZ@)"%+&-26,-Z{r_YPNH=?J;;9J`^QJ>3368535469AHKHC>7/,(%+5CJV\XRONLPSUPJEA944$iػͳqikrljp[KWa`|߿ȿpQNOGDG=@GTev|st{{wtqgZLA=?GGX{hXCDJLIIS^feYA-*054+&$"(*048;?BEFD53Xmb^XLIB;@LKFCOa\OI?5378524357HV\YQONKNQQNHCA921 $mƼģudhwѢkoxյȿs`RNJCELMPXcp|vi[OJHFJ`عmLJ\ɝiJ/.4669==ABBCDEFGNNQTY\_`^hkmw}ν}Q! +$$ $  $&&$#!$$ttd_ZSSSG5.34*.HN5%5J\ksz|mcau~~l^Zl{vttf`_O.$5:=Z}¤Ɯ{^JWǣvWPi弨ۯkHbi^p崦Úu\MQc˵BN|oFTȧ~WHRPF>;Qv|d(!,!+P~qlrxoTKGfθĠgQsް~cXbwtU[r}gSSV_̸rRNVbű͟nVKYeӮaF9DXfhb]JVսuQ]m{˨ghբp-" "+//,&! !)09FTcsɿxusvxyzz}~~vwvvwyywvvvusqonkkigecbakTC7758]qDBJZ|ɷyd~ݝYAT뽋{jY9 $'#$!,5?HA8AGCNtH$ *GVGC?HMIIMQPTVYXWZ`dfaVC+(59,*5?9;DNPJMX`aVD45>DC;9<>=@AEKRURLJIEFE77Sd^^VH>95>MZTOVbZLHA86985342337BDBCCEFIIINPTVX[[[\ehju}ʺůuH  *,&)(# #%$$(*dTYYOKNE7/-)$1MQ6"2J^muz}we[XVY`jxz|lR]}|rshc_M+-??SuufrأmWRgЕgiR* $%" $!-6AJB9AEAU{A +>RE?6CMGAIPPSVVUUYage]O8!*8;?DGEFD=4223/4.5ACKlޭe9)1;53;KNHIS^^VE;>HLMHHKR[gqnrun`QID8?C;>Q_deYD512/& +7ؽŸjD;LTKDObnu`T]Ҹo?<>??BFJECEEJJKKNQUXYXXU[hkhpw̺qE"2400.(! !%%$ *0^OXXLEC<03-,'/EE* 0J`muz{o\WZYR;8@Rt|nulQSmsuvlf_K+0CE?DGEBB=1+-201.8B;5JkƇH)%.403?EEIT`b[MFGLPTNOQSWakopocQB;9=KQMLQ\jjX>.+/;GUYW[_PDHGA==921410--/37:<;;4-&'3FRXUVSQJGEEC?>=-! +>ͺkJ7>JPINe¿z_Wcqè~B?A@@BHJFDFGKKLNPPTVWUUR]imhkqj> '9>985-$"!!&'% &5gZ]\QIE<39:>98EA'!1H\iqwx}x^Wdql\=.+;^y}cPPTNLRau~vuleZF(.CH@BNzjZkՎaUd{uwPUVX˕FpݴuPICDR[lwkVA9FekdK;Z̻E"" +#(AUsysj_WOLHG;.<@252Tdťױ~pvk~{gLBK_ῤ]IJRSa`[]io`HLZ|ǻnVTZZjץaTED]ǁNqد̲ŷg=;:98WID?8?JJI>@_׻l_^mndwdTP^ۡu[gj^>!%$#!" +269FRPkye2$:6;6;ADCDIMQQRQQV_e`UB'(5>??BFC=@9+$$-066=@7,9Q~P/")52228BNYeig\SRRRNORROMR]qriYE645DS[Z]Z^qjS5&%09?FOTZ\MBHLGB>81/310.**.268994/) !(7FOWZWQIEAAB><;) GжƝtO=>HJLSgxaQHdȱC@@?@CIIFCDGJLOPOQRTVUSQ[ikdem˻`4!0?E@?9/(%# !$%$#"3ruf_[YSJ?=>CLGCID,&4HZfltu{~ymae{gA+)FZddUF4,Siv¾d;]ХmxϿ}ovؼqF7  &)*)%"%'+3=IU`kwѸ{qlhihgc`\UOLIJKKLKKIIGEFEFDCBA?;9::;79EJFEKNOPOPU]d\O;" -8@A>@EB?=4&!)+..00(!%/HbvF.".774+0CU^nutld`ZVLLORQTaru^PNOOZ]eod`raF(!078:HQ[\I=EOJE@9/.21..+(*045781.+%(7GT\YNGB?@?<96"$Q˶w_NFJSQWkýþ¿}[>CaϹBABBBDGGDBDGJMQQQPPQSSRQUde^`pи`2 #4DKFE=2+&"!""#"$$#/SrxaW][MBCDISROTM5,8HWahqv|~lmmty^7$*4;=50$6W_QS[m}~vspfYF2%7GKFKRDJ]nܾt]Vsw|޽t?Eeݼ̚Zu‰gOey]UN??:]}TCQe}ѵzR2!+#1Tbu´re]YWVXWUMDP\rjRZaB5?@DFCC@?=;=>>>><:742224569;:789:9762411--*+(*&'$%#Z>5;EB13Qɼ[IJc^cu˦qV[t̴|`D7,$&&##-46=C<6CRLoU!&EA?BC@C?3%"&$))))&#+XO/'-5=8),EZapy|uoic\TQPNQ]tj^_cinjo|l\iZ>,/-+>LXZG4+(!$$# "#!)<`kZefSFHQSY[[aY>4Aaì|XB[֤nQR`nkBH\{f0E]oӢpjήx_eϱz<%0&" !%'&# #*4@KYgr}Őtlhgea^VOG?9678?>=<;:98:;;9:630/-..113587324553.,,+)'%$#""!kPIM;-5FvȠs\Y]hproKF]ȥVD5$%("!'&,07BHHDAHLog&,:G56ISLGLQUSRU[^^\H1!,>GID>@CBB?6'$,/*$  "$%*1636DVaot|}smib^`cfq|squ{}~~m`^I, %(&#.;OVF>KQOKD?962:640,**)/,,---*'!%8ISTWJHLLC:<+ )ZŽĮdGOZVQfex}\90>iظOCAFEIOGFHKLLNORQSRRPQTVXLYeeᾕ`<%%6GOJC;4/*((($! !!R}pldTHFPSRT`g[E8AOX_gqx{zrnorqj\LA;-0AQeu`?Rz~{zhk^R9'4BNQRU\RPTRFIqشcM]ذ{oŹǿuKBrÑȕ`YstSEfǩvhsþnFAADKJD=;>A>3'!$)*CuĹxqokllquvvxzvlghmfRESi_c`Y]msokc`mȷϯfG=>BKWjvz^TTh࿂eL;BhsTLdzppMGR\ѶmCJ[um;&$% "&'/07@IJF@HLlf,(5@7;JSMJLQSTRUZ\^RA*'7BJLC>>@BC>3!'2*' + "*'+36=DPZemy{}xvwutyyvxnUI9"  &%#+8KVG@KPOLHC?:6;8721-+(+))*,-)' "->IOMIMQPD81) &/]οǤ]PT[\YsvkC23RzٹVHEIHMPFFGLMNNRSQSRRRSTV\YahtǦf@("!$)4AHGD@9/&'&&#@h{dOGJV[ZZdiYC;EPZ_fmsv|~}vlnpmf[RMD8,%" +3;Rn_ITowxxmcZO4)8ITUSW[NOVXRRe~ǦmRZuV\zsWFHs˭˱SEXw|YR`ѥnU<757=@=:8530.,+,-234388:;=>>=940.,+(&)('%#!u`LA2@_̠mOThoںrQIrЉq]RA) $##'( 2041 ):2* ( #,&$-9CCIQYev~|sQ6%'++08GSG?IMLKHD@<8979662/)'%%'++'% ".=EGJOMKC5& ".4]ýͤr]aYV``~ĿX<)6W}cRKLLOQEFGJLOPRTRSTTRSUVYb_dݷnC' #(,.DIFC@9/%(&%".FnnUORQUY^ggWA;DO[bhmqtx{|{tjkkic^ZX`XME?91+(,.FbTQYgprplYUK,+?S\YVW[TVY[]_bfmρ]S\`mpXOXp}fECWideSHCAa©mG@LVNG[ƞhLKyz_F92<8668:??B>92+# #*:ayn^`gmqr|{wyytggW3GT][[_b``XPF52S}ƻƿٰhKWIXZ[d^JBA>BDA<8:JXqӜ`NAOִdBJUd}pUB>Qcm{俊jjojz{kVOWp‡N>02)'))'&##&0@Qdq}ǡ{`[wwnigbWOG@;767<:87531320/,+)(~zhO<5Q~php{~`FSuЊ_zɴrcWRA' ! !&%!5129EIFACGYq_4*6DGJMNIMORRUYURD0!-;GNMA89@BJ>0&1@5( &+"(:DABKS`t~|sQ1 &,148DPF>DHIIJGB=87698740-%$$&*)%#$$$1>9;=>;;BMDR^eomdaVTH' +.E[a[WXZ^`]Y`jmf[bn~޲pmjooaHFMSIBTrXHNPPFA]ݼl]WQLOgεlD16;LYRB2/1;::88<<=?ADHKKLLJIFDBAA?<;;>AEDDIIKKMLMLJGCA@?<:::864210~~pO86\~gRFHC}ƗkgÕj\UQ?$  $#"5127BHFCHKUcskV8 +$5FFFMOKLNPPUWOH=+$0>JOI@:=DDE9+ .9@2#   0&(8A<>FR^p{zaC* +#+59:BND87687653.&$##%%%"&&#)2DLOHB:./9:aƿ˾о^[pb\t|Z6)6U{Ϳ޻ybPDDQUGFFJLMNNONORRQRTVYf]gP-&04DFB>=7-$-*&$ !-RxqS9;=FR^]P@:CTakpsuy{{laXVYdon`S79=@@BDFU^^UPRG51" +F_bVMNVUT\h_?,+3X»ɺ{_ea\RR]`VJGDIb֡x|ۙT6Ibc8FXgn`:1Vozv_G;GRSYe|ˮ}x{ȗeK8:)*.,&"$1D[sgdy}pjhf\TMGB?@ACEGKMPSQNLJJIGFDCBAEHJLMOQSSUTRQQNKIHGEC@?><:866|{~oL45_ȸǧ|XJB:DXؖ_dѠwi^VR?$"! "#%324:ADDDJHOV\hfTN<0@CDHLJIKMPTTIA3$!)6FMLF<;CIG:1%#0:;. +  !/'(2:;;BIR`krw~y|cC+ '4<>BKB:?BGKMIE?875632121*%#!"#$#&%#!(2=IJE7$3>BjɽУhenb`seC58-;5/,19<=IYQ<@DLU\jǼȡrM230/0,%""%'5Lc|зueh}voli_VPKFEFHILNQUVWWUSQQRPOOKKMORTVWXYZ]\ZXYWURPPOMKHGEDA@>=|{{{~eB07`ŹY53BUvǮuP}и}af[SQB&!''#!#)027<@BEEFCKPKORKLD *8@BCFHHJMNTPB9,"%/>MQLB;>IMH5*!$2:5,  + + + %&)/69:=AGNSW^ksurx~~~}iL,$3=BDH>7?AGMQNF?9963-,.110)$ #%%&&$!&.>JG4"""5=Epؿ͌uojdep|¿lQBETh{׿}jVKUZJMLMMIHFGKLONOOQUVTq֯~M61/:CEA:/(#$"#" !$#/Sq|vlH8+#$$'$8J_kkjlqxuxyjae_WOD2 &294* 3FMIFG`ncaf\Q9)!).>P[VQTTQPU`dfbYRSPOU`rԝ̺ͧt]ffmpo§xdSJCA>5(#'#''),//0/.037;7, "(&7k}bRMP^he^___ZYX[dow|zseD/+9B6" 5L[aehd[QMQMA4+)CoƿܽpZB=Ln¶jsPNHkĪtK?>IOC3*08JQP`w~vk\QPTWXZawƼïY3261-'$!$)0?Vmðtmz{tob\TPMMOPSVY[]^___]\Z[[\ZXXXZ]abbadehgebc`]ZXXWUTRQOMKIHG~yvuyzszu[9-9cvvodcQMZwʹؽhaqY[QNOB* **%"$,-4;?@@DFIFNQHHNNNJ&  &4>B@CGGKLOSP@4*#"(/?ORJ?7?KPI1(!$060(! #),28;8BEGJMWdqwzvllt{|sv{vgW=" 0=CCE;4>?HNRPIA::71*(*/23+% !"%&'('%# %)7EE3)(,-/*5:Cnһ̀eoofjs|pYMNYivũvbSYZLOOPMHFDDJKMMMMQTa]޹V?4JLE8+#$& 4Q`il]E,!(-3G`lkims}vu}tgaec^UH;1+'3@HGDCB: &,7GG@c|ldgVJ,!09DSZTPUVOYX]ddZNGJPWXW^rʰȤyҰwn]OGE>6-,!% $/,*('(*/10.& !+/$.fȿmUHIPameWJGJLPT\`fc`SB12)-?RR?(%:GMOQQLFHI>1"1W{þƿϨ_E9>Vm{sc{ł[F6dʯaI;BKIMX[Za]Vg|ȿj?<71)$ $*;Kawʽ}uf`ZUSTVZ_bbdfffgefedfeeddaccikklklopomkifb`]^\[YYWWTSPPN~{tsrtuuuskaO<5Day~hM<8950Ls«wågkոuYUTN@/$'*$$125;?@BEDFEHIKMNRQF* #-9?ADIJKMMPK=1#" "+9FNNIA94+''-11.*%##%%$$&&%#!%)29=80)3389,*Oxɼzbchlr{~{zujXMVjq߿paZZURNMJIIFBFCLTTXXOel_HNRF/%')$ "'7QcbK1"&&,>Whnoopsv{~{shacddb]WROOI@Eaz{o`O?/'6>@KSUPKMSTX]cbS@88BHNQPRY_tݼֿm`VKHIIE:.$ '*-+)*--001,# -+!1Zs[PHDKXelaL<=@>BKQNKB:.'!!1HV_aS>-!!)4?DDBCC;0' ((GXs˽ŷýմ\C<@DLU[YW]l{ć`E2eǯeG@Phzxt}wtqon{y?B74*%.DZs¹{sicaaabdjmmppqrpopopqpqprqrrttuwwxxyzxvsjhhddaa_^[[XWTTQ|wtrqpqssrpeWA-*;VjqR,0BGzòuprˮ[ھziXLA-$"$)"#/25;?BBDECCFHHJLPPG,"-9@ACGIJKJLG8-##!#.:GNMG?;@FMH4%#&513*! + (-0101..4;FMQSLRVZ]c`X[[ajqsmgUE93&   *3:>@>95>FJOSNC;>:4,''*030.)'&%%$%%%&# "&,153/+64:9++Tܵw^ahnx~zwv~vn`RYgluǣwf]_bYRONMJHCEBMVUTRO\wⶆbL@41.& !"! !" &@SWL?-! *;Tgprpptw{|yrlida`bhqw{k`K5+,--& $ #2=Dc|}p`O;0&(6DJJNRTQORXY\\]UC0('9?HMMLPTXcklsȮywŴ˺{\S\]WUNFCA?80& '*+)((+-.0-(  /Vm`UF6227BS^feSB:;<511.-,&$&,/>L[aglbS:,$+-.02/' %$9B[ƹ¹ٴbKCCP^e^[pđpS=gĬyad{rqwni|vmfbeggdsu=;83(".?;3*%%(-642/+*('%$$#$!!!$)-,,2396',_Ķ˥q]`go{|xusryxvkZ[ehaͬp]`kbXQOPMJEBBMWWRRYoƽлݨuT=-/2&  !&! '6BIO@+%4Mdqtplqw|{wstwrka]alx~mT>787+3AJB307EMh}wi]N;65;HRXVORSPTZ^\XSOD2 (2>GHIKNMKKIKSg|w]SVxε[HDIJMPHD@:4.% "),+*()-//.*'  /K_u{eVPE2!5LY_ZE8575)%3EO^glhgjg`UG3$##**?Ŀźģldi~ƣȼ}fSFq໦r~¾wnpsroxvrkd^[Zloux||xokd``fif`s{D520(!"+8EXlǾ̽Ƚvpmppqu{~~snmkigedaa_][YXWzuqpifecb_[YI>.&.Ej|uiXam`OϹpZq]S0!,%! "##$%15=ACDFD@>@BDEGLKD/ # *7;;;@>BA>=8* !")3=FID?9@:1)'$   #*3:?@98-  + #$$!/cµŶë՝aPp_KESִzpƾfK<9{uf: ,* #&$!04>BDDFD?DFA;9?GKG<("&% ,966.(# + &'&%# '++)-+1>A6.,*)*+)% '( %.4<@97;FINQLE=A=5,$!%*8:973/-)%#" $"*oǵҫqgfjqz}wsomlkquzo]ZbaOȾcZcg_WTSPKFCILV[QZʳ˙\WD( + #7LLC6&*?Vimf^clvunkov|jUHIPh||tke^WRPW_unYJ>;:;AKRWYTVZ]bf_T>5.(!!,7AGLPRIB?6+*5A3#%?UhsbUMJQLMJDLQFC:3(#"'-/.-,.//..,$ +#&#"D`}Z7" +$0652&,8IT\bhkprqmhhjlni_P?- +""%+Fx¶˿ڠZ=RqmN9Blư}rpnnbd|μiZNKFBADKO[Z\_dglnjmpibbhpb?-/3148@MewIJŸwroruvz}snljgecb`_][YWVUlljhgccb_\WRPJFD=6+4Sflstphca`VUTLOY]xɠ`5A{P7SyA --!$*&/6>BFGHC=;=>ABFJLC-!(&!)2646868750+!#.8?CB>:7-$ #'7;;:93.,'$")vŹΜwtjhls|{urmkjjoqwpa^dbR¹ufcfb^YVQMJJPMRYPaϻocUI5  #!   $4EHIG9($.AUegaZ`hongcgl~v^JDEN_q~tWGGOUWU_ynTC688:>GOVX\^aac`VL6.&# !(/9?FIJGEB>40/7*1Ph{ubUOIIJGAED?CF=<7.& $(-//.../1/.)!&& '^ɶX7( + #%#((0?HXfmljgefijlmnojkh]N>.   (',[÷¼ž~UOW__TB8Pɷo[RKEIWv̾}kYKB;8_\Z]`dnvosrh]buro{jI531,.9G[o´Ƹ~xppqux{|sllhgbb__\]YYUUSUSRQQPQQPKIED?<<7.# #=VY]_^XRKOPJFGHVn{R^|ǖX6PæH$41!$.(/6>CGGGC<:<<>AFIOE.#*)"$)02-03032/,%%0:??>:<@EIF>3'%,,%/:72,)&   +  + +  15,#%+4:86BJLPRME=C?7.$ &4:<<<61-(%")yĿȎkrnmpw~{uqmjiikowujfjbYȽyjddd_YSPOPUMP[Vq_Mla   '2=GQ_mssq]C;FX`aagxyaJB:ACGJMSZ\ab`[XRIA1*$$$$+28=?BEGDFC<3! +F_pyaJDHHHFKBEHA>=53.(""),010/11230-# +6va8 "!.:>GLU`joni`^bgkklkeii_RF8,  ($MƼ½½֪`OGA>DNn¤ymQ>3+)>Xtò~vle_XTSVZhu|i]fxmL52.(.=Mc}÷Ƿ}vporuw{{sonjhedb`_^[ZWWU<:9:9:;;B@>;:834% + 8MHCEIIF=CC89JLSobTpG^ײI%92#&0*-4>CEEE@:89:<>CGOF/&.-##$&(-.+.1-01.(#'3C?8.' !%27;<:40+&$!+{cqvrt||uqmlihmoyzomja^Ⱥrdfhd^VRSRWOQb`y]<:&&%" +)2837DD;3?N\eec`\`degp|}xm^K;0(((*4=>8E=8@SflhurulO>>?PSUUUW\_``\PIC;4," "#%.69;=DGCEHB4&''"(+?Zixyx]C?GLJIE:?ID=<6,)%! $)-033221342/.!  ?{e>  "'1ADC<42268;BHNI1$*+'***()),/2-+*(' )47;??9<;=C?5+$ *0))3:92-)'  + + + + + -1+%#%()(%!.CNQQQMICAB>5,"!"+14764/+% BԷv]wsw{tpmlmnotrstg[bhǼnefjid\VT]UUZg{ûƫwK-"  + ")0622;>9BIT\ceea^[]_^`fn}v`E-#+=Qbnk`eeaTD=AH\\]]]]^]`ZRF<50,%!"" + (/7N^_^c_UJDA><:>>@AB?98/%!  %'.1223472/375.&  "$*LTP?1*#  (0679AHKJLOPRYdjfggeeda][\\WL=.%  +#GĹ˶ϪpVC63(5QjuqWGMjȽ^A!%.8AHRhľμwnjlpqqy}~~xwqokkijfgdeb ""!&*.-00)  ,=DE?=@@9>CF:BRh{RqÜʵ|d•c9+0.#&./&""-3:;?C@9212469AFOG2#(*)/2/,((*+*,+,)( *58=A?9:8>@@=90,%#!!"'+034456941364-% #(&-'!!" %3;@?=BFGKNQSSYagdb`_`_\YZYUND7,'$    +?¿ŽŧbU6*'*">XeZG.%.bù]<%$,9FOTcλvojmonpx{|~zvsqonmkjigg"&&(& -7=DC?=BG=8;EEZ]=ƥ͛g`ӭtK2,.-'.3+#-37:<@>9212469AFMF0 #%(132/-.-01+)+,( -8=@A>8:0$&,1**3982,)*       + "-98-$&'%%$# *?HHGGB>;886/(! &-034/)%$ (!":wƾԹjsx{{ytuustvtjnvl[ZsƽϺthgnk_Z^ibUUuͨsH"  /798.*/33;DNUW[ce^YY[\[agwzulcRD2% +69Ts~wneaYNB89?EKIKLNOOOGDA<9542+)'$" +3BDGHHFEEH>642,$">MI>ADADRVRH>7337766421/($  !&*.12234630131)$ "$! !  %09AGFCFFENRUWWZ_bfa^_ab`]YVQIA81/+*(#  + 5yƽþϿ`B79$ AXV:"$8wɿȿF''$)7JVXasɸysnpqruz}|xusppnmkihg ! "#  +59@C?9>G=54HHlhPXˣ޴~kŒ]B1)+.-56)&-3779><7332469>CLF. "'26530./02...*& $0:@A>:7:64342,&"&-0320*($ &"VȺαvxuz}zxvssphkuiWVwǼǽj`mth_`q`Ugޯi4&5% + 05670-0336BOUUW_b[VWZ[[]dfmpkjid`SG923;GT[qvmfXOD969;?9:;=?@ABB@><99880-)'%! +&/NMBEEAHRXTH<4155201.++-*! !#'*/2333463222.& #&  + )58AHIGIHGQVYZYXZ\_[Z_bb``WUPJD=8711/-&  -]u|~þ¿ľgF- $-! $'!8I?!;U}Ͳǵx=(!#(4JX^hny°|wrssux~zwusrpnljhg!""! + );8:<:348;86IY:WË|Ņ_{֡dG?.(03188()-2557;:6555468=<:99782/+(&#   "+26=@CBBBDB<70*-29GH@DB>FRWPD6/145114/*-10"  "$(+02333454331,$ $) +  *5:DKLKLKIQUYYUSTVSQU\_[Z\VURMG?86252/*#  );Ub[R\Ǹʽǻs[=*" &,*))( &/@9$%5GYh|ŮοĨj5&'2GZitoruµ~zwvwyz}yvurqoljged"&$" '779;?@A?9>?Swr2cϣj^س{A5;/*64287,&-1546986665668;?EE4" -354348:;E=3'-4:A@;:::86. $*--%$,.(*)*)  +')' +  +-400+!***))('')+,+-,.0)*)(&$"!&+--./,,&" !$"*ֿҲriXX]bc]PB;:Qn~qcj~|xuvuvyiUUoȹggtzpfj_tѼ̀="&' (/1043/,./;HV__]^^a[Z]XPGEEEDA=93-5/.8DMSWep|}zmZH?:7221/-0//24578;:97766630-*(%# &-3;ADDEGCD@8,%*5:FEADB:BMPI;2.011-/2-%&,/! !!$&),13333454430*! &' ,)  )4EMRPLIGDKMNLGEGJIKT^[ROTLLKHB92/330.+$  $)>F=28hƲoT?1$ %&*,32/-(&,5:IMKT[_djq{նùɷX%'2Ibr~tqq¼ž~|xx{}{ywtsqnkhed"##"  + (17:9?GIE>ELb`Jz֣_SjɸzW54C<481-393% .12237658876679=DG:)$*-0027?<=@<7.$!+**"!)+%$$&& ')(   "/540,# +,+,-,)&%#"#&)+/4%&'())&$&(((*)+,&#-ǥ~qc@BBED@6+%!T­}w}yzvz~lSNf̽ǿudittn^jz.'(&#)+,*-.+*.2?HS[][[YYVV[WL@<:832/+%" %-29?QZdfaZNC@=;73210+++../1279766554421/,)&!*07>AABEBB=6)")4>GDBFB8=DF?73223/),.(!"#%'+/111122332.& '&)/& )4ELNIA><7:;84//26;BPZQ@;A678751,,21.*)&#" +(.,%!'M|gR@)').338;CBAACCJOS`gmxxw}~zvne\UU`{øO#)8So{~ton~ſ~{y~~|zwvspmigf! + + )1=?54;;6CHVo]U`Ȱ{.Fht^IB7=NK<3/(098).12137658:96677;CF<-$)/20,./02.+(#)-2:<;>D@5*)*(&)! #" %''  +   "%1684.# +,.0./)(#!!#(,04 $$'*)(%'&%%$'*,&#"&6Ǿȼ|vc7877752,)TþǧkiԡV:5>HMTbwzsxqRGbϽrWYp~~h˴Z2% + ! %$'))+2;HMT[^^\\]YZZTB3*,&" "$%/:?FIGBBB@<982.-./-,,,..016878767653311-'!"'0598982)$,5=B@@FB69?@<:99862.02)  #%(+/211122342-%" +' #*4_{|snm|Ƚ}}~}yxurnkhg  + +  + !)3;>621+&CCsQ[ŗU16czhC& =]kbQE;/.7:4%.//23447;:886678CDA6)!$042-("!*01.,/9@:3' *%"$'%  "%($  #$!!  +37785) +)0410+)"! #*/28'$%+.*),&&''&'')%#!%%Nɾʰm6*(;D867'LFJ}nH! #B_qwib_dowsoroot|ztcncnxgWK\yžżnSaqwº÷ЖG  .20/49MRW[[[\\``ZWU>%"&(31//149964420.+)*(()*+.15656656854521-*'"! "*1540/>=94,&.5C@@G>/.1:BCA=742/,,*%" "'+///01223542-' $ -94)./320/4@8>yíl`l@235482'!(./145669@@:86445?EE<+#2884.($  #%&)+-/*!"$ %&(%  !!"!#! '022335* ,3862/+$ #'+050.-,-)))$$%$#$&((&# 9}Ƚñ}hLFQWG0!"1/0252./ %1#     + 38FGAPUV{k`kŽƿk+)5 $39/.011?NWZ_aa_``]\WSO6!" &./1//-+)*))''(),/0565465669886520.(%! )07?HNRME8&#.;GD=;2.7<>?ACC@=6,""&'#"(+..//012232.)"! 4>3#/57:9606>FIIFEC=1&*ETM9  3>LVUF?3,,.01,% Põyohd^WTSPZm}z{Q97;<=Qby}|}}{utvy|~}xsyѰhٷǾg=1+,()2Hd|}yvzĹ~|xuqom]WLKJ1 +  *;428;67@7,WzjS_xºd;*%5582$#/./14577;CA=97424;DG?-!.5752.*) "%(+)& !"%"$(&"#$&$"  )21..14, -49620+&! "%)+021.+(&$%#$%$##%()'%"Kúzuiekl[=###+-#! !  %((0-2R]QʾydqŷٖovW1,GMA9=O`heZ]`baabb__YUQ8%/4/+-+))))('((*-0255546577:998533/*& $(-026=CGEC<+ $/7GG<51=UYPFADJMPA4%"&  ! %*-//01123331,&!"!:B1 %3T^nqjeOJS]jz~sQ4(%3373%"..025699=CC?:75337BFA2#)032/+&% !%$"!(($!&! %&% #()$ +0,&*/2+07;841,%" !#%-0-'#" "$$$""$')((%"^ɺĹsnrz||wjN/     6G>'&()'(,5;*%&S^PͿuĵ½ºƝxWA+(>LIC=Iss\_bca_``^^XTR;! + + )38/+-**)(('&')*-025766667777875321+&"#'*.1798;?>4*,48@>;HUi|rcRJFJJ>6)!#'  #!"',./00123331/)# &>A. (8BDE@;42320258<81((I^ZE)%! +426:5-)%#(/498.  +  ?bwqeULEEGO]ixolllhdhlsx}f8!+029Noztqkhhow}}|{~}|zxutrqpqqrryxxy|wt{{ymhv…lDZsA534.4>Ql{xyyuȷC'  +!/65676237?>ED<=HMRIKUX\VGSLOOKUdfztm]D.,21052&!+.0278;;>DB>:86235>DB8($,.,&   + +%/1.(!&" ""%)#!#$#""#" $,)  +1*"'-2-17<841.&!'++$ $$#""$&(((&$!$sldhwuq]>,   #& *ZlW*  &4552-17;4# "WaVͺþĻĿ־Ȯo^S@@Ic^_bca_``]\VTUA+%  + +  !)251.-,*)((&'()-/136666668877986332-($""#! #-4;A@9017E@8DhnTC;;;>8-(& #!$),.//011233/,& &=9& .>HHF=5(%#""&-38862+'&&/Na\H-"+%"(*! "%.5;=4$ + + ,Gaqwqgplpywib[XXZZYafmsw{~c9 .534@]}xqhc`^`cqy~yvx|}}~~}{yvvsrqsuwy{zzxyxwvportkagwwocaĕ`ZӶs?7234=IYl}|w}zyأhN4   +"04323:=918GD9/%0=RFGPQPG9B9>D>@GIUQRPC3390-0/'!&.047:==@BC>:97423;AC?0(*'!  $'/:A?70!%*&!#%  %*)! "$&''$##('#%+% ,2) $+2. 28<963.%(*$##"!!#%''('%"$>ĽqfaoqvnR= ('   >O:(-2)!.YI %08EA;3*'&&) %_h`ξ¼Ͷtt{_bcda_``[ZUTXH73# + +'-1241/-+)('((**/03488888888888762321-)&(&"+AUdiaUK@8/06GIFNmz]KINakiR:(!  %),--../0111,(" %:2  %5FNJD9.#.1343100;VfaO7.71,-(%-5;?8*  &'*3AHRTh|qg[VPLKNRT[`fkpruwwzyxww|za;$".60-5Nkuuqi`VMMSY`oqtrppsvxyzzzxuronnnqswywvwtpkgb]ioeWVcp|q_RQ[|ۿ}Ykȹ~m?;99>KV`jrv||w~{z潐yN)  "153/0=E9(%<5-3.3@R@?FA@EGA9?OKFJLRF>CE<762-.-& &.047:=>@CB=:96445:?C@2##    $%',/5)(!&,(!$%"!'-," !$&''$"%*)$&)" +.3) #*2.!08;941,%%'#!! #%&&((&#!2Uʺľwkanpz|bM*JXflmnou~y|}|˹= $$$48215414>8648AHD>88>CFFJFDEB:30,*+-' #,,-059;>?DC>952110/7CE4 +!4ILFFHJKLPUZZTL;."&/+%&($",2.& $%!#'+,( +  47)!)4/,7<;4.( !### !#!*(('&$!7qϯ¼eXXZbntvqmi3*4O]QFELD<)'woR6'}v&&9HMSWNH<-!  + 0`ouƽwje__aghfc_[WWYXQL82("!!%)('(-46421.141)$%"!%),.27:9;;;:89:<<98633280))-*" HjɼwZI;03AHZc]^qgagtf+#$  &*,-/.-+--..-)&!!%:) (2?DA;2,()(",47CB>;7566128BD3 'HYjrojc^TX]aa]XTK@2% '-,#%(+( '++(#! $%")++(  +   #84#+4.-5=:3-&!"$!"#"((**'$!DǠ~yr^RQXdkppqrH;9DRUW\_P@#"'DzI% :r1.3FW]`_Q?2$ '@goxŻzmgbaadgige`\[[XRK@91-..-)"#$(/00-36972/01451($%%!"&+-28;;=>>::9;;:87442373,+,+%"5qϹtVLA58IRZ^dug^]uw;!),%"&)+.0/.,../.,("$##1- + ,5>A>977?=8,%%''.9ACDFD?JYigP938>?=6(!!',/,-173,(j{xw|wsonotvznegd`ZTRW]^]^]ZUSQNNRV\bhlhQ:3:@A?>8009BIBDAAADHOT\^]ZYZ]]\]`beefd^\\[]^]Y[ZYTQMJIFCDGOMIDBDHHE@99,\˪tPNivtRMTxmJIVYkyvonkj~|z~ՓN &&%$0;565424:=<:;>>;717>A?==>B=:<:9:;359CE7# 9R]bddehhecgjg^TMIRMF<0(%&'$'.0+%$'+.,%$()'#('&()'10+! $#!*;.#-3+.6<94.'""&&#"%$#$(.-(#VؾmW\afloty`O@8@MX^\O=!&=KgG2]vC24AT]^XD/# 6Wmkxƾļxojgeedeimkd`]\XQJ>952220.)+.17863>??90,03641*'()'"#%*,18;;<>>;::;88664434872+.2,!+OĺoTNF79NXWVhv_SPqqB%$+&!#')+-00/.///.,'"$%%.#09?>;:AHNKB5./116@HHEDDDScpm\J;1=@CA9423::=?>65771'(<^lz{vw~wnfaa`ca^\]`dgmkgegkpqmgaZWYZ]\YWUURLEEGMRW\_dS@--:DGFHB:.-2;;;:;<>?DGOQROKLQUWWWVY\_^ZVVUWXWTSPNLHEB@<889??=9:;;:83/0 /YɛaA>diSVjxoSQ^`krspw~}}|}~~zzx~|y{yttvuww{}~}|~l$ '('#.;9864348;998:98568<>?=<:>=>@EGGFGGGD:0/3532*%"*0012388:;@@<<:::<349BG>*'6KZ]]^Y\`cbba_[SJB8.*KYm_4QU/+:UbaQ9   Gjlezþvnlkjfeelqlfa]\WPH<7300/,()),/3676BED<0,1720/,*))'''))*/599;=>;;::645344456=8/065-ErrPNF7:M[W\w{dVNUwiD,#)'! &)+,-.10/0//-*& #"#02& 2:@?;=ITSPI>9:;:>EKIEELRbowrh\H5AFKMIHIKOOPQK?:991#$=OBLW[WX_chdXNOTUPOJGACELORNIHN[ire]UQRSUSOONLJEC>>CLRUVUYL;*(4?HHIE:, '3;7789:<=AEHKGBBHNTRNNPRWYSOOMONNLJGFC@:9551/.331/220.,+(*//^\9WuqcerrYWabejnu{vuvy|¾{|yyxwz{}|yy{|zy~|zyyy|}ȅ4$)*)",::9866779785756398;;=;;8<;=@CEDCEDC@6--2663)$"*/123488::??<;8789127@GC0# +  0GRTOIDNZefc^UM:657;:5.3;JURE>>A;3//1-%,/11,$!+, #0421/-(#)//*%",5 &,0*.7=93-&  #"!"! &//*#! !%!&OἯ}uqpvz}~ud\WI7+'!!>FU\rb(&?fwsY: + + Rqgfѽžtmlmmhffntoha^\XQJ@:50.*(#$$&(*/36CEC<3/49.-//-)&#++***,147:<=:::9534233348@>3.165oīqPJE<=NQYlsfYKLioK1 0-+&!'-..,,10/0/.+($ !"3A?' 1:A@>@LW\\YTRSQLNPQOKOZfltxsmgUAMQUVSRUXXWWUM>74:1&#0AG27>BBBHMHB86CRSLD<5+*+267;BJRY]]VOHFIJJHCFHB;4556>IPOKEGN<+%+5?CC@6$#2;679::9:<>@C@>=DIQNJHHLQRLHGEFDFC@?=;833/0,'%))))**(&##"%.#=eSMTzsms|p\Zccjpv~|}{|vqlkks{¹xtrsttvwwxzzzx{z|~ٝM&,+(",8::87897;:97665589:::::89;>ACDDDIEA<4+*.675)#"*,112388::>=;;8778347>GD4% + +,KW`aYRLFNUZXSKC;/,-5=?5*)$*6<;=AB<3-.0/*-012.& *, "/552,&   .21*%"+/ $),)!.6<92,%   #  &-/+&#!'&1o߻oiqŻ}toouyzymZC=5*!23CtĠh"9bwmO/  + +]s`pͺؾſulkjlifhotqjdaa^YSG@80,'"!!"$).6?8.)+.8@IJE;52D;1,,.7<=6- %5=6665556889;99:@CKHCA@DHIDA>;;<;988742/-+)$" ""#$$"!#* &=gZDkyvukZ\edlu}yvrory~~ži5).-)",6:;87:<9;:9644455798779;::=?ABCDF@:61*),475)#"))002389;;==;:89:::9:?GF4$8MnndSFISXYTKA>A?:@CJTZTG:'%)0784.(+24/02451*!!)-"".440% "'01.'! #)*!'+)"-596/)"  $#" %*-,)%"'$Huacwþ}xpklrww|vhcYTEGIARfl5#)CMG1 + 1hq[}ͺǰ½xnhgihhhmpogcacb]XLC90*%  #',08@FLE<76;@C;66:5.(*)+..-,,-14787767331101/29@EC40FdʷeNHNPLIGdl^QI?J|qgaQA>6,%#" #*)*-/---.//.0.+'#"$  )122.,)38;<=AJQ`befjlhaVMD>738@MNSXUMFE@EJLIEB@?=:6442.**+/@DGA4%25:=:68<91&+6953310./1223246:;A>:879=?=9534221421/-,*)$" !#"! !  !%0.$*AsxWgvmaX_llnz|xwwyz}|z»yC/.,("-4:;87;>:::86323547:9669=9<>@ABDEB;431--/376)#"('/01389;;;;;;9:;>@@=@GG3!5SgkldOCGQVIA73690$%0APUL<1. + &*-,.*$(39643675,$!).%"-34- !'(01-%  '** !%)(!,585.("!#%"%)+-+'"%!"_Š|i_n¹xwsmiint||wzttk\mp{qZ5"$'"  $>opWϾɽ½ɼ{nfeeggjmokc^_bb^ZTJ@5/+&#$)05:?GLQH;36>DHC><=:1/0)*./....03666455311000.15:FJ>9XȫyeRLTZOCPn}ifUROZzfae\N@0.)(# ,442/-,.0//./-*%! &"$0=<715888;@IO^_abgjf_SG<4* !**2<8-)/#',05?LUURQNF82150*)37) &' *$,346:?DIJLLOQPKFCGGE@>7530-))-357@C@3# #1CMKB?A:1#"-6632.,++-/1-,,/366;8311468961--.-,00/..-+)%$#""$$$##$$$$&(081/44Ojgvte[Wdruy~~{wupqtzПL262+#,59<::ADFGFFF<30.,.1851)$!'+112378;;98:9;<>BAIJGDC6$0KX[TUY[WNE:- 9A.&6=@=3+,% !$#',*)(*2;=859;862()/,'&*-,% + (.)--)#  +",. ,/-(+8;3+*$ $%'&$'12(!#!Hʪ}nioļ¿~~|wqmmptw|pU.  5VjbiŽ̺÷fX]bbacgec^[\]^]^UNF=730/245;EPPKOG>98CFT\`\\_XKC<1&   %)0>KADJHA621+),'!(2+$(1892& ",;GP[elnpnlihfeefeaYNIGGE@<654/..28>BCA7,!-FVWMHIE6%-3//.,++(('%%'')*-.1/*)),/11/.--,--/-..-...*(((''&%&''()*+.9X_Wt[U_jsz~~{|yvpqvګZ350)"+59<::;:87666677899::<>DEHGHEG;401.13851)$!'+112378;;89::;;>CCJKEED7(&:GPUURPLHFA;(+:3%%5EJF>4,/0598.&!$')*3<>8:<=;85-"(.,''+-)  +,%'(% !+--0.*09<2)'! "!'$ %.0'"#+jˬxhk{Ķ~twvoppuw|~~wlZOGB;6:8+-C]ham˰ǿƋfTY^__afec^[Z\]]\XSJC<865<;9;61.--,+.2464556111/011458@C9<@>81022+)!*<:%,5<@@>=<<@FNPZcmnpqruz|{qcTI?=;85478;==@BCBA6.$ ++?LMGIMJ>+%/0,,*))&&%&$%&&&'(*'&#$&)++,--/01/01100110,,+*)(''(()+,-.09;DJC59CmɸoUoWR\ivyrqqqtzo)%261)!*48<:=<:988899::;<==?AFGKIJGG;415366741($!'+112378;9789:::=AEKJEDC:/%'0>IKEACCCB@;3,!#.3/(#0=>?<;82*%,+'(,-& + %,)    *+ + 15/(3:<1("" #'!#*,&#$?ƫypfqzxzvmllqsx|}|v|wmgbZE07G[hf^sѭ¾°̎eOTYYZ]cb`\XWZ[[Z[VOIC?>=CGIKMQLE=;==>BN\vjB;DB:?>;6.++-035745462220101548?A9Hȷ~m[VUXXSPLt|y]LGaomkaP>751(&%'(/87652//.0121/-+"  "'"&.>HB.)/*06;=<:8:DKIGD9,+06:;9885564,)0:++.0,(*0.23.*(-15/+#,=?,28:;>EKOLKLMKQYcbaaelw}wcQE<:7679>AEGGGFA:7*""+9AB>ENNC-'-(%$##"!!%##!"!! !#$%'*-001111101233/.+)((&&'()+-//19:AJI>88UΌd}hSPYhwzslmmsɁ8-25/' *48;:>;;9:8;9<;>=@@CEHJLJJHF;43879:941($"(,112378;9879::;?BHKIECA:2/.3FUSC1$,3<<3&1B<,#&++.0/7EQVUQMF7%#,9DD=<<<::;5.!#**&(++$#$&(#"**#47.%-472(" ""%'&(#!"')%$%#Vٺypkkvxmu~qhegknru{wvy{nvtd[TTSN`nod[yɭſ¸ЏdKNVVX\cc`\YWZ[[Z^[UNIEDEGKMNOPI@8:=AADLWmgSG>47<5FįsfUPSVTNSZ{ruU8IqytmaPB:?BUfy}xgR>001/0//1242.*'  "&!#/6CI?)'0,168/,& #,7??@@BCEGKKNKKHG:55<;=<830($"(,112378;9679::;ADILHEA=9456:EPNA1"%+352,&0?I:$'3,'!-@MQPOKF:(#-7>;178866961'"**''))$$&&$$$ %+)$63&$,32*# %*+++)'%&&&&&7uүujfnxwn~ynfeinrqttvx|}}xphmxukms{xrl`pxrf_żЍaILTTW\bc_[XWYZYY^\XQKGFIHNQPOOF?787)*2357<@<3+-154221/;FTZXSSTXWVWZ__]TPNLA1$&,,! ,295=?76:6,383)"%*0049:658:98446;>GILOLHC?989>BC@@@=830+%&(%#*8BD=<>>3$#$ !  #$%&&+,.+,)+)*+,*--,*'%"#%%#"$$&&()05;=<<<<=>?ABDDIJLNNMKJG<47=?>;830($")-112378;9557::=AEJJHE@<963:A;5578:61/28=@@<5)"%.196.,4>DDACGNI8&%*.266.!111/1763+"!)+()'&$##%')(&$$#"#!!"'+% '5,!#)12+" "+//110+(&''& QѬsjdouuqù~ulgiltvuttsttyz{y}yqkq|nnihlyzvmaWfruoji͛ƼɇaHKRSV[bca]ZYZ[[Z_^[TMHGILRVSQNGA75:DJLKOYeaE410/-+'#!,01200010101123474699Nɻ}poaJIKIJWspnjWMHyxiaidK8CiqQIm{R015552//252*" +   +/7:40/57<:8:>:0''(+*)+/3DOYYPIHLOIA?CKLHGFHNI;+""+,,2>8@F@@GCBILC1%'" $&'(''()+,/258877:9?@BDEFGLMOPPOMKI>69@B@=730(%")-112378;9346:;>BGGHHGD?=;9=;-$'2:GDA=>ABA:/)())+*79812:CGFAAGJA6/;>@@>:/!+++*.698/%!),**%#$(*++'%%'(&$"%()'%# +&' +.8-!-16-032(!%%  +157;:2+'))' iӱwmejq{¶slecfkrtstvuvsvu|v{yw|z{z}~oZcdfgkuvqjb_hoolquܺǮƿ^GJQQRYabb^[Z[\\\^_^WMGHJPTWSNJD?3/3BQWVVX^hQ@/&#$!)./0///1/0/102143-0;E[ȶ}y\DFD>Ec}nng?JhxpiZWNISgx}pR;A`wr`65765201241(  -@E6277:7-##$&&$&,3CKQJ<35:DC?:794+/19FG;* '*,0;5AJGFKKMTWN:!  "%&$$$&&"%)-132253139950*&!!$4AA9532.*,/)! !! #%%%%%$$#! !&#)10($&@hiBG?BRgqrtztM071($28<<=ADCCB@?>=====?@BDEFJLNONMJIH<48?@>:720(%")-112378;93389;?CHEGHLGCABJB4'&/:9>DNSQH8.(*3;5'"&$+,%#.DOZH74:?CDJLMLKE9*((((.8<<3' ()('" "(,.+%%)05521132.)# !# +%8?1!,2,0BT]\[_`~ǭ~eC2/2/-,/222133//.00/110).?Ogʲ]FKE7Bjq{opc*A}skl_G4Drd3<]lPD53431235140'  +/JS?8GRNH>6454+!##&'%%+4:@C9(")HQWRI@2"*8>1#*+133APLGHE@IPM@,!%%(/-//,,+./(*059998)%!"'('$"!'9>:4354/..,&%$#!! "#%$""##"!$"" /5-##-Nd0C;@Vnwtt{|ʝe460)!/6==?ACBBA?=;:99:=ACCDHLJJKLLHB=:649@C>750.)'%*,001289<:779;=??ADGKLLHCDE>0$,;?5+H^njdhqqspmfb`djkmqu~ǣ֬{VJMSVST[afda^[[^`c^THBBHQW\[UQMIC1.3BYdcafei£_@8;504::756973-&)252:5:6MðjNUSBJyzr`LAzum_YDNm|P=Y{nN5+-154230.++(  .?@AEGJKGD?@=9-%.?B:0%".75*!"(%!+44!$*%#)262*//-*((.384+"$&*04-78FMY]]WRPKE525CYgjikk\kܽbI;&87656:@A><5,+..,9:>7U|eWYTIWoP>/StogYQUy]NQ_rybI6.,.24420-*(% + !0?GNQOK=71/1.)!! $(,+1/-+6J]g|R4,%#((&#'& )+%.5>CGHA7+(%&)-//('&(,/0265223653..137650-'#!$$"! "#'*,+&!"$   #&(*+,,,--+**,,,*)**))&&&%%%##"! "#%$!!$' #&'"!)IxV)8AMXgswt{zzy~گs>6/, .5=>@BDBB?>=;:98>ADFGHJLJJJKKGB>6449?A=82/.('%*,001289<:86;;>?@AFHIG@:5643.+5BD<871(%'))'-0(%% !##%)"**%1.-(#$),41+ %'/7<1:CMVZ]^ZOB<:88,-- ,BHjTGfxwG862'"(,,(#"%)*#!! 'I٫{nnjfkɳuroijpkhltz~}}}~}gMDC?Xm}tmhche^XSSW]ly˳¿­ʒbWLOSVUX]adcb^ZVSRPJB:71" *07<;99>@CFHIJKLKKKKHC?656:?@<81/-('%*,001289<:78;=>?@BHIGB70,+1578>B=31'$--/,"!)' )/0&"+!&)'-,+($$+.0("$ .=C6=N_head`TL;?FA6' 4.#98>K]hjimwPH´wPNKGA:5047<=62027@A:r{kZMD>Ipr]),|t[Lj`U\gsydNA=;92-/5751.("  +7FNI@6.*'**( "#"$&$'   &,/#$$$((%*07?FC7.(#&18IPY\WK@;3.#)(+.21/,$! "'(*+/157:;:830.-./.020.-....-)(',*++**)(&&))))*)(&&'((,-*)('&%$#%&'%#!!"!!# "#"! !"'')-/2589>JKHMG:43;ISbmu}z|ڪk65/, -5>@BDEBA???><;9>@CGJLLLLKKKJGC@778@ABIIF>2'#$/7?DE?2'%%.+,(##()%-/.%#982'$.0' (-.,-+)''-0.#!&'+CMAJWitpklj`\KJQND5#$/70+DoyusuL?<9(!%*-,("!&.3321+AdϣtmnqxŹmehlljnu|scZ]anu{xrnkkhd^XUX`goztƸÿȂHKXTPPUY^b]ZWTQLE@><9:BJV\WVPHDDA979CSelliq}XO̫x[E::867=FJIǠyjZJ=>VdQ)8p_\pNIh~wiUC89<<2-.3531/'  '7CD=4,)'((%!!""$&#+#'(('&')(" ")041+(-14;DP[aceikiaUOHC9.*((&,*),..,* $)+/1578:;===:8654553469;:99530.*..,+*)(&&&()(%&'%"""$&*+**)(('&&&''&#"#%% #&&&*('&%"#%),269>ADILXVHA71838BJQYdot٦i74/,!,4>ACEFCA?@@?><:?@DIOQPOLKJIIGC@89;>?=94/-+'&%*-001289<:87:=>BCCIIE;-# *3?FC7'! %'&-66/0253)!#(@:/!)15-$#*03.11/+(,-/&%-.+HWO\_mwwuuuonaWSUN=.585>RcvkiL>=7%#&+.-(")1325.KsϤwqppvķe`impkot{~|mbelksyzxsnkie`ZVYbjozoɄJS`WNLRX_b[XTRQNGB>=?DLRY\SQJCAB@;7@BA@=;98998656<><<;:9766643/-*('()*(($$#""%''&($%"#!#"$ !#$ $*,/2-,(&$%&+389<>AFIJQM?6-(458;@@ERayբg:4.-!+4>ADFFC@?AAA?<;=>BIPSRPLJIHGEB?:<>@?<62/,+&&%*-001289<:87:=>BDEJKF:* (0:?8( %(&!)),596/-0891*((!  *6,"#),/142/+,,/)""-5 'J]Yhflv{cPZU?5C=6[g_ZH;:4! $',.-(!",-,01R~ϥywtqsõddontmotz~~ufm{rtuvusqrqlf]Z[dllznȾƳýN`gYMHNV_b]YUUVUNIDEIPWZ\ZROHAAFE@;@L^oxwyzryǴpWF><@B@CGMM_t̶kK:2QrO?Nssjp|vK4Nun\QKE<96721//-./,"  +''#!!%*+%"'+%*  +  ),('!!# $6=AING=@GOU]aeglnwtpjgfjmllha[QHB:50+*('&%%&)*.1678<>ABACDEDC@>==>@A@??DFEEDABCEDBB@;841--..+)%$"!#%%$$ )1233/,)'$#%)121268=><>7//($,459;>EWnҞf<4.-"+4>BDFGC@@ABA?=;9:?FNRQNKJHGFEA?;=?A?;51.,+&&%*-001289<<88<>@BDFJKF9*!*/78- '-/+ #/+(0780(*9C>0&  .6+ "%).332.-.,-*!,:  &H]\mimvhK[ZA7QF9rɊyLOID850 +  $(,.-(!$%&*3YШyurtxŵgirptnruy}|uzsai{}xrnnpu|xukb__gnhynľȼ´þõyQlk[LFMW_b`\XX[YUQMMTZ`_]YQNGACJJE@EO^mtvxuz{ЬeXMJGA@CPMc˿jA:6`kF9azjbfqG7LvxbQFGE@963221-+,.*  +$+-(!#),&*  +%,(!% !6ORYcf[ORZ]^cab`delpuoibfjssrpk_TJD=6/--,,(*.15<@DFGGIHFDDEFEDBBCDBEIKJKNRRPNMMMPQPMKGC=97213.,&$# #%#"!  !.55320-*%!!"$(&%%+/34.0&%,'(-26?FRlԔh87/+!)2=CHKIDC@@AB@<875:GONMOKJHFC@>=78-!#)(+054*&&+.0* )5 3J\liipxqbUTQ?J4J{{cE.-:2/+#  $%(+-+& ! $'0]Ш~urst}}ξÿmhooxoutmo{{kWkmUWechhglty{{vngdbgjmt}ɴɚ{jmo^QNPT[d`^^aefaZ[Z`cfc]WNKHIMPPOLGL]nussvgзcN@8ASD@^οijbIDU{p\CDo~xqj^M>69guiURPJ=119;60+++,-# + +$*+& "$-3-!,    %/42)*  #'@]jputmbZTb]ZQONVZdispkdehprrniaYROG@962-),06=9=CDA;630-+$!!).1112679988;=BEIKID;.!"(-263-'%$-/+$#+5:-72%0/++1;DA3% $#28.#"!&/41+'*345/(%(-#!&2CWgqnn{|lffhaQC@:\~ZtzeF,&-2:4.# + $%(+-+&%(/^˨|~}xvuw~{rjnmtmssllv~{xcJgyZ@=FLU\ajtx{|wogcadit~Ƚ¼Ȗv}zfVPRW^fdaachhe^^`cfhc^XMLJLPSUWVQVcrwvvrrֿx\MLL5SǺufpwnYMezje[E5/:XxcMOLMH?2.3<62-,,*)"  +#(&# '.-'.)'#%)+597-.$#$-Fbosqi^WUWYWXRQOTUaelifafjoqstqjf_]UNF@72-28>EMV_egc^[ZYVSSRQPPQUV[^cinqtssrsvxwtplhda]VOKDB@:52/,+%$#')*((#'069:5/,'" "#&#""%"(5FZn`=81-#$.;BILKFEBBBB@;8534=<@DEA:520.+$!!).1111668878;=BEHIG>0$ (.6;@>70-/1-$'38*(!$&).5::5-' %(!)/&"-2/)).8::8520+20.)&0H\ljgr~lgfn{qZP3=c_9GY[P4#%*(?8. + $&),-+&'*/a¼ƭ}u{zxwvv~uȿvihgjiprlktz{}}nXqqS;47>HT]itzyzvld`aek}տčr^UX]chhecglljeefiijc_YPRRRSUY^ZW\hvy|zѲn]Y7Sŵp^dxaYJ.!'L{lT:CADEA8208420.+&#   #%$ #+..46:/'3:8:AC;/&#6=><01' '4NgnpocRKNSUUYWWSUSY\b`_^ekorwyyspjg`ZRKA;6:=CJR]hoqnjfda]ZZZYXXZ]^mpu{~ywtqole_[SPNFA<9550.-///,)#(-5;:94-)###!"!$($%8Kd~xZ?92.$!+9BILLFFDCCC@<86546:?DGBBBA@?>>?CFE@:411.+$! (-1111557879;>ADGGA6( &-2==?@:/'%$$ %'%",275.(((-/0& ,4( ##"+1-(+17=@ABB?7?>9,#&;S_cfn{}rdlluud:EgndL16;@?1%#$62&  !$')-.+&*--dƴ|qxzuxuuvw~ox³yg_acinspmsz|y}{}zs]OHHLSZbkv{|wpha_bhp׼}yxz|비zh^`fhikhfijkhfiikkid^ZY\[YVU[`_`hvsQjȱǺ|~cM8%-Br~g]K>67<@A<942001/*!  "''$%'$$(.19:9951-(! *09@>:1($ #(-+#(=VqrV>:30%)8AIMLFGDDDDA=9653027=@??????@@BEGF@:421/,$! (-1111557689;>ACFE:2(!%,/182042'#$### !!#1571'#(.;;6+*5<3*&*./,!#'+(%,65=FGPTTLIKG>-4JQ=*%"% 2Mcntoiecc^ZRQQPOMJIHMSWYZ^aehmprpnliiihecbcdefdfkrwytpnkkkklnrs|~}yvsnha[WSPLHDC@94,$ !)2;41&(7AILKEFCCDEC?<562,*068==>?@AABDFHF@:532/,$! ',1111446678;>ADDE81*&&**+) ""&*+'$""22'#)5894.-39?>7,!!+7<70./1.,##-98;2;:;B2&%!141) "%)+./,&!-//iľ¦}efedk{}x{λl^a`inslaZ^frvxxm}pink_pnkio{toe\[aktɹpgc[]cgaXRK;17;=I\测tsutopmjifecagjkjgb^^acccdhkoyʼǾƺ~Q*)MpYB47:<;6686312564-$ %)*)!#%)&" $,LmkQMY_chgWRWWPGNb`C,&#"!"*@\nosh]Y_deb[WUSSQOLIMSWYZ[]^aeilnpoqrssrswy~}{wusvy{wummnoqty{{vplgf_ZVTRKC<2)"  &,-5@EC;- "')((0@WnhP?<52'(7AIKICECCEFDA>9;6-).34<<>?@BCDDFHFA;642/,$!',1110435568;>ADCD:5-'#"!! +06:74564118EG=307:=?@BFG?>:/#"+4:9751/,) -<@:2:Z{sWF8348406.9R`aj}vȰVJS>$.8>E9+.;:4+ "%*,./,&"#./2oƷˮgdcaitx}}z|͹o^`]cgng[PT^kqttwzcvllxxiqqppu|zvni`[[dp{Թܘbcmffd]ROPA9?LJ3$'Ls꾔|vwwuqomlhhffeikjgcbbijijnqtwǹƷi<1KtzjO:1/;@>8554044542* !  $)+)!"(&!#(Hmvfgokhrra\fiba_jbE.(&%*2JfqihaYX^egcca``a`\YRTVXY[]]abehknprvxyz{zyyxyz~}zxrnib]TIA3*##"!%*/68=DEA9,!   *5A<1,055;<=?ACDEDFHFA;7530*$!!'+3112233345;>@ABC<80' $8DNPOQUTMHIRWPA689BGNRSREDD8-*07AAC?:42/ -.)4VVrėvw|{rqqnkijkdhkjhfdhrsopuyyyɿU/CqnaC33,5<=856516543-#  !    ())% %'#"'+>\qx|f]jl_\ingh`aX>+$',6Pmoedefimmlgebeeifc\\YZWZ[`ajikkmoqsruzz~vncVH=0'#"&!  %&,/7<@CEC>5," "$"$/AQmzΨŭ»ûף`M@72/%&6@FFGIFGHHGFDC?;:;:669;>ABA@@ACFHF?:863,%#*.85432222/2668>?:3/+##+#-LV^bfjnla][_b]M@;BR]eeb]PRSJ>544CGNKD<;9,(671#$Rm?>ZlxV/#!#%-7CQkӾηɷ̿ҵԞ]J=72-#&5@EFHIFGHHGFDC@<;=<99<>ACDCAABCFHF?:863,$%*087422111.1458;:6+$"/;0%.FZbhklqsqkhfghdXONVcotvsofhiaUKGIJOSRJDBC:% !$#BvdH`ϱtZDHYgrtA(&+..42/()4<>>1# #),.//,&  (/4w׾ήcbbbfjjq{Ⱥ|ncZZ[RV]][XZ_cinnu~}}vvx{td[ZXYYV[nºʸѥ^\XKRXzW<871&,K^lžuvzyuollijnnlmot}|v|νrtgYM@3../0455589::90#  +  $(# "!!&(')/;Qhz{sg[I<51.,"$+=Ufmmjpwxuohehiklmkjhfdb`acfhnqv{~~}~~~tcQF<950,*))*.4EFIJGHHHHFDBA==??==ABDFFDCBCDGIF?9752+#%*076321111.1458<:4%.9C4&!",BZjptuty|{ywtsroieioyy{{th^YYY\\YTQOPH3/UxjdxwЬu^f> ('#,,(%'29:8,  +$*,-//+%!)/6v̼ħgcc_cllr|tkea`_RRWX[Z\_biry}}rw{xgXRTZZWQYtȿɵ̖zfGOS9/Iȥ~K*,3/$(ZfUuǦŰ|vz|qnqusrppty{{ǹob`WG;50,015777:;851(  !$!$#!$%$'*/9Kc||lZN>3./02*&)8Ocmmpv|}xpjfhikmnmlljigfefghnryziXMB?;743336;BJQVYYX\\O8#2C\{պӽ͸̷ȶƽ˔XI;82,$"0?CCEGGDBBBDGIF?9751*"%*066210000/3559<=:+!&3[pvּŝl;#2! %%&*)# %.664' %*,-/.+$$)/;xɾ۾ife_cjkq|ĸzqkdbaRPRUY[]^`jt}||uxxnaTQTXWRTfĽʴꯅ]>EIQY`ehhbhcM/&4RhѵҼ̷ѾԼκŎVJ=92,$ -9DHKKIIJJHFDB?<?CACEECA@@EHIF?9640)"$+05510////23649?A?7-$'*-133( '2>Oaty{y{xokied`][[]_L7#"&1?Lg{ıd>-!"#''&!#+10.!  %++-.-*#!&*/?wɿªnjgaehjoz¾sgb_UQPQUXZ[`iu|}{zwof^YVTSQPaϺΥhE<1;3`θV'!)-$*LkyeNOjѫij~|}y|Ŷ|gZYP<224/258999;<:-"   + '% !!'*)%$.CReilhaWI=641/-*''.),9Pfpt{{tmjlmnprssttuutspmlkov}yrrv{~oaWRPMJIIIJTYaiosuumpgH&&B]ҶѻʶӿηʷŰͽSK@92,%*7CILLJJKJHFDB?<Ur}qs⿔g^ZD>5.(#$(.22-'$(&,>B>@CDBAAAFIJF?853/(!$+0430/....2676:==811352(  3BJZix}~}|vroomigffgfiaL1# (&!$-?OYcmqtҸgJ82.*  "% %+)$  '-+,-,(! !&)-2Guʼҹumgbgfiowvi_XUSMIFHKNW`rvvsk`ZTG=>H]½ŷ㻡ĕZ=%+*&&]NJ`eio׳Ǻ͸srwsh\K=7432568::86783" + ! "!" +%#!"*+)'""'076/&" +@[pwxx{}{xutuuuuvwxyzy|zurhimtzvtuwy{xrpnkhffggqu}|zh?#)2GgƯԼƮȵîκҶDZzLJA:2,%  '5CJMMKKKKIFCBB?>AA>?B=@CDCBBCFIJF?853.( $+0430/.--.15::;;6/)).1-"$;JUct~zwuuqokjkmkmjS7(#)(4Rdf`NZhuhFO9'3- $#%)'!  '-+,-,(! $'*.4Kvƾֿvkeaeghox}woicYUPKE@@DJPZo{srrm`VL;06Fdýɷʩʷþ~#?9/%!CңzmckظƹŶηvtwtkWC66630579::7566/  !!""" +%"!$+*'&$ "*396-"(B^qxvvyzxvuwxwwwwxyz{z}}wtggipzytsuwu{~{yvsqpqqx}}h@%.=QlƫĮվŭǴͱȦsLBH:2,&"%3BILKIIJJIGEDCDDB@>>?@BEEDDEFLKID>974.)#(0220/,+,.425:><4+ $%)=HSbp}|{zywusqlkjkj]E."!#!"(+#'BX]XT^gaRQXUDC74:?6# &*$  "'*,,+)$*.*,9R|÷׿olaXefflt}vaMKJXjc`[UJCFMJBGVntjpndRF?827DZzǼ¼ʳzG39?@84I~~peiƵƬлĵ~zof`H@9334587888730+! #! !""  $%%$(,-)%"%'*++0133/(!,Gdx~{wxzyyxyy~yutwz{{}}qjhkpy}xurouuw{}~|g8"7[}«ʷţǻԽȮǠoMEF:2,'#$2AHKJIIJJIHFDCDDB?>>@@BEEDDEFKKID>974/*# (0220.++,.1126<;6/'8DPap}~~}|vusqmkjk`VE3(&)+$ *-!3KSOLSZUHADB<<89?=4'"'(%#&("  !'+,,+(#*/).7Tôεmmf^ffejrz{^?)*-Gb]]ZXNGHMKEEPm~ukbgaVG><95=ENb~¸νɻY>8;><8Gqحm\d͸ƭƺĺxof[OC=610235:;:96/)#! ! + % $+0342358:;<<851,&" *B_rzxwy|||||}||{yxy|~zrmklq~|wtuuvy~{g5/M{żůλĦĢͳؿŘiOHD92-($"1?GJIIJKKJHGEDEDB?>?@@BEEDDEFKJHD>9751+#!)022/-**,...15::73%&3@O`o|}}xxurokigYSI:-(*,( &11 4ABCJLKC;8:>;;??7,&%"+/.(%"(&  !(,,,*'").)-7[νĿĨ~hhc]addipy~~^C +<^YZ]ZUMIJJHFNmth`YWQF;7986;"3_ןtldi׾ù¼qe_QA<:43101479983+" !!  !(0:@DEGHIJJJA:/%$!&8Ulvwz}z~zy}{smght|utstw}{c/!4Jmϸʲ«ģàũγœeQJC92.)&!/>FIIIJKKKJHGFFEB?>?@@BEEDDEFJJHC=9752+#"(.11.,*)+--,0278880)!!'1>Paoz~~}zzwsoida]XRC1   +,31'$0=DCA>A>8;D@>?<0%"#"%,.+'%" %*(!  +!(--,*&!),+-5`Ⱥzgb_]]aaekux{hH.AaZV__ZQIEEHNUs{l_WSIC9201015<>@KkĤ\2-;>95>]ދUdwzƤóŹýk\YO=95620//214540' +  !"  + $+5=CCDDEDDC>6*$/Jaotw|~|{|~|}zpfclxwurpquy|_( 4Vṵ϶Ǯؿžy{}{ǫǕePJD:3.)& .=EIIJJLLLKIHGGEB?=?A@BEEDDEFIIGC=9751*##'+/0.-*)*+),/135:>70&!$'+3ATgr~~}{wxxvqlgc`\WI3$24-2-%(;J=439=89>>851,$ $(,*$!## *-)! +")--,)% '*,/7^͹xidcc_^_bhqtw|tV9#)OfZTca]TIABDS^|tdWOK>:40,*)*29<=BZ}ĹŽβT7$,60-.j͆MSrʥʾükXSL;32430.035652,# "##$""  + # !%,1667765432,##'=Rafmv}}~}|wjbem}ztonoru~}U"&KxʮӺ˰־{tv|zӽ~tè̝iMGF;4.(% .=?A@BEEDDEFHHFB=975.(" !$$%,...,)((&)-./28<;4,%'+07EZkr|xurtvxywsni^ZYO8 !9FA666/#!0;9217<8662)''&" !%)*& %#$00'  #)--,(# $+.3;TĞrkace^^^afmtuzs^H0 2UgYVd`[UJ@?BVhyi\PGA520.)#$+;756@Rk̽÷޻c/&'02+-4gʠ[FaʦþþqZMC601331-03>=7/' + $&&%$""   #'$!$'****)('&#! %%3@NThs~uiefn{|uqpruw~qI!9a˰Ծϱħؾ}||Ϸ}׼ѧoJCH=5-'$!.=EJKJKLMMMKJJIFB>=?B@BEEDDEFGGFB=975+&"!#$"!)-/0-)&%!%+,++29:/& &,3;J_nr}~yw{}~}xsm\WWS?#2LXOB896+#"$$+-147551& $(-)" '%%0."   #),.,(" ")08@MyĪmnqeeh[_]afmtu|~o_RB-9WdX[d^YUOEBDZt}m`WMC;--.-&!)6<5.2CU`g°Ԟa@(',.,(/:Wɰus^Tq˪ξv]H:1./31.-15?;1'  +#$#"   +"%*,+)$!"""! "&$#!$&-5@I_lywnjeo}~wuvxt{mL6@aзԼӴͭ~ּ͵ϲԮsHAJ?5-(##0=FKLJKMNNMLKKIFB>=?B@BEEDDEFGGEB<875)%""%$"),110*&##)*'(-50# %,4=Nboqv}{uob\[YH+5R]RA==>50,#%'&''$%,+# (&'1-     $(+.,'" &.7=Etʭzfs{pkn`aachnuv{saTKA+;UaW`c[VURIEH_wh\UNA7&'**"/B<1+6JWYSҽʿԺy;(/--)%&.9JZjxaTRnѰ¶ѼzcI7212430.1681( !!  &.=:3,%$(& &(*0:BPZinljlr~wqqv}}zz|t{x`XlտӷնҰԻʵȫϭuEFC?6.)&!!.:86-'$"&&# '*/01+% $),,)(($(7CUiwvw}yuodgb]S9 "7CJOID@>6-    + (#$(% %,* $),.,(!'+)*5fɾֽ|rquwtookjghmstvzpfYNH<&EX\\\a`ZTNKMQdp^VPE7/$ "+27;753:86-'$$''# '*.21-%! "'()'**,'/%(:J\o{}}|ujbaiow~zsmfd`]Z@%$8AHE7542-%  + !$!$$',)  %*,.,(  #(%%-_ȼ̪{qrrwzxtsqmmmosssu{{a\VKC5 "M\[[\`a]WOLOVjmZRK@1*%4=;7049AKTVXWjɲ¿ľ̶߮i@;;6('26-2?IKPY_b_]eanɷ~p]K@<=>AB@<92'   ',1220$#!   &#.@BGJA.&))" #$#!!&*.38975,)&&''"%)-11-'! $$%&*,=BNA$)?Scqy|~~sqoj^NEDJSanspicgc^afO./?EL?"!     &''(#+.(  #(+,.+&!$(%%(Zٽ}rotw~|xuqppqsqoq{}nVWWNC2 +/V^YZ[]aaZPMR\r{hUKD9-(,AI=/$,9FOTWXIMϼԹٙJ3@=2$7aueZ_llffi_WaoaµzhVK=<>BFE>90& !%*/2420&$  $0:0*?@ACDFGHIIIJJHC=964.)&'''##',00,'!#$%$()JYgX:%"",D\jqux|tlgdb]X\ciow~}h_VPICBDJP[fmppnle`gp\6!':FNU>  + + ((!.((.,#  '*,,.+%  "%)%%&Y¨xvuwyyvqqqrtqmn}l]QW[TF1=`aY[\Yad]QLT`xwePE>5,)"!'9IJ9)&4FTXUTB:ǺøŹȆ=.:/(;pvjh[Ym;a̺ĹtcVD@@BEC92*  $&(()++,+'$&.17EI5,DSFDD;0*,+&%"  #$%" !',06=AKQUVY[ZXQmkv~tijXE1+6GUVURSPD502DGHJLNNLJHECA>>?@ACDFGHIIIJJHC=863-)&')&"!&+0/,'"%&&#$#J^l_H1&&!-Ebsuvzz}yrkbYPHEKUZcnyx`O=530..*-2;HUagngckva9"+@LU[>  + +  &&#*3#  .0) $*,,,-*#!$'*&%*\||yvx~wrooqrtslmyl_VT[`XH4 Ec_WZ\U^d^QMUbzr`MB93/0,2;EHA2&#0CUYQI8.oξЫp@;A47lôu5UijpdXQJGD?3+!!-89852/,,(&#    '1:@CEPM3(@PDCA80-,+&$#"%$$#$$'+.4:?JPVY`dge`w`kjq}~}YQKSN@0-9JWY\WSK<,!#.F{s|½ÿȶնñϺ̸ʼƯҰ{KJFB91,)&!#0=DGHJLNNLJHDB@>=>@ACDFGHIIIJJHC<754-('')(! $*//,'$&('#" AU^XQ=*('-Cf}~}{|yrbRE<:BKQ\jxy]J5+&   2CLgeckt\5"):,))0:COW]XPH@70*%!!!#*0:AEFIJKPJ.$;LCDA70.,'%#  "$%%#%'*,06=BIPUX]aebj[efhlx^XvV'+4KUI:9CQ]^_YRH<0'"2zx}~}ǾԾijڼȴϹ˷˻ξнҰ{KJFC:2-)&!"/@ACDFGHIIIKJHB<744-*)*)'  %)./-($%&&#%%8INNYL4.-+>e|{ynaG5$$.ERdvgVE<7/'#(*-28?EG`aclqY6%&*9LWU9 + +$%"#+.&):3! "(+--,-) #&),'(/_wrtxwxwywtpmmikoruphfmaa`\Y\ZQH9',Qe\U[]YafaYTZbyiWF;77:@AKQH5('+12:DJE90(-O_hrw¼ҪjILBEmӷV ":`ۼ~{wrnhiltz}zn]K9-! %+04=<>?ACDFGHIIIKJHB<643,*)*)'"$*./-)$##$$(*5CDI`X=51*9a~}{kQ8 #6E[qsgZTRRV[`aba[RHA]aflpX9+.+9LUT6 + &,#"+, ,=2   $(+----( #'*-'(._{rmmswxuusnjklikprtnfcqyra[_b]WWSLD9)!1Uf\U[\]cgc\W\dyfUD:68=EEMOC."&.7;BEC:.&-7LMXa_sxyƾˣM?PCIݾwޛN().aۼy_G6 " !'1;ADDKW__UIFFEE@1);LHG@40-'"   "%%%%(*-17=FLLOUUX\_Z`l̉Qc]fc]h{t]:CBFIMPPMIF@?<;:<=?CCCDFHJKKJHC;510,*)*+'"!)02/(!"! "-5;;IU[^P554Dby~{qeZQJG;AC<8>FI[`ixvg\\bdeeje]YZ`inmmv|rZHCDGO[d[9 %*)%(* +"05+  + !&++((+/-& $%&(%(2b{zywsqpntqplllnmnptspe[Wdhd^_`^YPPKGB<. ';U`]VWZ\bfb\X^gzweRA==;;:9:<>ABBDEGIJLKIC<521,*)*+)""'./,%!!!!'+7?Wc`ZL3/?Thyvi\TRTUkpqjeglmmot~pjfhijlqgecdjs}wty}r]ST\[[bh]<   !$)*-)(34' + $(--**-0.' #%&&($'3cƼ{yvtvvrqpqsomjkknopswuo`QK^ed`_`_YNNLFB>>AFC>50.//;99:<=AABDEGHILLIC;521-+*++)$ %+.,& " !2EgqaPE5.H`mzzqhdejmrvwqlkkkknr|xvvslfhnlnqv~xtvvjYW^okfgh]A$ #&'+/2& 162"  + '+./,,.1.& "%''&($%2cyuttsvutttvrqolmnrstvzulYF>W`c`^]][OMLHE@4(6CSZWRSU]dkic]`cvyiTF;9=@DGL?1.5960:IQE,+4=IOQRW[WQUcmluÿƊW=7>@6GƷδ@($'+'"XmhԸjM5"" $*-29DLNTZ_^WOJDFNZ\SE>@@:36CIJ<:3/-*% !$&&0127>DKMPRW\bfll\sqFZe^XCIM0%5K^?%3UM,9=5BU_WK<.%"!3~mpuy÷Ϛӻʮվ̮жŮĭɷϧtMEGC;4/+(%$"# ",:ACHIKLLKIHA?=;:;<>ABDFGHIJKJGA9310-+)++)$$(,,'!"! -GnsWB?;9L`o}}{qrqmjjjjgjoy|uopvtpspbTU_nnle^S?+#  + %)+++-+ (:9.  + "),..-,-/*# !%'&')&'2a¸xvvutuvutvwsrqopswyyyysfTC:T^fb^\[XOONHFB8+8CPUTQRTZbkkgbbeto`PF<9=DMPI8)+7=:4@LQ>$%18?IMQQTW`ZX\[X`oĿʽn>2CDEEJNPQW\bgjiQqlQ[XOM>@B&=QZA)1Por=$252AUVSG8.$#,@Ƚqqpps}ҫѾжպͳ­±ο˷ΦsLFIA:40,)%$#$""+8ACIIJKKJIIDB?=<=>?CDFHJKKKIHD=61/.,*)*,+$!(,-*%"$"+DjkK6>EMMXn}zwttvwy{{}}qqvthWXahopdQC6)'"! !)+*)(# +*=9* + "')+,-,++,$#%%&+)+0bý̸wrwxwuwuvusqrswvvuwy|||ysi^PGBV`ea]YXUQPMIHD;05>IOQOPRV^hkjefgq}ueZUJ>7KMH5"!,7'!$ "38AKUZZWVTNGCBBBRW]ce_TIB:3.29:8?91,,,/.(%$" ! !!!$'*-789=AHMPWX]`egiiaw_NH4)6<@A-(JZYC00IWU:.44;MWKL>1, 1Pû½|sopvzĿêöԾdzʰ̲οüΥrMGK@940,)%$$&#")6@CJIIIIIIJFDA?=>?@DEHJLLLLHFB;4/--+)(*,+$&*+*&"''(>beH7DP`VYm{}yw|y}}olpri\^gpwtbH5+$! !"$$"!%.21/ .=5% +  %(**+++*))!#$&**,3dľ}ohmvzyvwwutsoopvwyy{}|||uk_UNLLYaea^\YSQQNHGE;039FNRPPNRZeijfggnxn_VXOB7:DNR5,-5<=BFPM@.&,5;@BGJLOSUQPSVYY_jgloja^cjvwvsjd_^bcgkqv_96;03Myݸժy=.&,/))'FhB]ޟؾ~xsrompmbQ?(!!"'1:IJOTVSLGWVSQRSWYZYYZ^`XNA81.366596431.'# "##!"#$"$#!"$'*,49;AFMPRXZ[]adfgpqZTPD,/EG?/4XbSB53FGE<954CSRMP>23$5^Ŀzy{}ýдǻçξìкϥsNIM?941-*%$%'$#(5?CJJIHHIJJFDA>==>?CEHJLLLKIGB;3/-.+)'),+$$()($%'&9^hRCNXlhgmuz{|}ogfhe_gst]C2)" !##! !")120+ &381  $'(+++++*)(!""$)(+8iŽ|qnpy}|{zxwvtsonqux{}~|{zyodWOLNQY_b`^^[VSSOIGE<139DPURNIRXbghgeejsxh]XVPE87>DD0*/=ECGLMJ?.,7>=EEIKMPTVUSUWZY[aglnjbafkqqokd`_`lnrvvs}}S?25@dǮsݽ۔I($'.2.*);4AAKЬvuwcnʹwma_\\[YOC5& %6DLNPVYUNJLOcipyul`[_gaTF;31342022221-%"(+)&!%''%$%"!!!#&*28ADGJKKKJJHC;4/./+)'),+$"%&$"&$8]n]QV^owyoqz}yrf^_adrqWA4+"!#%%''$#$#!!!"++,/3-! +)84,  "'((-,++,+)' " "# #'&&;lxmjny~vuwutuutssstwz~~{yvmbUMJNR[_`^`b^XSTPKIF>57GGIILOSUSRSWZ]^beedbaacehhfc`^bdfjqwuomoxЩ|YCSbޮyhÕj'/+'31&"<4:}q}輈f]iklºufZUSQOI?2($")",FWWQJU[ZUXiyywinsjWQE9562.+0.+*+*(# $$''" $(**&%#"! !$(05=DMRUW]]]^cglnw^OD7:ITE1TL60FtnE66>YQM=9;@IRMNR>6A0%?b½ýϿùDZӨtPFE<52.*(&%%&&(-5?DILLIHKKHGC?=>??>DEHJKLLKJGA:40-,)''(+*# "%%/Nhf`ejq{~tqxxumjb^XXdxvY>41-&#%''(*)%)($(07:6+ +.63  + $*/+,,,+*)'&# "#):svidckt}|vvvxurrprrru{~~zrkaTONU[TXZ\]bfjd^TNJHFB;AJV\[RMS`klmjbZadp{tqia[TMF@<<;267CUWQWPE;5;BGJHHKMORSUUVXXYZ[[a]YWZ^_`e`ZVVZbfgjlmkifcigq|ݷ}Ẕ|zoq۾|E/0+-+.)",P~ԡuTVWoµ{~xtpmlieUJ?71-($!(-9CKSY^ULIWh{ȸzogd[M=/**,--(# "*.0/.("!!"!#%'('(!'+15??>CEGJKLLKJGA:4/,+)'&(*)# !#"'C`kqtoktywtvy{wuuy}zvpc_[XXdumQ?73-$  "#""#$&# &.883+ "2:. !&,0,-+,++)'&"$"&IUde]TU^efiib\]_m{yrj]YTNHC>:@EJWdb_a\N>7=DHGHIKMOPRUVWXYYYZZ\YTUXZ[Z\[WUVY]`^`bffecaa\erջ滔mk1nlS2#,'(14/)%*Et}yͽ}mf[QLGDAD>6/+('&&"'3BPUTTVKKWsþtidfj_VK=3..0::7.)#"%)+,(#! "$$%" !!#'.2;>CIQV[[aadhkjd`GGFNS64XU-EHKKHILLIGC?=>??>CDGIKLLKJG@93.,+(&&'*)"!!"  4Ohvknv}|yy~snmsz{voa][YYaluwkYE;75/&#"#"#$$&%&&)+.350$.99%!$(-1-,++,+)'& "'%$=u{mc^agq{{tsuurrqtsvvux{}}qd_YUVRKFVY[]^]ZY[[YZZXSP<9?NcjbWPW]`fgb^VYf{~udb`^UK@7ADNTWRQRXK>9?EHHKKMMOORTWXXYYYZZXXXYZ[ZYVUVVXYZZYZ\_``_`aZ_n‘tnk箇s+#$-*#3+$)7>LzدĶ|nYQF;6321630+&#$&&#$(4;FPSRPPPVhzlqvn`[enndXH>622:>?;5*" %*($ #$"!""!""&).4:?KLOPWY]]dfijhbYRJLIKI-.VT-=N8#(Bu.$/J]snK58J]aPA4#%%;aÿĿֽè˽úңpKCD;41.+)'&'(((,4=DHKKHILLIGC?=>??>BCFIKLLKKF?81-+*'&%')(! ""$! ):Xsrw{z}ysquyxrjZY[\YYY[VO@50/33,*)**,//31/141-)$ %5:5 $$&,0-+*+,+)'% &)&#=>AGJKKLLMMOOQSXYYZYZZZVWY\[[YWOSVYYZXVZ[[ZYWXWd^eqyٙz~ڗnsپG!"+2*!..+Ck|ͻmVE>:76678601.*#!$!",3FEEHLNNMYdvubSE<6:=A@<4,&%')$$)(!!"" #'.34)]Y0>Q>(*@v1$-Le{O25J\`T<0&!#,InĿμϳ˺ңoJCE;52/,*)())(),3??>ABEHKLLLKF?60,*)'%$&('  ""$" ! $(Ar}y~}vu{}|xtss~{og_TV\]WMA:1/+# *1-,-/3689?;;96-   +/<;.  $#%+/++*,,+(%# (-)$ICG; *=IMMPPLLMMOQTTY\ZZZ[ZZWZ\^^\WUMQUYYYURWYWVTTTTbenttvx}ԃf~ŶW)&'*)##(./Kwõ|gVF7,'*/4:975*,*'# "%&2:JHHLQMB9J_tvltx}pdZSRKGB>;:9650&#((" !"""'+4??>@BEHJKLLKF>5.*))&$#%'& !#" #"$ ._~zzvwy}zyzvtt}}ti`YRV\[Q?-&)).159:;9651)"6?7) +$#%(,+*+--+'# "(-)!(;c}qkikotwutpnoorpqrstvxx|y{|~p_NLPTUI4"  $-<4Ffw|{¾ŽƧԥoJEH>8530.--**))+2;AFJJHIMMKGC?=>??>?ADGJKLLLF=4-)((%##%'& ! " "Dvwnrvzwy{~}nacmuyy{|}vld`VXYVJ6  +  &)+*)#   +-:=/##%).-,-.-*& "*/*"#-:Y{|qjnquz~ypkkmpnppqrsuwxzzyxzuhYILQVXK6% %1=GNHDCKZeklbZZhrmaYICDThvl\JQkh5$(1ANUUMHKLMPRUVY[]]][[[[Z^aa\XUSRRTWWTPPJJMOSX]bdjfjws|أpm⽂XsۖK%(#%+)$.8<1.Vɧ~{|vz{vzkM5126553210+&"! !!!  &/8@CJPNHEFLUeqyynf\UNEDCA>7/(').+(%(,.3??>?ADGJKLLLF=4,)((%#"$'& $ ".\tqnd\cswqwy|uvurv{|xjUEJ\mw}{~zsmjXXYRE/   +)4<7% $"%*/.-./.*%"*.)#%26Pnuljqv{{oikonmoqpqrtwwxywttncVJLTY[O;- +  +(9;CL[gpsjZT[ed^YIBAM`rwg[ifMSHB@EMUULCLMNPTVWZ]]]]][[[[_ba[VTRUTUUVSQOJJMOSY_dkl^awxw忆cwbYe %#%%#%)(#48Jùkgп||~{wyy{zx||u\I2'(.2282-&$$#"#"-7BGNNG90=\{q[J;?EMRI=0*054.,0506?GKOSSUV]acbbbZTIC@ACH)L`,!YU(6MC9B]di<64@Ka[:4DKGOWJBHD7Kimgpwxwÿŷ̶ɽңuNAG@9630/../,,--.7BFKNLKMMJEC@>=>?@@ACEGIKLKD;2.+*)%#"%)( #"!&*  +  +:>2  "%)*,--.0/+% "%'%#&0<7D`|nqwwvuz}~zwqnoqrwspoqrtt{{{vobVNLPWYXPHB& +%2?@<>P`]WW`modVH?@KZhzwmvsxnZJEMSQPUOPSVZ\]]`aa_^][[^``]YUUTUTRNJGHJNPVZ\]]_akjem|~ܳnfӑXt㶓z<"&&# &*)-(()+N״uwsrsqqzs\OP>4.,*$%,&%'%#! !0>FHKD@FUjzwi`OCEKGDA@BB>84355=CFINMLNOX^]USUAIE=@?=>?@ABCEGIKLLE<3.+)(%#"%(( "! (33997Lq}uorux}~nh_[^``^QD?Mjzumc[]]WJ9& "/9:,  "'**,--./.*$ !$'*)+/74?Wwzustyxrptv|yurqqrsutqpstww{zxsk^TMLPW[\WRM-#'/1&"+("#0EVhw~tvmUGKV\^`SRSUY[]_`a`_\\][_`_\WUUTVTQNHFGKSUZ\^^]_ahjekv{wpҦjrƒ\؜yrX %&!#)+,&$)5`øoӻӠɴyphfp{K-:6-++(  #   (4FOVQMIFC?>=DHHIKJHHDDLRRLFDF@BNJ:5>:179!'VS38G;:Xn`N@;>A@AC:>EEHNJQ=0)!9OMPewuotƾŶïңuOCJ@9630////--.-.6?CHKJIKLIGEB?>>?@BBDFHIKLMG=4/+(&$""$'& $(+Afvtqswx|~yunfb_\\ZY\i{zsi]U[\VE. (382# +%)++,-.//.)#"$&)-/0023:Lfxyspxyzwsorszxvtsssstsqsvx{{{ywpeZQMKOW[_^[Y:,.:?EC;,    +.2:EQY__UMO`t~}~|aalVRX^YSWVVWY[_```^\\[]^`_^ZVTUUTQNLIILQZ[_`aa`_`egeiqtpn͝g~Ȳqa€juփ2 #'+%%)*%!&@x὜~hdϺŴmWT^xҥL46,''# + '3;>@BV]k|pZC:FT`ZTQOMIDFKNLJLLHME>BKK>.4?WuvN.7;333#0aW87E78Zr]NE=8>D<95>IEEJIRC+%15=Rgpsy{yôŲѢuOEK?8520////--.--4=CIKIGIIGIGC@>>??BCDFGIJKNG>5/+'%"!"#%%  $(=EJE:>X[8"1355)8e^95A35VnZLD:/9B86,5?BBJMWM.%->Vhu|{u~ƸŵϠtOEL?8520000/--.-,2;?EIHHKLJKHEA?>??BBDEFHIJLF=5/*&#!!!"##!%)6L`jux|{z{zsqs|vkd^SUN<##   # (3;0! %'+*+*,-0/.+&"%-*((-2576;HYisy{xwvvtuz|ywvvutttuuvy{}~zyrh_VQMIKQUZ\]\QHLURPOGG?/!  +   )1BO]cdeec~ƥ~ifd]_\ZZ[]`daa^\[]]_a_YWVVVVLKJKOVZ\Z\^_abeebccefiifsÙϹy^z/ %""'(&%''$'*# ?͉fe๕ίaF- )EЮ;<92'!!"""#$#"  &08>HSbm{taOCIOVZXSPLKONGCEECCJG:7ALMy̠pQ?$5763$4dd<2;./KaUI=0(077>)(2;CPW[V6#))5G^qzxt{¼̿¶͞rNEL>7520000/../-+19:AFGINQPLJFB?>>?AABDEFGHID;4.)%" !!"" !#'0@Ubuy}{yy|wmeaSSJ8!&!  !#%+78)  '(*++*-.10.*$!%.+'&*08=:@L[kv|{yuttuy}zxyvwuxvwuw{|~|{wuof]UPLMOTV[\]\RHNVQQSNKF8+#  + + 0C\g^RPVy|x|~{r¶c\cfb_\\]^`c`a_^\^^``]XVVWVURONOTXYYZ[\`bceedcbbeffhluԦwgUV $%&!##&+,(&*$ =𼝖jF cջ[8,-+*(&"&)(%#!! )07:APbuu^G9AKPNJFFEFD=98995DD7;Wr~gO@/6330#:qj=/9-,BPZR;-..4IP2%+3AUd^WF2%+5603>Pfsuv¼¼˜pLDL>7521001/../-+07;BGHJNQPNKGC@>>?@@ABCDEFFA92-)$! !  $*5K\rw|zvv}}||~|wuwzzx|~~yskc_TPB/+&"    $(,52   "'(*++*-/10-)#!$+*+)*0:ABIVaoy|xuttx|}|yxuvvyyyxx||}xxrqkc[SNKNRWY\]\[TJNUQQUSOMC93.#   +#0HVJ54EswsqpkȔbU]^b`^^__aa_a``_`ab^[YYXXUSTSSUZ\[Z__`bcdeffcabcegikhחbyԀ^[ߘ3 )%# #!!&)*&'""@ݹaE7+ 7{Ã;&-2.($! )+)(%$#!"25;AK]q|zz|~~{|hM26;>=;848;:315887GPjoWA75144%@o>.91/>Fea>/;36agD0/0>>??@ABCDED?82-($!! ! "&'/DVnuxxssyrojc_^]^c\WXcntu{}}wpf_ZSL<%/,)&!   $('"!&,-3.  #$'()***./10-)# $'),**/;CJR^hs|{vuuvy~|yvtsuxzxyy|||vunkfaYQKILPSY[[[YZOQVQRYVVTNFB?3# %+;>QaS;=Qduqppҟl^a`ba_``ba`___`a_a`]ZXYYXUQRQSW^`_]cbbacbdcgc`_acehj\{Ӻؔ]kl[gk +/&!%!%$""CϹoP7!   U١F17:/'$$%%(%$!"! '6=(=|s@/;75@Cig=,C35owV>6/8WsmbdU/0A7/((7Pj}¾ǙnMCF<75432224.-/+$+9CLTSKEGLIKLIDABDBA@???@@@;51/+% ! ! %($'7Kbiqwvx{}zqgWNB:9975(3CNV_inwwuog]SMRK<$,-03,! &-1-%#*37)   %%'')*..0.+&&+.,)-8BNZhuz{|z{ywvwz|~xvtsrtvwvwx{}zuqje^WRNIFKOUY\\[YVUWVVWYYYVTROH@:24341-($ ,BMXU^prgbfhx|xpoeaa``_`_\[ZZ\_^_\ZXTSTVVVRUY]__^]^^^^`^``bca^]aef_[lηܢ[iqnhs/"!!%$Aֺ|\=' /nEAA../#$&,6I[gs}r`^L1 +  (Eaywvw{|{~~wkOLA?F@;=9=ia3#@32j{gUB07UqgfgV2+84.($*>Zw»ǗnNBF<76432224.-/+%+8CJQRMIIKKKJGCBBC??>>>>?@A;51/+&! !"#!"!! #''(5EYcnuxxy}}|zuoa\WX_ehhkf^[^flqsrnibZSNTM;922-(-=MUTMP\b^bi]lvfm}jig^a_``_`_\XXX[^_^]ZWSRTVXXVWZ]^_^^^^^^^^^^cba^__ac``jտެoaf}duC##&#@ܯybH3" +   [̌_F@4.,!$)+.=Tkzz~t`NEB?8/''$$#!"!!$&)+7;@FKUahtv}zwy|}yj`pusvsqt~ϛmhZPopQBBIRI,@y|E:@=912gZ.#@60Znn]A29Pgbd_G)#07:1('2JiŵȘoOCH<76432224.-.+&,6@EKOONMMMJECBBA@<<<<=>?@B<61/,&"!!"#"#"#!!  %)+2;KWhtzzxyw}~~|onqpnljd_XSOPYP:  %'.65.)*,+)(&&&&++-......00,'&,20!  #%$%&&('*+...*)$!#&())+5EQait|}zxyxvuvwz{yurpoqsuvvxzzwrmb]VPNJGDILTW[ZZYWXYYXY[]^]]]\YTPMKMLLLKKHFDCGOQNDDJW`ahobei{lW\][STZ[V]]^^^^\[WWX[^``^YVRQSWY[Z[\]^^__^^^^^^^^daa__^_bekjw۸rmldYr+&&"# #?׫jXNOJ8)$  !:n}G87-( "  !(+,-Jaw}vz{y~nU>+9+,gW0&B>1FYqb<4=I\[aP3*CN?.$%9\¿Ž˿{trrolfghiklmmȘoODH=86533223/-.+(,48;AIPSTSMHA>?@?=:::;=>@AC=61/,'#"""#"$$$#),/1=K`qzzwvu~|zxumgd_YTNMNO]V= !,682/0/./+,*,*0/324110//-*)*/2,  +$&('(''((*+..,('" !$&''&&,7?JRU\WSPSZafdfe^WV]bb`ZRHBDFGISdrvuvos{vfq׼g8;<+8hkKDAC?..gX;2FD76?mb99FJWUZ@!*TdI,0RyͿsja\[ZXURSTUWXYZǗoODI=87543332/--+*-2.06@KSWWLF?<==<:::;<=?ABC=50.+'# "$%& (,,)3AWjwxuss|zx|~~~~{ytqolida\XQJHJNPbYA'272/10/.,-+-,--00200//,)),/12' + #'(*)*(()(*+..+&% !%(*(&(2F^n{{{{|}}||{ywwxzzxtpmmptvyxwwvrlh^XPIIEDAGIQUXXXVYZ[ZYY[]ZYXXZ[YXXWVTTSVTXWZaaS:(5Zb?FtnWQOEBJSUW[TVY]]\YWUUVZ]``^YURRUZ]^`_]\\^_a________`\[][TTZcpohʾ|YMT%"!#<Ӫ[ERJ+$(   /*PR9;1,(&%%$#! !!&"!+5@ju||{}}wtwukc;.):Ypunpj`WW^iprsskd^adllmpmdWMB;BF=-/\W6=MNTON4.ZqM* "-Hj¿ǶþƿʻzndVQNLMLIGGHIJKMNNƖnNCH>975433320-,,,.0*+08BKQTJFB>=<;:::;<=?@AB<4.,*&#!#%&%+*&.;Naptrrpwxsqvz|~|xtolif\\\[YZ]`ZVMHGJPTd\C + !042/01/0-.,.--+.-0.//-*&(.20- +!'))*)*))*)++..)%#!$(++-3@Tjx|yxz{{{|{ywvxyytrnlmpux{ywvsoie^XOHGCB@FHPTWWVUZ[\[YY[]\ZYY[\\\\[ZWVUUUYX\dbO7(;clMXQ4.29GY]URRPPW\[ZVUTUVX\^]\YWUVY\^^_^]\]^_`````````_YYZZQPWckmlŖiZ}P% #:ѠkZJ:992 + $ +1 :kG901)''&%$"!!!'$-ASpz|zyyvwuZB5.2DYo|}x}yrquxwv|z|xg[UKBEP^nytrppv{wpyl ?C43LsY62?46U[TN?FE,+JQWG8@B-+IG5ANOQD<( *NgB)(++9TʹǼyuoojjfjjorwx|}ȹyne]UHCECFDD?ECFDGFHGĕmMBG>976444410.,,...-./16>EJIIGC?<<<::::;=>?B;2-+)%"!$&")*%.7GYhopqpsqmmrtrpmic]YXXWTSRTX[_\XOJHMSXb[A ,32220./,.,.--+,)+),,/*&)/2,& +"%*+**()*)*)++.-(#!#&).7DTet}ywuvxxvtywusrsuvrpmkmqw{|zwurmgc_YOGEA@>EGOSVVVT\]]\ZZ\^_]ZYZ\\\]]]ZZXWW]Z[`]P?8MrydnlI501?R^]RKIKOTXZYTRTSTVYZZXYXWX[]]\\[[[\]^_________`XY[ZPLTdfjqϨvgmh! #9~ͤqNI;;310&"!!!"+Wc\@Uʏ\6.4))))&$"!"$!"4OfwzxxzysdI7.GThv~xqneWJCEWhxtnkqxxsza)-D>58M{[30C=:QY[T@HI./6LbN.:K94655?HLJ5& + 1E,$36,.EwÿȵǼ{vme[URMNKLIMMRSXX[\bhotzѿ|uja\VSKFAA?B@B?DBDBDBDBÔlMAG>976544410.+,./-220./4;AJKKGA==?99899;<=A:1,)($! $&  ()%/6DTdloprsqnottqpnib]YYY[WVW[]___YRMLPW\`ZA+43450.-,,,---+)'&&'*1,&)01)   $'+,*)'(**+)++.-'# "%(1@Qboy~tstwyxsowusqpqstqokjlrx||zwtqlfb`ZPGEA@>DGORVVUT\]]\ZZ\^_\XWXYZ[_bcbb`_]a[YZZOHFc~nrk_\[\]KWce^UPLHLSWXWTPRSSUXYXVZYY[]^][ZZ[\\]^^________aYY]ZNLThbgs|ͭxgXPºl( $#(&#9}ԩxYOK.3,""!#"#" "%eڨk5,6)*+)($" "%$(;Yt|}usyzeNCFWdhpzzvhP9/AWytliovxuyӒc?HO?8@N]1/GC=PX_XBLN45*IkT)9SC=+*5mºÿê{Ĵqfc]VLHB><<===?@CFGHHIRX]acir{írh`VQOLKFB=:889;<<<;;;:::ŕlNCE<887766620-++,/125850.04BEIKJE@<@=9557:=@6.+*&$%""#!!!!!  "$(36?^rspmllnpqqppomkihgfngdeillgbYNGLVaffW=(-47521.,*+-(*+($"$).-*,.*  #+**)()())'''+,/-' #"%.=Reostunptxywustsrqpqrsponnpsvx|zunlmjd[NKIB=@;EHQTVUWW^]\[ZZZZYYYYYZ[^b`bdeaac_WX\ZLJQr{|s^U^jondfjia[WSNJMVZTPRNRVWVUWYYYXXXYZZWWXZ[]^_`^\YWUTVWRQNKHMTc^aq{}ӻ|R@or*$"$"$*0tȦ~aTMB81'$&&"$%%##$&! Ku00,%&-'$&((!#39:779;>A7-*)&$% "# !!!!  "$(11;\rsphjmprsqpvvvxz|~~{xxxysoc[PLQZdij\B"#,32010-+*++++(&$%'+++..($',++)())*)''(+,/-& ! %#'9FZhoonmnptwxwtrtsqppqrspppqsuxy}{tmlmjeXKIIB=?;DHPRTUWY]\[ZZYZZZZZZZ[\_a`cgg_\\^WVYXQU^~rsmewrnnrurpnoqoid^ZNJLRVOLMMQUWVVWXZZZZZZZZ\]^__```^\XSOKIGFB@A@?GOZX\ktuŤiQxY3!% ! %*4xټz`OLJE=3+# #&&$!!$##" """! & K4&%$-(%(+-'#&$+878W{{{su}{o^IFTj}o[D1&BSlzzqlkĉcG]hTBASd<CFFF@?<;:<>?C7-)'%%&"! """!  "$'-+4Wprpehmqttsrwwy|~~~|tna[USV_gkn`F&  #*+-132/-,1/,++)'''+.1/% + ")--,,*)*)*('((,,.,&!"! &"!-COamqnkilnrtutqpqpnnnopqpqsuxyz{~{tlkmjdQGGHAHQSWekkκy&" "';պqdVPLID=71+)*)&%#"%&(& #!!!#""##6G "$#"&&/95:\yxvrwwiSONZmy`;'0Vvuqsi޺]FYfXEBTg@?B=802;@ORP>&+:H@5,"!-EjԾjNů­zk[NC<:77773-%""""$%%%%'())),8:3,),/38>?@AD8,(&%%'# """!  "$'+%-Qlqpikortuwxzzyyz{|{zwwxxrlg^\ZZ]cjmpbI,  "$,2310/3/,,-,(&&,24.! +&-0/--+*+**('(),,-+% "#!$%6HTepspmllnqssrpoonmmmnpqpruy{|||~zrkkmibIAEG@:=:ACJMQTZ]\\[[[\\]``___``a``bdaVPOUU[bb_bf{ycVVc{pv{{vtuy|wtsspg^UUUTQMJHLNRUVWVVY[]_`_]\ZYVQKD=:76420/..0-++,/5>HNW`dc}B%# +!#!AԶvlf_VMH@:;7410,'$&&',.,&"'*)*"-cn- + '49Cf{tuustkUAM`ryL$:W`tjsճ[DPXSE=ThB>A;A7Qt]?DLL;'%4KK8+**083(!!!6EY_WNKMQQQMA.6]׳fZҿøs`ZUOE74340.+#$ !#$% !#%&&%)079;?@BELMOWdv¥m[UQJF>;;;<==>=;;898;:@?A?@;:6ϿgLCG=998887741.+*+-/17>A?81,./1369;<>?@BBBBBD8,(&%%'!!"$$#  "#')!'Jgprpqrrruz}zwutqsqqplhc]Z[\_cgknqdM2  %-123341//0/+((/54+ !(-0/.-+)*)*(')*-,-)$!%!.CP[irsqnmmnprrqonnmlllnoqpswz}}|{}xpjklf]B@HKPTZ^[[[[\]^^ba````aac`_^\SPQWWX[\Z\_i|lcYOLQbssy|xvwzzuoqsri`^][VPMJIJKMPSUUUUVY\]\[ZVTQKE>8454433457;853103:DLWac`A&!$' Dгvba_[UMGA@<9653.)%'&&+0/)$ %-001--IʝM&  1>Llrqvwpi]G=Vu^91ErcfҮ^JNUZM>QxfB=?999888842.+*+-.49?CC?950//0258:<>ADEDCBC7-)'%%& !"$$##  "#'*!#Cantvvurpsz}zuqnlijhfc]YSRVZ_dhjmopfU?( !'+/100/00.+*+250#$)-//.-+))()(()*-,,($( "9Q\dmrqnkkmnopppnmmlkklmoprtwz{{{zyuojklcX<8AE>6849=FJPUZ^[[[\]^`abba````ac\ZXVRSV_WONRV[ZXgkglh_\XRPTXTSPm}~z}yvrpwtoruungeedZSQPLLKKMQTVVTUWXXXWVNLJGDA?=??>===>@IFC@;45:BMYaca{l !#&)'"FƧynd^ZYTLGB@98530,)'(&&(**(&')+.11/398Wl" 1@NgqoyzhVNELdmP"/Ym\p̤xXHJTdW;GqcB=@?F;TvbHFFOP*4N:  "#&5>>1%:wDzsϼo\G?ADA:-+,+(## ! ""&'*''& !'*.37;;=?EKTgzиw\JFH@:35566777:<<>;=;>BAC??;̻dJCG>:99988852/+*+-.46;@BA=:530//146;=BEGFCAA7-*)&$% !"$$$#   "#(,#!=[lwuvuqmntzusojeb_^\XTOKIHIT[cjmnmnjg_Q>$ "(,.0221.--.22)  "'*,-/-,*((''((*+.,+'#% ,E\ejpqnkjjmnoooonmlkjjkmopstvxyyxxvsmjlk`R86@E<4515:EKQUZ]\\\]^`bcbba`__``^YWWWTVX^VPQZ_]WHFDMXPGKSPSWXQNKm}}yuqnmttqtwyupnpobZXXTNKHINTVWWWUTRQONHGEDCDFGGGFEEEEHQOMJD;:=CLXcfau׋: +"! !#&))"Jɢqklic_]YPHB=8752/-,,,+&$$#%(.2442/,0ARq+    %6ALbxro|{]ACKiw{f5 /PiÚrVB?Ke];Ci`DBEAE7JnbPKAKU,'K? + + +,;CE7,&;mɷxní}]NA>AEB:*+)($ ! !! #!$$)),))&!$(-48@B@B@BA@?BAC@A>κdJCH>::9988652/+*+,.026:>?=<;83/--/19=BFHFC@?5-*)%#"!"$$$$!  !! "#&-$ 8Ukytvwsmlprqnid^YVTPLICABFIRZeknnopeghbR6"'+/330--//0-"%*+.-.-*)''&&((*+.,*'! %4Lcgkppmkkkkllmmlkmkjjjkmorvwwvwwvvtqljlh\M65@G<23138DKRVZ]ZZ]\__cbb_`]_]_]XUUWXWVZYVV^kndT=65HVK>FTY\YLGQ^\m~{tnloursquxzxuwzvi_^\XMIEEKQWXZXUQNKKHMKHGGILOLLLLLMOQSPOOJB=@CNZehbtX!#&)( M˭medgf\YWVQJB=7630,,/153-'"!$(*2663/.5Pw݊B1   +;;9977671-.-,,.../2468997520//058<@AA@=92*%##!!!"$$%% !!! "! $,$$*4Omvwsomnnlgfd`\UPMKHEB>>CLP]`hnqqqqjihicN/ +"./22.)+.6-" +#*+*.,((((((*+..-,*&%# '>VfkkjjihhejhkkkjijiijjmnpszzyvvwwvqlijkdVH6EQZad`t̃2 $! "$$&#LȨ±~led`WRQSTQLD@975/-.38A=4,%!#%,+2741+1RXZ>'ERS001 0JX\ahZ:.>MP@ETxzuҿoZLG@:5.'!!#(),.02444265530.+)!!"&+-+*27@FFGP`yоbSHB<4--/14446=;9976660--0-/0,,-/246897521000259Zd_\[^`]WQNV[_epu}|xsjhkqpruy||{ywtojea_[SLILQTVYXYXYXXXWWWWWWVVVVVUUTTRRPONKGDBJT\ad`sX!"$$&&Oվ׿|xȨ{qmldVRNNNJEA>><:5225:>;5/)$"%,,06:C^»ӾſͣV*() #8H=/X{~s]?).LlbD ⺊hTMABV^ODOQ_PCK>0*AT_>,]zqH-A/ +5L]fb^WZSC66>FOVZdromx̷}aMGA=60'"!%)-0269;<>>6787530,+''(*)'%05HY]cmv~ytmeaZTQɳdMAE>=;9976650./1.13/--/1479;:7533331369;<:981(# ! " !"""! "$" "'"(,2Hftsssttqje][VSOMKJDDFHLT\cfjnqopqtrplmng[P8#  $+00$ + $*//.(,*,-,,-.00/,(#&;RcljhfedegfighhjjiilkmmprstyxxwutrrpoljcUD839==920-4:GPXYXW[\\]]]\\^]\[ZZZZZURTXXQJLI[yiZDI\a\[\^_\WTPQPUbtz{yrhfhnmnptwwwtttrolhf`YRNPPPNORUWXY[[\\[[ZYXXZYYYYYYWVSPNKIGGKT[_dau~+  "!#)Tݮ{rt⺔vmxkd~}}|{|xm^VRMKFCA@BA@<7567441-)%$&$'.:I^ƿŭԸv>7,(" ,>H4(V}hD$:d¿mO' ݶhZQJMY^RB?NdQ@LD608ZqF6{˸?,A4# RdeG3 !(0),Xb\MNWk«oT?@=;5,%"  !&(*/68>9510-******26:@==DPjʶwZOFB;/(&(+/038AK]ho|}qe[Tȱ`LAE?><::87751002/36300248;=>=:877774567897791(# !!"  !!! "# !"!*/2Hhwstvuurnib_\VRONMHJMPT[agllnoomosvsnmpqokS=!  #+-* %*00-),*-.-,,-...,("0EXcghfdbbdgghfghjjjimmopsttuyyyxutqpooli[G5,36:;95/,29FRZ[XV[[[\\[ZY\\[ZZZYYVTRRTVVUMHRoq]]eaY[\c^ZWXWSOP\nwyz~~unfdfjiiknqrqrsttroljc_YUTQMIGIOUXZ]][[[ZYXXWZZZYXXWUVRNLJJKMMTY^dcxe  $XǏzxqjk٢rbwerzwy{}wj]YQIC@????@<621.,*'&%$&(!&2F`|տ͸{տY9)''#'('6;A2)SvpU0.W{t[:+ /ܷm\YZZYZSF6KdO@RK::2`}J:̦\'$/+' +";F[`e_P8# *'CSPBKf˷¾ûϽjN<:994)""##"#''+.19@DGNSWXXVPKE@:62-***,-/24:>=<::87741112/378678;>ACB@><;;;<::988766:2(" !!!#! "!#"!!,11Ddstuwwurqpje`[VSPOMPTX\bhkprsqpprtwtpnqtwxk\E.! +  + ++0," $$&*//-(++./.,,,,-.-)$%9M\bdfdbaadgggehijjkjmnqrrssvzzxwvtpnnmkfS9& -3;<:4/-18FQYYWTYYZZZYXXZZZZZYYYVWVQLMU]ZOL[pzweY]ab[UTWYVRQUbnwz|}~sjdcdhgfgjmnmrsssrokiifa[VNHDDFLQWZ[\YYYYYYYY[[ZYWVURUQMLKNQTTYZ]cbwخT ! [έvrrrؖbasnzru}~}{~}vmh^RH@<:>?>;61.+($$"!%)//2;Rsðy׺ȴsmu6)*0*+.*1:;>.'Rv_?Bp}hK6=۷q_^fcQPSI2PoT:GHC<*XvI:mb3., (JgrTA& +",/)%7:>]î¼˷gN>5660)"##%$'(+/17CKQXbioqtncYPHD?5/-*()+-/08=>>DOiȲpOFB>7-%%(+148@LYpƼoaǽ«~]HCFB?=;;98842211-27;:==>?>=;98878;3(" !"!$" ! !   *//B_nvxzwvuutmjd\WTRPOSZ_eioswvxxwtvywusrruy{|kQ:)  +'34, %&(*,,,*)*./-+***+,,)# ,AS]cddcbacehgfdhijjkjmnqstttswwwwurmklkh`H*%.9;70..29FPWXURVWXXYXXWXYYZZYXXX\[RGEP[_QFNd~l\]b`VPOSWWUQPWftzzztjeddjhfgjlmmstssqnkjmjf^UIA;>BEKOTVWZZZZZZZZ[ZZYWVUSURNMMOSV[]ZZ_]qÍD \gnjѐbmЧ{t|ru{vw|}{{vm_QC93<>><730,)#"!$'.7;=CWx¹Ͽul~ѷhoA,+0,(++&8@C,JrL.*W~uX8 Nڵn`[gaGHTM4Y~]14AM?'MfOGYpt{~v[0"21(@SZQ2'14.$ !,/;`ƲfO>511-($#$%$'*/35=OZdo{wi\TOG<74/*&')-.4;>>DNfɳnMD@>6,&&(,38=DP_wξxiŻ}\HCFB?=;;98843310+05;=@DFGGGECA@??@?><:98::<<3(" !""$#  !!  +'/5Jfssw|}{vuupke`[YYWY^dimortwy|zyxyztvxxwwy{p[F4'('$ + .92! $'**(')*)*./-+*)+,-,("6JU\`bbbbcdfhgefghjkkkmnpqrrqsuuurpmjgjhg]A*8:3+,/7E1 =X6 Cn}^3+iװfWLVT>I^W@[y\34@QD,BSX[JG?Tk|Q3<7$&8<6)!'&%(:LI2!*0/9VrĮ{bL=41.+($$#!#&+17HTc{ɴ~nŹ{YGCIB?=;;9884331/)/4;<@DGGFECB@?>>?>=:889;=?<3)"!##%#  !!!!!$&$"  &1OVY[^abcdfghiffghjkkklnoqrrqppqqpnjgdigeZ< %68/'*/;?HNPOKHPQSTUVVVTUVWXWVUSUVRMKMPXLJdkhhZUPPQSQQOMVeqrsws{}qjjmnspmmorssvusrqppppqpke[VRNNORTW\]\[ZYWUTSPPQSTVWUPMHFDDEGQQNPX[qU. #"$`ehѧl~Ӟusvyzz}vwxxwqpsqpy{zuhYJA8898533- "%),2:?Wqhl{̧ƴ[C@:2.(-33B;&08"-^`/:Ԭ}^L:EH:Nh`OUgT)$'  +/+%:XT-/21;VpƯ|aM?40-+)&$! "'-3:AGeuj[M?<<92.,.,*.589=<;854///.212068>CEC@=>=<<=>@?<::;?A@@B4($"!!"!!  "#'&$#&%&-1/*$ + +Fev{js|}xtqnlhdcegmosvwuvwyxz{|{{{yyyzz{}~e_^ZQD3$-98) %(*'#%,2///00//.000-' 6LPW]\^_adgiiiiiiijjkkkklmnmmlmnmnrogbdhc\L, #9>.#3BDHKLKIHMORRQQRSTTTTTTTTUSPNNOQSXMHrwd`WVTSQPPORPRWbmtvvtsnnnnorqqppqrrmmnoqrsqppnljfdaVWTSRTX\\[YWUTSSMLLNRTTQNE?A>747;AGNTUrA  ^ǵhsիlϔ|xxyvvtursstttqpqrvyyqdUK;863331* $+/27Ng˻þ˴_`ijwF?@68//.3==.Dn}Z'MělS@.-3:I[_LRQTUGBNGO:/]oA"09GYim_L:5* ).(#;_^4-67?HhȳaJ:30/-)&&&'%'/59ALd~y`J<89=70*,+,/05:=<;8542110212156?AB><;=@BA@A4($"! !!!  "#(%#$$$  %+/00- +Ebqvot|}xurqojgfikquyz{{|{}}~~{xw{qqnh]RG=612671""'&&'*,.,.-....--//.,&9QT[_^_`bdgiiiiiiijjjkkllmnmllknjmpngdff]RD+ !7<. %4BDGJKKIHMOQRQQRSTTTTTTTTRRRRQPOOVSXq`\WUQPPNLLPNPU`jqtvtsoonoprrqpppppmmnopqrppmnljgge^ZXSQPQSVYZ[ZXUSOMLMOPPMB91/*$$)3:AKTWwԉ;  ]ƴcoբiЌt~yvttssqrsrtrqpqqstqmcWNA<8320.'#)/6AZvĽƺȾp]g˱NjoJGG>FF<78<9);gõ~_1 `ҲkR=,&+,4?@AEPbdId^5+59AIeȳdK:30/,)(''&&)17;EOjʻ~eQA<<=8/),+,,059=DYrísTC<;4**0005<<8655431300/26>??ACDDA?>?ACBAA4($#! !!! !#($!"$#! "&+02'!0Kboqrx~zussrommpsy{~~xw|uoke^YTSSRLID7$  $&+&"'160+--....--//-*$>W[ac`abcfhijiijjkklljjlmllllihkiikjefgbRC8) !6:."(4@BEHIHGHMOQRQQRSTTTTTTTTPQTVUQMJR\nýiYTUSQONMKKNMNR\emqvutopopqsrqonmmmmmnnoppnmjkiiiiifa\TPLJKQVZ]^[WTQOLLMMLI?8/($,4=HSZ~w1 _Dz\iҗb΁k{wrqrsttqrqrsqpnoooljgaZSJC=52,)#!#'/@Qo̺~kY]վĬ{XMD8CC?:::4$ =g°yc:+zĜ}ZE3++().+36MqtJ4DOcSCWbRD"$5M_bei`I+   +>b\3)5:DHcþɷiO<50.-+(&'&(+39=HRsǶlWGA@=7.(+*,,/4;?EXqírTD==6))///5=:7665411..-049>@@><>>?@BCEDB?>?BDBA@3(%#! !%'$ "$#"'+(%!&;Tgoqwz~{xwuusrswz}}~j_][XY]abeba[M7% #).0/0*%*494/--....--.,*&!C^bfgcddfhjkkjjjkkklljjmmlllkhgihhgfdeeZE1)%!36,%+5@BDGHHGFJNQQQPQSSSSSSSSSPRTUTQMJMa~²~fVOWURONLMMLKLOV_hmvutoppqrtspnlkjilmmmnnommjjhjkmmmhcZTOKKOTX[\[YWSPMLMMMIEA;1% ").6?IT\֫`& _ŰXf̎bݿ{j{qmnqtusqpqrrpnlmmjfba^\XRJB93,&! "##)6NflkgX}Ţ`K@3;5<8883#2Ppta?9ȴÍྙcM;43.0520.GtyH.CVm[EDKTR'!)@LO\mjO+  7VS3"!'4IVzq]LFA=6-'))++16:>EVoŭrSD>;5**00.5;BGTc˻}eɼgRJGICA@?>;87432//,,+/27;>>=<=>?ABCDB@=<=@BA@?2'%#!  %&%"!!##$ "%#"$8Pdprs|~zyyywvy}wdWWXZ]acgimijkcUGCDBCFHGFD>:312421..////..,*'"Gcgjjghhiklmmlkmmnnlmkkmmmlihfeffeba`a_P8#"&44,)08@BDEGGGGJLNONNOPQQQQQQQSRSSSRPONIbƿzcVM[WUQPMMMJIJLRZciutsoppqrsromjhggkkklmmnlkhhghilmmjf`[USRRUUWXY[[URONNPPMJJG?3--/9@FNV]̔L _ïWcݿfˬs|}okmqstsqqrppomkjjf`]^]\ZVNF<4,% #''.?\yiifmʴϣaJGFJ;85630#%D\r~qc]gvybMHOYdl}rZDR귓ϱuȨhE623.3?C7/?goF0D\ubI8:Z`1&&4=DWls^< *@D2($*9@GDZɽƼϿqUC820.,)((&(/5;>IX}dzxbOHC>6-'(((,05:?DUmĬrTE?;6+*1.-4:BGSa̼~f˽bOHFIB@?==:76210-/--,.15:===<=>?@AAA?;88:=@>>>2'%#!  %$%#" ""#! (--7Nfvyvt~~}{||{y|}r_SPY\_befddkhfiigehdc`aa`[XNKB:30./..////..*($ Ieillillmnpponmooopnnmmmmmlhgedcec^\[YUD/,40)*29AACEFFGGILNONNOPPPPPPPPPSRQPPPQQHcpaWO]YVQPOONIIJJNV`gtrrnoopqrpnkigfehhiklmnmkhihiikkjjjge_\ZXXVTUX\^XUQOPQQOORRLD@<:CJNRX^{=Z[cέnʴ|x|plmpstrqppnnljhfgb]XYYXWUPH?7.$ $')1Hfɻrj}tarim߰gMQTU?..1-* %H]lz[;!4QxeF((9N_x~sWTrє}Ͷwگg=255-2BL?69S`H7D\zjV:4_d0&"(3?Tin_G+!-2-,+0>DIBVƼîuZD941.,+)'')169=IX~͸}ePIE@8+%'&'+169@FSkĪqTF?<5,)/-,39AFSaͼh˿^LGEG?=<::6430//.0/0/027;>????@ABBA@>53359=<<=1'%#  $$%$# !"$#!!'3;AKbzvt~|~~}}}l]RQU]`beddbadacggghmihghffa^URJB9310--....--)&! Ifikllooprrrqpoprqqopnnnnkjhfba^ab[WUPK:*(25-'*39AABDDEFGIKNNNMNPPPPPPPPPQPPPQQRRIfycYWP]YUPOMNNIIIHKS]erqplnnoqpoljgfedefhikmomkihggefffhlllfa_]]YWWY]_\XSPOPOMSVUQMMICGNRUZac2X^bu~wwwsnnpstsqnnnnlige`]XUTSSQQMIB;/$"$)3Gfɲvf~~]gײoROLK5+-20+ )LXfyl^SJNhnVRYan|x[i|{r}ޙo|]?9?:,+;F@;5ASNAAVypd?-UP!&7JTRLA2# !"$-18DFJ@Rȳy^H:520-*))*-278;FWѻhQIFB8-&&%'+05;BERjĪqTG>=6+(/,+28>FSbοjYIDDF<:99742100/021220079>=?=?>A@A>>;1/027;<:?1'%% !! "##%" !""#$$!!%.;EQZouq~{~~~~{gWONT[`aefffdd^^bif`[Z_^^___^ZTQKHC?:6-..//..+*%  Heiklottttttsqpqqrppoonnnkjjgcb]aaYURMD6',66,%*49AABCDEFGIKPNOMNOPPPPPPPPLMNRSSRRLhjWTUS\XTQNMNOKKIIJQ\dqpmmmmoqonligeeddefgkkmmmkkjgfcabfkmkfa_^^[YXY[^_ZTPNNMLPRPLKNKDIORX[eT+ V`c}xwsrktpoprrrpmkmjjfea]ZTQONLKMJHD>3($#'*.<2 4SYfyiju|_s}ywr}σۈ]vJ??E>)!.9>=48NTG>Owsl@#D6 ,;><9740% ",5;FGH740,('%'*158:GYѼjNIGC9-'&'&+05;AESiĬqUG@?8-)/,,28=@4)$$!  $%$"#!  #&&!#*3=HP^izxwqeVRW]^]]\]Z[^abbehhfcbaacecaadeb^ZWUPJC94,))*,*-& !Eckqonryzyyvtpqrstqmllkhhjihed`_X]]RMH=5% 0B0$%(9=CA@ACEFELLOMONNNPQQQPNIGIKLMPSRLEiy_RPSU[ZXSOLMPOONJHLW`lmlmnmnoqlgdeeb`_`bdhknpmmljhecacegihb``Z__\XTTXY\^XSPOOPLJNRRLIPUVZ_iΙ9 Xcs}vzvvxqhqvsihmofihiffa`\UURNJECCEDCA>5(#*%5DMhDZզwTLe}z~ɬIBGCYpnScidpm|~^lѾqlnlδdt57\H72"*,7750=95../38=>>?3)&$! !$$%&%#! "! !!!!-6;CNW`n}ut|n^XRSY]]Z]\[ZZ\^`cefebabcdefebbdgba_^]YRKA:3.--++,'!Hgosrrw{{{ywuqprrqnmkjjgghggdd`\SY\QID93% /A.#%(9=CB@ACEEFKMNNOOMMOPOONLHFDHLMRTRJJfrYONRXZZXVPNMOOPPMIMV^hjjklmopokfdefca``acfijknmmkifba_aceb_\^[`a_[VTRVY\ZYVVSOLLMSTSQSY\_ajٵ/Yfl~tsxvsqrtmcrvsjflleefeda^[YSQNJEA==>===;3)(/->Ud|ÿجqNUolbĒΧT:G]wyzyosŷ}r}s[cx橀ɻxh46WG:6(13753/9UZB49:0   +!/2,# + #,&4:/@;6Pȵ~aL?95/)#*249I[~лfQHB?:1('&(+/69?DRhȮu[JC@:1/41-26:865653.)+23EdzݿܰɬsVuufru_2@f~z}x}Ĵ~~sd`pɳ۲kne,0JB:7,13643/6LP;(   + + -673&#(@:2@:7Kx῔;ɷcM=72-'#'038GY}ҽfPGA>90''&(+/69=BPhǯsWIC@9..31-15;?IZϿiɳvRBDMNKJKLKJHGFDA?=940)+.2579:987665430015:==<90(&# "&%%$#"! "(.5;75221/+(%+8@Qqľֶۯ˴w`~sghbj{KIk~sp~~|vjwɸƯ{gD&1?CB?50.43643>>+    ,345/'  )D<6B>;GiޭrXhƬʸcK:40,&"%-27FWxҽfPD?<8.'''),07:>CQfƮqTID>5--20-058;GW~§jȮpN@DNQNLLLKIGEA?=<;830(*-14789888643221126:=<;6/)'"!''''%#" +8EPY^ecc`_VOFn~pcZWXTWYYVSRRUUUVXY[\Z\]]\[\]c`]\[ZYXWXXXY[^`]ZTNE;.'$ +Uw~|ts{{|||yuqpqokijiebdcc``]]YYMJE4-/*$ +#39"'*9=CA@@BCCDIKKKJJKKLLJJJIHHHGFGNSPHNH@=:7512/*(#".DYhø˯۬saXnxzximxqlv}ڥr]}Źxu¡lC.&9:GNMC2(/1:;42+#%   + -2599*#+$'=96AACH]zYeӽʸbJ80.+% #+07CTsϼeOD?;5.(''),07:>CPdĭsPGB<3-+.+*/469DT|èmƼdLABJNHGHHHFDC=<::962/(),036889;;:74341247;=;95/)'! )*++)&#! "##%*/7>JTZ^abplgb_ZTOa|yh\URU\]\ZVRPQRUUVWYZZ[XZ\\[Z[\]ZXWWVUSWXYYXZ]`\[ZWOC3)"*Uw}|usyz{|{xvrqqnigihc___`^^ZXTVRM=-+.$ +57(*9=A@>?BDDEIKKLJKKIKKIIIIIIIGFFNRND@4*&-9HU^YVOLNTWQMKHIJHGKLMNMOPPT\dhfdfhfhihfedeaa``ababdeeedc`_\[ZYWXX[`]ZX[aej]QHHJJP\VUUTUX\`]cfkr}]&_ɷhX]lqswqutpklrusmjgdccccbba_\XTPHB=;<<9623/,%$$4Y~ɻ੢viJ\lxpik}ȃX{þŻuy}гqZ[|sXPQ8*>MQK/ (,;A5,"$&  !07?7-($!#&'+"1@429=HHRң־ʹbJ7/-*%"*16BQrμgOD=;6.)((*-16;?CNd«tSH@;60,*&)079:CT{Ҿpj\MA=>AC>>@BCDCC?=;:850-'),/35788;=<84332358<=:85/+( &(*+)% +069:=DJ[_dfd`]]nnjaZWZ_lsdXUUTW\`\XTSUWYXYYYYYXXUUUTSTWZVSPOPQOMRVYZXVVXRUY[VJ9.%Npy}yw{{z{zwuqpqmgehga]ZZ]\\VSNQVT=).0-55(+9>?>=?BDEGJJJJKKIJJHGGFFGHGIHIQSJ=.##*9GTTUQOMPSTNJGIIJILLLMMNOOOXaeb_`cfhjifdceaa``acbcddeedda`^\ZXVVWZ\[YVW]dlgZPLHCIWVWXZY\`e_abl|آFbѻcUaqtqtqosqmlqroica`___a`_^\[WSME?99;:96331,*),@qƾ;ղ벟{sbo|lhdv܇Mzüpu{t{];6/**&(+16:=CNduUI?::70)%*3<>?GV{Ѻq^aa[USLBD>97867766:=@BCCB@><950,'),/257759<<72002359<=:850+( !#'('"$2?GJPUWX[bh`dghfb`akol`SQ\iucWRW[ZYZXTPORVY[\\\[YWVUXWURQTY[UROOQRPNLRXYVRONIOV\ZN=1!"Ikx~|y|z{zzxtroqlfdgga\UWZZZTOKNZ[@*30 .64(+9>>=<>BEFFJJKKKJJJFFEEDEFFGHIMUSG7*! %).;HPQUROKOOUNHGGJLKMLKLLNOOLV_c_[\_fikjfdbdaa`abccdcddeedba_]ZXUUWZXXYWUYailbXTI?ERRTVWUVY^\[]l͒7" aһfZgvuoqqmqtrqrrjea___^_a^]\ZYTQLB:57::963550/05MƫźǸ̨xoak{wfvVlmƻpwuc\kb5D”wq]C/ #;7.+)&(+/4:=CNbͽxYMB=>>5,&-8BCDLZ{ηp ")),0652***.28=BDGDB?>;63))*-14546763.,.1/159<=<<9+ #((!"#%'& '9IU[^himrvxvtea[W\dgemigdWQfyxz{eWVXZ[_b^VPKINX_`[ZXWVVUTTUTRQQRUVUMFFKOPNNMOSRLIJJOQRXXF2@gw{z{{{zyzxsqorlecfbWOLRZZWNIEH``>#"$02#&18<<<<=?BEGIIGGGGGEEGGFDDEFKHGINMGB30*'-9-%% ,,,(" !# +&BXO4)8KdmV*08426KdmN6--,'! '&',.2>Kf©nPE>95-*)'&).59=BL`z`OC=@A<616AFGJUeȰud#"! !)3=A90'$#&*07=@HFDB@<73*)*-14546651,*+-.0379:997-$#"! !!"!#*5GXdihfegjmljhf^]ZY^fhgceddnxmc[VTVUSUYXTLJJOW^__ZXWVUUTTTSQPPQSUQJCCHNONNKMPNIFGINOQWYI6:`tz}}}~}|zwsqplfcd`VONQUTQLKJM_^="  *60"&07<<<<=@BEFGIGGGGEEEFEDBBDFKHFHMMHD;9418EOOPNOKIGGHIHFHLNLJLMNNMMLLHOV[^`cggedded_]^^^_``]]^_accdaa\[YXVVWWYUUWSKQ\cdcb[PIEQVQNTUVbid\awѶu&"  Vɭsomqponmmoooonmlgd`_^]]^^^\[XUQMF>7796-'+25645?YӰ}nuˬls|win첊{~thnxzpddlƿlGMxoD)%/.'*K[A,"/60% +  +,+& #*52-'(-8?'"*797G`bP0$-+)45=C>=GVpnP:0.,)"#%+*-056BLjīmPE<95.)*&'),49<@L`}òfWLFFGC>:?HLNQ^oīo^(%%!'6?>6.&" !$)19=GFEEC?95,++-15665540,))*-/2467553-'#&%$ !3ALVequpg`[_cc_ZWWXYYX\bc`Ydeh}seZSRSSTVTNKNQQNOQTX[]\ZWWVUTTTSRPOOPQRMF>>DLOOLIIKICACHLMNTYM= 2Xoy~~|ytrmjfb`\TPPONKKJOQQXP6 2<, '06;;<<>@BDFFFFFDDDDDDCA>>BFJIGHKLJGA@=;ALSTLIJGFEDDGGGILNMKNNOOLKJJFIMSY_dgbbbded_\]]]]\[XXZ[]_`a_`[ZYYVVWWXSSTPHKU^ade_SEJ`zȸo`UNNMJEDGOUW\k|ϽhX(%$!&040++,)%$%)07;BCDEEB<8/.-/368855420.../01345430+&"!'&%%*9N]hmruqg\UTZ__XSRSYZXVY^_\Xclsyog[XTRRQOMPVWRMMMLTWZZXVXXYWVVUTSSQPONNNONIA:9@IMNJFDEC>>@HLKJQXQD!   !.Pk{}yvrjie`]WRPOKHDGJRWUJ:)):A*'/5::;<>@BDEEEEECCCCCBA?;=AGIIGGIKJICDCBGOSOECDDFGFEGGHJLMMLOOOOKJHGDDCJT^df_`adfd_[\\ZZYWSRTVWZ\^]]YYYXVVWWTQRTOJIPW]bb`UA3MSLEJJLXac]]~ˋG& +S[eisuupmlnnnmkigb^[]^_\[XXUSOMIF?7562-(*09>@@CUy¼̺ѩzpr|tobdؤg]}wj|mhmǻaCP{tG14EL1#2AH@!   &&$#"/7B>/! )/'"5@=J_`N1@@.*.8F;8637JiͿpTC9554.-./15;=>HTwϾgMC<:7-(())*,267=H_zʻvk^UTUPLPRX^`gyƯx^O&#$"#*12-+.22.,,.168<=?CEC?;21/0489:5555665401234544/'! !$-:J[gnyxtohb\XY^ca[VVX[ZXX`hjf\_jxxnbXQMJKNPPMFCJVada^XRV[__[XXXWUTSRRQQNNMLLKLLE<55=FKLGB??>;<@JLJGMVSJ(  "% .Kfy|wtqhfb]YUPNKGEBFJPSN9# />@%'.489:<>@BCDEECCCCBBAA><;DP[ad^^`ced^[ZZXWUSONPQRTWYYZWWWXVVVVPMNROLKNTW[Z[S@/LPIADBBL[_\[~y7!I_jlsqokjlkkjigec]ZX[[[ZXUVRPMLHD>53420.04:?CFLaĻzlhlunochjVv}gai‘^?O~ǢpJ9:BT5#0KL*! + ,891'-;KI7! ""!&*,>JGPZN3(`uI$,;;EOYarȽ­u[E<;>=720038=?AL[̸bKA985-''('(,236A@>;31/0379954579:98112345551' ';Titvtxsle`__`cefc^ZZ[YXXar|kcdtzm`\_a_YQLJOMJHFC?;J]r{l_SX^`_]]\VTTSRQQPNNMMLKKJA:34;;;;>DMOIDITSM2# "% !,C_v{wrpgd^YWTNKGEEEGFEC<' +  5>: '.378:<>@BBCDDBBBBAA@@><<=AFGIIIHHFFBFJLORNE>;<@FHIFCEHIIIKLPPONJHFEB?A>?HW]Z\|f* Ghtstogbehiiigfca\XWXYXUURSOMJIGC>444126565>1'6DQUK?>IQF6+EP!(0J_}z{ǿȴ}cJB=AB;6547??=:86679;;971/,-046743369:85001235565*! &8Tm{|uonke_\[]^^][YXXYZPPVixhctvgr{rkcVLJKMOPOMKMG@<<@CEYn|gRV\`a_^[VTSSRQPPNNNNMLKJ?935ABBBAAAAAA@@>?>>;:;?GIEAADGHGGILOOONJHGEA?=AHRZ^\[[\]]YWVVUTRPMLKKKLNPQRQRTUSSRQKIJIKLLKMQTU]]J3:A>9>=>HV__buP#"Osuvtsld^`deegfeca\USVUURSQOKJFGED>84327:702:FVkysx~|{bckpwwwtlode}~{ӸwZVlĕ^>WL08Nh< "KJ2&,8=9/%! !%/.2:FLMIRCANQFGPs@/Oe{~rfXZoĿϽnRF>@A?=;9?DHHE@=755677531/,,/36765469961///02456;.&! !7Mkyohlif_^YYWSONNQUXYKMVowjhcds_H;>CFDQIA@DHHFA<66;ENShhTW\_a_[VVTSRRQPPOOOMMKKI>835=CED?:68:>ELSRKACOROB/$4So}~wsog]USUSLEBFJLI;(  +"59.(-1679A=>BGHC>@CGGFFHJMLNKJHGF@@?AGOW]]YXXYYVTUUTSRPMLHJJJLNOPRQSTSRQPKHHFFJJGJOTX`cO7-755=>?IZchhiic]aYSOLGFIx۪A#4[qsrrld_afdddcd`a\YUUTRPONJFDCBCC>85228>910;I`yǯ~rusw}v]_ouxunv|prrgdʧ|{Կ{\Zp^A\Q.;Xp=  I?1#  "(-)# + .;EHOSM>%7IWYV`wm.CmI;BIMTTjŭwXJ?>?@@CADKOQXlϸkQD;552*%#&$&+147=Mbzʷwnihhkrx~ŶeTE<8PLHB;62.225776657>HOOKEA8765456742/..258610453111.../256764&+CXjxyspkgdb_YWSSPLMTWXY[\IL\vt{~xgmnSDE?:;8:>>8/*(+,:<=FKP\x{kY[]]ZXWXVUUUTSPMOOLGLMLD>0.59@C;66668=CHNKEBBFKOJ9$ '#-Gct}~wrm[ZXQNPJC>AEE;+  )97)%,1468;>@AAA@@@??>>>@@?@A@CDFFGEFCBBEHLNNKGDA@BCCDDEDDFGHIIIIJKIHFCB?ACDFLUYY[\ZTRTVUSPPQQOJHHIIMNPQQQQSRPNKHHGFFCCBDJOR\bUB-/@24D=Kdhk]B3%#*.4&IŁ= !9Ocpz|kjjheb`_``__`]_][XSPNKHFA@>>>ADB95216=:66>Qn~{uuwzzz|rruwrvonzvd_qurpuwvt{~qz㳠ÂdczeAcJ7>]eK#'37$%!"&$%"!/CC?=?;55DHIHEC;:754345963002575105765610123456:71' %(("8Vjw~}~}zuo^ZUMKKICA@<0" ,<8)%+0368;=@@A@??>>>===@@@@ABCDFEDCCCCDFILMMIEBAABCCDEEFGHIJJJJIIIIGECA>@BCEJQWWXWUPORUTROPPQOKJHJJMOPQOOQPQPMLIHHGDDAAAJOQY\QA-B41<4@YdmV+ +*Ti0  *EWbkv}nhdcdda]^^^^]]]]\ZUQLIEC?<:;>?CA63536;;9h~rc]kb:$8>C@@=<;<;E@GsyvuƵlYNKJLOTY^gluĮlXE8995-$""!$(+136:H^zʵ~tmssstyzj`SJHFGG`_[WQKEB<8624468:;=?ABBB=;842122:841/0131..4888943467888>5+'+9Qe{|vi^^`c]][ZVSPOVY\\[VSRUZhw{fXfovr^_joqhejrrcE+#%.+ ")38HRVW^WNPqeXZ\][YYWZWVVUURPNNIGIMJD:.3?AB@6/5:<<>DIDEFGGGGGRB, , ,G_nwwuuuutog_ZUMIIHC@9,  + +2@9( &+0368:=?@@@>>>===<?ABDGLPYYXUTUVYUSOOOPOLLJKLNOQRNNQPQPMLKKHGDDCC?HNNSWOC2KC;=3;RarT +$%aU(" %9P\]^lwpf_^bc`[[[\\\\\][YTOKGD@;:9:;?B>64745679?Nax»}~~||{xy}qjnqpqtttriqfoz_`nmCWPBDS]WF8(/-' &%&#   ,,7<;FOOF1/>\zoK4AD4-380.069;866H@@?=;742234:740//01/,-499;;86678:;<506<><>ELDDEEDCCBK@/!  -%!(;N^hnsvvqkib^ZWRNJE@6+  + 7B8'!&+/257:=?@@@???>>>==?@ABCCCCDB@?ADGJKKKJHD@>@AABDEEFIIIIJKKLIIHFDB@??@BCEGIJTUUVVWWXSRONMNOONKMMPQSSRTTTRPMKJJGGDDCCAGKKNRNH.IKFB8:JYqS 0-'#o@"!! "  "7DTVRR^kkf_\\]\ZXYYZZ[[\YVROKIC@98779;==74443536768;??=<<>@A>;751//0357530../0/+,3789:;8768;?A@/$,AWhrolhe`^^`TUWVVTRPUY]]\WRPScz{nig_IR]faWc|{{znN)% -37=DJPUVY`\PG>KhzdZTVYZYXXYUTRRQRQPLLHFIMJD9,1>>98438<==@GMGEB?>=>?@:1& #(('(/=HRbjstmddc^\ZXRG;4!  "7=3'"'+/157:<>?@?AA@@@????@BCDDDCCB@@BEILLKJHEB?=@@ABDEFFIHGGGHIJIHFDB@?>@ACFHIHGHJMQRTSRSROMLMOOOMNOQTUUZZYWTQLJIIGGEEEEGHGFINOO%6GID93>PoR%#"%9n(!!#" #&#!  3LMOLHIS\dec^XUVYVWWXXYYZWTPMKHEB::8768::;20134237Po}zwsqnoefd^YQJF:6310.+*+.-.38604;63=A>BIOYakpvywwdblՊ]Xkòl`{t`Xm~x{̡pwZTvjyY\}}lWF<>=EK8#+,&%(.2( +G66GXXcsgiwwebaP8::3111)(#$-4=;LǷ~wvzyz|}{pbRF>81,)&$!!&,38=CNeϼu`PHIKNPW\]ZWUPHB:33,($'())_`_^ZWSOJF@ADJMKCA@BDB=90.+*+.258641////0,,1444486679=AC<.&5Obkmhdcec]YXSTSTTSRQTX[]\YVUVh|mx~pa]^]IRZ_\R_wlQ4-:0$1EGJNSVXVVMWXPB:Lpu_USUYZYYYZTRQQPQQPKLGEHMJD8*0?=65369988;<;95,!#!&))*.56AKTUPMNQSRRRJ8'  +  &791'!$'+.0569<>???BBAAA@@@?@BDEDDCDCBCDGJLLKHFC@>=?@ABDEFGHGFEEFHIIHEC@>==ABDHKKHE?AEKORRQSSQLJJMNOMORTVWX^^^ZWRMIHIHIHIJLOKHHKNON2&DLD>4:LnW,PݤX! !###""%)&" +BYSMDBBGLY_c_WRSWUVVVVVWVQNMJIHE@=<:77687:4//1/17C\|~|tni^XUSOKFEBC<4,# +  %&-6=GOX^eiZ]gbJSzl?5]³sk}h_lmd[qjeWfdpµvYa_WVWB!)1,*+'*<*0Sghv~qc[P><<<70'#$(38LŸ|}~~{_VJ?50/,(#! "!&.5;?ETmʶhQB;=?AFJONHDA>850+)&$"%'''XYZZWTRNKHFJRUVSKEAACB=80-*)*-25;9620-,,/+*-/,++0158<>??7,,@\lmjf^\`a[TSTTRRPPPPQTWXYWVV[m}puwoaXY][KSTSQIWzxvrkd^WKJJ@>KRPQSWXZ[ZOWUKA:Ms~p]URUXZZYZ[USQQPRRQKKGEHLJD6)2DA62079=CHHDA?=96579;??;2$! $()-.+""###%*,/758:4#    + +*660+!!"$'+./469<>???AAA@@@???@CEEEDCDDEFGIKLKJGDA?>=??ABDEGGIGFDDEGHIGDA?=<<@ADILLGB;;=CKRTUVTRNHHKMNOQSVX\]^]^YWRMKJKJLNPRSUOMORQKF;&%FOFC<=HeR  1fŃG!$#!#$$$# #%#"8LXQIA:79>PW]^[WUTUUUUTTTSJGFFGGCAA==:77477642,*3C[qpaXSM@94)# + +   + +   ).2==HSqqZOLasjVdúZ4&Elk\jxhvlrrfghbewj_F&'0-& J9 +5/,,*" #*19=AF^vʼkWD71369<>@@<721.,)&&#"!%''&SRUTTRONJHHNV\ZUQICBCC>:53/-.159?=:51.,+0+),,)'&*-5;?@><4,0Iespjd[V[]XTUUSRQOOPPSUXXYXXXdt{tjpun_RMOWLSMKRRczj_Z[[\SIU_VWUSSSTTTSUND??Vwl]XQTXZZZZ[VTRRQSSSJKFEHLJE4)5IE71.68>GNLB:9865679;FFA5& $%&(04) +#     +-640.!!#%(+-/469<>???@@@??>>>?@CEFEDCEEFHIJKLKIFC@?>>>?@BDFGHJHFEDFHIIGDA><<<>?CIMLFA6327ALQTWWSNIFIMPNQSWY^_[\\ZWROLLMMORTVYZTRUYTH>;)&DKCEE<A@>;87474;=9,'8Om}{iN>52/#  +  +  #29O͑U84Hi{dCS³®rYM^wûnxmi}xvg`ŧxq|taT>%#-/&!)) VN% Cjwj\W_eR@GC8>>3,(%  %9nxvutphfcc]]ZVOGDC=5/(&'&  !%.39@CHg~ػqZJ=1*,0244746/,+*((&'$##%&'&QPSSTSOKFFGKRY]\SMHFGGFE@BCA=:;=DB=82-*((+/.+''%&-59?B;1(*:Wnrmhaa^ZTSVXSTTPNMOQRUXXXX[^n}qejkaXSKEL\UOCC]fxksd[XWY`cZXSMNV]ZUOLID>E^|yl_VRQVZZVSUXWTRRQQQONMIINPG;.-6DA2-3>?BGJF<31465249?FGE=/""$&+-/.-,   + +'381'$$$%'*-/569<>>>>>>===>??BCDEFGFFBCEHJKLLLIEA>==>??@ACDEEGFEEGGFEEB?;:;=>CABGKKE?1+)08BMVSROIFFHIIKOQUY]`a``^ZURPSTUY[\]\\UPNSOC9B3FTDKJB?@0 ?4#%* !##$$&&"%#!$(>MNIE>1' ")=IV_`[TONOPQQPOMHGGD><>?@=?=:636<==8-*EfulrjUF-&  !FnT1<:?xtKLzǹ½ý{klcju¸{sjWYAQW0%2#&/,*, =E%WF@afQ7+(' &FGF>2% "$&*,0112   + + +)382)$$$%'*-/579<=>>>>>===>?@BCDEFGFFCDFIKLLLKHD@>===??@ABDEEGEEFGHGEDA>;:;=>BACGKJC<.(%+3:89;;<==;745:;>>:#%;2!'  +*;"0RH*  +2NQ;)& %$+>C=?6)  !AywiaZWTOJGFCCAA?<841+(&#!"! !$%$139<@DRbzȶeJ:0(! #$&%'(./00/0.---,,+***]\\\[XTPEB@@CFHF?977:<==@CEGGGIKFB:1*%"!###! (28<=826EYdaZ]dceaUHFO[PQRQNMNPTWZXXVY\twmgiga]WOG\h^PAEk}|fSWhhj~{aVTRUVXWTOJHEBFVstf[SQRUYYVTTVUSQPPPPOLLHHMND8*,274.4?GGD?7323037:;;=>CEE@5)  $&)+-/246$  +  "+372*%$%%(*-/579<=>>=>====>?@BCDEFGFFDFHJLLLKIFC?=<<=>?@ABCDEFEEFHIHFB@=::;=?BCEIKH@9+&!%-6?HRSQPMJHGGIMOSW]`deeeb^ZYXXY[]^][[WSQQLE><) 9MIPPA1! )_ޜO!$'$!##$$$$$&" &:KNG985/%.6?GMPSUVUSQNKIHC?<843578:;<;846:;=CIOd||mhXG>20.#  + +  +  4[p;126DPpiSh¾ƺq_MhkM?BCDDEE?:2*#  &19<;97?PadYOQY`dcWHBKVOPRQONNOUXZYWVX[wtkojhb`\TK`qi[LNx|i\ttZ]XYWVTTTJEEDL_}sdYSPRUXXVTTUSQOOOPONKKGHLLA5+.33/0:EMF<3/0363469======>?@ABCDEFGFFFHJLMLKJFD@=;;<=>??ABCDDEDEGIJHF?>;99;>@CEHKKE<5+$")08@LOPPNLHHFGKMQTZ^^``a`]\XXWWY[ZYXVY\XQIHG7 1HLSRC(  !=uv=!&#"%!!##$$$##"   3EPLA4540)!%)-29BLSSTUVSOJGA=71/./237;==968@ABKVbqxf]KB:+   +  +",:NayԜZ%$<75Kw\Mǹph]oN4cmA&:mqN,*31>OH6' + +"BeJ + +-=@>3& +"%(:?E>54+#' $Hηp`NB<7630..-.-*+*)*)(#"! !"$(&#$%*0389>CKWj}˼lS;-*&"!%.///258;::===>>>a`___\[VTOFA==<:767789;<==>?>=:8.*$"-45336ER][QHHJX^b[MEHKMPQQONOOUXZYWVX[yuoxrlgd_YSfzxoaawktjZVW[ZUTULHGGTjrcXROPRTUTSRRQOMNMONMJJFGKJ?1-351/5?GNA1*.5::8535=7-" $---,,./1-" &'!  +(-/0.*'''(*-0278:<===<<<<=>?@ABCDEFGFFGIKMMKIHCA>;::;<>>?@ACCDDDDGIIFD=;989;?AEGJLIB82*$!%(-39FJPRPNMKFHLNQSWZ[[\^^\\YVUUVYXWTT^hdXMMQ.*EPVS?"  %+VR-(* "#!!###!+GEJPUUQJF?;6/+*+,.37:<;9:DBEF;6* Oh 03/&&0/2<;950,!"$-1-(+3HRXUNJGEPV\]UNFCLOQQPOOORWZXXVY\||z}tnh`]]mzysr̳̾YQU_`XQQQMJM^wwg[TQQRSTTSRQONLLLNNMIIFFIH<.07833;BCF9+*4=@>:403?ABBCDEFGFFHILMMJGEA?<:99;<=>?@ABCDCCDFHGC@;9778;?BFHJID<3.*%#(*+/3>CJOPPPOHHLLNPSVYY]^a`^\WVVWYXWWXfpl_TPT' &APSK7 ++9sŀ2).*"!!#!!%7DJI>1./231,$!!+38?HPSQKG?;4-+''%),0688:>GFIYprYD.%%%(*(  + + /-##-5PrҌ7$'121Ffsnan~hyxY^sĤf4Mrm8-bQ/7d{jYRSL>5(,%%" Ll%  4EE;252)5U]NB0  !),+,*)&%%/_ŵ}bNB7-&" !%',+-+(*,29>CMYdrʽpO9'#$!&+-,-/5:>>>gec``\ZVLF;5/.-**+/1247:><974/'""*/0-,-33*!%/IRWSONLIJLQY\VH>KNQRQOMOQVYXXWZ]~si`aesz¸ͱn_Z_`UOPTRPUj}l_WTQQRSTSRPNLKLLMMLHHEFHG:,19:57AA:72/3=CB>82.3>GIG:99971("")-0/./0//50((/41% + &241000+++,.14679;<==<;<<<=>@ABBCDEFGFFGILMLIEB?=:888:;==>@ABCCCCDEFD@=98668<@BEFGD>5-))%%*.-+-06?FHKNMIILKLMQSVW[]aa_][YYZ]\[[^fnmeVJE!>OP>( %2'Jߞ[0.' !!!$3DJIA7-)),//*&!)/8@EECC>92,'%!"%)/379?HIM^zybN7$"*))+,,%%$""  +     *-).<;9=dۚ># )*+;AI\niJ\ecbMmeJRvͤe6]c9;ZsZGH]le[RLNJ?;6;9>?0?y[% + +vhK+ "+22555321,PÿƴpTB;0($"%)/,00/04:@DLXgu³z^C0##$"'+,,/137;>?@BDFGHljec_]XTH@7.+))% $)-.159<9641+"#,6<=:87<7*#.HSYTPPQOHEIT]ZK60.5AIHD;::::5-' $(35310/++0.) ++472# )673222---.035789;<==<;;;<<>@ABBCDEFGFFGIKMKHCA><:878:;==>?ABCCCCCEEC>:87668<@CDED@90)%&#&*.*)*&+5EMV]l|ξmR<,"$$#(,.02589<@CGLQVZ\gfdec`ZUL@5...,&++-0379:A@=83.*'"""!""#$',028@ED>AG@2&(1P\\QKQWTG?>IW\QDKLMNQPPOTUVZYU[awldivs`\WIIS[WZjseZTPRSTX[VMHHIIJJKKEJJEHJ>+3557>B7) .>GF?85./4>GJHC547@ABBBDEDDDGIIKLLJGCA;975579;;<=?ACDEEEEECA>=433369=?DDC>5,&"!$()***+ "2AHIHHLOLFDINQUZ[^`ba[`bbclpolcVOSN5 5M>* +!47'(UK)#($!##%""" 2ELC:1+0.-+,+)$! "(+.2+"$ %('.8@HP\m§scJ/! ',0-(&%$+('%%#  + +  + + + -117@=0=Zl,!"&AVuF#PWP|VSZzqdn}w^^d\PRZb`XUZUZ]\anwtvyw|tJ*59.31  + !! +JknQ1  +*8AEGIBG\zþzTG4)&# !$'*,.10//13128<>CLU\amyͻ`G1+% "&)/389?@FEB?:51./.-,++,,1589=CEBDGKG9-0:W`^QJQWUJ?9>KSPJOOPPPOOOPRWYYW[aynhgse{j]YUKEG`_bsre]XQSSSVYVLIIIHHHHHDIIEHJ>-+168;;1%(4BIF=40/17@HIE?545:A?7- %((-../010.3560% + "/64+ .851341,-.13689;;;;;;;;<==?@ABCCDEEDEGIJKLLJFB@:86558:<<<>?ABDDDDCB@=;932246:>@BBA;3*$! "&())++*:CHJHEEEFGHHINV[^bgi]befiquumaRLLD$ 7R<(83*5e͒<('%""$$$!!5BC:5/+10/,,+&! %/.%*"#&+27>HQawƭrgN5&$'.283.,,+'%$""   29:48AC<=OٚH  !4]D8HS}NBTlzn\UPFILQXbm{~z}wYA=+*/ +   "02;P^U4&5AILOKTkɸjF;.%#! + + !$(-04787788868?ELQ[gryʷzZD1+# "$,06:@FMPZeq{eeeeb]XSKFB@@CHIGEEFFFFFIHFD@;74653111237<>=?CB=AFLH=38B^d_RKPVVNB63GJC9/*14;CIGB;4249@?8/  '))---.010/3674+  !.:<2 &163253,../1368:;;;;;;;;=>?@ABCCCEFEEEHJJKKJHEA?876569<><=>?ABCDCBA?<96511247;?AAA>80'" !$')+,,%3DOTKCCIOQORW]^\\``fhjlnrsreZMGD79X8 +$$,943N١_.!(*%!!##"  +,@Pijbotz}xnggm^]hjnsr~f[^\XN>0$,0 ++=PZUE3($AJV_YA !#'6AEKNa~ĿîpY=4.'" $&),048;?>?ADECEPXbhtǵtS<0+%  #,16>JV`er~edeec_WQLLKIJKPTMKLHIEFDEBC><642--.-00448:>:<;;5:?JH>48B`b]SMPTSPD7/3>LUTROLMMNORQTVZZclyz~gd~su}p`XUUVURPRUSJKHFDA>=;:>?>@?6+*3:70-04DGIE=3,)05=FJG@95337>=7. +  #*++--,-01102463,# !# -=C6,352482(//01369:<<<<<<<?ABCCCB@=:64201258<@BA@=6-&"  "&*,,,$  ;O[QHEJQUVX]a`[Y]`qqqookheXRJD<) 8V0 &)2<;Bnz7'('*#! ""! 3??4-3/-11/.,*$  + &*(3Mkz~tmY=)%+,2860..,%##  "$!    + +/;=;=?>;:7833..-+,0279>=AAB;965.5;98:<>>@?7/144/')5BOLF=5.++/5?HKG@:7425;;5-  "%'-.-..,-/1102452,$!!!-@G8 1552593&1111369;<<<<<<<@=>>?ABBCDC@<953201369=@BB@<5,%"!!%*,,*& +=KMOOOOPQPV]`bfmsvqpnle]YRPJ?. 3J(#)/:DDR]#&+#'"  "!!  "4>;1/71,/1/-+*%   &+@^otsxxq^@($)+3860/-+('&##  $'*#   $3;=BIMXrr/4-& $,.,:9Ms}ypQ 2@TTKYhekhgpysY@$!$6A3-2) +93&'$*EqѼh,)"*?^zy\3 &*-Dhþ̹_F72.'#.237;BJNTZ`goty~ǶqN:2+& %08EWlaacec`WRLIIGGFFFA>>984300--*,+/06:>CGJKLMMH?851+5>IKD;@HXXYUOMLIHB=75:CINMMLMNQRWSRTW\jwpe|xy{yfWPNOQROMORNGECA?<976;;:6678:<>?>>?@@ABBDB?;85331247:=?@B@;2*$!!  $*,+(!!3@R\ZSONRU[ahov{rmllj_VROJA4 + .9%!)-1;GQM_јD),"'! ""! '58611:4,/0/,*)$  "2Mmuslgp~yq_?%!).7<:41/++)(%%#!  &+)" +   )26,#%*0/27Ii~~u~X/$':DQNCLTNKRa~ȢuĬU5%#'#"+/8?*1RVM?MMMMNNNNPNORUYertkekuqy{scWQOPNPONPSNEA>=;975478;??<851+(*-2>JJD;3.--.4:CIHC=92/-19<93% +"(+-.21/21.,-./.122/)# !%$!0FI6 +$4872594(542247:=========DDDDEEEFFHIHHHKMLJHEA=:86789:<=>>>?@@ABBB@=964332358;=>?A>8/'! " $*,*&  2IX\YXY__`elrvtogfhh^SOK?-  **+(&3===EOVTjp,((#*  !""" /841.092+220/,+%    +.Keyzunq~yo^@%",17>=60.+,'%%&%%#  + '.'!  +   $  )5DTdpufgqodS;9:::9MNNNONMLIHLQTXbkwkjgpufnmsttopploy~{zm_UPOOLNONQSNE?<;:8755447;<8530)(08EIG@;7/,+/9=<7' +%+.0031/42.,-..--..+&! $#0FH4 +%3883494*643247;=========DEEEEEFFGHIIHIKMLJHD@<987889;<==>??@@AABA?;853323469;=>>@<6-$# $)+)%% +"4CNU]bb`_dnuwvphejg\PKF3  1("*2ALIELSW\uT&##.  !##" %5<10+.70,4421-*#   '?Uqyxttvn]?##/18>;3-,'(%!!#$&&   */+&  - $3DTamwr\Y^PAAC>95,+/67+5?Ki~z{~{{q\PMB?B>=GD95>H[v̿lH6+;A7&*f}xL'0Oxw/'*D\V9  $)C~ſνhO;.% #'08AFO_rƹqP@3*%)3@Yy^^_becZTNG@>AB<4966543328768;>?AJIJJID>9/-'  # '@b\TOLHE?==??>951GLPKGFFFGGKQU]l|us}ucU_fstnc^Z\_jpvxyxxqg[SNMMPONNMJEA=:86433399:>@:/%$%+9GLF?51/10/04??>>>?@@FFFGGHHHIIIIJJLLJHEA=;989:;=>?@@???BDDB@=<:86421359>@:0' "!"%**($ + *C[ca_agpx|zwkia[Z[PD6&57,,:GLEBEHET{!'++$+"  """ 0@B1&%/4+*-00.+)&""!'*&#$&>`mn}yj^E+(037<:521,&&%%"!    #-1,*  ) '0@TequtgUKNKA<;+$-1.183,38@_~zy|}thb]RE><;;>@BECHKOWdwйWA>7I^C :[/!C{Ǯs$%""'37, 4l¿νfI5'!!%(1=GPatǶtS?2*$ "%-8HgbaacdaXRG?6342.''%'%(&(&*'))/.0//00/.+&"  +#=f^WQNJFA>>@@?951DIMHEEEDGDHPW^js{wusw}|{~~ti^XWkorkaYUSRXbkrvvvqkbYRNNNPNMMLID?:986443379<@@9-##'0@MNE;/,-02026?DIID;4/+*+.69:7' "()..-//024343100001/*%!$8B>-  + )6:94131+66557:=???>>??@AFFFGGHHHIIIIJJKLJHD@=:989:<=??@@??@BDDB?=<:8542246:=??>=>8/&"!"&**'#  +3M]bjknqssolid\QOME8&25-26:>=>?CEmj'/",#("  """ #5BB.$#,.)&)++*+*'$#%$"! !""$$##&*()*+-"') -Uuylkpzuj^E)&106::8641,,-+*%!  !,3721'  + $ (2BS`db]SJFIG;65$ +20171(049W~{{~~uia[QE9798;;>?AEGJQYepԶP<;1)" $'05*%&,8FPNC8*()/2259CFIHA71,++,/5897)&./..-/.014343211222/*$'?@@@@?@BDDA?<;97543357;>??=<;5,$#"#&**'" + !:Rcoruurnjic^UKF>1$01+31/4>EDIVլP'2&+!$"  """ (:C>'$&" %#$'')'&%)*('(*-.,,-0220+'&**,*()''! (Lgokkjo{qi[B(&0-4:::<;977963/+("%+4:=:91# +   ")1?MSRKDBADG?325" -40/4-$.00Ky~~~|{|ujaYOD56:9769=?CEHIPU]]ct׻V>9E\kC.dkR2!7bͷ|)84($#AzʻeL7*&#"$*.8IXh}ǵpQ;0(! $)4@[zgeccdb\WKB7112321/1/1020/++(' .EUga]VRMJFDCDC?951>BDBCEEACBISXXSSq|m^\gs|}qcWW]\QEFKQROJGEKNW_db_]VSOKIHIJKIGFEC?:8654333338>@<5.).3?@???@ABCFFFGGHHHIJJJKJJJGEA>;:::;<>?@@@@@@@BCCA>;:86444469<:82*!#"#'**%  #=Vgmssme`]YVPH?/  .+(32*2ITQXkǂ9&1'*"""  !###!!*;?7  !"%$$$%%$%(-14112441,&   %'!)9N^elurq~shfZ@('0+2:<=ACBB@CB@:63-+()+/10../369=@><8+   !'%,08><=DLOMGB>AFB9-1:)'25-,.(,-*?k~}}~}|sibXKA59<:5358BACDGIOSQX_foȣw[LUfn@#G?1'0Tƴ})<8*- ! )\¿ɹeL9-((%# $',19M]rǵpP;/%!!'+8Fbdaabeea]SLEACINPPNOKLHIGEAA<;4/++'$"!#!&#)/2**)3467;IYbea]WRMKFEDCA>963;?DCDFC@<CFHGGHPQVXWPIGMLIGFFFGIGDCB@=87543334459==:50.47;?@=950*')-19ADEEA:2.,+,.04687-$#+23..-.-./22432233351+$5IF8+'#$%  (2765541//7789;=>?@@@@ABDEFFFGGHHHIJKKKJIIFD@<:9:;=>?@AAA@A@@BCC@>:96434458:>AA>;85/' $#$(+)$  &?V_jokc[UXNE8+ &313>B8A[e\bzX+$,#&%#"  !###!!)77, "%)+&&'()'" 1>8 4OZ`_izzx{ypfadX?('1+/7:>CGEDEHHHEBB@>=@AAA@A?==<<=@><8-  /:9;CKOSVRNIGHHGE?CD<0(0=6288+%'$(,+9Z|}}~}unf_SF=:=?<6227A?<>BGLPUXVKABP`zu|wF!.$&4Ntw'73(7,# # $&D¾ɺfM:0,+(%"$&),3=Qf~ȳnM:-&  $)-9<;><@;BHJ>;;FHJHMV_a`^\WRMKIGDB><887:?EFHHB<556/-+*-/135781*##)-11..-.-..13432112240*# !;OG5**($% -685576101789:<>??@@@ABCEFFFFGGHHHIJKLLJIGEB>:99:<>?@AAAAAAAABCC@=985334569962.&$$%)+)#  #6BR`ggc`Q@/ *4ABGU\OUilbkݖ9%$'"$'#"  "$$$"" '2/#  !FVO( 7Ubd]cu{x~zwncbg[@('-*.69>><91% >NNQTUVWTRI>64455;??8-(-5;8=7'!# $*,3Ee}|~wpid\OD:=>>;7546?<99?DJLLIDCGJMU]k}źM',/9Srp(0,+62-'%'&'kʻgK;31.,)$!%(+.4>ZodzmK9-%#')0ASseaabehge^ZVVZcmsqpnkhecb`_]^__]][XVRUUWUXQU[\PMOXYVRV_c`]\[WQOMMHD?;98898>CFJI@725C\yqc_luzvolf^chkd\W]dlga_ahmrywpi_SJEMNMKIGEDFC@>=;9532222355668:80$&1750+)2.-158>EIHD<3+)(*-01347860++/010./-.--.0343100001-&  ">RH4***$$ 299659721378:;=>??@@AACDFGFFFGGHHHIJLLLJHGDA=989;851-% $$&),)" + $3COSQM6' *5CCDDEGHLOPVTTROF<5>==;::==>=<6, +$I\\YUQNJEA;3-(''&06<:60-+66;8( !! '004Qu~~vkec[MB:<;987989A?=>BEFENHDFJLGIBM\mưQ(CW`vl,)(..//+# '""&1O˼gK:441.+&#")*+.6@_wƳmL7-$$)+3FXwfcabehgga^ZZ`gpuutroliedgdddeeddb_\[\]``ha`ge\Z`fe_XZchcYY\XSPRRJE?9779;6=CIKK@58@Surmnv~ygf`WTU[bgfedglquv}ulaVNIRRPNLGFEEB?>><:875534556568:9- .87/'#.,/6:<@FMJD;1)&%*-1133787301320/./-..--05431/////+$ "@UI2(**%$ #5;:66:931578:<>???@@ABCEFHFFHGIHJHKJNMNJJFE@>998==B@CBDBCABAABCB?=86422468<=BCB>841,%!%%&*,)" +  + ")*$    +  -54633=B=CQW^{]##+##$%("  "$$" (/' +   .BdkF(*9CUge`jtw}{~yvvokkqbA&"%',146<@ABBBEFJOPOPONG9ERMFC?AIf|mkrsnt|zlkZMOSYeV]gjloxufZSPZWSROGB;4=79C?1.8;5384% +/60&"",-038>DILD:1+''%)*++.168;631.,**0241.,.0796216630,% JRH7',,/#,9>;64775498;>@@@BCDEFGGGGFIIJILKNMOMOLMJJGFB@;<;?>DACACBEDBCCCB?<942135888<=AAA=72+&"&(**(%       +  )19>>:54@AGZhkցN*,*%"&&"#! ! !""###! ,3)  +   %)'!7+''*( $/,&3Nyxmic[SKC;:8769>EJQOPXZTI@?KEAG?9FLPRPQVfrƾQ)%=r^-%!*-&!!NýĪqU<)')% !&&'3EaŲyY@.*(&##" #((,7GWn`dgfilmi_URW\^fppomkhgecdgjkljigedb`bbbccddefdbaccb`\^`c_]\XSOPQRPKGA>;9=:FMMLKCIRrt\N[`mfjotz{yv}|jSOMKKQWaejo|uh\XTUUVVRNJH7;?BCDB?;:?FA3*,7;<5* (45,$!#-/149>DHHA6,'$%$*+++.0567420.,**1332--/4696247950,&  IRJ9(..1& /9?;64775469<>@@@BDDEFGGGGFKKKKLMNOOOONMLJIFD@>=>?ADDCCDEEDDCCCA>;:43236898=>@CA=73+%!'(***%  +   +#.##(.28=HPRRQSZ]eu[7 +-+&$'(##! !  !#$$$!#38- +   "),+'>TYYX]hijfimroillg_^fmadxE*" (.26=@A><<=?DFE=61)4>NVWVVT]hsr`J6+' (BUXUKEA?=<;;;;79?CD@;8?DD=0&#$** ':cyyrmbWQI@:9:<=BBDFMRSUSQRRMI?=>?ACA>92//=E:)-262)$%)0025:?DGC;0&"!$$+,,,-/23410.-,++2210,-0557514872-*$!! EPJ:*0/1'"09><74764469?@BEDDDDEFEDBCB@>;:54347999=>@BA=72)# "'(**)% +  + +$.7-&,6<>AEJSZ]_dhhmrB'&,.,'$'($#! !  "###!-;:899<<==<5-'"*5FPTRPN\jxxfO:.6,&*ATUSLGDB=76434467;=A@>?EIHA;8/$#%%/0%"*Pi}yo_SKB;759BKYbkqotpeTJIIUKGD>DLJ@CIOVWXX]jź_+;}|Y.%*(!%7zȳüǮvY>)%'%  #$)3Dcƴ}^D1+*('$#!"&*),3>M^vchlmnppk\QMT[^hqoonkjhighhjllkkjjihghgffdb_\]]_a^_`cab``\[[XSQOPSSTTNGA=9>EDGTS?FinNJ[_q~wvtqnwoaipeZQRUX\blr~|xnbWPI_WMFB;64CBEEA<=@LH>69AC@-4@D6$"233/)(,112376+" $&+,-,--000.-,,-,,10.,*-05342/3750*&!"DQK=+/.0'%29><7478437:@B@<61(" $'(**)$    &25,'0>CHNKB;90$.--3H[n{~mZLB:54CHSbuiTNRSPMXS88LO@?EMVWVS]fuf9'GFFRP+.),$&2;>=8678657:=@AABCEEFGHHHHGLLLLMNOPOOOMLJHFCBBAABCDFFEEFGHFDBA@>=;:76569;<;??AB?;4/% "%')*)(#   +%.2+*3>BCBHGGFHINT\mu}q3()+)$"%&!" !! ####%%%# #.3-#  +     +,<>IVXU_rxuqtwrnnabgha^jryb5&.()01//3433799764----//.)%/ADDE@DRdh]TSZM>6520.@IIHNOCPiW]RDh{~}wonrjdrwwxqnmmkhd`XWVUWUQMA@FT_c\SA?@B>67C@JTVQF<3K5.88'%21/-*)*,-01594-$!&(*+,,,+,,+)*+-/12-+)*+.0332/-03.&!CQO?++(*# )5=@=8688556:=@AABDEFFGHIIHHLLLLMNPPPOOMKIGFBBBBCDEFGGFFGGHGEBA?=<;:9768:===AABB>92,##%')*)(#  +  %+.*,5<==>A?=:;FIIC@@@=B??<=>@BA@?ABDBA@TpuZC82-&-9RogPE@98<7=GLJA709Vy^SIGF@AA8C?AELQQOMPXbqöeF=>R|fI2 %*)#  N­{s~ʳ{]B-(+($#(*2=VjʺeK3,+)'$#!#%&')*,1OizR82IE=3($(21.)'(*,--05>DC:3.(!!&'(*,,,+,+)()+.135.,*,.223650.14-$CRPC--'%  ,8=?>8689657;=@BBBDEFGHHIIHHMLLMMOPQPOOMKHFEBBBCDEFFHGGGGHIHEB@>=<;::878;=>=CCCB>8/)!!$&()*)("    $)-..4;=;:;B?<866=CC^lsp?4!.)+)$!%%!!!!!!$$$#%$$"",2,"    $  ,?9D_meev~|yxphluj_[\VZx^B1!!+*-/33112534667520-148AFB9-! -4>?9,"#+3/*(18FHHA=?@>>=<::9:;DDA@AGLSkvvbNIJKC=1'-8>:/7Ldvz~z_IA?:;>AFPVTJ?;JX_^h}reODIG>9A?BEHLLLLKOT[m|G.4C]lQ;'*(" 4kæ{}¿˴|^B-*,($%*+/:M]oz~˺fL4-+(&#!!#$%%''%*0446778<;:;:9764ehgeflonZMIR^ckrqpnkgddcbbdgkmqpkiihifcb_bfkqstrlhcceeb_XX[ZWUTTWWYZWRMKIDJOILZb~_as]Bi}|{xr__~ħqv|h]ZPSdtuzsjTLD@CJQTWPD64@XmzN>Jię^@?@QR7!!**0+%#&,/1,.6?EC9/*% %&')++,+,+)'),/246.,,/2444972/35.# ARRD//)#!-:?@>9689657;=@BBBDFFGHIIIIHMMMMNOPQPONMKHFEABBCEFGGHHGGGHIHEB@><;;;:989<>>>DDCB=7.(#%&()*)'"   !(.146>DB==AOLFA;;>CJdruN6D*)*,*%"&&"!!!!!###"$##!#-3* +   !&'%! *;2>awqkw{{ywlahus_TRS[~N2&$6(,.3443583355631/269@DC><=;:999BCCAAHZho8 ) +=GD:?LZejxpU@;:57>=@FILKHIGWTD@Y|jQOG>H?ACFHIGHFCEJQ`{o8'6MksWC&'*&"###((Lɮxv̵}^E.*,*$ &)).6DS_iu~{xtqkfafc``erͻiM4-,)'#"!"%$%$!#())*+++..00/.--+beecgmnk^ROZipnjnmlifbaa^_bdgkmmdba`cdfghgjs||xrhd`^bded[YZXWWYYXXVURPMLMIIENKM{`WwlRlxyxyv\]izԮcgsstoc_hyuu{xpZQFBDHIILD=9@N\ewmÝjP>HL>(%/3,$#',..(2>DB<51&$! %''()*---+*()-25660//3564357421/& +3PTG6+#"!2=879=?AAAACEGHIJJJJINNNNNNNNQPOMKHEDCCEFGHHGJIIIIJKJFB@=<;;;;;<=?@AADDC@92+'!#%&,+)('"  (25<=BGGBBEY^`[X\adlt{|̉:$E?%++++('&#$!   !"#&&&$ "33" + + !&<5Bctlix|qvvc`kiidWKXurC$'('-13004894321012315=CGD=75887/' %(%(/7FLQMGCBA@<:9=ABDFB@??Jo^?<:(!02/)+3:;1;LZeow{ZLBAD?<;89AMZcm{hC>@D7&%03.(&(,/018AD@7/*%$"!!"&'&')*-..,*(*.3654///34533352/,* 3OTG8.'""2=97:=?AAABDFGHIJJJJINNNNNNNNPPNLJGEDEEGHIIIIJIIIJJKJFB@=<;;<;<<>?@AADDC?81+' #%'(,+)('! + (26==@DEABFYagikooloyh1'?9.+,,-*)'$%"! ""#$&&&$ !32"  + + +$):08]un`brorrjgc[ZSILhW1")***.31/59:32100146<=ADHGCA?BB@8."  $$"$.6ELPKFFFC39AGIIED>??>Kc~bL:30)&'2450.4::4>KWclx}sRC:9=;=?;;;=??BCFBGWXF::VT9JRDABDIJFCD;;@DGUki_nv[8#&),)!"6wжý˺`F1*('$#')-.59>BGIJDDCBCBAACB@=;85544459@IPaxѾoR80,('#! !##%#"! #$$&%#"`dgfhmpmd[Ycprmiggfda^]]]]__abdb^\\]adfhoqty~|ul\UQVahjgd^YX[\[WWUSPNKJIG>CGRITiDLmw}spv}{leff]knXkKSonqlijs~}pjmlnsuqjb\UPJHHGCAOJDBGS`hgei{Ťe`]?3A>(#321.+*,048=BB<3)$######&&%&(*-..,('*/3531//033422674/+% 1KRG9.*"#4=@@>;;>?;::>?ABBBDFHHIJJJJJNNNNNNNNOOMKHFDCGHIJKKKJIJJJKKKJFC@><;<<<<=>?AABDDB>71+' "%')*,+)'&!  +   ++9?D?>?@=<@Waluyvmchp~߅D*-937+-.0-,*&&#"!""""$$$%'''%!!1.    $-5,2Ulk^\kqjhoi\TYPJTzf8#*--'+1/.48:2100258:BAAACDDEGLMLE;1* #.6FLOJFGHGJMOMGC@B94:Zt?>?9/*,.+).41/058;?IVcn{dE:338:>ACBBABABD@HQWSIDE9KZIRIEADFIJFAA95;@AIWɽlH# (.,%"I|ľͼbG1('&#!$'('+-/1211.0//000/1/-,+)((*)**.26;K`пpU:2-)'$ ""$#  ! ! ]cgghlolf`_hqpkhggfca^^[[[]_``b`][[]aehjmpstwtkaSKJSclnid]WW[^]YZWSQMKIIJ=BJQFRjDFlwqnrupc[ZX`ʼnqcj}wsqnqtpdWLGFFEGIIEAFEEFMYfoh^Xg͒_IETU1/1((20230,-28<>@?90(# !"#$#$#$&')-..,&%(-230-00233212794,% + + .GME8.+"&6?@?>;;>@<;=@@BCBCEGHIJJKKJJOOOOOOOOONLIGFDDHIJKKKKKIJJKKLKIGC@><<<<<=>?@ABCDCA=60*' !!#%()*,+)'&     0BMOE=97315O]joogZOSXmg4*1709-.120.,('$#"$$$$''&&((((%#" !/+   #-.)3Leigihug[ihZVUTUa}sI &*+,'-0-,156000158=<=>>?7;>=;51.("# %08DIKHFKONNMJHECBAFGSmc79<;60++)")331138>BKVfs}yX:3116:<@CCDCDCDCHMOHDFNQ41tsgTJHCEFJJFB?538==@HfҾ}[6!*($)YģſͽbE0(&#  ##!"%&%$#$')))))++,,+'&%$$&'(*.113BUrsX;4-)&" ! "#!Y`fgilmkgcfmqmhggffca_^^\\_`adgc^\\^behjjoqnmjbVJCGRdnnjbZTU[_`]\XTQMLJJK=AIPEQqFO||snihe^VPP>Rʰlg{~|vwvn_OC>=>?BCCAA@CHMR\gnf\YkʌGBF@Zvm=%%-.,/363//5;A@>;5-&! """"!%&'),--+""&+/0-+12453213683)  +   + -@IB5+)!&8?@?>;=A@=>>AACDCDFHHIJKKKKJOOOOOOOOOMKIGFEEHIJKKKJJIJKLMLLIGCA>=<<==>?@ABCDDC@<4.*' ! #%')*,+)'%  + + +!3HTVG920--/FWfg_TNIGMgĈO3,2:2501231/-*)&%$&&''+*('(()))(&$""".'     .+$)Fhvplcqg]f_SVLYiszrS0$++*)*/1,),///01488)"'*0995239?@IYlzgI34879;;<=<>=>=>>KID85=BD4SnrS<- +!8mͽaD1&#"!"###$&&,*)'%" ""&*03145.)&#  " T]efhjjigdgmniffgiffcba_^^acfgihc^^^bdfhhnngdb[OA?EUgonh^XTTY]`_^ZURMLKKH>BEPGRm9Jxpkc\TLGGICMnģnbtuw~}zxsj]PFC??<<::;=?GMSUY_ci[Q[xӍ>D[UWUlmH(&23(/155338=FC=81*" ! "!&&(),,,)! #(-0.-357732149:6)! +    *:C>3*)!):@@>=;>AA=??BBDDDEGHIIJKLLKKPPPPPPPPPNKIGFGGJJKKKKJJIJLMNMLIGDA?====>??ABCDDDB?:3-)' !!#&(*+-+)'%   + + 2FPTA/'('*-6K]`ZXY[^b{S84/1>4034330/.+*''&(()*.,*())**++)'&%#!#.%  +#($+(AtlhjfccXOQXjvS0$)-+(',11+&())+-159<@A;74.+$"&))*&$!"&,)$"&*!#1=CDHLLPUURUNJJS^imq{yU47MG<8=8("(24772,+2;=FVoyU;28==;:;:;;=<==?=?>;8:?@A:DHmQELFGILLGA91-/578FA:40*$  !##'(()++*(" #(-11147:94225785' $&2=;2*+"*=;>AC@?@BBDEEEGIIJKKLLKKPPPPPPPPQOLIHGHILLMMMMLKIJLNNMLIHDB?====??@ABDDECB>92-)&"##%(*,--+)&$   0CML6 !);PZ_gns|8+555>1*7642.--++)((**++0.,)***+,,,+)(&$%-%+36.*%  $>t|g\]WPRThmyz_5 "'+//,),00*$&''%)/5;==<84.(%!$,//'$),'7CKHKOORUTNNR[am~yM9=B?:DA>81+)(0--0,''099?PldF43<@>::<:;;=>?>@>427=@@EICC,ZeEMGHKNKGA72,+069?JKbûZ@ )[۳bD0%   (,,-4CWt®v\A7-'%#"R]ghghkigefiicbfhheecbbagfgfgfgeeb`_^^_`_hf[TVQD8=KZhllg[ZXTTU[^^ZVPMJJKPJG@HFGwvqiaTGBDHLHNL_̛ؠh]na^tyzrgZSKGDGB;314:?A<611/+' !$%(())+*)&%!%(.35479;;7226.2,! +$! #!-9:2,-"+=BA>=;@@CCEEEEGIIJKLLLLKPPPPPPPPQOLIHHIJNNOOONMMIJLNONLIHDB?>==>??@ACDEEA?>71,(&$%%'),-0,+)&" +   +0DOE/ "2FUcr{~ܴ[3&79:;-&:741-,--,++**+..2/,***+,--++*('''/&! &07762,# :gbLOEDRU]RRT= "%).0/,*01+&'('!&/5:;:895/,,+**9COUVL?6,! ,;HOLORQSTQLj}rjg`ZK96@@8AJE5*.0+/*)./,.6768Je~vQ;45;A<8:>?;;<;;:;9837:94:F?G1]{bNIJIKIGA62,),18>GDT|Ⱥe=  )dԹ}{½©dE0%  (.,-8DWq°y]C8/(&#$! cdfjmmljifcbeeffjifebbdbcdghhec_f`[WXY[\ae`TRUN>-0OpqhhdZYWQPOVYb\UNKKKMRMF@=ER^yqf[PRVLJ[T[\_wxѦ]az_ilqecZKBD>@D=5;;:?EJPRSPQQJPUWY^fpNKέZbH94+(/0--26:<>>97646521&"!%''#&**&%&)&#'+4<><1% 0>BB@?>=>>>@>=@DFGGIJJJJJJJJJRRRQQPPPNNLKKLNNNNNNNNNNPPPONMLIIFECAA@@@@@ADFIKF@:1*&$$'''(*-020-("   9LIG, + +0%'=IF?KRPS[[TwaI=<>CCBA>>EC?;60,'/121/038510AYrvYB978<=;;?BA@;76;>?==;889;88==CYd||KMLFGIC8/..,,*(.F8Ku¿rT4+uvyſĭfJ0& %*,04ATlǸfL7,//% !"  !""!! !!#$%oooonkiggdcdfhijkjfbba``bbddedd`_]YY]`bc`_WNOUN<-0PopggbZYVSPORUZYURQOOOHC<;>FMT\p|vpa[RQRNZy}xh^imסc}f[JSMQOD>?9=FD>B@=@EIMPNMLLKNTWY]dk\gҸ{`H81('/./048::;:75544455.'!!$%%!$('$#%((&',28:965330,'&)" !$+,&!+8><0$"1?BB@@?>=????=@DFGGIJJJJJJJJJRRRQQPPPONMLLMNONNNNNNNNPPPONMLIIFECBAAAAAABCFHID@91+'%$''()+.020-("  + 8IE>'  + + + 0K\kv{M2(*.55/-0951.-.../0000/.--..,*(('''+*)(('/=6!  +'.55.# 6\qWH?(0.6+"!"%),-..+))*-/0.+-14789878:;;:89EJOWaege_WJ:%,@JGLIGAAOufTRSMGCCCC@@?@EC?;73-+03344335634>Tk}`K<89;:<:;@CA?:77;>?=>978;=859;CPTzJLLHGF@5111.,'&,:?NeŽ»hO;3@Һ~îgI/%!!%+-/4BUm˺kR=123-%(#"##%'**)'(()*++))())+,-usplhdbbcbegiijkmkfb`_]]__`_bbdb^\[]bdee^XNHLRK8.3SnoggaZZXWTQQQRRVVUTROC>:=BFJLNKIHGKLRVZ]`df{ɹ[E5,"&0.458;;9853221248:61)$"##$ #%#!!%(*&%).20.+*('%" !$*-&"-9@;/& %4@CCBA@?>@@AA>AEGGHIJJJJJJJJJQQQQPPPPONMMMMNONNNNNNNNOPPPONLJJGFDCBBBCBBBCEFGD@91+'&&(()*,/120-(# 4C<. +6M\gnͅ4#&*05412694.,-/.-/0000/.--..,*(('')**)'('1A='   !" 7[myT8.5!!$+' ()+,,,+*'&&(+.//++.1344488:::97:8::=FNW[__YI. 4CJJECFM^ojI9?IJGIHEC@@@BED@<94/-/259:83178:>K^{fI;6:?>;:8?<;659@@93;@ED?uHKMJHE>4421.+((,0GTSmȼk[`׾v|űlM."!%*-/9GZpξqU@202+()$$%&()-+*))*++,,++++,-./nkf_[Y[]efjkkkljmifa^][[]\\\]aedfdbcb_\YVROILNG518Xpohha\\[[XURPKMSVWSOJGDABDGHLZet|xwtrola\QKO]ΰ{WؕfS~ŵYJC@>DC76=4+5@AGKMNNJGEEJJNRWYYZhTA2'%2/99<=;7400/0/04;@=80($"""!"$# "'*+'%'+,'$#" !%),%#/;@<0&"!(6ACCCAA@?AABB?BEGHHIJKKKKKKKKQPPPPPPPOONNNNOOOOOOOOOOOPPPONMKKHFEDDDDEDDDDDDEC?81,('')*+,.012/-)#1<2 + 8FRa]$%,156313772,*-//-/0000/.--..,*(('))**(''&3FF/!    7Xeڞb367 %/&$++'/2220.+*&%%'+.0-+-/12333789:;;:<2/+))/5:?EG@1"""9GLJ@DQk~ZHMQMGACEFEFCAA@BED@>:720.26=@=4/5:>>@KfpN925>D@<:8=DC=7446;??<9439BB92?HK=/lMMNLIC<3764/,((.-JRH]¹ټ|wsu}¼ʶtS1"! "(+-1=Nby®{^I820-)('&&&*,//+),+-,/-0.0/2154][UPNPX\lorqojijige`]\ZZ\[[Z\_dfljfe`[TONPSOLF@55?^tqjhb_^]]YVTPIKPTRNIDJIE?;=DPdv|xvspmlid[MISkֳwSɆ`بW{è\MHKP^\I;@4-=MNMRTUQKGEDFHLPTVSTev~gJ=0"&51<;<;83/,--.-.3W~y5*6::6212440-,.//-/0000/.--..,*((')),,*(&%5JL9'  +     +5V]q49>.8)!'0366542/,*&%$'*.////0223334569;<=@;7/$!'./.'(>HJGJOg_B6<81*%##!#&%$&*-)$"#$" + "%"&5@C=0'%$,8@ABC@@??ABCD@CGHHHHILLLLLLLLOOOOPPPPOPQQQQPOPPPPPPPPOOPPPPOMLIHGGGGGHHHHHGFEB>82-+**,-.01222/-)%  *. /VO1<>930220/0000////0000/.--..,*(())),+)'%&5KP?-       +8USӂ>=?+')13("(49577641.,)(')-0101111222201369;=@DA7+ + (+"-?HICLYP?PI8-3JWTH?BFGDBAADDA@><871//8AB:428?=62=?>@C@95358=@>;558=@>84:IC53[k]PJHD<8;850,,.38>?IWb~ӯ|ohhoxímG1 $$  !""$&''((&&$"  $&),19H\tȼ~lUD<82-.//258:;99;845EZmzyz}zvrlfbXTLKYrӬrVб~_Ɖ`^vbECGJN_dVIYXNV_ZT__]VPHBAEIOQQPSYVT\irjQ>52,,>5520,)%$#%'*(&)28:;:5.(%$"&'$%)+&" !#!  "!&5@C<1'%%,8??AC??>>ABCCADGIHHHILLLLLLLLNNNOOPPPOPQRRQPOPPPPPPPPOOPQQPPMLJIHHHHIIIJKJIHGA>82-+++,.013332/-)%!"""! &' (\-!4::3,.44.+0551//1/0000/.--..,*(())+,+)''%2HNA1 + + +     ;ROyJ=;671)$%+.1122332/-,+*)*-00011000000002368:FG>Kgc<8LL?7=OVN@EFHHDBBBDDBA@>:93.+2=C>967;<615>Qe}tY@;CBAB?9547:?@=:58<>=976;J=6>OwgPFED@<=851./26889GVO_մĪxka^elt½ʸ~X=("('# !"$%%&#$##""###%%'')+,,/.+)&$$$(*-049AKYnķiUMJC<=;=AEJLNNMQRWW[[_]_^bbfeYUQKMVgsz{{tleee_\\[Z\\]]\^^acfd___acc`^VMD>92*$6Eftnih^bYSQSVWUPLFDBCGIA;65AUn~yz|~{wtle_PSOPXnԭvYȢfôrY^_Y[b_PURPA7ETN]qn\[dhida^WPGB@FKRRPPT\YT_keZPG-/*/@7/-*&# !$'&#%-379:70*&%!&%%%(*%! !## + + !"&5@C<0'%%-8>>@B>>>>@ABCADHIHHHILLLLLLLLNNNOOPPPPPRSSRPPPPPPPPPPOOPQQQPNMJIHHHIIIJKLLKIHA=82.,+,-.023332.-)%! ###"! $$  (cm%164,'-66/(0782./2/0000/.--..,*(())+,+)'&'2ELA3        =SLvU<79=5$%24+#./010/-,.,+,/11110/.....00124689EGG?3%%',-% +27;EF=[y{YDKI7=ENI@;@FKKJGBACDDDBB@?;:5.'.;CA;98998349:Jc~zZB55=HNI>79>EDB@=8658;@A=949>>;766?N98BD^{mOCDDA><971/04:675BPDJsѻؼp\UX[`iwľ§bH.&,.*%#"$'(*)((&&%%#$$&(*+---177421/--57;=BHS\j~ʿlc_XQPQSV[_defgjmpsvw~~~`[SLMYgqwvtmga_`_]]\Z[[YX]_]afheccehie]WKC<:4-(%8Wmnmh``_ZWSSVYZPJA:58@E79AL]ovryxslaVTQQTZu׮v\qt_^qpa\TO[tzd`pcdkeZVSOLFA@DHNSSTTW]YccOOVN=' .9;,%!" &)&(-68:;71*%"$#%'&&& "%)'" +  !!%4?@;1("&/9?A@=>>>?AABBBDGHHHIJKKKKKKKKNNNOOPPPQQQQQQQQQQQQQQQQPQQQQPOLMKJIIIJJLKKLMLIG@=72../0013566550,&"!  ###$#!!$"  + #D*$01.+-3775&-573//0.//00//.+,--,*)'**,,+)%#,FIH9 + +  + + + + +   =LQx?.0.1% %,)$$*-/12221.11/274-.-,,.12358;<;999?AD@91,*.&)+''%$<:;FF9WrFFB82@PVICHF;=@FGECCDFFCB@?<;80&(3=?=853379986=J^umUIC<>BFHD@;;=BC?:755:>>?A?:9:>?:35;?RD;wxQBFHD>;<8.0992+7AB=@EKؿ«q\[]UY_dkwþҺv\B2-**,&&&'(**+*)**+)))*,.159;?EHGEDEGJMOSTV`lx¶{tpooprx|aZSMNWelsrpke`a`]]\\[ZYZY[\[`fighged`YOHA<9872,+=[nonibba\WWXZYVME<626;A8ARaoy|wz}xpi^SPLHKXwݱrHOqxmYO]v~tuk^[rõvqmaUQOLIE@?CGORSPPOb^`^SPUQD%7@>3-%!""!"# !&/37970,)!"!"!""!! !'++%"# + %5@A;/&#'0:@A@>>>??BBBBBDGHHHIKKKKKKKKKNNNOOPPPQQQQQQQQQQQQQQQQPQQQQPOLMJJIIJJKLLLMNLIF?;61/./0235666540,'#"!  "##"!%%%&%""!&$  + 6Z*/,0,21/27:74%+241/02//00//..,,--,*)()*,,+)'#/KON? +  +'BPVϙY.(090$ $)-+*))*+,--//.152+,+,*//3278==?>@B@<9675,/.&&' )@=;DD9Yp=<:99=EHCDHG<>ADFEEDEGFCBA?<<:3))08<=8554765379>FUmnS?:9@?AABA?<:9646;@??@=8:=>=878;;A>9;>Bzijİs^Z[Y[[Z[bnv¹ȱsWD;3./++-0023333556553:=?BFIMQ[`a_^_`bikmoqyľ\XRMLUbholkic```^^]]\[[\\\\[_ehfgc`ZTJ@97579:523Fbqnojbdc]Y[^]WOIA8202465F`s||}~|{{~tkcZQIHGKXw԰uH?Vnxwsf^qû}phe]PQKJHGC@?AFNQQMJJabYRUROQO- +5;5/+&$&''%# !##!#',49850,+##!!  ! !(//(! ##!!   &6@A9-%%)3@EFGGJKFHIGFDCB701.!!%!.A>B=78??8:@@=I:3gyRKOHA><@?99=;2*4;:668;jȷdzw^YW[ZVQNPV\kr¿»ȪxdVH?=;;==@CEFFEGHJJKKVVY^bfkpzžUSPMPWcipmjgb___^]]\[\\]^^^[^caZVSQKF>94769<:558Nfsmmibb_ZX[_\RF;6326897>Rl|}xy|zz|}|rjaYSLJDDSzӵ^Thü|fYQU]]\UNJIHFCA?BFLOPMLKW\OJVRIOT;%3842/-.000.(&&%$$',16;;4/*+(%$!"!"""!!(/0'  +'7AB9,%$+5>BBBA@@AADDDDCEHIHIJKLLLLLLLLOPPPPPPPPPQQQQRRQQQQQQQQPQQQQPOLLJIIIJKLMMMNOLHD9742123599:98642/,'$##"!!#%')*))'&&''% "#&'  +1rψ3)-.34346630*,/0//24110/....--,,+*))++,++)&$;bphI +  + +  #!&7GTeڭl@46>?5+('$%##!#$'(*+.-0//-),-.15;?FHKMMNPRQPROLFA>3/1*"#1B@>AD?an33?<4,')19=;732121;83/2?UdkcUA4/6=<:<>===@=82.-8?E@;986?C>26CB67=D>?47kyPLSJ?:>AB>==92,496446:Z˺v\USSUTRONQT\`ht|îyi_\TTVVZ\`_ddehikjjvw{~¾ROMMR[gmsnifa_^\]]]\[]\\]_`]_]VK>=>=<:;9<<>?946:Shrkje``\WVWZVJ?/016=AEEVew~~zuu}{unh_XRE@86Jyœåzk]RPYa_\XVOVJDIPRUYLKIIGEBACDJKLLNQOUJGVRFLOG=5348:999::986/.,'$$%'.5772.**(&%##""#""#(/.' + &6@A9.'$-8@BBBBBBBBEEFFCFHIIIJLLLLLLLLLQPPPPPPPPPPQQRRRQQQQQQQQPQQQQPOLKIIIIJKLMMMNNKFA76433578;<<;:753.*&##$#"#$&)***)''''(&# !#&' Bi2 $-320/////0111001311/..../--,+**))*+,,+)%$?qyR!  +  "$$".DHJMNNNOPSQSPKD930,-&!%#1@<=7:>=69CGC??CEEDGGDDCB@@@@9/&$+3>;720/24577;?BFGA@@:6379<;<;=><=A>?:4.-,:BF?7567?B;25CB66943995259./2246>7239;F?<:?AHPMMLKHCCABDIIKLPRLNIIRQIFLPPH8,)**-39=?A@==:1,*)')-.130-*#!!" !$',/+% + + + + $+7=?7-($-9@BABBCCCDFFGGCFIJIIKLMMMMMMMMQQQQPPPPOOPQQRSSQQQQQQQQPQQQQPOLKIIIJKLMLLMNMIC>655568:<==>=;964.+'%%%%%%&(*++*)(('())&#!!!&( + WD&!#)$+11/,+,-/3322211110.--.01.-,+*)****,,*(%$Ayb/ +    """%7BCY{զp:58BE=0#"!'*-),00110/29?IMQSRQQQSQRPLD:1+)+%'-,07;ABA>[c*2A@8=;=@;58AECA@BCDCGGEDDCAA?A<3(#%+8874203404;:979:<>?<;A=;60.01;CG=316:@@836??78:IA:7Et~`OOKA5;?CDA<:89<9314;=LoǺҹiOJIGLPSTPMMSPQT[^flx{ĶPNMMT_nvsmfa`]XUXZYZZZ[\[ZYXYTG9,-0/02:>CA?7-+6CVipihd][[XUUTOIDKLJDADQ[vy~}}z{{{wvwyqlh`RJFdrd^YWUPPQ;?DA>=<8AGIFEDC@<<:7;BJPNPMLHCA?ADGHIIKNQKKLHJJBJNSOA0##-6<@CDEGE<763/,-.0650*! $(/00+%!  + +  +%+(,08<;4+%$-9@A?ABDDDDGGHHDFIJJJKLMMMMMMMMRRRQQPPPOOPQQRSSQQQQQQQQPQQQQPOLKHHIJKLMKKLMLGA;55679<>?>>>><:860-)'())()*+,,+*)+**+,,)'#"!"#$(* #n`$$(/'0/210/../00123210/.-,-/13.-,*))**++,+*(&#ByyF*    +  $" &)DHE^֭\D;JTH1%"'*%*0142-((.4DIOSSRPPRMKGEA:4)%(&-56228A@=8]i.4CC:889;<;<>?@BB@@ACHGEEEDBB>@>6+#!#-27862/.26=AA=746:?CCA?;:;:;:;;:>:71.06;=DG;/.7>?;667::9=7FB@AIjsWHFE=9=ACB=::>=70.5;@KcοֹcLHHHHLMLKHHSRTX\[\]acimv{~~RQMLQ^ktoib^^[VSUWVWWXZ[ZXTQSOD72431.18:C@<4)*7ETgmggd\[][ZWTOKIEGFDEShz~~|{yvy{vnie]NEATqi_qydWDNO@:>>4>;4./7;:@?>:?A?947402>=?CD=;<;77316<;3+""!%,361*%%(-)/3:<82)%#-;BB@ACDDGGGHJHFFKJLJMMOMOMOMOOPPROQNPNOMPOQPSQQOQOQOQOPOQOQNOLHHHIJKLMJJKLKF?:5568;=@A>>?>=;972/+**+,++,-..,+*/,+,..,*%!%##'(++ )}J)(,*8.255310/--.13320.-,,-034/-,*))*+*+++*(&#CwY3   + $&  &2JLGbʗe;@CFFECECCB8.$$,6;93-*8<><636:9:;<;<<;>;::89::;83..2@?989>;4-,3:BJ^Ѿڽ\E@@BCBBCCEFLMSZ\WQPUXZ^bhopls|{wv{RRPJLXekh`\][TQPSUWYZWUTRRRUTMA9630/..6>CC90'"5RX^gc]ZZW^YXZZVMD;8:EYmz~~}{{w|}|zrhbcZG;9EXhihcWF;DQUPKHHME?=?@=:::88878;==><=:99543357:457:>>=:730,)((*,,--..///,-/010-,%" #$"$)*%#,)  +Vؿy4$ ))-0/01220/.0/-,-/132.*),0100.+(''(+,*)**)'$BeC  +    (7OVI_W.&J[;61-'!!&1/-)('%'.39<:::C@6,%#")39;84266566777767:==:471/39>=;986324:>CCD7)/720,-4769?>>BGDER_xWCG>C9:<=:865971*)18>KbƾħV802,037::;=BFLOQPPOQRVX[]_^badkqy~{wlhisRSOIITcgd\XYXSOOQSVXXWTRSSTWVOD=:41-..6?AC:0)%6SZ_ca\\[[d_XVURJC:=FUjy~~}|{x{|z}{uj`[\UF==;HPMIJC9<@A>;5.+67:<>AFIKKG>2)(&/*# &(*,00.-  + +  !!,9962,*(2?FHFFHJJJJLLLLJKMNPPQQQQQQQQQOOMMMMMMMLLLMMNNNMMMMMMMMLLLLLLLLKKKLLMMMLLLJGC?=568:=?ABA@>>>=:731-*))+,--..///0./0111.-&#!$$"#)/* &+)! (lE+#!&+++-./01110/0/-,-/123/+*,.///.+(''()+*))*)'$@{qO& +  + + +)AWYLfŊP3DVH=:4+  )))()%%#$(,.---/3-'&)*'$ ! #/73/,/;?BA:1)%!&.6::85654334566668::633104;?>;863248=AFHHR]qYBE=A;;98654474/)*19>J`ħ~U5*-&&*-2458>ADGJJJIJLOPRSTRLMNTX_cfopnonmih_ZZdrSSPIHSaec[VXVROOQSWYYVRPRSUYYSHA<50**+5>?>6.(&8S_ceb^^\[c\QICA??DM\l{~}{{zzzxzzwyyun`WRSOE?A=AB;9??;FFB=9;679;=@ABBA?>>=:732/,++-..////0000112220/($"$%"#)/+!&+)" +9t $+-*()-./01111//---.0130,*+,--/-+)((()*)))**&$=tb:   +   !1P[WTw往N?EKA@;2& #&)%#  #.50..1;FGCbm+0;;=;757768=>>>???????>>===<=?AB@8.'!"(09=<:65322356877887411027>@>;62017?=?EJLRXeZ=?:@>;74336453/)+3:?I^ǪY8+-#%&(),.09;=>ABDDFFHGFEFC?=>@BHKNRSTUTTTRLGEM^sUUQJHR`dbZVWVSPQQTWYXUQNPQTXYTIC?70)))3<<:.'')=Xdfgd_\TMPMB5*,8D[es~{~}{yyyyyy{yuutoh[SMLIBAAFIG@>AEEIKONJEGHF>733689:::;;;::::987766443210/.@BCCA@?>=:7431.../00000011123233311*&#&%""(.,#&+'"  JU',,)(),-./0111/..--./020-+***+.-+)((((*)))**'%8jtU  +   + + ++:YSPbشP7=>>>???>>==<;;;??@CD?4+" "*6>?=7531124677776531025;@A>;40-1:AB@9;>5'-5.((.1448:?<>BINQQX]9;8?@;40026632/*,4;AI[~˭Z8*,"!! #&)245589;?@A@@A?>74;KdVVRJHS`dcZVWVTRTRTVXWTQNQRSWXSJDA93,+*1::4'!&+@\ihe_UK;/,0,"#>Wpwyu}|ywxxyz{}zurpjbXQJGD@@?GJIECCDADJQQNIDB>96456789:;;;:9888776544565530.,7:@DFFFGCDDEFGGHGFFDEEDEIDFKNFHPYVL<*!"&+.232111.-+'" "#$&%&$%)'().016 +   -:<74/+*4AHJHHJLLLLNNNNMMOPPQPPPPPPPPPNNLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLKKKLLMMMNMJGC?<:::<>@ACDDB@??=97542100122222211144333433-)%'&""'.+$$*'$ +X_4&!')(')+++,,./00/..---..00.+)()).-,*)((')('(**'%1\o+ +  + + 9FYFJu|A36A=855435:<==>>???>==<;:99@>>BFC:1%! %0:>?9742123456665333359>@@<92.-34'-5.(+123488?>@BHKJGL]576>A:2./37623.*.6=BHXwͯ[9*)#,../1122:<;=<<;;:9755467441222313+(.BDGHFA?>?@DEC@?=8765456789:;:97676654333667751.+138BHKIJJQUXQ?)).0123+($! "%&$%''&''+(('(+/14 !-9<74/++5BIJIIKMMMMOOOONNOPQQPPOOOOOOOMMKKKKKKKLLLLKKKKKKKKKKKKLLLLLLLLKKKLLMMMMKIFB?<;;<=?ABCDECA@?=97654333334333322254333434/+'(&"!&/-% $*(% ""-p3(#'&%(++****+,-.....----...,)'()--,+)('')('(+*($+P¯= +  + +&IPPASh<8;>DE>1$ !$((!$,' !(3<>:861]m#'8>A=9676348<<<=>>??>>=<;:98><<@DD=7+&!#*3:>;:854211134433568;>@@=:70/052%+5.*/543376>AABCFADIToͯZ7'&%'())*)+//11222466532110-+*))))((##/HiQRNGEP^aaXSTUSSUTTUUVVVUURONNJC?C?<94..21-&(49H_^P8# +#1Hbtzyxz}zzxursuvxwxuokh_WTPHB??=;>?CEECCB>>?==?AA<:731257789::86465543221467751-*,-05@BINNGHP[]Q:" )045-)%(()*)&&)+)('&),/2  +  + + !-9<850++6BIKIJKNNNNPPPPNOPQQQPPOOOOOOOMMKKKKKKKLLLKKJJJKKKKKKKKLLLLLLLLKKKLLMMMKJGDA?=<==>@ACDEFDA@?=967665555555443332542223341,()&"!%-,%!$*(# %'#Gg!" &(%%*+)*)((()*+....--,++-.,('(*-,,+*('&&%'(**($*Eö^1   + +/UWCIhѣgG@;>DB:1" + + !$" + 07/"!0?B:53.Ym!'8>@>9897447;;<=>>????><;:98<;;=AB?<1,%!$,5;=<;9630.-023347:>@BA>:750148<>@@=<DD@>>81=~X,35:=4,*/6::01.+09?EHSi̮Y5#  "#&&$#$!"$%''')04442..+''%##$%&$(?`|NOKDCN\`_VQSSRRUTTTTTVWWRNIGEB<7D@?<70./,+).:=I\R=(=Shx{wtw~zxvrpqruvuvsmif]UPLFA??>9;<>ABADHAABCDDEGA>82./37679:975355432211346751,)**,18?DGFECBAABBCCCBB@AA@EDAHQQDAIT\XI7*".431)$(---,'%(+*&$$&*./   + + + + .9<850,,6CJKIJLNNNNPPPPOOPQQQPPOOOOOOOMMKKKKKKKLLLKKJJJKKKKKKKKLLLLLLLLKKKLLMMMJIFCA?>==>?@BCDEFDB@?=967776666665544333442123242-))'" %-,& "''$ (**[;|>!'(%',+&*)'&&'()....-,++*,-,(&(*,,,+*)'&&%'(**&$+>Ľ|M   +  + 6^Z8*!  "! !!  %;D8'.@D;30,Wk!&8>?=:9:9436:;<<=>??@?>=;:99:::<>@@?50(! '19>>=;83/,+.12249=BCDB=853/37:;<>@=<:,%0,/7<73343>CF@<92+8|V*15;;2*)07::00.,09@CIPdˮV2 "#""(,-.,*'%$#" #"&%$&;]xROLHEJ[e`VQTUSSWZVRRVXURQJB=<9417?FC;2/0,'-9CDHKC +":AM`p{}{ustywputrpqqrssnifb\SKGEB><<=<:;=>>@CENF??BCC@940048989987543311111111334420.-(*+-06>CCB@@AAA@AACCDCA@BACDFHKJDDFLPME>3$*.*& &-.,+)%&&)()('&'+-!   +  .9=960*+8GMLHIMMNOPRRRQOPQSSRQPPPPPPPPNLJJKKLLLMLKJJJKKJJJKKLLLLLLLLLLLIIKLLLLLJHEB?>==>@CEFEDCDCCA>;756778877655666666765445340-))$$./( #++&  !*!+}۽G#&!%(+,*(*,((())))*,++-//,('*,,)(*,)**+*)'&%%%%%&((,8vk1 +  + + +  !GdYCpˑ\:;<;><-% +  +#%% !-@KA+ +79664.Wg#';;B;<<<;742579<>>>>BA?=;:99<98:>AA@=7-%#'-2:?CC>7310//16;>>FEB>:74238=>==?B>@>+-*35974035???<93-+9zV(0@970*+5;;7/.//05?@@A@@>=@@CCFGIH?<;?ELQS;$ !!"%**)(%%$&)''&&'+/&   .9=950++8GLLHJMMNOPRRRQOPRSSRPPPPPPPPPNLJJKKLLLNMLKKKKLJJJKKKLLLLLLLLLLIJKKLLLKIHEB?>>>?@CEFEDCCCBA>;866788887677777777775555441.+*% %/0) $,,' "#&.%?ʳq.&()(%%')())*****))+.0/*&&)--+)))))*+*)'&&%%%%&'&$1s®V' +  + +  5R]OM~ܿW@0/9>2'   + " %+-*,3>KF6'!(256874W_ 46><<==;74268:<>???BA?=<::9;98:>AA@?90($$(+6;BDA<862125:?BCHEA<742149=?=<>A??<(''13653036=>@>83,)7V$/?85/+-7>>:+*,.06>GJM\tȫQ)"#$#!! !$4UtPNKGGP_ebZWXXVSTVTSUXWSND<3,)'$$3>KLE7+$-.6=@:74 +.Mgpyyrmov|ysnpummmmpppqnkd_YRHAE@;6458;;=@AA>?@@;77863023444468::98654400000000000/.,+**)'&(.8?>???>>=<<=<=<<<<>>A@CDFGC?;:;AIOB:(   &&%#!&&'&##$#*(((()-/*  !-:=840,-9FLLIJMNNOPRRRRPQRSSRPOPPPPPPPNLJKKKKLLNMLKKKKLJJJJKKKLKKKKKKKKIJJKLKKKHGDA?????ACDEEDCCBA@=;8777899877888888888866665541-,("!'/0,#'/.) +&%(3Hնνπ5!$&&%#!!$'()*,,,+*'(+./-)%%),.,*('()*+*)('$$%%%&%&)lìD  +  'JZRK_{O10>E4'  + + '2;=<76;FK?/$$*07<=8[|[##68A<===;74278:<>???A@?><;:9:98:=@@@B=5,&###/5>CDB?>767:@DGGHD>831006:??=<=??>9$ !#03652258:;=;61*'6W$0@51.,0:BB=))*-07?HHJWnç~P) "3SoOMJFIUbeb]ZZZXTSWVVWWSMH@9/($"!".9FID6,%./6981.-" 1BZhpx}xqlipvzunimrkkllmlkjkga]VPGBA=60/2699<@?><;9976342.*159:868:88765432////////...-+*)(((''(,38;=@@?=<<;;<;;:::<=>>@BECAAA>:8:=CH=&+-+'('&&$"$$*'&&')-/)  + .<>730-/:FKLIJMNOPPSSRRPQRSRQPOOOOOOOOMMKKKKKKKLLKJIIJJIIJJJKKKJJJJJJJJIJJKKKJJGECA@@@AAACDDDDCBA@>=;9888999988:::::9999876675663/.*$#'.2.&)21*$#%0&^ĮT('%$" "%'')+-.-,+(()*+*)'()++*)((()*++*('%$%%%&%#!bh!   + +3XXNXw̥vMAB?-'""   + #3?CB>745>FC6*! #(5;<8ShN#(7:B==>=;842678:;=>>@@?>=;:98889<>?@C?:3,&" '.7@EFDC===?CFGFD@:400138<@@=;<>>;7" $1354349<<;:72-++;n}Q/3=3/..5=@?:*+,/29@IGJUgϿzM)3UrMLHEKZfeb^\ZZZVSZ\[ZVOGA=7/'#!!!*1;><5/),052+''(!Q`nlrvxsqpqstspmjjkjkkkkgdbc`\WQMFC=92-,-1447;<:65564433/+)15::878:65432100////////--,*)(('&(***+.08>><<<:;;::<;<<>@B@7:<<989;>IH1 $*+*+)&$"#%&(&%&'*-0&     0=>840.2;EKLJKLNOPQSSSRQQRSRQONOOOOOOOMMKKKKKKKJIHGGGGGIIIJJJKKJJJJJJJJIJJKKJIIEDBA@ABBBBCCDDCCA@?=<;::99::::99<<;;::99987667569510+%$(.0/),32+!"-WѺn; ! (2,%$##$')*')*,---,+*(&%'*,-+(&&')*'(*++*)(%%$###$# WM  +   -DXQSrԲcL4)('(! +  0BLMD:114:BB:2% %2775:G6%16<<=>=<96444578:;<:97789:<>@BA=82+&"!&0:BFGFCBBCDEDB>;50/1469=A@=;<>;85#  )455558QUH=981//37==:4//1349?GHKTb˻yL' 5\{LLGEM_iea_\XX[XT^]\XQH@;73,&! )-3563/-,23+!!#,cpvtussppqsrpmlljhehijihd_\ZYUPLFA@83.+(+,/2477433434441/,+0256655644320/..........-,+)('''%'*+*)))4:@CA??@??==;;:;;:<;>>@>;854358<:DH@8. !!(%%#"$&'%##"&(+.'%    !1>>830/4>??><:957899:=@BA?<6/)%#*4>DGGGFEEEDA?:73//2589=AA><=?865&"-765469?AB<3*&',1>;9AC<4//16:=:6/233569>CILR_ʺyJ' !!!  ;fKKFDNblea_[VV[ZV]]ZUMD=930,'" !),0232/-.56+ +-fsvwupnmmmmnmlkkhecdegggb]ZXVSMHB==40,*''*+1322211233320/..2113565444321/..---------,*(''''%'((&$%%.6>BA??A@?=<:;:;:9;:==?=?9301356;?CDC8!"$%%"! $'),++! + "2??72226=;:;;<::;<<;::=<<;:98877555544;731,%%(,00+/53++nǸûU '234002675/*((''(+-/-,)%#%+10+&#%'((&')*+*))&#$####"CQ  + +  $FVLOrýʥSD4*"   +!:MRK?1./04>EA7& %-.262+ &06<8:<==<:8333468:<=>?@?=:9469989=@BA@=70)%!#'0;CFGHGFFFEB?963002578<@A>=>@756( ,963359=@A;2*&&*/865=A;3,.29=@=6.123569>CLOS]ʺyK( !"#"!AkKKFCOdne`^ZTT[[W[[YSKC=:21.*&##$*,0232.+/7:,+gw|yuoooomjjlmlifdd`befgb]ZZYUNHA<:2.+''&()121101242321/./053137975554310//--------.,*(''''&&&$!!"$*3?@@?=<9:9::9;:=<><62/26985><;:;<<:;;<<;;:<<;:998776544534;731,%$(+/0,053+! -lɺԤQ &/,4579=>9/()'%%&)-0,,+(%&+0.*&%'('%&')*+**'&$$####!=v\  +  !EWJS|ýĨlR6("   #=;:444469;=<=?@?=;9469989<@BB@<6/($$$'/9BFGHGGGHGDA974101358<@A?=?A756* *962138<>?:2+'')-29=<;83+.2;@D?8/002457=CNQT[˺yK( !$##! $Eo \ No newline at end of file diff --git a/buildroot-overlay/package/ai2d_kpu/ai2d_kpu.mk b/buildroot-overlay/package/ai2d_kpu/ai2d_kpu.mk new file mode 100755 index 0000000..96a1e17 --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/ai2d_kpu.mk @@ -0,0 +1,20 @@ +AI2D_KPU_SITE = $(realpath $(TOPDIR))"/package/ai2d_kpu" +AI2D_KPU_SITE_METHOD = local +AI2D_KPU_DEPENDENCIES += libmmz libnncase + + +define AI2D_KPU_BUILD_CMDS + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CXX)" -C $(@D) +endef + +define AI2D_KPU_INSTALL_TARGET_CMDS + mkdir -p $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/ai2d_kpu.elf $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/test.kmodel $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/ai2d_input.bin $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/input.bin $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/result.bin $(TARGET_DIR)/app/ai2d_kpu + $(INSTALL) -m 0755 $(@D)/run.sh $(TARGET_DIR)/app/ai2d_kpu +endef + +$(eval $(generic-package)) diff --git a/buildroot-overlay/package/ai2d_kpu/gsl/gsl-lite.hpp b/buildroot-overlay/package/ai2d_kpu/gsl/gsl-lite.hpp new file mode 100644 index 0000000..859f9cc --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/gsl/gsl-lite.hpp @@ -0,0 +1,4156 @@ +// +// gsl-lite is based on GSL: Guidelines Support Library. +// For more information see https://github.com/gsl-lite/gsl-lite +// +// Copyright (c) 2015-2018 Martin Moene +// Copyright (c) 2015-2018 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_GSL_LITE_HPP_INCLUDED +#define GSL_GSL_LITE_HPP_INCLUDED + +#include // for swap() [pre-C++11], equal(), lexicographical_compare() +#include // for exception, terminate(), uncaught_exceptions() +#include // for data(), size(), reverse_iterator<>, iterator_traits<> +#include +#include // for addressof(), unique_ptr<>, shared_ptr<> +#include // for basic_ostream<> +#include // for ios_base, streamsize +#include // for logic_error +#include +#include // for move(), forward<>(), swap() +#include // for size_t, ptrdiff_t, nullptr_t + +#define gsl_lite_MAJOR 0 +#define gsl_lite_MINOR 37 +#define gsl_lite_PATCH 0 + +#define gsl_lite_VERSION gsl_STRINGIFY(gsl_lite_MAJOR) "." gsl_STRINGIFY(gsl_lite_MINOR) "." gsl_STRINGIFY(gsl_lite_PATCH) + +// gsl-lite backward compatibility: + +#if !defined( gsl_CONFIG_DEFAULTS_VERSION ) +# define gsl_CONFIG_DEFAULTS_VERSION gsl_lite_MAJOR +#endif + +#ifdef gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +# define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +# pragma message ("gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR is deprecated since gsl-lite 0.7; replace with gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR, or consider span(with_container, cont).") +#endif + +#if defined( gsl_CONFIG_CONTRACT_LEVEL_ON ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_ON is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_ON.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +#endif +#if defined( gsl_CONFIG_CONTRACT_LEVEL_OFF ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_OFF is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_OFF +#endif +#if defined( gsl_CONFIG_CONTRACT_LEVEL_EXPECTS_ONLY ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_EXPECTS_ONLY is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +# define gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF +#elif defined( gsl_CONFIG_CONTRACT_LEVEL_ENSURES_ONLY ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_ENSURES_ONLY is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +# define gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF +#endif + +// M-GSL compatibility: + +#if defined( GSL_THROW_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_VIOLATION_THROWS +#endif + +#if defined( GSL_TERMINATE_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES +#endif + +#if defined( GSL_UNENFORCED_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_CHECKING_OFF +#endif + +// Configuration: Features + +#ifndef gsl_FEATURE_WITH_CONTAINER_TO_STD +# define gsl_FEATURE_WITH_CONTAINER_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_MAKE_SPAN_TO_STD +# define gsl_FEATURE_MAKE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_BYTE_SPAN_TO_STD +# define gsl_FEATURE_BYTE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_IMPLICIT_MACRO +# define gsl_FEATURE_IMPLICIT_MACRO 0 +#endif + +#ifndef gsl_FEATURE_OWNER_MACRO +# define gsl_FEATURE_OWNER_MACRO (gsl_CONFIG_DEFAULTS_VERSION == 0) +#endif + +#ifndef gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD +# define gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD 0 +#endif + +#ifndef gsl_FEATURE_GSL_LITE_NAMESPACE +# define gsl_FEATURE_GSL_LITE_NAMESPACE (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +// Configuration: Other + +#if defined( gsl_CONFIG_TRANSPARENT_NOT_NULL ) && gsl_CONFIG_TRANSPARENT_NOT_NULL && defined( gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF ) +# error configuration option gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF is meaningless if gsl_CONFIG_TRANSPARENT_NOT_NULL=1 +#endif + +#ifndef gsl_CONFIG_DEPRECATE_TO_LEVEL +# if gsl_CONFIG_DEFAULTS_VERSION >= 1 +# define gsl_CONFIG_DEPRECATE_TO_LEVEL 6 +# else +# define gsl_CONFIG_DEPRECATE_TO_LEVEL 0 +# endif +#endif + +#ifndef gsl_CONFIG_SPAN_INDEX_TYPE +# define gsl_CONFIG_SPAN_INDEX_TYPE std::size_t +#endif + +#ifndef gsl_CONFIG_INDEX_TYPE +# if gsl_CONFIG_DEFAULTS_VERSION >= 1 +// p0122r3 uses std::ptrdiff_t +# define gsl_CONFIG_INDEX_TYPE std::ptrdiff_t +# else +# define gsl_CONFIG_INDEX_TYPE gsl_CONFIG_SPAN_INDEX_TYPE +# endif +#endif + +#ifndef gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR +# define gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#ifndef gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF +# define gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF 0 +#endif + +#ifndef gsl_CONFIG_TRANSPARENT_NOT_NULL +# define gsl_CONFIG_TRANSPARENT_NOT_NULL (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#ifndef gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS +# define gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS 0 +#endif + +#ifndef gsl_CONFIG_ALLOWS_SPAN_COMPARISON +# define gsl_CONFIG_ALLOWS_SPAN_COMPARISON (gsl_CONFIG_DEFAULTS_VERSION == 0) +#endif + +#ifndef gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON +# define gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON 1 +#endif + +#ifndef gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR +# define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR 0 +#endif + +#ifndef gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION +# define gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#if 1 < defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) + defined( gsl_CONFIG_CONTRACT_CHECKING_ON ) + defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) +# error only one of gsl_CONFIG_CONTRACT_CHECKING_AUDIT, gsl_CONFIG_CONTRACT_CHECKING_ON, and gsl_CONFIG_CONTRACT_CHECKING_OFF may be defined +#endif +#if 1 < defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) + defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) +# error only one of gsl_CONFIG_CONTRACT_VIOLATION_THROWS, gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES, and gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER may be defined +#endif +#if 1 < defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) + defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) +# error only one of gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME and gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE may be defined +#endif + +// C++ language version detection (C++20 is speculative): +// Note: VC14.0/1900 (VS2015) lacks too much from C++14. + +#ifndef gsl_CPLUSPLUS +# if defined(_MSVC_LANG ) && !defined(__clang__) +# define gsl_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG ) +# else +# define gsl_CPLUSPLUS __cplusplus +# endif +#endif + +#define gsl_CPP98_OR_GREATER ( gsl_CPLUSPLUS >= 199711L ) +#define gsl_CPP11_OR_GREATER ( gsl_CPLUSPLUS >= 201103L ) +#define gsl_CPP14_OR_GREATER ( gsl_CPLUSPLUS >= 201402L ) +#define gsl_CPP17_OR_GREATER ( gsl_CPLUSPLUS >= 201703L ) +#define gsl_CPP20_OR_GREATER ( gsl_CPLUSPLUS >= 202000L ) + +// C++ language version (represent 98 as 3): + +#define gsl_CPLUSPLUS_V ( gsl_CPLUSPLUS / 100 - (gsl_CPLUSPLUS > 200000 ? 2000 : 1994) ) + +// half-open range [lo..hi): +#define gsl_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) + +// Compiler versions: + +// MSVC++ 6.0 _MSC_VER == 1200 gsl_COMPILER_MSVC_VERSION == 60 (Visual Studio 6.0) +// MSVC++ 7.0 _MSC_VER == 1300 gsl_COMPILER_MSVC_VERSION == 70 (Visual Studio .NET 2002) +// MSVC++ 7.1 _MSC_VER == 1310 gsl_COMPILER_MSVC_VERSION == 71 (Visual Studio .NET 2003) +// MSVC++ 8.0 _MSC_VER == 1400 gsl_COMPILER_MSVC_VERSION == 80 (Visual Studio 2005) +// MSVC++ 9.0 _MSC_VER == 1500 gsl_COMPILER_MSVC_VERSION == 90 (Visual Studio 2008) +// MSVC++ 10.0 _MSC_VER == 1600 gsl_COMPILER_MSVC_VERSION == 100 (Visual Studio 2010) +// MSVC++ 11.0 _MSC_VER == 1700 gsl_COMPILER_MSVC_VERSION == 110 (Visual Studio 2012) +// MSVC++ 12.0 _MSC_VER == 1800 gsl_COMPILER_MSVC_VERSION == 120 (Visual Studio 2013) +// MSVC++ 14.0 _MSC_VER == 1900 gsl_COMPILER_MSVC_VERSION == 140 (Visual Studio 2015) +// MSVC++ 14.1 _MSC_VER >= 1910 gsl_COMPILER_MSVC_VERSION == 141 (Visual Studio 2017) +// MSVC++ 14.2 _MSC_VER >= 1920 gsl_COMPILER_MSVC_VERSION == 142 (Visual Studio 2019) + +#if defined(_MSC_VER ) && !defined(__clang__) +# define gsl_COMPILER_MSVC_VER (_MSC_VER ) +# define gsl_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) ) +# define gsl_COMPILER_MSVC_VERSION_FULL (_MSC_VER - 100 * ( 5 + (_MSC_VER < 1900 ) ) ) +#else +# define gsl_COMPILER_MSVC_VER 0 +# define gsl_COMPILER_MSVC_VERSION 0 +# define gsl_COMPILER_MSVC_VERSION_FULL 0 +#endif + +#define gsl_COMPILER_VERSION( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) ) + +// AppleClang 7.0.0 __apple_build_version__ == 7000172 gsl_COMPILER_APPLECLANG_VERSION == 700 (Xcode 7.0, 7.0.1) (LLVM 3.7.0) +// AppleClang 7.0.0 __apple_build_version__ == 7000176 gsl_COMPILER_APPLECLANG_VERSION == 700 (Xcode 7.1) (LLVM 3.7.0) +// AppleClang 7.0.2 __apple_build_version__ == 7000181 gsl_COMPILER_APPLECLANG_VERSION == 702 (Xcode 7.2, 7.2.1) (LLVM 3.7.0) +// AppleClang 7.3.0 __apple_build_version__ == 7030029 gsl_COMPILER_APPLECLANG_VERSION == 730 (Xcode 7.3) (LLVM 3.8.0) +// AppleClang 7.3.0 __apple_build_version__ == 7030031 gsl_COMPILER_APPLECLANG_VERSION == 730 (Xcode 7.3.1) (LLVM 3.8.0) +// AppleClang 8.0.0 __apple_build_version__ == 8000038 gsl_COMPILER_APPLECLANG_VERSION == 800 (Xcode 8.0) (LLVM 3.9.0) +// AppleClang 8.0.0 __apple_build_version__ == 8000042 gsl_COMPILER_APPLECLANG_VERSION == 800 (Xcode 8.1, 8.2, 8.2.1) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020038 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020041 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3.1) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020042 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3.2, 8.3.3) (LLVM 3.9.0) +// AppleClang 9.0.0 __apple_build_version__ == 9000037 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.0) (LLVM 4.0.0?) +// AppleClang 9.0.0 __apple_build_version__ == 9000038 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.1) (LLVM 4.0.0?) +// AppleClang 9.0.0 __apple_build_version__ == 9000039 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.2) (LLVM 4.0.0?) +// AppleClang 9.1.0 __apple_build_version__ == 9020039 gsl_COMPILER_APPLECLANG_VERSION == 910 (Xcode 9.3, 9.3.1) (LLVM 5.0.2?) +// AppleClang 9.1.0 __apple_build_version__ == 9020039 gsl_COMPILER_APPLECLANG_VERSION == 910 (Xcode 9.4, 9.4.1) (LLVM 5.0.2?) +// AppleClang 10.0.0 __apple_build_version__ == 10001145 gsl_COMPILER_APPLECLANG_VERSION == 1000 (Xcode 10.0, 10.1) (LLVM 6.0.1?) +// AppleClang 10.0.1 __apple_build_version__ == 10010046 gsl_COMPILER_APPLECLANG_VERSION == 1001 (Xcode 10.2, 10.2.1, 10.3) (LLVM 7.0.0?) +// AppleClang 11.0.0 __apple_build_version__ == 11000033 gsl_COMPILER_APPLECLANG_VERSION == 1100 (Xcode 11.1, 11.2, 11.3) (LLVM 8.0.0?) + +#if defined( __apple_build_version__ ) +# define gsl_COMPILER_APPLECLANG_VERSION gsl_COMPILER_VERSION( __clang_major__, __clang_minor__, __clang_patchlevel__ ) +# define gsl_COMPILER_CLANG_VERSION 0 +#elif defined( __clang__ ) +# define gsl_COMPILER_APPLECLANG_VERSION 0 +# define gsl_COMPILER_CLANG_VERSION gsl_COMPILER_VERSION( __clang_major__, __clang_minor__, __clang_patchlevel__ ) +#else +# define gsl_COMPILER_APPLECLANG_VERSION 0 +# define gsl_COMPILER_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# define gsl_COMPILER_GNUC_VERSION gsl_COMPILER_VERSION( __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ ) +#else +# define gsl_COMPILER_GNUC_VERSION 0 +#endif + +// Compiler non-strict aliasing: + +#if defined(__clang__) || defined(__GNUC__) +# define gsl_may_alias __attribute__((__may_alias__)) +#else +# define gsl_may_alias +#endif + +// Presence of gsl, language and library features: + +#define gsl_IN_STD( v ) ( ((v) == 98 ? 3 : (v)) >= gsl_CPLUSPLUS_V ) + +#define gsl_DEPRECATE_TO_LEVEL( level ) ( level <= gsl_CONFIG_DEPRECATE_TO_LEVEL ) +#define gsl_FEATURE_TO_STD( feature ) ( gsl_IN_STD( gsl_FEATURE( feature##_TO_STD ) ) ) +#define gsl_FEATURE( feature ) ( gsl_FEATURE_##feature ) +#define gsl_CONFIG( feature ) ( gsl_CONFIG_##feature ) +#define gsl_HAVE( feature ) ( gsl_HAVE_##feature ) + +// Presence of wide character support: + +#ifdef __DJGPP__ +# define gsl_HAVE_WCHAR 0 +#else +# define gsl_HAVE_WCHAR 1 +#endif + +// Presence of language & library features: + +#if gsl_BETWEEN(gsl_COMPILER_GNUC_VERSION, 1, 500) || gsl_BETWEEN(gsl_COMPILER_CLANG_VERSION, 1, 360) || gsl_COMPILER_APPLECLANG_VERSION +# ifdef __EXCEPTIONS +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // __EXCEPTIONS +#elif gsl_COMPILER_GNUC_VERSION >= 500 || gsl_COMPILER_CLANG_VERSION >= 500 +# ifdef __cpp_exceptions +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // __cpp_exceptions +#elif gsl_COMPILER_MSVC_VERSION +# ifdef _CPPUNWIND +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // _CPPUNWIND +#else +// For all other compilers, assume exceptions are always enabled. +# define gsl_HAVE_EXCEPTIONS 1 +#endif + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) && !gsl_HAVE( EXCEPTIONS ) +# error Cannot use gsl_CONFIG_CONTRACT_VIOLATION_THROWS if exceptions are disabled. +#endif // defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) && !gsl_HAVE( EXCEPTIONS ) + +#ifdef _HAS_CPP0X +# define gsl_HAS_CPP0X _HAS_CPP0X +#else +# define gsl_HAS_CPP0X 0 +#endif + +#define gsl_CPP11_100 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1600) +#define gsl_CPP11_110 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1700) +#define gsl_CPP11_120 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP11_140 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP14_000 (gsl_CPP14_OR_GREATER) +#define gsl_CPP14_120 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP14_140 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP17_000 (gsl_CPP17_OR_GREATER) +#define gsl_CPP17_140 (gsl_CPP17_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP11_140_CPP0X_90 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1500 && gsl_HAS_CPP0X)) +#define gsl_CPP11_140_CPP0X_100 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1600 && gsl_HAS_CPP0X)) + +// Presence of C++11 language features: + +#define gsl_HAVE_AUTO gsl_CPP11_100 +#define gsl_HAVE_NULLPTR gsl_CPP11_100 +#define gsl_HAVE_RVALUE_REFERENCE gsl_CPP11_100 +#define gsl_HAVE_FUNCTION_REF_QUALIFIER ( gsl_CPP14_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 481 ) ) + +#define gsl_HAVE_ENUM_CLASS gsl_CPP11_110 + +#define gsl_HAVE_ALIAS_TEMPLATE gsl_CPP11_120 +#define gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG gsl_CPP11_120 +#define gsl_HAVE_EXPLICIT gsl_CPP11_120 +#define gsl_HAVE_INITIALIZER_LIST gsl_CPP11_120 +#define gsl_HAVE_VARIADIC_TEMPLATE gsl_CPP11_120 +#define gsl_HAVE_IS_DELETE gsl_CPP11_120 + +#define gsl_HAVE_CONSTEXPR_11 gsl_CPP11_140 +#define gsl_HAVE_IS_DEFAULT gsl_CPP11_140 +#define gsl_HAVE_NOEXCEPT gsl_CPP11_140 +#define gsl_HAVE_NORETURN ( gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 480 ) ) + +#define gsl_HAVE_EXPRESSION_SFINAE gsl_CPP11_140 + +#if gsl_CPP11_OR_GREATER +// see above +#endif + +// Presence of C++14 language features: + +#define gsl_HAVE_CONSTEXPR_14 ( gsl_CPP14_000 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 600 ) ) +#define gsl_HAVE_DECLTYPE_AUTO gsl_CPP14_140 +#define gsl_HAVE_DEPRECATED ( gsl_CPP14_140 && ! gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 142 ) ) + +// Presence of C++17 language features: +// MSVC: template parameter deduction guides since Visual Studio 2017 v15.7 + +#define gsl_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE gsl_CPP17_000 +#define gsl_HAVE_DEDUCTION_GUIDES ( gsl_CPP17_000 && ! gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION_FULL, 1, 1414 ) ) +#define gsl_HAVE_NODISCARD gsl_CPP17_000 +#define gsl_HAVE_CONSTEXPR_17 gsl_CPP17_OR_GREATER + +// Presence of C++20 language features: + +#define gsl_HAVE_CONSTEXPR_20 gsl_CPP20_OR_GREATER + +// Presence of C++ library features: + +#define gsl_HAVE_ADDRESSOF gsl_CPP17_000 +#define gsl_HAVE_ARRAY gsl_CPP11_110 +#define gsl_HAVE_TYPE_TRAITS gsl_CPP11_110 +#define gsl_HAVE_TR1_TYPE_TRAITS gsl_CPP11_110 + +#define gsl_HAVE_CONTAINER_DATA_METHOD gsl_CPP11_140_CPP0X_90 +#define gsl_HAVE_STD_DATA gsl_CPP17_000 +#ifdef __cpp_lib_ssize +# define gsl_HAVE_STD_SSIZE 1 +#else +# define gsl_HAVE_STD_SSIZE ( gsl_COMPILER_GNUC_VERSION >= 1000 && __cplusplus > 201703L ) +#endif + +#define gsl_HAVE_SIZED_TYPES gsl_CPP11_140 + +#define gsl_HAVE_MAKE_SHARED gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_SHARED_PTR gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_UNIQUE_PTR gsl_CPP11_140_CPP0X_100 + +#define gsl_HAVE_MAKE_UNIQUE gsl_CPP14_120 + +#define gsl_HAVE_UNCAUGHT_EXCEPTIONS gsl_CPP17_140 + +#define gsl_HAVE_ADD_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_INTEGRAL_CONSTANT gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_REFERENCE gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_CVREF gsl_CPP20_OR_GREATER + +#define gsl_HAVE_TR1_ADD_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_INTEGRAL_CONSTANT gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_REFERENCE gsl_HAVE_TR1_TYPE_TRAITS + +// C++ feature usage: + +#if gsl_HAVE( ADDRESSOF ) +# define gsl_ADDRESSOF(x) std::addressof(x) +#else +# define gsl_ADDRESSOF(x) (&x) +#endif + +#if gsl_HAVE( CONSTEXPR_11 ) +# define gsl_constexpr constexpr +#else +# define gsl_constexpr /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_14 ) +# define gsl_constexpr14 constexpr +#else +# define gsl_constexpr14 /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_17 ) +# define gsl_constexpr17 constexpr +#else +# define gsl_constexpr17 /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_20 ) +# define gsl_constexpr20 constexpr +#else +# define gsl_constexpr20 /*constexpr*/ +#endif + +#if gsl_HAVE( EXPLICIT ) +# define gsl_explicit explicit +#else +# define gsl_explicit /*explicit*/ +#endif + +#if gsl_FEATURE( IMPLICIT_MACRO ) +# define implicit /*implicit*/ +#endif + +#if gsl_HAVE( IS_DELETE ) +# define gsl_is_delete = delete +#else +# define gsl_is_delete +#endif + +#if gsl_HAVE( IS_DELETE ) +# define gsl_is_delete_access public +#else +# define gsl_is_delete_access private +#endif + +#if !gsl_HAVE( NOEXCEPT ) || defined( gsl_TESTING_ ) +# define gsl_noexcept /*noexcept*/ +#else +# define gsl_noexcept noexcept +#endif + +#if gsl_HAVE( NULLPTR ) +# define gsl_nullptr nullptr +#else +# define gsl_nullptr NULL +#endif + +#if gsl_HAVE( NODISCARD ) +# define gsl_NODISCARD [[nodiscard]] +#else +# define gsl_NODISCARD +#endif + +#if gsl_HAVE( NORETURN ) +# define gsl_NORETURN [[noreturn]] +#elif defined(_MSC_VER) +# define gsl_NORETURN __declspec(noreturn) +#else +# define gsl_NORETURN +#endif + +#if gsl_HAVE( DEPRECATED ) && !defined( gsl_TESTING_ ) +# define gsl_DEPRECATED [[deprecated]] +# define gsl_DEPRECATED_MSG( msg ) [[deprecated( msg )]] +#else +# define gsl_DEPRECATED +# define gsl_DEPRECATED_MSG( msg ) +#endif + +#if gsl_HAVE( TYPE_TRAITS ) + +#define gsl_DEFINE_ENUM_BITMASK_OPERATORS_( ENUM ) \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator~( ENUM val ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( ~U( val ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator|( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) | U( rhs ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator&( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) & U( rhs ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator^( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) ^ U( rhs ) ); \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator|=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs | rhs; \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator&=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs & rhs; \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator^=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs ^ rhs; \ + } + +#define gsl_DEFINE_ENUM_RELATIONAL_OPERATORS_( ENUM ) \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator<( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) < U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator>( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) > U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator<=( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) <= U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator>=( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) >= U( rhs ); \ + } + + // + // Defines bitmask operators `|`, `&`, `^`, `~`, `|=`, `&=`, and `^=` for the given enum type. + //ᅟ + //ᅟ enum class Vegetables { + //ᅟ tomato = 0b001, + //ᅟ onion = 0b010, + //ᅟ eggplant = 0b100 + //ᅟ }; + //ᅟ gsl_DEFINE_ENUM_BITMASK_OPERATORS( Vegetables ) + // +#define gsl_DEFINE_ENUM_BITMASK_OPERATORS( ENUM ) gsl_DEFINE_ENUM_BITMASK_OPERATORS_( ENUM ) + + // + // Defines relational operators `<`, `>`, `<=`, `>=` for the given enum type. + //ᅟ + //ᅟ enum class OperatorPrecedence { + //ᅟ additive = 0, + //ᅟ multiplicative = 1, + //ᅟ power = 2 + //ᅟ }; + //ᅟ gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( OperatorPrecedence ) + // +#define gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( ENUM ) gsl_DEFINE_ENUM_RELATIONAL_OPERATORS_( ENUM ) + +#endif // gsl_HAVE( TYPE_TRAITS ) + +#define gsl_DIMENSION_OF( a ) ( sizeof(a) / sizeof(0[a]) ) + + +// Method enabling (C++98, VC120 (VS2013) cannot use __VA_ARGS__) + +#if gsl_HAVE( EXPRESSION_SFINAE ) +# define gsl_DECLTYPE_(T, EXPR) decltype( EXPR ) +#else +# define gsl_DECLTYPE_(T, EXPR) T +#endif + +// NOTE: When using SFINAE in gsl-lite, please note that overloads of function templates must always use SFINAE with non-type default arguments +// as explained in https://en.cppreference.com/w/cpp/types/enable_if#Notes. `gsl_ENABLE_IF_()` implements graceful fallback to default +// type arguments (for compilers that don't support non-type default arguments); please verify that this is appropriate in the given +// situation, and add additional checks if necessary. +// +// Also, please note that `gsl_ENABLE_IF_()` doesn't enforce the constraint at all if no compiler/library support is available (i.e. pre-C++11). + +#if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) +# if !gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) // VS 2013 seems to have trouble with SFINAE for default non-type arguments +# define gsl_ENABLE_IF_(VA) , typename std::enable_if< ( VA ), int >::type = 0 +# else +# define gsl_ENABLE_IF_(VA) , typename = typename std::enable_if< ( VA ), ::gsl::detail::enabler >::type +# endif +#else +# define gsl_ENABLE_IF_(VA) +#endif + + +// Other features: + +#define gsl_HAVE_CONSTRAINED_SPAN_CONTAINER_CTOR \ + ( gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG && gsl_HAVE_CONTAINER_DATA_METHOD ) + +// Note: !defined(__NVCC__) doesn't work with nvcc here: +#define gsl_HAVE_UNCONSTRAINED_SPAN_CONTAINER_CTOR \ + ( gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR && (__NVCC__== 0) ) + +// GSL API (e.g. for CUDA platform): + +// Guidelines for using `gsl_api`: +// +// NVCC imposes the restriction that a function annotated `__host__ __device__` cannot call host-only or device-only functions. +// This makes `gsl_api` inappropriate for generic functions that call unknown code, e.g. the template constructors of `span<>` +// or functions like `finally()` which accept an arbitrary function object. +// It is often preferable to annotate functions only with `gsl_constexpr` or `gsl_constexpr14`. The "extended constexpr" mode +// of NVCC (currently an experimental feature) will implicitly consider constexpr functions `__host__ __device__` functions +// but tolerates calls to host-only or device-only functions. + +#ifndef gsl_api +# ifdef __CUDACC__ +# define gsl_api __host__ __device__ +# else +# define gsl_api /*gsl_api*/ +# endif +#endif + +// Additional includes: + +#if gsl_HAVE( ARRAY ) +# include +#endif + +#if !gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) || !gsl_HAVE( AUTO ) +# include +#endif + +#if gsl_HAVE( INITIALIZER_LIST ) +# include +#endif + +#if gsl_HAVE( TYPE_TRAITS ) +# include // for enable_if<>, + // add_const<>, add_pointer<>, common_type<>, make_signed<>, remove_cv<>, remove_const<>, remove_volatile<>, remove_reference<>, remove_cvref<>, remove_pointer<>, underlying_type<>, + // is_assignable<>, is_constructible<>, is_const<>, is_convertible<>, is_integral<>, is_pointer<>, is_signed<>, + // integral_constant<>, declval() +#elif gsl_HAVE( TR1_TYPE_TRAITS ) +# include // for add_const<>, remove_cv<>, remove_const<>, remove_volatile<>, remove_reference<>, integral_constant<> +#endif + +// MSVC warning suppression macros: + +#if gsl_COMPILER_MSVC_VERSION >= 140 && !defined(__NVCC__) +# define gsl_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] +# define gsl_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) ) +# define gsl_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes)) +# define gsl_RESTORE_MSVC_WARNINGS() __pragma(warning(pop )) +#else +// TODO: define for Clang +# define gsl_SUPPRESS_MSGSL_WARNING(expr) +# define gsl_SUPPRESS_MSVC_WARNING(code, descr) +# define gsl_DISABLE_MSVC_WARNINGS(codes) +# define gsl_RESTORE_MSVC_WARNINGS() +#endif + +// Suppress the following MSVC GSL warnings: +// - C26432: gsl::c.21 : if you define or delete any default operation in the type '...', define or delete them all +// - C26410: gsl::r.32 : the parameter 'ptr' is a reference to const unique pointer, use const T* or const T& instead +// - C26415: gsl::r.30 : smart pointer parameter 'ptr' is used only to access contained pointer. Use T* or T& instead +// - C26418: gsl::r.36 : shared pointer parameter 'ptr' is not copied or moved. Use T* or T& instead +// - C26472: gsl::t.1 : don't use a static_cast for arithmetic conversions; +// use brace initialization, gsl::narrow_cast or gsl::narrow +// - C26439: gsl::f.6 : special function 'function' can be declared 'noexcept' +// - C26440: gsl::f.6 : function 'function' can be declared 'noexcept' +// - C26455: gsl::f.6 : default constructor may not throw. Declare it 'noexcept' +// - C26473: gsl::t.1 : don't cast between pointer types where the source type and the target type are the same +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead +// - C26482: gsl::b.2 : only index into arrays using constant expressions +// - C26446: gdl::b.4 : prefer to use gsl::at() instead of unchecked subscript operator +// - C26490: gsl::t.1 : don't use reinterpret_cast +// - C26487: gsl::l.4 : don't return a pointer '('s result)' that may be invalid + +gsl_DISABLE_MSVC_WARNINGS( 26432 26410 26415 26418 26472 26439 26440 26455 26473 26481 26482 26446 26490 26487 ) + +namespace gsl { + +// forward declare span<>: + +template< class T > +class span; + +// C++11 emulation: + +namespace std11 { + +#if gsl_HAVE( ADD_CONST ) + +using std::add_const; + +#elif gsl_HAVE( TR1_ADD_CONST ) + +using std::tr1::add_const; + +#else + +template< class T > struct add_const { typedef const T type; }; + +#endif // gsl_HAVE( ADD_CONST ) + +#if gsl_HAVE( REMOVE_CONST ) + +using std::remove_cv; +using std::remove_const; +using std::remove_volatile; + +#elif gsl_HAVE( TR1_REMOVE_CONST ) + +using std::tr1::remove_cv; +using std::tr1::remove_const; +using std::tr1::remove_volatile; + +#else + +template< class T > struct remove_const { typedef T type; }; +template< class T > struct remove_const { typedef T type; }; + +template< class T > struct remove_volatile { typedef T type; }; +template< class T > struct remove_volatile { typedef T type; }; + +template< class T > +struct remove_cv +{ + typedef typename remove_volatile::type>::type type; +}; + +#endif // gsl_HAVE( REMOVE_CONST ) + +#if gsl_HAVE( REMOVE_REFERENCE ) + +using std::remove_reference; + +#elif gsl_HAVE( TR1_REMOVE_REFERENCE ) + +using std::tr1::remove_reference; + +#else + +template< class T > struct remove_reference { typedef T type; }; +template< class T > struct remove_reference { typedef T type; }; +# if gsl_HAVE( RVALUE_REFERENCE ) +template< class T > struct remove_reference { typedef T type; }; +# endif + +#endif // gsl_HAVE( REMOVE_REFERENCE ) + + +#if gsl_HAVE( INTEGRAL_CONSTANT ) + +using std::integral_constant; +using std::true_type; +using std::false_type; + +#elif gsl_HAVE( TR1_INTEGRAL_CONSTANT ) + +using std::tr1::integral_constant; +using std::tr1::true_type; +using std::tr1::false_type; + +#else + +template< class T, T v > struct integral_constant { enum { value = v }; }; +typedef integral_constant< bool, true > true_type; +typedef integral_constant< bool, false > false_type; + +#endif + +#if gsl_HAVE( TYPE_TRAITS ) + +using std::underlying_type; + +#elif gsl_HAVE( TR1_TYPE_TRAITS ) + +using std::tr1::underlying_type; + +#else + +// We could try to define `underlying_type<>` for pre-C++11 here, but let's not until someone actually needs it. + +#endif + +} // namespace std11 + +// C++14 emulation: + +namespace std14 { + +#if gsl_HAVE( UNIQUE_PTR ) +# if gsl_HAVE( MAKE_UNIQUE ) + +using std::make_unique; + +# elif gsl_HAVE( VARIADIC_TEMPLATE ) + +template< class T, class... Args > +std::unique_ptr make_unique( Args &&... args ) +{ + return std::unique_ptr( new T( std::forward( args )... ) ); +} + +# endif // gsl_HAVE( MAKE_UNIQUE ), gsl_HAVE( VARIADIC_TEMPLATE ) +#endif // gsl_HAVE( UNIQUE_PTR ) + +} // namespace std14 + +namespace detail { + +#if gsl_HAVE( VARIADIC_TEMPLATE ) + +template < bool V0, class T0, class... Ts > struct conjunction_ { using type = T0; }; +template < class T0, class T1, class... Ts > struct conjunction_ : conjunction_ { }; +template < bool V0, class T0, class... Ts > struct disjunction_ { using type = T0; }; +template < class T0, class T1, class... Ts > struct disjunction_ : disjunction_ { }; + +#endif + +} // namespace detail + +// C++17 emulation: + +namespace std17 { + +template< bool v > struct bool_constant : std11::integral_constant{}; + +#if gsl_CPP11_120 + +template < class... Ts > struct conjunction; +template < > struct conjunction< > : std11::true_type { }; +template < class T0, class... Ts > struct conjunction : detail::conjunction_::type { }; +template < class... Ts > struct disjunction; +template < > struct disjunction< > : std11::false_type { }; +template < class T0, class... Ts > struct disjunction : detail::disjunction_::type { }; +template < class T > struct negation : std11::integral_constant { }; + +# if gsl_CPP14_OR_GREATER + +template < class... Ts > constexpr bool conjunction_v = conjunction::value; +template < class... Ts > constexpr bool disjunction_v = disjunction::value; +template < class T > constexpr bool negation_v = negation::value; + +# endif // gsl_CPP14_OR_GREATER + +template< class... Ts > +struct make_void { typedef void type; }; + +template< class... Ts > +using void_t = typename make_void< Ts... >::type; + +#endif // gsl_CPP11_120 + +#if gsl_HAVE( STD_DATA ) + +using std::data; +using std::size; + +#elif gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + +template< class T, size_t N > +gsl_api inline gsl_constexpr auto size( T const(&)[N] ) gsl_noexcept -> size_t +{ + return N; +} + +template< class C > +inline gsl_constexpr auto size( C const & cont ) -> decltype( cont.size() ) +{ + return cont.size(); +} + +template< class T, size_t N > +gsl_api inline gsl_constexpr auto data( T(&arr)[N] ) gsl_noexcept -> T* +{ + return &arr[0]; +} + +template< class C > +inline gsl_constexpr auto data( C & cont ) -> decltype( cont.data() ) +{ + return cont.data(); +} + +template< class C > +inline gsl_constexpr auto data( C const & cont ) -> decltype( cont.data() ) +{ + return cont.data(); +} + +template< class E > +inline gsl_constexpr auto data( std::initializer_list il ) gsl_noexcept -> E const * +{ + return il.begin(); +} + +#endif // span_HAVE( DATA ) + +} // namespace std17 + +// C++20 emulation: + +namespace std20 { + +#if gsl_CPP11_100 + +struct identity +{ + template < class T > + gsl_constexpr T && operator ()( T && arg ) const gsl_noexcept + { + return std::forward( arg ); + } +}; + +#endif // gsl_CPP11_100 + +template< class T > +struct type_identity +{ + typedef T type; +}; +#if gsl_HAVE( ALIAS_TEMPLATE ) +template< class T > +using type_identity_t = typename type_identity::type; +#endif // gsl_HAVE( ALIAS_TEMPLATE ) + +#if gsl_HAVE( STD_SSIZE ) + +using std::ssize; + +#elif gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + +template < class C > +gsl_constexpr auto ssize( C const & c ) + -> typename std::common_type::type>::type +{ + using R = typename std::common_type::type>::type; + return static_cast( c.size() ); +} + +template +gsl_constexpr auto ssize( T const(&)[N] ) gsl_noexcept -> std::ptrdiff_t +{ + return std::ptrdiff_t( N ); +} + +#endif // gsl_HAVE( STD_SSIZE ) + +#if gsl_HAVE( REMOVE_CVREF ) + +using std::remove_cvref; + +#else + +template< class T > struct remove_cvref { typedef typename std11::remove_cv< typename std11::remove_reference< T >::type >::type type; }; + +#endif // gsl_HAVE( REMOVE_CVREF ) + +} // namespace std20 + +namespace detail { + +/// for nsel_REQUIRES_T + +/*enum*/ class enabler{}; + +#if gsl_HAVE( TYPE_TRAITS ) + +template< class Q > +struct is_span_oracle : std::false_type{}; + +template< class T> +struct is_span_oracle< span > : std::true_type{}; + +template< class Q > +struct is_span : is_span_oracle< typename std::remove_cv::type >{}; + +template< class Q > +struct is_std_array_oracle : std::false_type{}; + +#if gsl_HAVE( ARRAY ) + +template< class T, std::size_t Extent > +struct is_std_array_oracle< std::array > : std::true_type{}; + +#endif + +template< class Q > +struct is_std_array : is_std_array_oracle< typename std::remove_cv::type >{}; + +template< class Q > +struct is_array : std::false_type{}; + +template< class T > +struct is_array : std::true_type{}; + +template< class T, std::size_t N > +struct is_array : std::true_type{}; + +# if gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) + +template< class, class = void > +struct has_size_and_data : std::false_type{}; + +template< class C > +struct has_size_and_data +< + C, std17::void_t< + decltype( std17::size(std::declval()) ), + decltype( std17::data(std::declval()) ) > +> : std::true_type{}; + +template< class, class, class = void > +struct is_compatible_element : std::false_type {}; + +template< class C, class E > +struct is_compatible_element +< + C, E, std17::void_t< + decltype( std17::data(std::declval()) ), + typename std::remove_pointer() ) )>::type(*)[] > +> : std::is_convertible< typename std::remove_pointer() ) )>::type(*)[], E(*)[] >{}; + +template< class C > +struct is_container : std17::bool_constant +< + ! is_span< C >::value + && ! is_array< C >::value + && ! is_std_array< C >::value + && has_size_and_data< C >::value +>{}; + +template< class C, class E > +struct is_compatible_container : std17::bool_constant +< + is_container::value + && is_compatible_element::value +>{}; + +# else // ^^^ gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) ^^^ / vvv ! gsl_CPP11_140 || gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) vvv + +template< + class C, class E + , typename = typename std::enable_if< + ! is_span< C >::value + && ! is_array< C >::value + && ! is_std_array< C >::value + && ( std::is_convertible< typename std::remove_pointer() ) )>::type(*)[], E(*)[] >::value) + // && has_size_and_data< C >::value + , enabler>::type + , class = decltype( std17::size(std::declval()) ) + , class = decltype( std17::data(std::declval()) ) +> +# if gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) +// VS2013 has insufficient support for expression SFINAE; we cannot make `is_compatible_container<>` a proper type trait here +struct is_compatible_container : std::true_type { }; +# else +struct is_compatible_container_r { is_compatible_container_r(int); }; +template< class C, class E > +std::true_type is_compatible_container_f( is_compatible_container_r ); +template< class C, class E > +std::false_type is_compatible_container_f( ... ); + +template< class C, class E > +struct is_compatible_container : decltype( is_compatible_container_f< C, E >( 0 ) ) { }; +# endif // gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) + +# endif // gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) + +#endif // gsl_HAVE( TYPE_TRAITS ) + +} // namespace detail + +// +// GSL.util: utilities +// + +// Integer type for indices (e.g. in a loop). +typedef gsl_CONFIG_INDEX_TYPE index; + +// +// GSL.owner: ownership pointers +// +#if gsl_HAVE( SHARED_PTR ) + using std::unique_ptr; + using std::shared_ptr; + using std::make_shared; +# if gsl_HAVE( MAKE_UNIQUE ) || gsl_HAVE( VARIADIC_TEMPLATE ) + using std14::make_unique; +# endif +#endif + +#if gsl_HAVE( ALIAS_TEMPLATE ) + template< class T +#if gsl_HAVE( TYPE_TRAITS ) + , typename = typename std::enable_if< std::is_pointer::value >::type +#endif + > + using owner = T; +#elif gsl_CONFIG_DEFAULTS_VERSION == 0 + // TODO vNext: remove + template< class T > struct owner { typedef T type; }; +#endif + +#define gsl_HAVE_OWNER_TEMPLATE gsl_HAVE_ALIAS_TEMPLATE + +// TODO vNext: remove +#if gsl_FEATURE( OWNER_MACRO ) +# if gsl_HAVE( OWNER_TEMPLATE ) +# define Owner(t) ::gsl::owner +# else +# define Owner(t) ::gsl::owner::type +# endif +#endif + +// +// GSL.assert: assertions +// + +#if gsl_HAVE( TYPE_TRAITS ) +# define gsl_ELIDE_CONTRACT_( x ) static_assert(::std::is_constructible::value, "argument of contract check must be convertible to bool") +#else +# define gsl_ELIDE_CONTRACT_( x ) +#endif + +#if defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) +# define gsl_ASSUME( x ) gsl_ELIDE_CONTRACT_( x ) /* there is no assume intrinsic in CUDA device code */ +#elif gsl_COMPILER_MSVC_VERSION +# define gsl_ASSUME( x ) __assume( x ) +#elif gsl_COMPILER_GNUC_VERSION +# define gsl_ASSUME( x ) (( x ) ? static_cast(0) : __builtin_unreachable()) +#elif defined(__has_builtin) +# if __has_builtin(__builtin_unreachable) +# define gsl_ASSUME( x ) (( x ) ? static_cast(0) : __builtin_unreachable()) +# endif +#else +# define gsl_ASSUME( x ) gsl_ELIDE_CONTRACT_( x ) /* unknown compiler; cannot rely on assume intrinsic */ +#endif + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::fail_fast_assert_handler( #x, "GSL: " str, __FILE__, __LINE__ ) ) +#elif defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) +# define gsl_CONTRACT_CHECK_( str, x ) assert( ( x ) && str ) +#elif defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::detail::fail_fast_throw( "GSL: " str " at " __FILE__ ":" gsl_STRINGIFY(__LINE__) ) ) +#else // defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) [default] +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::detail::fail_fast_terminate() ) +#endif + +#if defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) || defined( gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF ) +# if defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) +# define gsl_Expects( x ) gsl_ASSUME( x ) +# else // defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) [default] +# define gsl_Expects( x ) gsl_ELIDE_CONTRACT_( x ) +# endif +#else +# define gsl_Expects( x ) gsl_CONTRACT_CHECK_( "Precondition failure", x ) +#endif +#define Expects( x ) gsl_Expects( x ) + +#if !defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) || defined( gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF ) +# define gsl_ExpectsAudit( x ) gsl_ELIDE_CONTRACT_( x ) +#else +# define gsl_ExpectsAudit( x ) gsl_CONTRACT_CHECK_( "Precondition failure (audit)", x ) +#endif + +#if defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) || defined( gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF ) +# if defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) +# define gsl_Ensures( x ) gsl_ASSUME( x ) +# else // defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) [default] +# define gsl_Ensures( x ) gsl_ELIDE_CONTRACT_( x ) +# endif +#else +# define gsl_Ensures( x ) gsl_CONTRACT_CHECK_( "Postcondition failure", x ) +#endif +#define Ensures( x ) gsl_Ensures( x ) + +#if !defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) || defined( gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF ) +# define gsl_EnsuresAudit( x ) gsl_ELIDE_CONTRACT_( x ) +#else +# define gsl_EnsuresAudit( x ) gsl_CONTRACT_CHECK_( "Postcondition failure (audit)", x ) +#endif + +#define gsl_STRINGIFY( x ) gsl_STRINGIFY_( x ) +#define gsl_STRINGIFY_( x ) #x + +struct fail_fast : public std::logic_error +{ + explicit fail_fast( char const * message ) + : std::logic_error( message ) {} +}; + +namespace detail { + + +#if gsl_HAVE( EXCEPTIONS ) +gsl_NORETURN inline void fail_fast_throw( char const * message ) +{ + throw fail_fast( message ); +} +#endif // gsl_HAVE( EXCEPTIONS ) +gsl_NORETURN inline void fail_fast_terminate() gsl_noexcept +{ + std::terminate(); +} + +} // namespace detail + +// Should be defined by user +gsl_api void fail_fast_assert_handler( char const * const expression, char const * const message, char const * const file, int line ); + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + +# if gsl_HAVE( EXCEPTIONS ) +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_constexpr14 inline +void fail_fast_assert( bool cond, char const * const message ) +{ + if ( !cond ) + throw fail_fast( message ); +} +# endif // gsl_HAVE( EXCEPTIONS ) + +#elif defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) + +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_api gsl_constexpr14 inline +void fail_fast_assert( bool cond, char const * const expression, char const * const message, char const * const file, int line ) +{ + if ( !cond ) + ::gsl::fail_fast_assert_handler( expression, message, file, line ); +} + +#else // defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) [default] + +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_constexpr14 inline +void fail_fast_assert( bool cond ) gsl_noexcept +{ + if ( !cond ) + std::terminate(); +} + +#endif + + +// +// GSL.util: utilities +// + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +// Add uncaught_exceptions for pre-2017 MSVC, GCC and Clang +// Return unsigned char to save stack space, uncaught_exceptions can only increase by 1 in a scope + +namespace detail { + +gsl_api inline unsigned char to_uchar( unsigned x ) gsl_noexcept +{ + return static_cast( x ); +} + +} // namespace detail + +namespace std11 { + +#if gsl_HAVE( UNCAUGHT_EXCEPTIONS ) + +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( std::uncaught_exceptions() ); +} + +#elif gsl_COMPILER_MSVC_VERSION + +extern "C" char * __cdecl _getptd(); +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( *reinterpret_cast(_getptd() + (sizeof(void*) == 8 ? 0x100 : 0x90) ) ); +} + +#elif gsl_COMPILER_CLANG_VERSION || gsl_COMPILER_GNUC_VERSION || gsl_COMPILER_APPLECLANG_VERSION + +extern "C" char * __cxa_get_globals(); +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( *reinterpret_cast(__cxa_get_globals() + sizeof(void*) ) ); +} +#endif +} // namespace std11 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + +template< class F > +class final_action +{ +public: + explicit final_action( F action ) gsl_noexcept + : action_( std::move( action ) ) + , invoke_( true ) + {} + + final_action( final_action && other ) gsl_noexcept + : action_( std::move( other.action_ ) ) + , invoke_( other.invoke_ ) + { + other.invoke_ = false; + } + + gsl_SUPPRESS_MSGSL_WARNING(f.6) + virtual ~final_action() gsl_noexcept + { + if ( invoke_ ) + action_(); + } + +gsl_is_delete_access: + final_action( final_action const & ) gsl_is_delete; + final_action & operator=( final_action const & ) gsl_is_delete; + final_action & operator=( final_action && ) gsl_is_delete; + +protected: + void dismiss() gsl_noexcept + { + invoke_ = false; + } + +private: + F action_; + bool invoke_; +}; + +template< class F > +inline final_action finally( F const & action ) gsl_noexcept +{ + return final_action( action ); +} + +template< class F > +inline final_action finally( F && action ) gsl_noexcept +{ + return final_action( std::forward( action ) ); +} + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +template< class F > +class final_action_return : public final_action +{ +public: + explicit final_action_return( F && action ) gsl_noexcept + : final_action( std::move( action ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + final_action_return( final_action_return && other ) gsl_noexcept + : final_action( std::move( other ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_return() override + { + if ( std11::uncaught_exceptions() != exception_count ) + this->dismiss(); + } + +gsl_is_delete_access: + final_action_return( final_action_return const & ) gsl_is_delete; + final_action_return & operator=( final_action_return const & ) gsl_is_delete; + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_return on_return( F const & action ) gsl_noexcept +{ + return final_action_return( action ); +} + +template< class F > +inline final_action_return on_return( F && action ) gsl_noexcept +{ + return final_action_return( std::forward( action ) ); +} + +template< class F > +class final_action_error : public final_action +{ +public: + explicit final_action_error( F && action ) gsl_noexcept + : final_action( std::move( action ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + final_action_error( final_action_error && other ) gsl_noexcept + : final_action( std::move( other ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_error() override + { + if ( std11::uncaught_exceptions() == exception_count ) + this->dismiss(); + } + +gsl_is_delete_access: + final_action_error( final_action_error const & ) gsl_is_delete; + final_action_error & operator=( final_action_error const & ) gsl_is_delete; + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_error on_error( F const & action ) gsl_noexcept +{ + return final_action_error( action ); +} + +template< class F > +inline final_action_error on_error( F && action ) gsl_noexcept +{ + return final_action_error( std::forward( action ) ); +} + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#else // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + +class final_action +{ +public: + typedef void (*Action)(); + + final_action( Action action ) + : action_( action ) + , invoke_( true ) + {} + + final_action( final_action const & other ) + : action_( other.action_ ) + , invoke_( other.invoke_ ) + { + other.invoke_ = false; + } + + virtual ~final_action() + { + if ( invoke_ ) + action_(); + } + +protected: + void dismiss() + { + invoke_ = false; + } + +private: + final_action & operator=( final_action const & ); + +private: + Action action_; + mutable bool invoke_; +}; + +template< class F > +inline final_action finally( F const & f ) +{ + return final_action(( f )); +} + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +class final_action_return : public final_action +{ +public: + explicit final_action_return( Action action ) + : final_action( action ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_return() + { + if ( std11::uncaught_exceptions() != exception_count ) + this->dismiss(); + } + +private: + final_action_return & operator=( final_action_return const & ); + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_return on_return( F const & action ) +{ + return final_action_return( action ); +} + +class final_action_error : public final_action +{ +public: + explicit final_action_error( Action action ) + : final_action( action ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_error() + { + if ( std11::uncaught_exceptions() == exception_count ) + this->dismiss(); + } + +private: + final_action_error & operator=( final_action_error const & ); + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_error on_error( F const & action ) +{ + return final_action_error( action ); +} + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION == 110 + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +template< class T, class U > +gsl_api inline gsl_constexpr T narrow_cast( U && u ) gsl_noexcept +{ + return static_cast( std::forward( u ) ); +} + +#else + +template< class T, class U > +gsl_api inline T narrow_cast( U u ) gsl_noexcept +{ + return static_cast( u ); +} + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +struct narrowing_error : public std::exception {}; + +#if gsl_HAVE( TYPE_TRAITS ) + +namespace detail { + + template< class T, class U > + struct is_same_signedness : public std::integral_constant::value == std::is_signed::value> + {}; + +# if defined( __NVCC__ ) + // We do this to circumvent NVCC warnings about pointless unsigned comparisons with 0. + template< class T > + gsl_constexpr gsl_api bool is_negative( T value, std::true_type /*isSigned*/ ) gsl_noexcept + { + return value < T(); + } + template< class T > + gsl_constexpr gsl_api bool is_negative( T /*value*/, std::false_type /*isUnsigned*/ ) gsl_noexcept + { + return false; + } + template< class T, class U > + gsl_constexpr gsl_api bool have_same_sign( T t, U u, std::true_type /*isSameSignedness*/ ) gsl_noexcept + { + return true; + } + template< class T, class U > + gsl_constexpr gsl_api bool have_same_sign( T t, U u, std::false_type /*isSameSignedness*/ ) gsl_noexcept + { + return detail::is_negative( t, std::is_signed() ) == detail::is_negative( u, std::is_signed() ); + } +# endif // defined( __NVCC__ ) + +} // namespace detail + +#endif + +#if gsl_HAVE( EXCEPTIONS ) || !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION +template< class T, class U > +# if !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION && !defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +gsl_api +# endif // !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION && !defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +inline T narrow( U u ) +{ + T t = static_cast( u ); + + if ( static_cast( t ) != u ) + { +# if gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION || defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + throw narrowing_error(); +# else + std::terminate(); +# endif + } + +# if gsl_HAVE( TYPE_TRAITS ) +# if defined( __NVCC__ ) + if ( ! detail::have_same_sign( t, u, detail::is_same_signedness() ) ) +# else + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + if ( ! detail::is_same_signedness::value && ( t < T() ) != ( u < U() ) ) +# endif +# else + // Don't assume T() works: + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + if ( ( t < 0 ) != ( u < 0 ) ) +# endif + { +# if gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION || defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + throw narrowing_error(); +# else + std::terminate(); +# endif + } + + return t; +} +#endif // gsl_HAVE( EXCEPTIONS ) || !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION + +template< class T, class U > +gsl_api inline T narrow_failfast( U u ) +{ + T t = static_cast( u ); + + gsl_Expects( static_cast( t ) == u ); + +#if gsl_HAVE( TYPE_TRAITS ) +# if defined( __NVCC__ ) + gsl_Expects( ::gsl::detail::have_same_sign( t, u, ::gsl::detail::is_same_signedness() ) ); +# else + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + gsl_Expects( ( ::gsl::detail::is_same_signedness::value || ( t < T() ) == ( u < U() ) ) ); +# endif +#else + // Don't assume T() works: + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + gsl_Expects( ( t < 0 ) == ( u < 0 ) ); +#endif + + return t; +} + + +// +// at() - Bounds-checked way of accessing static arrays, std::array, std::vector. +// + +template< class T, size_t N > +gsl_api inline gsl_constexpr14 T & at( T(&arr)[N], size_t pos ) +{ + gsl_Expects( pos < N ); + return arr[pos]; +} + +template< class Container > +inline gsl_constexpr14 typename Container::value_type & at( Container & cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return cont[pos]; +} + +template< class Container > +inline gsl_constexpr14 typename Container::value_type const & at( Container const & cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return cont[pos]; +} + +#if gsl_HAVE( INITIALIZER_LIST ) + +template< class T > +inline const gsl_constexpr14 T at( std::initializer_list cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return *( cont.begin() + pos ); +} +#endif + +template< class T > +gsl_api inline gsl_constexpr14 T & at( span s, size_t pos ) +{ + return s[ pos ]; +} + +// +// GSL.views: views +// + +// +// not_null<> - Wrap any indirection and enforce non-null. +// + +template< class T > +class not_null; + +namespace detail { + +// helper class to figure out the pointed-to type of a pointer +#if gsl_CPP11_OR_GREATER +template< class T, class E = void > +struct element_type_helper +{ + // For types without a member element_type (this will handle raw pointers) + typedef typename std::remove_reference< decltype( *std::declval() ) >::type type; +}; + +template< class T > +struct element_type_helper< T, std17::void_t< typename T::element_type > > +{ + // For types with a member element_type + typedef typename T::element_type type; +}; +#else +// Pre-C++11, we cannot have decltype, so we cannot handle types without a member element_type +template< class T, class E = void > +struct element_type_helper +{ + typedef typename T::element_type type; +}; + +template< class T > +struct element_type_helper< T* > +{ + typedef T type; +}; +#endif + +template< class T > +struct is_not_null_oracle : std11::false_type { }; +template< class T > +struct is_not_null_oracle< not_null > : std11::true_type { }; + +template< class T, bool IsCopyable = true > +struct not_null_data; +#if gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) +template< class T > +struct not_null_data< T, false > +{ + T ptr_; + + gsl_constexpr14 not_null_data( T && _ptr ) gsl_noexcept + : ptr_( std::move( _ptr ) ) + { + } + + gsl_constexpr14 not_null_data( not_null_data && other ) gsl_noexcept + : ptr_( std::move( other.ptr_ ) ) + { + } + gsl_constexpr14 not_null_data & operator=( not_null_data && other ) gsl_noexcept + { + ptr_ = std::move( other.ptr_ ); + return *this; + } + +gsl_is_delete_access: + not_null_data( not_null_data const & other ) gsl_is_delete; + not_null_data & operator=( not_null_data const & other ) gsl_is_delete; +}; +#endif // gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) +template< class T > +struct not_null_data< T, true > +{ + T ptr_; + + gsl_constexpr14 not_null_data( T const & _ptr ) gsl_noexcept + : ptr_( _ptr ) + { + } + +#if gsl_HAVE( RVALUE_REFERENCE ) + gsl_constexpr14 not_null_data( T && _ptr ) gsl_noexcept + : ptr_( std::move( _ptr ) ) + { + } + + gsl_constexpr14 not_null_data( not_null_data && other ) gsl_noexcept + : ptr_( std::move( other.ptr_ ) ) + { + } + gsl_constexpr14 not_null_data & operator=( not_null_data && other ) gsl_noexcept + { + ptr_ = std::move( other.ptr_ ); + return *this; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) + + gsl_constexpr14 not_null_data( not_null_data const & other ) + : ptr_( other.ptr_ ) + { + gsl_Expects( ptr_ != gsl_nullptr ); + } + gsl_constexpr14 not_null_data & operator=( not_null_data const & other ) + { + gsl_Expects( other.ptr_ != gsl_nullptr ); + ptr_ = other.ptr_; + return *this; + } +}; + +template< class T > +struct is_copyable +#if gsl_HAVE( TYPE_TRAITS ) +: std11::integral_constant< bool, std::is_copy_constructible::value && std::is_copy_assignable::value > +#else +: std11::true_type +#endif +{ +}; +#if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( UNIQUE_PTR ) && gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) +// Type traits are buggy in VC++ 2013, so we explicitly declare `unique_ptr<>` non-copyable. +template< class T, class Deleter > +struct is_copyable< std::unique_ptr< T, Deleter > > : std11::false_type +{ +}; +#endif + +} // namespace detail + +template< class T > +class not_null +{ +private: + detail::not_null_data< T, detail::is_copyable< T >::value > data_; + + // need to access `not_null::data_` + template< class U > + friend class not_null; + +public: + typedef typename detail::element_type_helper::type element_type; + +#if gsl_HAVE( TYPE_TRAITS ) + static_assert( std::is_assignable::value, "T cannot be assigned nullptr." ); +#endif + +#if gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) +# if gsl_HAVE( RVALUE_REFERENCE ) + template< class U + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value ), int >::type = 0 +# endif + > + gsl_constexpr14 explicit not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 explicit not_null( U const& other ) + : data_( T( other ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) +#else // a.k.a. !gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) +# if gsl_HAVE( RVALUE_REFERENCE ) + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 explicit not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !( gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // If type_traits are not available, then we can't distinguish `is_convertible<>` and `is_constructible<>`, so we unconditionally permit implicit construction. + template< class U > + gsl_constexpr14 not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 not_null( U const& other ) + : data_( T( other ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) +#endif // gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) + +# if gsl_HAVE( RVALUE_REFERENCE ) + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 explicit not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !( gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // If type_traits are not available, then we can't distinguish `is_convertible<>` and `is_constructible<>`, so we unconditionally permit implicit construction. + template< class U > + gsl_constexpr14 not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + template< class U > + gsl_constexpr14 not_null& operator=( not_null other ) + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_.ptr_ = std::move( other.data_.ptr_ ); + return *this; + } +# endif // gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 not_null( not_null const& other ) + : data_( T( other.data_.ptr_ ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + template< class U > + gsl_constexpr14 not_null& operator=( not_null const & other ) + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_.ptr_ = other.data_.ptr_; + return *this; + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) + +#if gsl_CONFIG( TRANSPARENT_NOT_NULL ) + gsl_constexpr14 element_type * + get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_.get(); + } +#else +# if gsl_CONFIG( NOT_NULL_GET_BY_CONST_REF ) + gsl_constexpr14 T const & get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# else + gsl_constexpr14 T get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# endif +#endif + + // We want an implicit conversion operator that can be used to convert from both lvalues (by + // const reference or by copy) and rvalues (by move). So it seems like we could define + // + // template< class U > + // operator U const &() const & { ... } + // template< class U > + // operator U &&() && { ... } + // + // However, having two conversion operators with different return types renders the assignment + // operator of the result type ambiguous: + // + // not_null> p( ... ); + // std::unique_ptr q; + // q = std::move( p ); // ambiguous + // + // To avoid this ambiguity, we have both overloads of the conversion operator return `U` + // rather than `U const &` or `U &&`. This implies that converting an lvalue always induces + // a copy, which can cause unnecessary copies or even fail to compile in some situations: + // + // not_null> sp( ... ); + // std::shared_ptr const & rs = sp; // unnecessary copy + // std::unique_ptr const & ru = p; // error: cannot copy `unique_ptr` + // + // However, these situations are rather unusual, and the following, more frequent situations + // remain unimpaired: + // + // std::shared_ptr vs = sp; // no extra copy + // std::unique_ptr vu = std::move( p ); + +#if gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) + // explicit conversion operator + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 explicit + operator U() const +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + & +# endif + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return U( data_.ptr_ ); + } +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 explicit + operator U() && + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return U( std::move( data_.ptr_ ) ); + } +# endif + + // implicit conversion operator + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 + operator U() const +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + & +# endif + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 + operator U() && + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return std::move( data_.ptr_ ); + } +# endif +#else // a.k.a. #if !( gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) ) + template< class U > + gsl_constexpr14 + operator U() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) + + gsl_constexpr14 T const & + operator->() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } + + gsl_constexpr14 element_type & + operator*() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return *data_.ptr_; + } + +#if gsl_HAVE( RVALUE_REFERENCE ) + // Visual C++ 2013 doesn't generate default move constructors, so we declare them explicitly. + gsl_constexpr14 not_null( not_null && other ) gsl_noexcept + : data_( std::move( other.data_ ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + gsl_constexpr14 not_null & operator=( not_null && other ) gsl_noexcept + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_ = std::move( other.data_ ); + return *this; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 not_null( not_null const & other ) = default; + gsl_constexpr14 not_null & operator=( not_null const & other ) = default; +#endif + +gsl_is_delete_access: + not_null() gsl_is_delete; + // prevent compilation when initialized with a nullptr or literal 0: +#if gsl_HAVE( NULLPTR ) + not_null( std::nullptr_t ) gsl_is_delete; + not_null & operator=( std::nullptr_t ) gsl_is_delete; +#else + not_null( int ) gsl_is_delete; + not_null & operator=( int ) gsl_is_delete; +#endif + + // unwanted operators...pointers only point to single objects! + not_null & operator++() gsl_is_delete; + not_null & operator--() gsl_is_delete; + not_null operator++( int ) gsl_is_delete; + not_null operator--( int ) gsl_is_delete; + not_null & operator+ ( size_t ) gsl_is_delete; + not_null & operator+=( size_t ) gsl_is_delete; + not_null & operator- ( size_t ) gsl_is_delete; + not_null & operator-=( size_t ) gsl_is_delete; + not_null & operator+=( std::ptrdiff_t ) gsl_is_delete; + not_null & operator-=( std::ptrdiff_t ) gsl_is_delete; + void operator[]( std::ptrdiff_t ) const gsl_is_delete; +}; +#if gsl_HAVE( DEDUCTION_GUIDES ) +template< class U > +not_null( U ) -> not_null; +template< class U > +not_null( not_null ) -> not_null; +#endif + +#if gsl_HAVE( NULLPTR ) +void make_not_null( std::nullptr_t ) gsl_is_delete; +#endif // gsl_HAVE( NULLPTR ) +#if gsl_HAVE( RVALUE_REFERENCE ) +template< class U > +not_null make_not_null( U u ) +{ + return not_null( std::move( u ) ); +} +template< class U > +not_null make_not_null( not_null u ) +{ + return std::move( u ); +} +#else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) +template< class U > +not_null make_not_null( U const & u ) +{ + return not_null( u ); +} +template< class U > +not_null make_not_null( not_null const & u ) +{ + return u; +} +#endif // gsl_HAVE( RVALUE_REFERENCE ) + + +// not_null with implicit constructor, allowing copy-initialization: + +template< class T > +class not_null_ic : public not_null +{ +public: + template< class U + gsl_ENABLE_IF_(( std::is_constructible::value )) + > + gsl_constexpr14 +#if gsl_HAVE( RVALUE_REFERENCE ) + not_null_ic( U && u ) + : not_null( std::forward( u ) ) +#else + not_null_ic( U const & u ) + : not_null( u ) +#endif + {} +}; + +// more not_null unwanted operators + +template< class T, class U > +std::ptrdiff_t operator-( not_null const &, not_null const & ) gsl_is_delete; + +template< class T > +not_null operator-( not_null const &, std::ptrdiff_t ) gsl_is_delete; + +template< class T > +not_null operator+( not_null const &, std::ptrdiff_t ) gsl_is_delete; + +template< class T > +not_null operator+( std::ptrdiff_t, not_null const & ) gsl_is_delete; + +// not_null comparisons + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( not_null const & l, not_null const & r ) +{ + return l.operator->() == r.operator->(); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( not_null const & l, U const & r ) +{ + return l.operator->() == r; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( T const & l, not_null const & r ) +{ + return l == r.operator->(); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( not_null const & l, not_null const & r ) +{ + return l.operator->() < r.operator->(); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( not_null const & l, U const & r ) +{ + return l.operator->() < r; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( T const & l, not_null const & r ) +{ + return l < r.operator->(); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( not_null const & l, not_null const & r ) +{ + return !( l == r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( not_null const & l, U const & r ) +{ + return !( l == r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( T const & l, not_null const & r ) +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( not_null const & l, not_null const & r ) +{ + return !( r < l ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( not_null const & l, U const & r ) +{ + return !( r < l ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( T const & l, not_null const & r ) +{ + return !( r < l ); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( not_null const & l, not_null const & r ) +{ + return r < l; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( not_null const & l, U const & r ) +{ + return r < l; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( T const & l, not_null const & r ) +{ + return r < l; +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( not_null const & l, not_null const & r ) +{ + return !( l < r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( not_null const & l, U const & r ) +{ + return !( l < r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( T const & l, not_null const & r ) +{ + return !( l < r ); +} + +// print not_null + +template< class CharType, class Traits, class T > +std::basic_ostream< CharType, Traits > & operator<<( std::basic_ostream< CharType, Traits > & os, not_null const & p ) +{ + return os << p.operator->(); +} + + +// +// Byte-specific type. +// +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + enum class gsl_may_alias byte : unsigned char {}; +#else + struct gsl_may_alias byte { typedef unsigned char type; type v; }; +#endif + +template< class T > +gsl_api inline gsl_constexpr byte to_byte( T v ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return static_cast( v ); +#elif gsl_HAVE( CONSTEXPR_11 ) + return { static_cast( v ) }; +#else + byte b = { static_cast( v ) }; return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr IntegerType to_integer( byte b ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return static_cast::type>( b ); +#else + return b.v; +#endif +} + +gsl_api inline gsl_constexpr unsigned char to_uchar( byte b ) gsl_noexcept +{ + return to_integer( b ); +} + +gsl_api inline gsl_constexpr unsigned char to_uchar( int i ) gsl_noexcept +{ + return static_cast( i ); +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr14 byte & operator<<=( byte & b, IntegerType shift ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return b = ::gsl::to_byte( ::gsl::to_uchar( b ) << shift ); +#else + b.v = ::gsl::to_uchar( b.v << shift ); return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr byte operator<<( byte b, IntegerType shift ) gsl_noexcept +{ + return ::gsl::to_byte( ::gsl::to_uchar( b ) << shift ); +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr14 byte & operator>>=( byte & b, IntegerType shift ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return b = ::gsl::to_byte( ::gsl::to_uchar( b ) >> shift ); +#else + b.v = ::gsl::to_uchar( b.v >> shift ); return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr byte operator>>( byte b, IntegerType shift ) gsl_noexcept +{ + return ::gsl::to_byte( ::gsl::to_uchar( b ) >> shift ); +} + +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) +gsl_DEFINE_ENUM_BITMASK_OPERATORS( byte ) +gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( byte ) +#else // a.k.a. !gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) +gsl_api inline gsl_constexpr bool operator==( byte l, byte r ) gsl_noexcept +{ + return l.v == r.v; +} + +gsl_api inline gsl_constexpr bool operator!=( byte l, byte r ) gsl_noexcept +{ + return !( l == r ); +} + +gsl_api inline gsl_constexpr bool operator< ( byte l, byte r ) gsl_noexcept +{ + return l.v < r.v; +} + +gsl_api inline gsl_constexpr bool operator<=( byte l, byte r ) gsl_noexcept +{ + return !( r < l ); +} + +gsl_api inline gsl_constexpr bool operator> ( byte l, byte r ) gsl_noexcept +{ + return ( r < l ); +} + +gsl_api inline gsl_constexpr bool operator>=( byte l, byte r ) gsl_noexcept +{ + return !( l < r ); +} + +gsl_api inline gsl_constexpr14 byte & operator|=( byte & l, byte r ) gsl_noexcept +{ + l.v |= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator|( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v | r.v ); +} + +gsl_api inline gsl_constexpr14 byte & operator&=( byte & l, byte r ) gsl_noexcept +{ + l.v &= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator&( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v & r.v ); +} + +gsl_api inline gsl_constexpr14 byte & operator^=( byte & l, byte r ) gsl_noexcept +{ + l.v ^= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator^( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v ^ r.v ); +} + +gsl_api inline gsl_constexpr byte operator~( byte b ) gsl_noexcept +{ + return ::gsl::to_byte( ~b.v ); +} +#endif // gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +// Tag to select span constructor taking a container: + +struct with_container_t { gsl_constexpr with_container_t() gsl_noexcept {} }; +const gsl_constexpr with_container_t with_container; // TODO: this can lead to ODR violations because the symbol will be defined in multiple translation units + +#endif + +// +// span<> - A 1D view of contiguous T's, replace (*,len). +// +template< class T > +class span +{ + template< class U > friend class span; + +public: + typedef gsl_CONFIG_SPAN_INDEX_TYPE index_type; + + typedef T element_type; + typedef typename std11::remove_cv< T >::type value_type; + + typedef T & reference; + typedef T * pointer; + typedef T const * const_pointer; + typedef T const & const_reference; + + typedef pointer iterator; + typedef const_pointer const_iterator; + + typedef std::reverse_iterator< iterator > reverse_iterator; + typedef std::reverse_iterator< const_iterator > const_reverse_iterator; + + typedef typename std::iterator_traits< iterator >::difference_type difference_type; + + // 26.7.3.2 Constructors, copy, and assignment [span.cons] + + gsl_api gsl_constexpr14 span() gsl_noexcept + : first_( gsl_nullptr ) + , last_ ( gsl_nullptr ) + { + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + +#if gsl_HAVE( NULLPTR ) + gsl_api gsl_constexpr14 span( std::nullptr_t, index_type size_in ) + : first_( nullptr ) + , last_ ( nullptr ) + { + gsl_Expects( size_in == 0 ); + } +#endif + +#if gsl_HAVE( IS_DELETE ) + gsl_DEPRECATED + gsl_api gsl_constexpr span( reference data_in ) + : span( &data_in, 1 ) + {} + + gsl_api gsl_constexpr span( element_type && ) = delete; +#endif + +#endif // deprecate + + gsl_api gsl_constexpr14 span( pointer data_in, index_type size_in ) + : first_( data_in ) + , last_ ( data_in + size_in ) + { + gsl_Expects( size_in == 0 || ( size_in > 0 && data_in != gsl_nullptr ) ); + } + + gsl_api gsl_constexpr14 span( pointer first_in, pointer last_in ) + : first_( first_in ) + , last_ ( last_in ) + { + gsl_Expects( first_in <= last_in ); + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + + template< class U > + gsl_api gsl_constexpr14 span( U * data_in, index_type size_in ) + : first_( data_in ) + , last_ ( data_in + size_in ) + { + gsl_Expects( size_in == 0 || ( size_in > 0 && data_in != gsl_nullptr ) ); + } + +#endif // deprecate + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + template< class U, size_t N > + gsl_api gsl_constexpr span( U (&arr)[N] ) gsl_noexcept + : first_( gsl_ADDRESSOF( arr[0] ) ) + , last_ ( gsl_ADDRESSOF( arr[0] ) + N ) + {} +#else + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_api gsl_constexpr span( element_type (&arr)[N] ) gsl_noexcept + : first_( gsl_ADDRESSOF( arr[0] ) ) + , last_ ( gsl_ADDRESSOF( arr[0] ) + N ) + {} +#endif // deprecate + +#if gsl_HAVE( ARRAY ) +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + + template< class U, size_t N > + gsl_constexpr span( std::array< U, N > & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + + template< class U, size_t N > + gsl_constexpr span( std::array< U, N > const & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + +#else + + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_constexpr span( std::array< value_type, N > & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_constexpr span( std::array< value_type, N > const & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + +#endif // deprecate +#endif // gsl_HAVE( ARRAY ) + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + template< class Container + gsl_ENABLE_IF_(( detail::is_compatible_container< Container, element_type >::value )) + > + gsl_constexpr span( Container & cont ) gsl_noexcept + : first_( std17::data( cont ) ) + , last_ ( std17::data( cont ) + std17::size( cont ) ) + {} + + template< class Container + gsl_ENABLE_IF_(( + std::is_const< element_type >::value + && detail::is_compatible_container< Container, element_type >::value + )) + > + gsl_constexpr span( Container const & cont ) gsl_noexcept + : first_( std17::data( cont ) ) + , last_ ( std17::data( cont ) + std17::size( cont ) ) + {} + +#elif gsl_HAVE( UNCONSTRAINED_SPAN_CONTAINER_CTOR ) + + template< class Container > + gsl_constexpr span( Container & cont ) + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + + template< class Container > + gsl_constexpr span( Container const & cont ) + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + + template< class Container > + gsl_constexpr span( with_container_t, Container & cont ) gsl_noexcept + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + + template< class Container > + gsl_constexpr span( with_container_t, Container const & cont ) gsl_noexcept + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + +#endif + +#if !gsl_DEPRECATE_TO_LEVEL( 4 ) + // constructor taking shared_ptr deprecated since 0.29.0 + +# if gsl_HAVE( SHARED_PTR ) + gsl_DEPRECATED + gsl_constexpr span( shared_ptr const & ptr ) + : first_( ptr.get() ) + , last_ ( ptr.get() ? ptr.get() + 1 : gsl_nullptr ) + {} +# endif + + // constructors taking unique_ptr deprecated since 0.29.0 + +# if gsl_HAVE( UNIQUE_PTR ) +# if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + template< class ArrayElementType = typename std::add_pointer::type > +# else + template< class ArrayElementType > +# endif + gsl_DEPRECATED + gsl_constexpr span( unique_ptr const & ptr, index_type count ) + : first_( ptr.get() ) + , last_ ( ptr.get() + count ) + {} + + gsl_DEPRECATED + gsl_constexpr span( unique_ptr const & ptr ) + : first_( ptr.get() ) + , last_ ( ptr.get() ? ptr.get() + 1 : gsl_nullptr ) + {} +# endif + +#endif // deprecate shared_ptr, unique_ptr + +#if gsl_HAVE( IS_DEFAULT ) && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 430, 600) + gsl_constexpr span( span && ) gsl_noexcept = default; + gsl_constexpr span( span const & ) = default; +#else + gsl_api gsl_constexpr span( span const & other ) + : first_( other.begin() ) + , last_ ( other.end() ) + {} +#endif + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 span & operator=( span && ) gsl_noexcept = default; + gsl_constexpr14 span & operator=( span const & ) gsl_noexcept = default; +#else + gsl_constexpr14 span & operator=( span other ) gsl_noexcept + { + first_ = other.first_; + last_ = other.last_; + return *this; + } +#endif + + template< class U + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_api gsl_constexpr span( span const & other ) + : first_( other.begin() ) + , last_ ( other.end() ) + {} + +#if 0 + // Converting from other span ? + template< class U > operator=(); +#endif + + // 26.7.3.3 Subviews [span.sub] + + gsl_api gsl_constexpr14 span first( index_type count ) const + { + gsl_Expects( std::size_t( count ) <= std::size_t( this->size() ) ); + return span( this->data(), count ); + } + + gsl_api gsl_constexpr14 span last( index_type count ) const + { + gsl_Expects( std::size_t( count ) <= std::size_t( this->size() ) ); + return span( this->data() + this->size() - count, count ); + } + + gsl_api gsl_constexpr14 span subspan( index_type offset ) const + { + gsl_Expects( std::size_t( offset ) <= std::size_t( this->size() ) ); + return span( this->data() + offset, this->size() - offset ); + } + + gsl_api gsl_constexpr14 span subspan( index_type offset, index_type count ) const + { + gsl_Expects( + std::size_t( offset ) <= std::size_t( this->size() ) && + std::size_t( count ) <= std::size_t( this->size() - offset ) ); + return span( this->data() + offset, count ); + } + + // 26.7.3.4 Observers [span.obs] + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return narrow_cast( last_ - first_ ); + } + + gsl_api gsl_constexpr std::ptrdiff_t ssize() const gsl_noexcept + { + return narrow_cast( last_ - first_ ); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return size() * narrow_cast( sizeof( element_type ) ); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + // 26.7.3.5 Element access [span.elem] + + gsl_api gsl_constexpr14 reference operator[]( index_type pos ) const + { + gsl_Expects( pos < size() ); + return first_[ pos ]; + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference operator()( index_type pos ) const + { + return (*this)[ pos ]; + } + + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference at( index_type pos ) const + { + return (*this)[ pos ]; + } +#endif // deprecate + + gsl_api gsl_constexpr14 reference front() const + { + gsl_Expects( first_ != last_ ); + return *first_; + } + + gsl_api gsl_constexpr14 reference back() const + { + gsl_Expects( first_ != last_ ); + return *(last_ - 1); + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return first_; + } + + // 26.7.3.6 Iterator support [span.iterators] + + gsl_api gsl_constexpr iterator begin() const gsl_noexcept + { + return iterator( first_ ); + } + + gsl_api gsl_constexpr iterator end() const gsl_noexcept + { + return iterator( last_ ); + } + + gsl_api gsl_constexpr const_iterator cbegin() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return { begin() }; +#else + return const_iterator( begin() ); +#endif + } + + gsl_api gsl_constexpr const_iterator cend() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return { end() }; +#else + return const_iterator( end() ); +#endif + } + + gsl_constexpr17 reverse_iterator rbegin() const gsl_noexcept + { + return reverse_iterator( end() ); + } + + gsl_constexpr17 reverse_iterator rend() const gsl_noexcept + { + return reverse_iterator( begin() ); + } + + gsl_constexpr17 const_reverse_iterator crbegin() const gsl_noexcept + { + return const_reverse_iterator( cend() ); + } + + gsl_constexpr17 const_reverse_iterator crend() const gsl_noexcept + { + return const_reverse_iterator( cbegin() ); + } + + gsl_constexpr14 void swap( span & other ) gsl_noexcept + { + std::swap( first_, other.first_ ); + std::swap( last_ , other.last_ ); + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 3 ) + // member length() deprecated since 0.29.0 + + gsl_DEPRECATED_MSG("use size() instead") + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return size(); + } + + // member length_bytes() deprecated since 0.29.0 + + gsl_DEPRECATED_MSG("use size_bytes() instead") + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return size_bytes(); + } +#endif + +#if ! gsl_DEPRECATE_TO_LEVEL( 2 ) + // member as_bytes(), as_writeable_bytes deprecated since 0.17.0 + + gsl_DEPRECATED_MSG("use free function gsl::as_bytes() instead") + gsl_api span< const byte > as_bytes() const gsl_noexcept + { + return span< const byte >( reinterpret_cast( data() ), size_bytes() ); // NOLINT + } + + gsl_DEPRECATED_MSG("use free function gsl::as_writable_bytes() instead") + gsl_api span< byte > as_writeable_bytes() const gsl_noexcept + { + return span< byte >( reinterpret_cast( data() ), size_bytes() ); // NOLINT + } + +#endif + + template< class U > + gsl_api span< U > as_span() const + { + gsl_Expects( ( this->size_bytes() % sizeof(U) ) == 0 ); + return span< U >( reinterpret_cast( this->data() ), this->size_bytes() / sizeof( U ) ); // NOLINT + } + +private: + pointer first_; + pointer last_; +}; + +// class template argument deduction guides: + +#if gsl_HAVE( DEDUCTION_GUIDES ) // gsl_CPP17_OR_GREATER + +template< class T, size_t N > +span( T (&)[N] ) -> span; + +template< class T, size_t N > +span( std::array & ) -> span; + +template< class T, size_t N > +span( std::array const & ) -> span; + +template< class Container > +span( Container& ) -> span; + +template< class Container > +span( Container const & ) -> span; + +#endif // gsl_HAVE( DEDUCTION_GUIDES ) + +// 26.7.3.7 Comparison operators [span.comparison] + +#if gsl_CONFIG( ALLOWS_SPAN_COMPARISON ) +# if gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator==( span const & l, span const & r ) +{ + return l.size() == r.size() + && (l.begin() == r.begin() || std::equal( l.begin(), l.end(), r.begin() ) ); +} + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator< ( span const & l, span const & r ) +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +# else // a.k.a. !gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator==( span const & l, span const & r ) +{ + return l.size() == r.size() + && (l.begin() == r.begin() || std::equal( l.begin(), l.end(), r.begin() ) ); +} + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator< ( span const & l, span const & r ) +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} +# endif // gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +inline gsl_constexpr bool operator!=( span const & l, span const & r ) +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr bool operator<=( span const & l, span const & r ) +{ + return !( r < l ); +} + +template< class T, class U > +inline gsl_constexpr bool operator> ( span const & l, span const & r ) +{ + return ( r < l ); +} + +template< class T, class U > +inline gsl_constexpr bool operator>=( span const & l, span const & r ) +{ + return !( l < r ); +} +#endif // gsl_CONFIG( ALLOWS_SPAN_COMPARISON ) + +// span algorithms + +template< class T > +gsl_api inline gsl_constexpr std::size_t size( span const & spn ) +{ + return static_cast( spn.size() ); +} + +template< class T > +gsl_api inline gsl_constexpr std::ptrdiff_t ssize( span const & spn ) +{ + return spn.ssize(); +} + +namespace detail { + +template< class II, class N, class OI > +gsl_api gsl_constexpr14 inline OI copy_n( II first, N count, OI result ) +{ + if ( count > 0 ) + { + *result++ = *first; + for ( N i = 1; i < count; ++i ) + { + *result++ = *++first; + } + } + return result; +} +} + +template< class T, class U > +gsl_api gsl_constexpr14 inline void copy( span src, span dest ) +{ +#if gsl_CPP14_OR_GREATER // gsl_HAVE( TYPE_TRAITS ) (circumvent Travis clang 3.4) + static_assert( std::is_assignable::value, "Cannot assign elements of source span to elements of destination span" ); +#endif + gsl_Expects( dest.size() >= src.size() ); + detail::copy_n( src.data(), src.size(), dest.data() ); +} + +// span creator functions (see ctors) + +template< class T > +gsl_api inline span< const byte > as_bytes( span spn ) gsl_noexcept +{ + return span< const byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +template< class T> +gsl_api inline span< byte > as_writable_bytes( span spn ) gsl_noexcept +{ + return span< byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) +template< class T> +gsl_DEPRECATED_MSG("use as_writable_bytes() (different spelling) instead") +gsl_api inline span< byte > as_writeable_bytes( span spn ) gsl_noexcept +{ + return span< byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} +#endif // deprecate + +#if gsl_FEATURE_TO_STD( MAKE_SPAN ) + +template< class T > +gsl_api inline gsl_constexpr span +make_span( T * ptr, typename span::index_type count ) +{ + return span( ptr, count ); +} + +template< class T > +gsl_api inline gsl_constexpr span +make_span( T * first, T * last ) +{ + return span( first, last ); +} + +template< class T, size_t N > +gsl_api inline gsl_constexpr span +make_span( T (&arr)[N] ) +{ + return span( gsl_ADDRESSOF( arr[0] ), N ); +} + +#if gsl_HAVE( ARRAY ) + +template< class T, size_t N > +inline gsl_constexpr span +make_span( std::array & arr ) +{ + return span( arr ); +} + +template< class T, size_t N > +inline gsl_constexpr span +make_span( std::array const & arr ) +{ + return span( arr ); +} +#endif + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) && gsl_HAVE( AUTO ) + +template< class Container, class EP = decltype( std17::data(std::declval())) > +inline gsl_constexpr auto +make_span( Container & cont ) -> span< typename std::remove_pointer::type > +{ + return span< typename std::remove_pointer::type >( cont ); +} + +template< class Container, class EP = decltype( std17::data(std::declval())) > +inline gsl_constexpr auto +make_span( Container const & cont ) -> span< const typename std::remove_pointer::type > +{ + return span< const typename std::remove_pointer::type >( cont ); +} + +#else + +template< class T > +inline span +make_span( std::vector & cont ) +{ + return span( with_container, cont ); +} + +template< class T > +inline span +make_span( std::vector const & cont ) +{ + return span( with_container, cont ); +} +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +template< class Container > +inline gsl_constexpr span +make_span( with_container_t, Container & cont ) gsl_noexcept +{ + return span< typename Container::value_type >( with_container, cont ); +} + +template< class Container > +inline gsl_constexpr span +make_span( with_container_t, Container const & cont ) gsl_noexcept +{ + return span< const typename Container::value_type >( with_container, cont ); +} + +#endif // gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +#if !gsl_DEPRECATE_TO_LEVEL( 4 ) +template< class Ptr > +gsl_DEPRECATED +inline span +make_span( Ptr & ptr ) +{ + return span( ptr ); +} +#endif // !gsl_DEPRECATE_TO_LEVEL( 4 ) + +template< class Ptr > +gsl_DEPRECATED +inline span +make_span( Ptr & ptr, typename span::index_type count ) +{ + return span( ptr, count ); +} + +#endif // gsl_FEATURE_TO_STD( MAKE_SPAN ) + +#if gsl_FEATURE_TO_STD( BYTE_SPAN ) + +template< class T > +gsl_api inline gsl_constexpr span +byte_span( T & t ) gsl_noexcept +{ + return span( reinterpret_cast( &t ), sizeof(T) ); +} + +template< class T > +gsl_api inline gsl_constexpr span +byte_span( T const & t ) gsl_noexcept +{ + return span( reinterpret_cast( &t ), sizeof(T) ); +} + +#endif // gsl_FEATURE_TO_STD( BYTE_SPAN ) + +// +// basic_string_span: +// + +template< class T > +class basic_string_span; + +namespace detail { + +template< class T > +struct is_basic_string_span_oracle : std11::false_type {}; + +template< class T > +struct is_basic_string_span_oracle< basic_string_span > : std11::true_type {}; + +template< class T > +struct is_basic_string_span : is_basic_string_span_oracle< typename std11::remove_cv::type > {}; + +template< class T > +gsl_api inline gsl_constexpr14 std::size_t string_length( T * ptr, std::size_t max ) +{ + if ( ptr == gsl_nullptr || max <= 0 ) + return 0; + + std::size_t len = 0; + while ( len < max && ptr[len] ) // NOLINT + ++len; + + return len; +} + +} // namespace detail + +// +// basic_string_span<> - A view of contiguous characters, replace (*,len). +// +template< class T > +class basic_string_span +{ +public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef typename span_type::pointer pointer ; + typedef typename span_type::reference reference ; + + typedef typename span_type::iterator iterator ; + typedef typename span_type::const_iterator const_iterator ; + typedef typename span_type::reverse_iterator reverse_iterator; + typedef typename span_type::const_reverse_iterator const_reverse_iterator; + + // construction: + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr basic_string_span() gsl_noexcept = default; +#else + gsl_api gsl_constexpr basic_string_span() gsl_noexcept {} +#endif + +#if gsl_HAVE( NULLPTR ) + gsl_api gsl_constexpr basic_string_span( std::nullptr_t ) gsl_noexcept + : span_( nullptr, static_cast( 0 ) ) + {} +#endif + +#ifdef __CUDACC_RELAXED_CONSTEXPR__ + gsl_api +#endif // __CUDACC_RELAXED_CONSTEXPR__ + gsl_constexpr basic_string_span( pointer ptr ) + : span_( remove_z( ptr, (std::numeric_limits::max)() ) ) + {} + + gsl_api gsl_constexpr basic_string_span( pointer ptr, index_type count ) + : span_( ptr, count ) + {} + + gsl_api gsl_constexpr basic_string_span( pointer firstElem, pointer lastElem ) + : span_( firstElem, lastElem ) + {} + + template< std::size_t N > + gsl_api gsl_constexpr basic_string_span( element_type (&arr)[N] ) + : span_( remove_z( gsl_ADDRESSOF( arr[0] ), N ) ) + {} + +#if gsl_HAVE( ARRAY ) + + template< std::size_t N > + gsl_constexpr basic_string_span( std::array< typename std11::remove_const::type, N> & arr ) + : span_( remove_z( arr ) ) + {} + + template< std::size_t N > + gsl_constexpr basic_string_span( std::array< typename std11::remove_const::type, N> const & arr ) + : span_( remove_z( arr ) ) + {} + +#endif + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + + // Exclude: array, [basic_string,] basic_string_span + + template< class Container + gsl_ENABLE_IF_(( + ! detail::is_std_array< Container >::value + && ! detail::is_basic_string_span< Container >::value + && std::is_convertible< typename Container::pointer, pointer >::value + && std::is_convertible< typename Container::pointer, decltype(std::declval().data()) >::value + )) + > + gsl_constexpr basic_string_span( Container & cont ) + : span_( ( cont ) ) + {} + + // Exclude: array, [basic_string,] basic_string_span + + template< class Container + gsl_ENABLE_IF_(( + ! detail::is_std_array< Container >::value + && ! detail::is_basic_string_span< Container >::value + && std::is_convertible< typename Container::pointer, pointer >::value + && std::is_convertible< typename Container::pointer, decltype(std::declval().data()) >::value + )) + > + gsl_constexpr basic_string_span( Container const & cont ) + : span_( ( cont ) ) + {} + +#elif gsl_HAVE( UNCONSTRAINED_SPAN_CONTAINER_CTOR ) + + template< class Container > + gsl_constexpr basic_string_span( Container & cont ) + : span_( cont ) + {} + + template< class Container > + gsl_constexpr basic_string_span( Container const & cont ) + : span_( cont ) + {} + +#else + + template< class U > + gsl_api gsl_constexpr basic_string_span( span const & rhs ) + : span_( rhs ) + {} + +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + + template< class Container > + gsl_constexpr basic_string_span( with_container_t, Container & cont ) + : span_( with_container, cont ) + {} +#endif + +#if gsl_HAVE( IS_DEFAULT ) +# if gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 440, 600 ) + gsl_constexpr basic_string_span( basic_string_span const & rhs ) = default; + + gsl_constexpr basic_string_span( basic_string_span && rhs ) = default; +# else + gsl_constexpr basic_string_span( basic_string_span const & rhs ) gsl_noexcept = default; + + gsl_constexpr basic_string_span( basic_string_span && rhs ) gsl_noexcept = default; +# endif +#endif + + template< class U + gsl_ENABLE_IF_(( std::is_convertible::pointer, pointer>::value )) + > + gsl_api gsl_constexpr basic_string_span( basic_string_span const & rhs ) + : span_( reinterpret_cast( rhs.data() ), rhs.length() ) // NOLINT + {} + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + template< class U + gsl_ENABLE_IF_(( std::is_convertible::pointer, pointer>::value )) + > + gsl_api gsl_constexpr basic_string_span( basic_string_span && rhs ) + : span_( reinterpret_cast( rhs.data() ), rhs.length() ) // NOLINT + {} +#endif + + template< class CharTraits, class Allocator > + gsl_constexpr basic_string_span( + std::basic_string< typename std11::remove_const::type, CharTraits, Allocator > & str ) + : span_( gsl_ADDRESSOF( str[0] ), str.length() ) + {} + + template< class CharTraits, class Allocator > + gsl_constexpr basic_string_span( + std::basic_string< typename std11::remove_const::type, CharTraits, Allocator > const & str ) + : span_( gsl_ADDRESSOF( str[0] ), str.length() ) + {} + + // assignment: + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 basic_string_span & operator=( basic_string_span const & rhs ) gsl_noexcept = default; + + gsl_constexpr14 basic_string_span & operator=( basic_string_span && rhs ) gsl_noexcept = default; +#endif + + // sub span: + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span first( index_type count ) const + { + return span_.first( count ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span last( index_type count ) const + { + return span_.last( count ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span subspan( index_type offset ) const + { + return span_.subspan( offset ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span subspan( index_type offset, index_type count ) const + { + return span_.subspan( offset, count ); + } + + // observers: + + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + gsl_api gsl_constexpr14 reference operator[]( index_type idx ) const + { + return span_[idx]; + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference operator()( index_type idx ) const + { + return span_[idx]; + } +#endif // deprecate + + gsl_api gsl_constexpr14 reference front() const + { + return span_.front(); + } + + gsl_api gsl_constexpr14 reference back() const + { + return span_.back(); + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return span_.data(); + } + + gsl_api gsl_constexpr iterator begin() const gsl_noexcept + { + return span_.begin(); + } + + gsl_api gsl_constexpr iterator end() const gsl_noexcept + { + return span_.end(); + } + + gsl_constexpr17 reverse_iterator rbegin() const gsl_noexcept + { + return span_.rbegin(); + } + + gsl_constexpr17 reverse_iterator rend() const gsl_noexcept + { + return span_.rend(); + } + + // const version not in p0123r2: + + gsl_api gsl_constexpr const_iterator cbegin() const gsl_noexcept + { + return span_.cbegin(); + } + + gsl_api gsl_constexpr const_iterator cend() const gsl_noexcept + { + return span_.cend(); + } + + gsl_constexpr17 const_reverse_iterator crbegin() const gsl_noexcept + { + return span_.crbegin(); + } + + gsl_constexpr17 const_reverse_iterator crend() const gsl_noexcept + { + return span_.crend(); + } + +private: + gsl_api static gsl_constexpr14 span_type remove_z( pointer const & sz, std::size_t max ) + { + return span_type( sz, detail::string_length( sz, max ) ); + } + +#if gsl_HAVE( ARRAY ) + template< size_t N > + static gsl_constexpr14 span_type remove_z( std::array::type, N> & arr ) + { + return remove_z( gsl_ADDRESSOF( arr[0] ), narrow_cast< std::size_t >( N ) ); + } + + template< size_t N > + static gsl_constexpr14 span_type remove_z( std::array::type, N> const & arr ) + { + return remove_z( gsl_ADDRESSOF( arr[0] ), narrow_cast< std::size_t >( N ) ); + } +#endif + +private: + span_type span_; +}; + +// basic_string_span comparison functions: + +#if gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( basic_string_span const & l, U const & u ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > r( u ); + + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( basic_string_span const & l, U const & u ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > r( u ); + + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( U const & u, basic_string_span const & r ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > l( u ); + + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( U const & u, basic_string_span const & r ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > l( u ); + + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} +#endif + +#else //gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( basic_string_span const & l, basic_string_span const & r ) gsl_noexcept +{ + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( basic_string_span const & l, basic_string_span const & r ) gsl_noexcept +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +#endif // gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +inline gsl_constexpr14 bool operator!=( basic_string_span const & l, U const & r ) gsl_noexcept +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr14 bool operator<=( basic_string_span const & l, U const & r ) gsl_noexcept +{ +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) || ! gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + return !( r < l ); +#else + basic_string_span< typename std11::add_const::type > rr( r ); + return !( rr < l ); +#endif +} + +template< class T, class U > +inline gsl_constexpr14 bool operator>( basic_string_span const & l, U const & r ) gsl_noexcept +{ +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) || ! gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + return ( r < l ); +#else + basic_string_span< typename std11::add_const::type > rr( r ); + return ( rr < l ); +#endif +} + +template< class T, class U > +inline gsl_constexpr14 bool operator>=( basic_string_span const & l, U const & r ) gsl_noexcept +{ + return !( l < r ); +} + +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator!=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( l == r ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator<=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( r < l ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator>( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return ( r < l ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator>=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( l < r ); +} + +#endif // gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +// convert basic_string_span to byte span: + +template< class T > +gsl_api inline span< const byte > as_bytes( basic_string_span spn ) gsl_noexcept +{ + return span< const byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +// +// String types: +// + +typedef char * zstring; +typedef const char * czstring; + +#if gsl_HAVE( WCHAR ) +typedef wchar_t * wzstring; +typedef const wchar_t * cwzstring; +#endif + +typedef basic_string_span< char > string_span; +typedef basic_string_span< char const > cstring_span; + +#if gsl_HAVE( WCHAR ) +typedef basic_string_span< wchar_t > wstring_span; +typedef basic_string_span< wchar_t const > cwstring_span; +#endif + +// to_string() allow (explicit) conversions from string_span to string + +#if 0 + +template< class T > +inline std::basic_string< typename std::remove_const::type > to_string( basic_string_span spn ) +{ + std::string( spn.data(), spn.length() ); +} + +#else + +inline std::string to_string( string_span const & spn ) +{ + return std::string( spn.data(), spn.length() ); +} + +inline std::string to_string( cstring_span const & spn ) +{ + return std::string( spn.data(), spn.length() ); +} + +#if gsl_HAVE( WCHAR ) + +inline std::wstring to_string( wstring_span const & spn ) +{ + return std::wstring( spn.data(), spn.length() ); +} + +inline std::wstring to_string( cwstring_span const & spn ) +{ + return std::wstring( spn.data(), spn.length() ); +} + +#endif // gsl_HAVE( WCHAR ) +#endif // to_string() + +// +// Stream output for string_span types +// + +namespace detail { + +template< class Stream > +void write_padding( Stream & os, std::streamsize n ) +{ + for ( std::streamsize i = 0; i < n; ++i ) + os.rdbuf()->sputc( os.fill() ); +} + +template< class Stream, class Span > +Stream & write_to_stream( Stream & os, Span const & spn ) +{ + typename Stream::sentry sentry( os ); + + if ( !os ) + return os; + + const std::streamsize length = narrow( spn.length() ); + + // Whether, and how, to pad + const bool pad = ( length < os.width() ); + const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right; + + if ( left_pad ) + write_padding( os, os.width() - length ); + + // Write span characters + os.rdbuf()->sputn( spn.begin(), length ); + + if ( pad && !left_pad ) + write_padding( os, os.width() - length ); + + // Reset output stream width + os.width(0); + + return os; +} + +} // namespace detail + +template< typename Traits > +std::basic_ostream< char, Traits > & operator<<( std::basic_ostream< char, Traits > & os, string_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +template< typename Traits > +std::basic_ostream< char, Traits > & operator<<( std::basic_ostream< char, Traits > & os, cstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +#if gsl_HAVE( WCHAR ) + +template< typename Traits > +std::basic_ostream< wchar_t, Traits > & operator<<( std::basic_ostream< wchar_t, Traits > & os, wstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +template< typename Traits > +std::basic_ostream< wchar_t, Traits > & operator<<( std::basic_ostream< wchar_t, Traits > & os, cwstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +#endif // gsl_HAVE( WCHAR ) + +// +// ensure_sentinel() +// +// Provides a way to obtain a span from a contiguous sequence +// that ends with a (non-inclusive) sentinel value. +// +// Will fail-fast if sentinel cannot be found before max elements are examined. +// +namespace detail { + +template< class T, class SizeType, const T Sentinel > +gsl_api static span ensure_sentinel( T * seq, SizeType max = (std::numeric_limits::max)() ) +{ + typedef T * pointer; + + gsl_SUPPRESS_MSVC_WARNING( 26429, "f.23: symbol 'cur' is never tested for nullness, it can be marked as not_null" ) + pointer cur = seq; + + while ( static_cast( cur - seq ) < max && *cur != Sentinel ) + ++cur; + + gsl_Expects( *cur == Sentinel ); + + return span( seq, narrow_cast< typename span::index_type >( cur - seq ) ); +} +} // namespace detail + +// +// ensure_z - creates a string_span for a czstring or cwzstring. +// Will fail fast if a null-terminator cannot be found before +// the limit of size_type. +// + +template< class T > +gsl_api inline span ensure_z( T * const & sz, size_t max = (std::numeric_limits::max)() ) +{ + return detail::ensure_sentinel( sz, max ); +} + +template< class T, size_t N > +gsl_api inline span ensure_z( T (&sz)[N] ) +{ + return ::gsl::ensure_z( gsl_ADDRESSOF( sz[0] ), N ); +} + +# if gsl_HAVE( TYPE_TRAITS ) + +template< class Container > +inline span< typename std::remove_pointer::type > +ensure_z( Container & cont ) +{ + return ::gsl::ensure_z( cont.data(), cont.length() ); +} +# endif + +// +// basic_zstring_span<> - A view of contiguous null-terminated characters, replace (*,len). +// + +template +class basic_zstring_span +{ +public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef element_type * czstring_type; + typedef basic_string_span string_span_type; + + gsl_api gsl_constexpr14 basic_zstring_span( span_type s ) + : span_( s ) + { + // expects a zero-terminated span + gsl_Expects( s[s.size() - 1] == '\0'); + } + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr basic_zstring_span( basic_zstring_span const & other ) = default; + gsl_constexpr basic_zstring_span( basic_zstring_span && other ) = default; + gsl_constexpr14 basic_zstring_span & operator=( basic_zstring_span const & other ) = default; + gsl_constexpr14 basic_zstring_span & operator=( basic_zstring_span && other ) = default; +#else + gsl_api gsl_constexpr basic_zstring_span( basic_zstring_span const & other) : span_ ( other.span_ ) {} + gsl_api gsl_constexpr basic_zstring_span & operator=( basic_zstring_span const & other ) { span_ = other.span_; return *this; } +#endif + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return span_.size() == 0; + } + + gsl_api gsl_constexpr string_span_type as_string_span() const gsl_noexcept + { + return string_span_type( span_.data(), span_.size() > 1 ? span_.size() - 1 : 0 ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr string_span_type ensure_z() const + { + return ::gsl::ensure_z(span_.data(), span_.size()); + } + + gsl_api gsl_constexpr czstring_type assume_z() const gsl_noexcept + { + return span_.data(); + } + +private: + span_type span_; +}; + +// +// zString types: +// + +typedef basic_zstring_span< char > zstring_span; +typedef basic_zstring_span< char const > czstring_span; + +#if gsl_HAVE( WCHAR ) +typedef basic_zstring_span< wchar_t > wzstring_span; +typedef basic_zstring_span< wchar_t const > cwzstring_span; +#endif + +} // namespace gsl + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +namespace std { + +template<> +struct hash< ::gsl::byte > +{ +public: + gsl_constexpr std::size_t operator()( ::gsl::byte v ) const gsl_noexcept + { + return ::gsl::to_integer( v ); + } +}; + +} // namespace std + +#endif + +#if gsl_FEATURE_GSL_LITE_NAMESPACE + +// gsl_lite namespace: + +// gsl-lite currently keeps all symbols in the namespace `gsl`. The `gsl_lite` namespace contains all the symbols in the +// `gsl` namespace, plus some extensions that are not specified in the Core Guidelines. +// +// Going forward, we want to support coexistence of gsl-lite with M-GSL, so we want to encourage using the `gsl_lite` +// namespace when consuming gsl-lite. Typical use in library code would be: +// +// #include // instead of +// +// namespace foo { +// namespace gsl = ::gsl_lite; // convenience alias +// double mean(gsl::span elements) { +// gsl_Expects(!elements.empty()); // instead of Expects() +// ... +// } +// } // namespace foo +// +// In a future version, the new header will only define the `gsl_lite` namespace and no +// unprefixed `Expects()` and `Ensures()` macros to avoid collision with M-GSL. To ensure backward compatibility, the +// old header will keep defining the `gsl` namespace and the `Expects()` and `Ensures()` macros. + +namespace gsl_lite +{ + +namespace std11 = ::gsl::std11; +namespace std14 = ::gsl::std14; +namespace std17 = ::gsl::std17; +namespace std20 = ::gsl::std20; + +using namespace std11; +using namespace std14; +using namespace std17; +using namespace std20; + +#if gsl_HAVE( SHARED_PTR ) +using std::unique_ptr; +using std::shared_ptr; +using std::make_shared; +#endif + +using ::gsl::index; + +// Integer type for dimensions. +typedef gsl_CONFIG_INDEX_TYPE dim; + +// Integer type for array strides. +typedef gsl_CONFIG_INDEX_TYPE stride; + +// Integer type for pointer, iterator, or index differences. +typedef gsl_CONFIG_INDEX_TYPE diff; + +#if gsl_HAVE( ALIAS_TEMPLATE ) +using ::gsl::owner; +#endif + +using ::gsl::fail_fast; + +using ::gsl::finally; +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) +using ::gsl::on_return; +using ::gsl::on_error; +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +using ::gsl::narrow_cast; +using ::gsl::narrowing_error; +using ::gsl::narrow; +using ::gsl::narrow_failfast; + + +using ::gsl::at; + +using ::gsl::not_null; +using ::gsl::make_not_null; + +using ::gsl::byte; + +using ::gsl::with_container_t; +using ::gsl::with_container; + +using ::gsl::span; +using ::gsl::make_span; +using ::gsl::byte_span; +using ::gsl::copy; +using ::gsl::as_bytes; +using ::gsl::as_writable_bytes; +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) +using ::gsl::as_writeable_bytes; +#endif + +using ::gsl::basic_string_span; +using ::gsl::string_span; +using ::gsl::cstring_span; + +using ::gsl::basic_zstring_span; +using ::gsl::zstring_span; +using ::gsl::czstring_span; + +using ::gsl::zstring; +using ::gsl::czstring; + +#if gsl_HAVE( WCHAR ) +using ::gsl::wzstring; +using ::gsl::cwzstring; + +using ::gsl::wzstring_span; +using ::gsl::cwzstring_span; +#endif // gsl_HAVE( WCHAR ) + +} // namespace gsl_lite + +#endif // gsl_FEATURE_GSL_LITE_NAMESPACE + +gsl_RESTORE_MSVC_WARNINGS() + +#endif // GSL_GSL_LITE_HPP_INCLUDED + +// end of file diff --git a/buildroot-overlay/package/ai2d_kpu/input.bin b/buildroot-overlay/package/ai2d_kpu/input.bin new file mode 100755 index 0000000..beda0e1 Binary files /dev/null and b/buildroot-overlay/package/ai2d_kpu/input.bin differ diff --git a/buildroot-overlay/package/ai2d_kpu/kpu_test.out b/buildroot-overlay/package/ai2d_kpu/kpu_test.out new file mode 100755 index 0000000..d282a15 Binary files /dev/null and b/buildroot-overlay/package/ai2d_kpu/kpu_test.out differ diff --git a/buildroot-overlay/package/ai2d_kpu/main.cpp b/buildroot-overlay/package/ai2d_kpu/main.cpp new file mode 100755 index 0000000..738564a --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/main.cpp @@ -0,0 +1,335 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "mmz.h" +#include +#include +// #include "dbg.h" + +using namespace nncase; +using namespace nncase::runtime; +using namespace nncase::runtime::detail; +using namespace nncase::runtime::k230; +using namespace nncase::F::k230; + +template +void print_one_line_data(std::string name, std::vector tmp, size_t count = 0) +{ + std::cout << name << " data, size = " << tmp.size() << std::endl; + if (count == 0) + count = tmp.size(); + std::cout << "[ "; + for (size_t i = 0; i < count; i++) + std::cout << (int64_t)tmp[i] << " "; + std::cout << " ]" << std::endl; +} + +template +void print_one_line_data(std::string name, T tmp, size_t count = 0) +{ + std::cout << name << " data " << std::endl; + std::cout << "[ "; + for (size_t i = 0; i < count; i++) + std::cout << (char)tmp[i] << " "; + std::cout << " ]" << std::endl; +} + +template +std::vector> txt_to_vector(const char *pathname) +{ + std::ifstream infile; + infile.open(pathname); + + std::vector> res; + std::vector suanz; + std::string s; + + while (getline(infile, s)) + { + std::istringstream is(s); + T d; + while (!is.eof()) + { + is >> d; + suanz.push_back(d); + } + res.push_back(suanz); + + suanz.clear(); + s.clear(); + } + + infile.close(); + + return res; +} + +std::vector read_binary_file(const char *file_name) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + std::vector vec(len / sizeof(unsigned char), 0); + ifs.seekg(0, ifs.beg); + ifs.read(reinterpret_cast(vec.data()), len); + ifs.close(); + return vec; +} + +size_t read_binary_file(const char *file_name, char *buffer) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + ifs.seekg(0, ifs.beg); + ifs.read(buffer, len); + ifs.close(); + return len; +} + +auto read_binary(const char *file_name, char *buffer, size_t begin, size_t count) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(begin, ifs.beg); + ifs.read(buffer + begin, count); + ifs.close(); +} + +size_t get_binary_file_size(const char *file_name) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + ifs.close(); + return len; +} + +template +double dot(const T *v1, const T *v2, size_t size) +{ + double ret = 0.f; + for (size_t i = 0; i < size; i++) + { + ret += v1[i] * v2[i]; + } + + return ret; +} + +template +double cosine(const T *v1, const T *v2, size_t size) +{ + return dot(v1, v2, size) / ((sqrt(dot(v1, v1, size)) * sqrt(dot(v2, v2, size)))); +} + +result> to_values(value_t v) +{ + if (v.is_a()) + { + return ok(std::vector { v }); + } + else if (v.is_a()) + { + auto out_fields = v.as().unwrap()->fields(); + return ok(std::vector(out_fields.begin(), out_fields.end())); + } + else + { + return err(std::errc::invalid_argument); + } +} + +std::vector split(const std::string &s, char delim) { + std::vector result; + std::stringstream ss(s); + std::string item; + + while (getline(ss, item, delim)) { + result.push_back(item); + } + + return result; +} + +static dims_t parse_digits(const std::string& s) { + dims_t digits; + auto strs = split(s, ' '); + for (size_t i = 0; i < strs.size(); i++) + { + digits.push_back(std::stoi(strs[i])); + } + return digits; +} + +static std::vector parse_multilines(const std::vector& strs, size_t begin, size_t size) { + std::vector result; + for(auto i = strs.begin() + begin; i != strs.begin() + begin + size; ++i) + { + auto shape = parse_digits(*i); + if(shape[0] == 0) + { + shape = dims_t{}; + } + result.push_back(shape); + } + return result; +} + + +struct data_desc { + std::vector input_shape; + std::vector output_shape; + bool is_empty() { return input_shape.empty() && output_shape.empty(); } +}; + +data_desc parse_desc(const unsigned char *kmodel_desc_raw) { + auto kmode_desc = std::string(reinterpret_cast(kmodel_desc_raw)); + auto descs = split(kmode_desc, '\n'); + auto nums = parse_digits(descs[0]); + auto input_num = nums[0]; + auto output_num = nums[1]; + auto in_shapes = parse_multilines(descs, 1, input_num); + auto out_shapes = parse_multilines(descs, 1 + input_num, output_num); + return data_desc{in_shapes, out_shapes}; +} + +template +void print_data(void *a, void *b, size_t all_size) +{ + for (size_t i = 0; i < all_size/sizeof(T); i++) + { + std::cout << "[" << std::setw(5) << i << "] " // index width set to 2 + << std::setw(10) << std::left << *(reinterpret_cast(a) + i) << " " // value from a width set to 10 + << std::setw(10) << std::left << *(reinterpret_cast(b) + i) << std::flush; // value from b width set to 10 + if(*(reinterpret_cast(a) + i) != *(reinterpret_cast(b) + i)) + { + std::cout << " error" << std::flush; + } + std::cout << std::endl; + } +} + +template +void print_single_data(void *a, size_t all_size) +{ + std::cout << "----------------------------" << std::endl; + for (size_t i = 0; i < all_size / sizeof(T); i++) + { + if(i %10 == 0) + { + std::cout << std::endl; + } + std::cout << std::setw(10) << std::left << *(reinterpret_cast(a) + i) << " " << std::flush; // value from b width set to 10 + } + std::cout << "----------------------------" << std::endl; +} + +template +float compare_output(tensor t,std::vector expect) { + auto unmap_buf = t->to_host() + .expect("not host") + ->buffer() + .as_host() + .expect("not host buffer"); + auto mapped_buf = std::move(unmap_buf.map(map_access_t::map_read).unwrap()); + int ret = memcmp((void *)mapped_buf.buffer().data(), (void *)expect.data(), expect.size()*sizeof(T)); + if (!ret) + { + return 1; + } + else + { + + print_data(mapped_buf.buffer().data(), expect.data(), 32); + float cos = cosine((float *)mapped_buf.buffer().data(), (float *)expect.data(), expect.size() * sizeof(T) / sizeof(float)); + return cos; + } +} + +void __attribute__((destructor)) cleanup() { + std::cout << "Cleaning up memory..." << std::endl; + shrink_memory_pool(); +#ifdef LINUX_RUNTIME + kd_mpi_mmz_deinit(); +#endif +} + +void signal_handler(int signum) { + std::cout << "Interrupt signal (" << signum << ") received.\n"; + exit(signum); +} + +int main(int argc, char *argv[]) +{ + // 处理信号,在程序退出时清理内存 + signal(SIGINT, signal_handler); + + std::cout << "case " << argv[0] << " build " << __DATE__ << " " << __TIME__ << std::endl; + if (argc < 4) + { + std::cerr << "Usage: " << argv[0] << " ... ... " << std::endl; + return -1; + } + + interpreter interp; + std::ifstream ifs(argv[1], std::ios::binary); + interp.load_model(ifs).expect("Invalid kmodel"); + + std::vector ai2d_output; + { + runtime_tensor tensor = host_runtime_tensor::create(typecode_t::dt_uint8, dims_t {1,3,320,320}, hrt::pool_shared).expect("create ai2d input tensor failed"); + // auto tensor = interp.get_input_tensor(0); + auto in_data = read_binary_file(argv[2]); + std::cout << "data size: " << (size_t)in_data.size() << std::endl; + auto ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, dims_t { 1, 3, 624, 1024 }, { (gsl::byte *)in_data.data(), (size_t)in_data.size() }, true, hrt::pool_shared).expect("create ai2d input tensor failed"); + + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {0, 125}, {0, 0}}, ai2d_pad_mode::constant, {104,117,123}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule().expect("build ai2d schedule error"); + builder.invoke(ai2d_in_tensor,tensor).expect("error occurred in ai2d running"); + + auto cos = compare_output(tensor.impl(), read_binary_file(argv[3])); + std::cout << "compare ai2d output with kmodel input cosine similarity = " << cos << std::endl; + ai2d_output.emplace_back(tensor); + } + + std::vector inputs; + for (size_t i = 0; i < interp.inputs_size(); i++) + { + hrt::sync(ai2d_output[i], sync_op_t::sync_write_back, true).unwrap(); + inputs.push_back(ai2d_output[i].impl()); + } + + auto start = std::chrono::steady_clock::now(); + auto return_value = interp.entry_function().expect("no entry_function")->invoke(inputs).expect("run entry_function failed"); + auto stop = std::chrono::steady_clock::now(); + double duration = std::chrono::duration(stop - start).count(); + std::cout << "interp run: " << duration << " ms, fps = " << 1000 / duration << std::endl; + auto values = to_values(return_value).expect("unsupported value type"); + for (size_t i = 0; i < values.size(); ++i) + { + auto t = values[i].as().expect("value is not a tensor"); + auto cos = compare_output(t, read_binary_file(argv[i + 3 + interp.inputs_size()])); + std::cout << "compare output [" << i << "] cosine similarity = " << cos << std::endl; + if (cos == 1) { + std::cout << "ai2d kpu test pass" << std::endl; + } else { + std::cout << "ai2d kpu test fail" << std::endl; + } + } + + return 0; +} \ No newline at end of file diff --git a/buildroot-overlay/package/ai2d_kpu/result.bin b/buildroot-overlay/package/ai2d_kpu/result.bin new file mode 100755 index 0000000..85f162d Binary files /dev/null and b/buildroot-overlay/package/ai2d_kpu/result.bin differ diff --git a/buildroot-overlay/package/ai2d_kpu/run.sh b/buildroot-overlay/package/ai2d_kpu/run.sh new file mode 100644 index 0000000..ac25528 --- /dev/null +++ b/buildroot-overlay/package/ai2d_kpu/run.sh @@ -0,0 +1 @@ +./ai2d_kpu.elf test.kmodel ai2d_input.bin input.bin result.bin diff --git a/buildroot-overlay/package/ai2d_kpu/test.kmodel b/buildroot-overlay/package/ai2d_kpu/test.kmodel new file mode 100755 index 0000000..c9d75b3 Binary files /dev/null and b/buildroot-overlay/package/ai2d_kpu/test.kmodel differ diff --git a/buildroot-overlay/package/face_detect/Config.in b/buildroot-overlay/package/face_detect/Config.in new file mode 100644 index 0000000..cc500dc --- /dev/null +++ b/buildroot-overlay/package/face_detect/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_FACE_DETECT + bool "face detect demo" + help + ai demo for retinaface diff --git a/buildroot-overlay/package/face_detect/Makefile b/buildroot-overlay/package/face_detect/Makefile new file mode 100644 index 0000000..7daf60a --- /dev/null +++ b/buildroot-overlay/package/face_detect/Makefile @@ -0,0 +1,15 @@ +CXX=/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1/bin/riscv64-unknown-linux-gnu-g++ + +OBJ = main.cc model.cc mobile_retinaface.cc anchors_320.cc util.cc + +LIBDIR = -L ../libnncase/nncase/lib -L ../libmmz +LIBS = -l nncase.rt_modules.k230 -l Nncase.Runtime.Native -lfunctional_k230 -lmmz -lpthread +INCLUDE = -I ./ -I ../libnncase/nncase -I ../libnncase/nncase/include -I ../libmmz + +CXX_FLAG = -O2 -march=rv64imafdcv -mabi=lp64d -mcmodel=medany -std=c++17 -DLINUX_RUNTIME -Wno-multichar -Wno-unused-result + +all: + $(CXX) $(CXX_FLAG) $(INCLUDE) $(OBJ) -o face_detect.elf $(LIBDIR) $(LIBS) + +clean: + rm -f *.o *.elf diff --git a/buildroot-overlay/package/face_detect/ai2d_input.bin b/buildroot-overlay/package/face_detect/ai2d_input.bin new file mode 100755 index 0000000..a6549c8 --- /dev/null +++ b/buildroot-overlay/package/face_detect/ai2d_input.bin @@ -0,0 +1,3836 @@ +ɼ~ɯƩտ|ti^bx¾}zutsv|yslmihmtqmkklruxyyx{|~}woddUK?5.)$'+,($ &13()+/479DQ^xy}~yvuuy{yzk^SLJB5* !"$&5ARZa[UME?ƺ徖ūٿſͻzrg_dz|yussw}{uomigmrpmkjmquvwxwyz~}wne`TI@71,&&++)&!&/134578755;@B@EL\ioponpsx{ǽƳjG63221EXtl]QWdu{k]KA?AJOarͮhWWn~|yuhWKHJUgu{|xuqnnmljilnpquw˼r_Tazm_\YVM:' &/MfžodYTQLLVqÿĽɵz^A6;A?804EPXal{{~~yusuz¿~~yk`RLHB7-! "$&)7DS\b]UMD=߻ֿټɽ¾vnf`hüzxtrtx}}wsojfjpollknquvwxxxy}ztof]SIA:3.)&+-,'"(12<=82202348DUbnqpnmou|Ǽ{eN@:51/5&&(*,/>K[didYPG?ظԻ׸ȹ½¼~qjecnĽ{usqrx~{wplfjmmjlmorsuvvwwx{{uolfZPHA;30+$),,)$" !,35?ABC>822,0.07BR_npqmikt~ŷwcXKB;52.1>Q\ZJ3$$)8QSF?>DMT]]RC530112;ATc}ʸw{}|}|{vrj\OKMN[ly|~~|zwwxvrqpmkijjllmot}жs]`oɹne`ZTH5%-GjrknŽ༉`OOTPWZgz|vsrtz}pbWRNG?0/146:GVfnslbWMDֺ׽ԳǶ½ykedgvĿý}yupmou}}|tmghlllloqrstuvuvwzzrmkicVLE=82.*!"&),(#! !!""!%079ACDA=87:;=>@EOZcpqpkgjvk\UOLGA:431.(3EPP@'&AG>8AJVahbTE631457?FUd{̸|{{|{xsmeXOPV[gx}zywux{{wurpljkjkkjkpuzz¿ſ˭bVdĬvaZY[UC- 2Tw~}¿ǪcTU_cimz~|vtrszû}pc]XQJ><=?AFRapx|ti]QGdzٿӳ¿rdacl~~~}xsmkls|}}wqghklmpqrtsttuuuvy|}vohddc_TK@91-*(#"$&*'# !! !$$%)4;>BCA?;>DL[_acgilnsrojinx¿ƸoVA637772/1/*#-84468?FU`uǰ~zyxy{zuoh_RJPYgs}zvwtsx}yvsokkkijggkpttz¾xWVn˸f\X]ZJ8.! )Bb¿ökZSWfpvy~zvstr{Ž|rke_WOKLNNT`my|obTJһήſ}i^]bp~~|vrkhjqy~|}xrgfilmprttssttuuvx{~~ypjb][[^\TH;2+'$$'&#!#(%! $$%+5>@=>><@K]lxtmjlq{ǼƴkQ9,(,/1//1.'(5BIJFEBB=BQYjzξ|zwvuvxypjbWJCKWjv~xtvssy{xupmjkjjfehlnnu}¾ʲhOY|ŴreaZJ?;,%&5Mi¿ѹscTQS]kvyz}{wuts{{upjb^_a`eq~xj[Pʴã~~ucYW`pý~~~|wqighmw{z{xqedhjlprrtsrssrssuxzz{{{yyz{xsme_WSQVWWPD7,%#!"))%!&# "%%+6@B99;=G[u|uljnv}}ǽyqeen~oU<-*&,0/25.$'2>IQX]Z[PHH:(%)=Vkvxnc^TJHJGEEKS`nŲ~zwvutvxynh_QA=FSfq}vssrrz~zwrmkiiiedejklqz}½]J]þķsfXG?@5+(/AZ}ɮvcSHKU`mvutwxz|ywwt|ŵ}wsqqrrtsdYǿɴzuzvlZPQ_wĿ~||xurjggjrutuqnfabfloqnllossqppopoqqqpnmkkhb]SOLIIMTTNB3%"'*("" $-368248CWrsmnpy{utxƼtcVJ>BN^lǾtYF92+-/36420,+/9EO[eh`UI?3' &9Retzxrfc^XRNMLOV`jwɹ~}wutrtvutje\K72ARan{ztqpvzzvrnlllkfgfgijkow{¾ūjLOeź¯v`RE:;1*+7MjÿwaK?HT[dnnmpry}~~|{{~|yxyv~Ŷ~}ohȽȼ~yytv{vkbSOTby~||zxtlgcfmpprplb\\afjnljiknmkkijiihhgie_]ZXSMCA@?BFKKI>1$&)(# &+,-*2>Og¼Ƿuossy}wutxlZJ?4+.9GTfzvbP@7/2489830)()/5<811469?DD>6+ "###! "7Sqͱ}ywzp]H;2.-,1;8;AHVi|~qeXJA?AHRYYUMIFGHD:36=>=<2*&*2G`}yrliponov|xusrusqqpomh_VLDBK]o||zyz}xqolijkkkjjigeedekpruxyzz|zvtrtvxwx~½^=7Mh¾úofbdcbnz]KA5*')4FVh{ÿyzqhygF1(6GNZcnnpoqvsnsvvvttvx|}}zvuuxxʽ{wssvtpmmmmnoponnopputrqqrtx~|zzy{vk`ULFA:>Nm|~}{xpi`[\bimf_SJFHQY^_^\XWUTTRPOMKJHBCA>;41,((,/4;CE:2) ##"" &<]}ž}vv_M:2./36:?><=;62*($"#*.4:?B61*!#%&'!   -Ef̬{yeQB3/.5;@BB@:8:@GS]`[WPD=9961+(+,-08>?A?=40*#$)+,+('" (;Ppϳuk]N@768?GKJE?99@JPV\ZURTNISa~|~uqwŲ{ywusqnnlkjkljdaWI<=FRajzuica^`cehilljgfcbcghhijklmmkifdcbdkq}þgB(1Qly]F4.GLNKECCB@>><<:8620-)&+16=AIMLE?940+& ',/0630*! (2G[wɳ~~ric[SG;:?ENRLGA;=KX_cgb[[dfdkwzw{|wvxxvsmkggeggea]SC78CNYbow~~qf`^[[`cehmlkiheeeffeddfffihfec`^aho{d=#+Ki}yxxwvYA+!.CNSVPNZl}}ePI>3,0F\r¾°tnda]^]\{˹XF/&3BJT`aaccjqrpmmommmoqpqpooqv|}rjecipv|dzϽ~|}zy{zuqli_[VQPOMNJJJIKLNNPPPPQPPQTRPOOLIFD<773-(&2Hjȵʿ}tw{Ļ~~~|xqh`[WT[ecbUB50008>BA=;9743444220*)+*+1=DKOWUQNC;;82*! " "),.-122/' (2EYv˰~uha_\UJ??BDEDDDGO[iuuptrimzwmiihq|{}|vnrqrssrlhfdcedaZSI=31:FU`jr|wkbVUVX_begijmmlhdba`]\[^_cc`^cb]XZcnY1!'Fhv{sf_bjmydF.$*5@@DHO_uoYL?969Lb{rg_^YZ__hĹsY?0'-:ISXVYcinqrrkjhjlpstoljklrx~ulknspw~|{xvîǽyqxŹ{yxvwz}~yuqlh_XTMJGEECCBBEFIJLLKKKJJJLJJIFEB=;3-/,**)5Nm°}wwrtvy~׻yd][Zu}~~zwskc\WTYadbXC5/,*/5996221-,--.-.-*,-05=IQY^a\ULC8973,% $&$$$(*,-0110+" +(1?Pjȴvmc^^]WNFCDDCEJNZfvvu}¾yneaahq||{~~yrqooqrolgfdddc]QID:14@FKXkzaSIDCHZnxla[\YZ]`q¼mS;.',7COUVZdkqtsslhhhkostqmmmqtz}rlmsxwupnmnml«{zpjnųÿxuutu{x|}~~zuqjf]XRLHEB??@??BEHJMLKJJIIIJHECC@>87.+++*.1>Vvöysmkj`cgmvzvy}ÙoO?82Hg~~|yvmg`[X\dhg^J;1+&*-010.,,&''(*+--,.49@LYbmpqi]RE;:83.)&'(+**(()+.../.,& + #,4D\tĶĽuhb\YZZWOOKJGDJU`xɷ{}{mb_aeipsuvz~zxzzxtnllopnlgedffcZJ?<628BN[es{ug^SSUZ`egjhllmlihfca_\\[[\^ZZ\\WSUbs½`9.8Uousoh`THEJh|¯|aOCCEDGPZjĵl^TSTZk¿vlcZUXYZZd~hN6+(,4=HQVZdlstuulkhhjmpsuuvvxz~zqlmu{vpgebbfkoqο{~~vrrsϹvssrszx}||~zvqje]VPKEA=;:988<@EHKKLKJIGFFA>=<:821*&''(/5F\~οzrrrqnhZ]enzlZSSWtӵeC0'!-C]{¿|wojd_[^elmeRA3)"'*,+*(%# !"%(+**.4=ER`irwxncXLB?=82/.//./0.)),01/-,-*# !-8K`zľƺukc^YXZZYRTSRMMVixƼ»pgecabbbabht~~zxwxxvpnmnomkfccfgbWD8534?JValzsd\RRUY_dghhjkklkiieda^][ZZ]XY[[URUevýhC;F`uxsmf]PA:<^wísidd]bn|ɽuf\\ahz¿½|vme^XUY^^\miO3+(,17DNV\gotwwuolighjlqx{~~¾~skmtx~unfffjr{þwvsx~ҿ¿}tqpooyy}|~~{vqid[VPJC?98542137<@FGKKJHEB>975520++'"##&08KdĹjackwxo`ckwdPDACa{jO6(!(;X{xqlgb]`fopj[J9,#&())%# "&''-4=FS`hqwyqhaVMHD=75452//0,)(,01-,*-*$ &-;Mjýƿ~qea^\\]^^YVX[\aoäqjc_[VSQRU]fs~|yvuvz{uqonnkidaadd_S?2-.7ER]isoa[QQTX_cfffgiiijiihgeb_\[Z[WWZZVTWj}¾pLDMdusmg`XJ:/1Ro¬ð~k_bjr}}½|xsmha^ZZ]abg}nS3+),-2AMW]iqxzzvrnjgghkq{Ÿ¾ukhjoyyvqqsz¸±}yjgjnwȿþ~wtspow{~~~~~{vohbZVPID=8652.+,16:BEIIIFA=4/.,-+)%$!"#(4?TkhNMXj}xlkq~xcXTPO_m{i`QA0$)CfĿysomgbcgptrfVD4()*)'&! $&).8?JU`isy{vojc\TOF@<:950-,)'&(+'$"#)*$ #&2FdyncXXZ[`bdacgmt~ż¥ùtkb\VPJEGJOWbpyxvqmntwvronmjhc`_`^YL8,(,8HVanvzj_ZRRUY_accacdefggiiigda_\[\XY]^ZW[n½tPBGVfb[UNH=.$(C`ʺtddoy{z~þ}ytnjfb`]]^^agtsX6-)),1>JX_ku{{|xtpjhggio{ǼĽ{medehqz}{uuvuvw~±}~ӿ}v}|gZ[`cmx}}xz|zyuqw|~}|}~{wohaZVNHD>8563-)'+/39>EIIE>7*%%#%$"#&-;F`vkQ0*+(((% "&)+1;CMXblu~}|xshaVNJFC<70-*)('(" !'163-!!"$1Gf}une\UX\bjpuvøqg^WSNE@BFJQZeqy}|}wmjnstpllkihca]\WOB/$$*6HWboyue\YSTWZ^aaa]^`acdefjkigda_]]ZZ_a^\`u»rL:6@LIE?:6/$!9Tuǿο~lkt~zwy{}ľ{unc`^]]^__\\h{^7,&'*0. $<`´~zvupjjov~xiVD7,*()*(#$(+,3>CHNT\eknr{{xuxwoptpljijihdb]YRH;)!&5HUamxqc[YVVY\```_Z[\^_`aeiljhfc`_^[\adb_dxnH2(09771-,(! 4Mnqoyŷytvxzž|yrk\[[[[]_`ZXhd9,#"&/9EYanw~~}ywqmjiijoy¶xtqwpihilkjihilotvx͸ztkds~zzxzvpfabeggmtrz~~}zzxyyz|zyyz~{||zwojd]VQKGD><:4,&%&)(337BE?82# +2:KZqmR90))/=<975=GR`jh^U@5-&*-%!);Vwytvof_YSW\^m}re^[ZYPRZa^\oĻtb[WUPJA>@AEIOSVWW\flpsrpmpu|ºtnlpkgilkf^]YSH<1% !*9FUes|~m`]bZ\abb`\[YYY[]`_^fihfcabca^`cdaah~jE,"!$(*))$!#&-1%#&0;FVerwz||ywtpoopru{Ǿrknrsnrpljiijlĺ{xrl{~}zwþ~}zxwyvxzxwvx{z|{zvpje^ZSMJFB?=7/)(('',+0:=:51($!$/7@R`ul]E3*$&'*4>BA?5336=@7+(8Qr˶nK7,'!&%%Ch|ywwwx}oXF90+/31+'&&%$',257;AHS]gpxyupbZUSRQPNT]iuoYI;-,,!)0C]}}vqnkd\XSQW_n~vnd[VTTSTTXYTUm¹o\VRPLG?<<=BGKOQRMPTZ^abdeglnrxҹyvtmhhjiga\VOC8.$ $-:IWdr||l_]b^`efe`\YWWYZ\][\accbacefa^_ccbckkP5#"*./0037>ELaw{ȷ~|xtot°}wmhfa__ddbdggYl¸iE;3/.3@LXdnqux|ytrprux{~~{zyxxyļ}y´Ľſ~{xxxyuwxvutwxzzzyuojf_[XSOJFDB=6/,*(&)'*276773.)$ +7?HZi}ƷmUH9,'" #(,++#$&)/1)"9\ʩ{U>2.)&$ "#-/*##$<_~|||ycO?614860,)(((,07;>AFMT\elwzunlkkkktt_K955*/8Kfyqjfc]XQPQUakĺ|xtqqqqqvtrk`azùlUMLIGC=:8;?DIKNNKKLMQUX[]``][_irȤzvxpigggfb\TK>3+%",3@NYhuxj_^bcehhga[WTVVY\[XW\^___bdeb__cdcel~}}}zp_E)#4:87BOYbjkmrwxspqv|ľ´Ĺ~{xvvvuvxvtuuxyyyxtqkha]ZWSPMJFB<61.*%)&'-46;@;83*"#0=GQaqǶeI=4.*#$#$')(#!#'(*/2,"*HrвaH<4/.*'$#$&'*68421C_kYE;37;952*)('-29<@CIMTZciskWC@C=5?Snuld^[RNKPWbrŽ{ǾüyfMHED@=8458>BEGILMJHJLMRWVZXRLO[fu}ƣwqwqkhged`\SG:0+('4;GT^kxtjbacijlliaZUTTXZ[YTSWXWW[_acebacecfl{~yz|{vjR6&/AMPV]goss{ķ~˲|tpvϿƳ}vmfcgnrvztlfge^ovVKHHFAFQ[bggimoosrtyú|sy{{zyz}Ǻľ~zwuuuwxzwuuvxxxvuspkhd_\[YWTQKGA;61+'+%%)/3\׾v\J?7110-**-21EPSSPZnƽq_I=76::85-+*).49=@CILQX`gqƺnYFEKGDNcy~qh_WRHGLVdsƼn^LFDA?;6426;>@ACHGDBDDBFMPSQLFHT_iq||uqnkjgc`[YOC5-++,9?IT^jv}~slhhinnnlg_XSUVY[[XQNKLMOV\bdhedggcfjxþ{vwyxlXB7=K]bjt}|~ÿȻ׾|plwȺ~xslfhq|~||{z{_PKRTMMQ[bfffhgdnmowxs}|ywy}|ywýž|xuttyz{ywvwxwwutqokjgcb`_^\XRLF@;50++%$&*.8CMNLB4+*-/5FT]fwǹzU95:FPQQK>4,((*+.//2;@@Yqǩq]OF<==:76;@Jbpuxst¹teQC87:;;<41//17;8503899;=DE@=>>;>HLNNJEJRZ_fp{wljihe`]XUK?2,,/2=<:86/153239BF>6875;GOOONLOSY[air|uigec_[[XUK@5026:DIQZblu|yuwxxwyvsnh`[WZ\`b_VKD;88?JU\^cbglmjilzÿztopqtxzzupooqtxz}{|ywvvx{}{tj\OOVft~yѰzx{{~yonw~}ʼ~{wzw{~yvqmlmw½ſ|n^W_^SNSXZYWY^^[b_alúij{zujjq{qqv»|xvvwyywvstuwuurqnmlomkjkjhf^XPID@=96/,++.7CLQSK<224=ESaiqȸjPOVi}ujb^\\^][`o~ızwzzl[J:5;?BE<98559=@CDFILQW^xƶ~oaXd{vi[TNKIRYh|ƾp]UQK=8578764.13/,/5?B8..,,5DRSSSTUWZ]_bistjeb^ZXYYWOB967>BJQXahqzxw{{}{}yuoib]Z[_cd`WJB>:6:DMRS]^flpmmo{vpjmlortsnkghkortuuurnlkmqsuu{||{yzz|}~}sdVRXiyѼҾnjjuzyqqy}ykxʸqklosyyxvwyzupljlwйxl\X_ZKGQSSRQU^baheen¶Ÿ{uulry{|yyxuropomikxÿ}yvsxyvsoortsspqoopoonnmlkjb^YSPLGB=611118BMMNG@;;@ACHJIFA>?BGHGGLMNT_v°kcm~xri_SKDHRWfz|vh[SMF=4122233333.++/3<9;2*($2O`c_\_WRZVY^gswj]\\W\c_aYLB>?FJQXbhjqzvsz}{|yrg`]^^eie_XMD;858?EGHP]hjmtxw{xtmf_^_dgfeeddeffffikmkheddcdjlswz{zyxsposvxwz{}{|kZRR_sűracnwz||{}|ynmt~ʺzvxtibbmga^age^\if\gtyïyh]USMEEHHHIMW_XOMWlƺĵ¶|}sy}~z|xx~zxvyuussrsprrqmifjo}¾{vrtwuqnpruutrrqppqqppponmfb]YWQMID<8764;AHJNIB?AES\gns}ŷojv¿~iZJCDEHMPPMHCBGILJMOOOVavsr~wnf\QICCKUdp}xxocTJFB;5/../012242.++,0659/'# 3Soztd\SPV[[^esxi]\[U]ief^RHEHNRW^gkms{xv|~}yrga__cimie[QF:735<@BAJWcglu||¾}wrle_YVW]^`^`^_aaa`acefedcaa__ceilmmmnmmklnruvz{}~o^TRZm³}siahqwz|}~lk}{romg`_cYROVgmbPLX^amuy~˲p_RKF?><::BKSQJDF[|ɾʵ~wyzvronorrqoqptvvsnhc_lwſ}wqsvuspqsuutsrrrrssstssrqkhda^ZVQMEA=:8<@AFMKEBHO^dmtyǻxvºĽøscRIHIMTTTQLHFHIOOQRPPUawʻxldXNFA?CN[ktvt~sh[RF?<95/+*+,-//00/.,,,/417/%5WnYOOT`^_drzk^][Wbqpph^TRU[^afnqst|z{xqgcbcjpsnh^SG;8679>>=EQ]cju~xpje^XSPQWXZY[Z\\^^]]_a`bcdca]\]^_`_``c`dfiknsvz|vdVQVgyȷuh_`cfqzz~ùsmc^ZUORVWVa|jLR`r}tpƮkRC:6875/5@D@>Cnüͷyxzwspquyxsqrtuvxwvtlbcnźº{upqsssssuwwvtssssstuvvuutolihfc]ZUPJD@<>>=;====AIS[frzsic]WQLMPTVXXZZ\]_`__`abdgjiga_\[YYWXZ^[bhkmpw|l\TTan|ǵ~o]URYfoy}ľykbVOLHEDCEVzڴe^qvmzͺ}\?/,497(&-4:NhŽӾ{wtvy||xvvwyyzwz}vmdjwļyqnopqttttuwutssssstuvwwwvsqonmjgb][UNFCB=:>DEBFPYimrw|î~ĵľp^QMKPX[\YUPLKLRSWXSNT`x~wk]RC=<@BCIOY\biv¿yk\RLD=8431,'&'(),...00/0..0071'.QeYURUW]dnxxkfb\h{}woifgknpsy|~~tmggiktxxph^TIEDBAA?><=BJT_m|tne^XRNJMOSSTUWY\^abbacdehkmmjeb[ZXWVX[`bgmquy{lc[`gs~}|~ѿ{hVRT^mxĽxi[NDBDEA97WФ~r̬v{rJ*"*3.2Nzȱu{wzλ|}}}{||~{uw|ypgiorqvԾžzpllmnrrrquusrsqssstuwxxxxvtttsrnkef`VNJG?98<>AHU]morw|ƶ|}~udWPLPX\\\YTOMMPUZ[VRWd}¹~wodVL=::?B@ACEDGM\op_RHD?930-+)&$&'((,,...-.--1281'#Arzm_UOS[bhkmmnosyunf^g{ytpnpuvx|}smjlnpxzwmf\UKHGGEC@=<:67]ܸǘstd9!,Oyƽ̷tzv|ʾ}sryyqjhhe^eǽ~|{{{|һſ|skjklnponrsrqqpqqqrtvwxzzywwxzzvrmpk_VRND9469ANZbpqtxƹ¾{k^UOSZ\^_[WROPPU^a\W_mþ|vof\OE@::?A?==8548H_vµygUG><830,))(&#%%&%((+**+++,0381'.T{m\MQW\^[YVZ^fr~vkagy}{xwx}}tportu{{vkc\VOKLNLID@?;:=FP_u}zuplgb^[VQLMMOOOORRY]befgijjjhgfeccaabdflqu~skfnxqigqɻ{kZ]adfjnot{oXPD95:>=4T֧ljij[4 +4^ʺǿʸv{}~ǽtr{|tmig`Wa·|vplifdcefjnqsstйujhhjmnkjqqponopprsuwyz||{{{}~zxtwqe\XTH8116BR`gstvyȾÿ¾pcZSU\]_`\WSPQPW`c`]dr}xph`WJ@B<;@C@=<;703D\uǿu`M>6610-)'('%%%$%%%&((('()+/47/& + 9`xdNQVYXSNJOU`p|qbfw{~|{z~~vsswyy}|vjb\XRPQSQMHCC;7:ALYo|xtnlheb_]YSMOPPPPPQSZ_dhjknnnkheddcdghjnqx}yoinwz~phr~Ƹp^PUWTPPQOX_imusicXB8:CI?V{ڲjeyzx}ɪ|KX͸ƶtz{x|~|xvvoeqyvurmf`]ZXVTTVWYY[\_do̶wlecehhhkmnmkjlortvy{{z{|{|}xmc_WL<,'/AUfpwvw~ŽþĿÿyh]XX\\_ca]WSQS[diebiw~vpg]WQHDBAAC@=@GAEHHTds}rYC5/1+%#%&'%""#####$%))&!!(14/(" +Cc~lZROURF@CJTfwzpotz{~~|vvx}zqi^YTUWZYULC><97:BOez{vsnhec_]`ba\UROONLNPQW[cilnpqpmifeggijlqw{yslntv{~xwhWH<:741./.6:@DGNYeþ_D4FOMYsŹŻsdiv|zseiu£w?:̹źz|~z|}Ȱ}wsomjd_WPHC<6000159>?NU`inwͶymfabccdhjkljijmqswz||||~}}~}qhcZN;,&/CVhqxwzſÿ~ma[Z\\`cb\WTSU[ejjhp||pjcYQJFA?<=DLW^eiq|sXB5--&! !###%&%%&&&&'))&!!'//*! "6Qj}~raVOOK@=BMXjzzuuy}xy{{qj`\VY[\\XPGA=:59>Kax|vomgb]ca`cge`XQONMKLNPV[cimortrnjgfhhjnqv{~ywtrnoqv~͹fTF6+&%$$%&()#%))+1:EU`gmӻeGNQW_tн;jXXadb\W^l{Ƕh>=aıýŷ~}{{ƶ}Ծ|qmjijf`XOJC<4+"!#4=JRTWi{ʳſ}pg`][Z]cghihgijmtv{}}~~vnf[N9*%/DXkuzz|½ƾþtg_]]`cfd`YUUU\fmmmu}wlg_TKFFEC><@CIS[kupS=1+)"%''&&&''&((&""&-*% +=OantqfZPMF?AHP[m{{y{}zpjba]`abb^TKF>:67<=BQd~yuqmibZUJMYdnoi`VSRQTWZ\]`egikootux{~~|yrmifb`_agkmnnnnoqrrpgca`adhjlgir}Ƕp:#  + FѠkcjx༚ƻı~{xwyo_K;3.+8DUlͿȹƶ~|{żslmu~¾~{{xqkh`YQG:+  +  *4IU_bl{l\LAAGQW]adfghnpstx{|rkaRB5-1BXkyýƿ¸{mc^eilljdbb[^gpvz~wtolibYNIMPOJHFM_qǾ}unkmolkjr|fC+!#'&'(()('$!   !% ''+7HR\`b^YTTT^bgmv}~}vnkjmmllnle[RMJEB@@DO_w{urqnkd\UILXepqme_[YVWXZ[]`dhknttvx||zwuroifcb^]^aglqrwx|~}xusssuvxtsvxz~˽rP*  CQLIKbpƽܿȳ~wvxxwm]MB96?JYjϺΰȵ~üľ|njp|Ƚze_`deeddd]UA9'  + )5GTOQezqm»|m\J=>DLT[`cdghknprvywmf^N=607H^p{ſ|nc^dfjlhebc]_gpw{|vph`[^WOPWXQJMLUg}ʻ{riglniejpxc@( #%%&%&'&&#"  !$"$-2) ('*6HR]ada[Z[\]ahot{~{|~xpljmnklnlg]TNKHECBBL[lx|xtrssoiaZKOYeprnfea\ZXXYZ]`ejnrxzxzxuonkgebcbaabfmtx{}zvsnls{~V3 +9|sFD;1DHYsɿæ͸yxwuwtgZOGFGS\oТ˸|zxqrz½hLGOSY_`^XLA/% +!   +*8EHN[ccc]MR{r]H;8>IPX^_`beimrux{zqe[RG>34@Qfw~Ŀsf`dgkopmgc^aekrx|ytple]XPQINZXOPIPar׾~umkkgeghr}a<" + + #%%#!!"! "! %*6CE9( $(-5GV`egf`ZY[Y]biot}spx}tpllkkklopkbZUQNJFGJLPbejpv}|wvwywwti[PTZfquuma^][XX\_bdioux{{|{||{xuspnkihhjhghlqw~{m_Z]bjtüqH'   ?|ѾQ- #)%4I_x׹Ŵxrppppmh_SOW`hwéمjʺzmmq{zľytv{ȿZ=;GX\`]XN?2  +!$$$$#  ):FQXYVJD6>h½u`K=:AIQY\\]`cimsvx|wrh]UKB925AUhx~uhbcfjlomgd_`cjqv}zuqmicZUQPILURKOOYkķxnkjfdekr}úa<  "##!!! '1=MQE5$#&*2;KWbfjga\Z[X\afnt}tmq||tnkjjilmqpld]XUQLIIJMNVZ^bjqx}|yxz{z{wm`UV\grvslb`^[YY\_cflsy}~|{{zxurponmlmnqorrv|~lZLIL\gxügD&1J|ëS. !'5FYnɿǣzplpqqqnh__jv~׷ߏpĻǻqefmx~z°yuxǭR6HT]filic^\]X[afnt}ykiou|tnlllkoosrnf`[WSPMMMOOPTVZaglo||}||{{{|~~}|xnbVW]hqvrkdb`\YY\^dipx~~||{yvsqqppqtwyx{|mUB75JYm~x_C(!(@X[:,'&&)/5@M]gvƻܵη~qjpqtuutosͦ󬈓ɼxj_bhuzǼz{ͯR8@S]]YM?.  +!#$'%((&'(% 1ILGF:4%,Xſ|iVHFLQW]]ZWX[ciry}~~wsf]TMG<422;Nbs}|¾ſ}neccginonmfdbhow~xpmifb\UPKKEHSST]bqʽuihikptzg>  "3H_h_Q>89CP[ejoopmf`^]Y\aels|mdejy}{tommnmqqtsogb\XTPOOONOOQSUZ_dgnooprvz|~zoaUV\gqvsleb`\YX[]ejr{~}{yxwwxy|pW>/'Rfu}|y¿¼qfddfgmopqkfbgmxyljfb]WNICFEOahlv|ɾxmcdjpzmE$ 1F_mg[PJLXfpx{ywvqic_^[]adkq{vheflqv{{tonopprrusohc]XURQQOMLMOPQTY\`bdfiov|zo`TV^irwungca^[Z]_hmu}~t[B/$5=Mas|vhP4 +&3=C@a÷hSIC<<73,(&$&5APgʾܺĶyquyz}Ο|ϔü½|qh_W]dq||xɼǸqE+,9BB=2'"&)--,2:8/"  0=DD?-/TſqbUTY\chg_WRQRYahorw{}}zuoib\TH@?=3017DWix~{pvžtieedfkoqsohbemw}yjfc^YSID@GMa~ƻxmfir{vQ2"0Hdwwlhehuyqhb^^_bdioxsmhdhlorwzsooqrstsvtpic_WWURSQNKKKLNPTY[^bgmu~zn`UU]isyxqifebaadgptz}~~{bG1%04=L`s|s]@ + $3@JQWwøqa[TKC;4,&',6F`{ϸӻvzҥƿzqibZTZbmx|xȿľa:##,21-&   +!&*,0-*/72'  +/798+0Vwg[Y`cjoofZRNIOU\`dimnomid_YUNB<>;216>I]my}joüxlgfdejnsvrjbdlv~yvhea[VME?ELXvʿzsv\?," " (5Nnwmfaaaccglt{vohhmoqsy~zspprtuwxxvrkfbZXWVTSOLJKMMORUY`enxzk]TV]ju|{unllkjkos{}gO8++-0;Nbs}~~}||{yy}pV5  +.?MZasƼvjf_UH?4-&!!'4Jbyڽûy}׵ŌƵwogb]TMU\jv}þürP/%('% %*--0-'*/* &***#+Uÿ{k_^dgntsi]RNEINQUX^bbca^[WRPK>8=;238AM`qz~}|hiy{oigdfinswukabjt~||yvqgd_ZRJB;KSbdI7.##"  !! ! !"&% "$$&&/AIYs½nWH@3-&#"#""!" &'#.*)),--,/6E`}vnhghfbdjrxvrrtx{yvsrsvwyzzwske`]\[XWSOOMNOPRTVYjsufYPS_nz}yvwxxz~u[>-('(-7DUdfrzzwwvux|aF-  '<:<>?ADJQVZfdee_YWYcky||}lcdr}ľzojecipvx|xqkjnw~{yxwwurrrpgaPYWMI@=Fiźɾ¿}od[G6& ',-*+-++-+((+..05>E[mú~rkcbadjmpsy~zywuuvxy}}~{voie`_]ZVTQRQROMOQUZdo~teWW]ft~|x~~~|{}y]F2(!1@`mvwvx|}z|wU0 + 1E[kw}ɽynhedd^VND<3/'*-1678;>:6472)"".>QdmiX@(  I|vssu|~oaQGA?>94678=CLYeow{}tjfdls||}{mjpx¼¾»}qldchoux{|wnilu½{xvvttqnmmha\LWRID@EUyƼȿÿ~o_I81-.-001-,)(&(09=CL]j¼zsd^[^ejot}Ʒzywvwxz{}}~{vokgca_\XUSRSQOMLOTYbo~~sdWV\iw}{~{yxxzz}~oV=,(9Yjwzzz||xz~uQ0  + "6Masvojgd`XQLIC@/-,,.-,,-24,,23;GMMGB>>:3-)&" !&2CUiznU>.&$$" ?n¾{yy|sfXNGC@942349@M`uwpqw~}{y~¿Ȼrlecjpuwy{yqlnu»zxvusqmjhfc\WOXPEBEQg»iUH@:<962/+)*1Xjy~|vnfc_\ZUL?3,& ':Of|ž¼ųx}ǽĴwmf_`^_`cfjnny~zrlgnwýījG9988;GRbnqkdaUQIECBAAELXkt]I<52-,++,/362120*" !CyȽqdWKD>9560115Fc¿~wogciotv||{wttxʽztsqpnlhc`]ZTORTKAFPe~̿¿ž~`TKHFFOZrĽuljkmdTQYdinsx{ɷxyz{|~|wrmjfc`\XVUVWVVSRRTX[gz{n_QSZgsz||~zrkhhls{xK0&B[w~~}ywwww|hK5# $@[lxʼ}wqjc^[RF<4.% (7Jaǿĸ½ͻvyʿʿyod[TSUX[_dhp|wpjucA79:<=O[nz~yspmh^YXZ]`ejun]PJF;97647:<@@B@6*6mʾwi\OGB<:=5216EeŽ||xpgcflqs}|{xvwz˽wrpnmkkga^[XRLOQH@FSgžĵʮzpmmq}üwlmwyjPEHW]hrw{dz~xyz{}}}ytolfc`[XVUVY[YVVUUWZfx{o_RX_jtyzy|xpjhhns{Y>)#&?Xq}~{{zzz}y^F8-&B\mw}¦zy|ribYPHA=6-% #1GfĻ÷˽Ʒyx̿znYPKJKOQVZ^clzxrôrV<8>ACFWfx|~|wx|xeZZSMGCCCFHPNPSM9(-etj[NHD@>;63;Kfʿɾxx}ĺ~rhcabipuwxyz{òunjklkfc_]ZVOILIHKLVj}ҽǶɻthphE58Gajv|zij~yyyz||}{wspjea][ZYY_\WTTTUXWfv|nd]]cowyvuv~~}tmknry~mXE>/ "/K]q{~{|xfR:&"0J`ikrzͿzvlbaXLGF;.#-Kcy÷ƹƾǷȿn\JFFA54?Xeqtppz~ý½kQ<;DHKO`n}rqjea[WTSUXXX\VC1&/fzp`QJFB?<84;Kc¸ÿźvty|~˼tha``ekrsvwy|пzqiffhfda^]ZVOJHHMSX\htȽ¿ɺľͼ±shp||a<+/Mir}}Ź}zzzzz|~}{wsqkgc^][ZY_\WSSRSVWfw{pfadit||yyz{uqptw~sbXG55@Tdv}~s[H<;BQ_efkrtvuj[URE7-# 3Hb¹ȹǶñ}mUB;80%'2`|zmltƼ~zycL:?LSW[jwzslhefdce_L9,/g¾xeUMHEC=96:EZw~vrsuvuvy~~~|Ҽuhc`^cioqux{}ɸzrib``b``^]\XUOKFHR^fgfhŵŮؼ{widkvuY5)2_z}}ú}zyyzzz|~}zvsqnje`^\[Z_\WRQQSUZhz{qiejpz~}}|yxy|zm[EDN_n}mbVSQTWW]byʴtzqgaSC8,"%9Okʺ{uzƶεȹym^N<3/'!-n¿qhv~Ⱦ}ysqv||]H:CT]bgs~|xvusphU@/0h¿{iXQLIIA<8;ANew}~ytrtrppuwvvx{zvsuwy}}vvyνxld__bhmoux{IJyrjc][]^_\[[[WSNLIMWhpmc_Ϸͽ̮ũ}txue__ffO20@u}xvuvwyz||yurpokfa_][[_\VQPOQS[j{zqnjsz{|~~~{gTOVlwrbRJGFLQmөvw|}sgWG9+%!"/=TqɽĴƺznd^RJ;4.&!+aɰoinsz|snn|ſ~vrruywZD8CVbjoyzq^F2!7mm\TPNNGB?=?FVcy{|¿zxxrpospklpvtroprwz}|z{}|xtuzſ|nfa_agkouy}ɾtkd_Z[]^_[\ZYVQNMOR]mtnbYíɺǿucZYXG3:Rʾ|xsrqruy{~~zwsqonjea_][[]\VQPQRT^l}zrqr~~}}z|~~~¿wf_ct}v\KFDHNg潒yrpx|m\J7/) #*3D`|Ƚ¸ƽ}qf\VVOG>:2( &9d˯{qfjstvxz~}yxsiibWSZtº|spporv~uXB7AWfqy{hO7)!BwtdZWSQNIECBBLVlw~z|vqoqnkoz|tqruvttttutuyrjd`cfkovz~·}ne_ZY[^`a]][WSQPPVYeqvl_UɶĻȿʻ׺o^TTH9Gdǹzwsrqsw{}}xuqomkgc_]\[Z\YUQQRSVbn~zuw{}}}z|~~}{|}ľvnmyhTJHNUmȦqmvp\G92*$%+.4FdĺĸǻͶweni`WPOSTMG@6(3V~i^[X\dgjnrx|}xrnligdbaZNPI>2;ThwuY?2'%O{j`[VSQOLIHELSgu{x{~½xrsuwvqrqrspoqw|wmfbchkouz~xi`[WX[`bc`_\WQOPRY^juvj[Q«̾Ŀ̱Ƹ{dUWPFTs~{xwwy|{vromlgc_\[[ZZ\YUQRTVXeq}x}~¼º~w|wbVT\f|ԽlTE=65:;831222452(.(1`½}vrmhcfefgjkjiruxz}sYE7UqpdG0$Bm¾~tj_XWZ[XQLMOVf~{ux}ձwhdejpv¹¿vi^\ahlrvvy~zn^UTTY`efe]WTUSTW]`_lznPELĽwWNg˵dz´ž̵qkkuƻ̧}zywtsqookgcbdeb`__\[XY\_erzy޺uǹ»¾s`\cns{phktǽ¶~vuȷ࿒^RKTcklkilbI71.+)2G^s±rX<6+ +Bv}wtmf`[XWWWVUTZ^bgklllqvww}{nXD507Ke}w{sU8:Xsiadcc^XRQQT_t|wzȪ{rty{nb_`eiprsty~pjjf_VVZahkif`[UUUSW\iimo]HGWƶfTXu¯v\U\Żž½°Ш~Ҭ}{z{{{{{zyxwxxskecdgikmooqtu{z⻋użľ̽ý½¿{jZW]enwǽһznknuƾԯ\bppjpxfZ[[V_juvnfo|tt|sV2 + +  + +2ü~zumh`_ZWUTQPPT\fpvxwrh[UZ_]TF7+/=Pal_gviJGbyneghe`[WURUas}x|ýͺ~oc_`choqqrv|ugcddb_`cippkf^XTTTRV[jfd_NAJ^Źs`e|ǻxhdqɹƿ¹°¯|ծ~zyxwz{||}|zzz{|vmfdfkmprtuvw}xtuẋvȿŵ~odfotzŻêypkmw˿Ζiiwuqx}nimlgnx~refpu\dyhG&     9žzuogc`[YWVTRV\gu}xiUIHHD>:/(,4:@EEQgrWUkƿtkljgd`[XWYbq~y~¿ŹǺýtf`abfnpppsz|l_[\`begjpuskeYTQSUVZamd^VICRgƭ|Ŀȿ~rlqÿƿϾ|ج~}}|zyvvvw{|}~~}{z{|{vnighnoqrsssv}ypnp{ÿṌxʾǽxlow{}ŽDZ}xsqmjmtĽݦwr|~~vuzzsszxjhmyQOgwpaH, +   !$Oƾ~{woje`_][[XZ_jzlTC<72//**.1,'%0?[yn[^sĿ{romkhda]ZZcqz~vgbbaempooqx}{~tcVPRY^eglrvsjbYTRTVX\cg^VPHGUiƹȿʴbTkοxtlqz~xvwrvtjn}~|ب~{{zxwuvwx}~}{|{yupmmmqqqonnmpxwpnow~y}½ຐ~ʾþsqtx{ɶummkiimx급{{yvx}xpq~YMTUQH8& # ,@jƺ}uqjfecbbYY^hvqWC6.)')&+11&"5Tvplqtvg_g}źºwpolieb][X_n~zǻtfab`eknompv{wvz}|o]PHJQ[cekquqg_\WTUTUZaZSJFBCPaȽűvW?TҾ˴ƴ{f[War~ogfh`gdZgx{}||~~֥}}zzywvuvyz~|{{vtqqqqponmjggjq~zrnnqvx|ÿ޻°˾}uyͼ|tlnkiio|ĺē~yx|utzhUN?;6-! & 4Pzɸ}zvplkllka\]alu~~ueTD7,&').31).KmsZPW^_]ao˽~xklnou¾{rojge`\[U[fx}{½¾}pe`\]`fjmprv}{utpnryxjZJ=6BQaekomg\VOLMRXXRKOF@???FOhq~ŸsKEHdƵŲԶx^JL[uq`_^ZWTSWgzvqnu~zyxvv{Ӡ||zsv{~|}~||yvwxvrnnhghfabgnyrkhhmqww~¸¿ٿĽ°Ƽʿ{uw{srnlrʲب}o}|xx{~nXH40,& ! %9_ɿ{uplnpro`\\_hpv{}xoeZNB;20..0+%,GesWJMQX]iyƽthc]__`dlv{}uqlgda_\UYeu~{x~žż·ykb\Y\^cgkoqty~~xtrolovvkYI94@Q^ciljaVPHGFIORMHE>:563.' (7Jby¿q]QSWbfpui\UPONYZ[\]`dgjox{ulkjji__eq~z}ϼȲ¼znf`cceinprsuz}wrnjdcionfUB9>IV]dgcZPLJKMQW[]^`\Z]``]YOQRQMJIIHQ_jvӻm__p¿̸Ȳq_V\gu|tnquwx{yn^_`jykjv}qlmqvz~~|{|Ř{yz{}~|xusrqpnlhc^ZVTUUTSUV`elqsnf^PF?>?>@BFEGHHRgz̦ʽǿĻ~yxww|ƺĽ͹wqnps|ܵyy~wryxslho|v`MIMA9."%$2Gn}}|{yyxyy|~m^MB?8/&!&0=Slžyj]U[bhehv~xslhe^TMLNQRVY\`aacdfejtwomlllcbfpͺѻ»vlfccdhmrrtw|ztpib`dprn_L><@MV^a]VQNPSX\bfkntqqqtxxwhjmmib\Y]_ccfp~ɪ~mb^iϿ{̽zgWcfilqplhjoy}acjxÓnhq{~zrhcdgqu}ś}zxz~|xuqpnlhc\WTRSSXWUSPNJKLLIE?90,,14112/111,-8DWp¿Ѫż|uuvustϼþª~||wuurtvϨov{rvphcenz|o`QFCD@:.""'2Bb~~~{n^PI?4+&(-5Ha}{jaXSZcfcepxphcc`[WSNHEGKNOTV^bcdedb_akr{yronmlddgqóȷ}wutmhhlruyz~}vph__botpbQC<9DKVYXUSTY_glqtz}|vqmlkԹvdQOgƿʽsoŹudWmmjeinqrswjhoɟ}ruz~|vngb`_nrzǞýyxwx|}ytslhd[TPSTX\\XTOIB1/+*'$ (----+()%#;SnӬ·Ĺû{}}urz®ſƾѷ|yvsv}zz}ܾql{{w|uulcafnrsreVNG@::B=6,#%'-:ERpþ{l\RF=6--.1AYv»|k]YUQXadisz~ypgb_[\__[WRNKHHHHGSX`effedb^`iklz|tromkddisǸļznmrw}~{sh``cnpk^PE<4>HRWWX\`lv~skh~ǰrXDI\½̷qmƻtlsslgn{Ȳ}vqmhmqx~ȟü||zz{~}xuojd[UX_ehh`RF>4, &&%')&$# +  (7Vpֲź}qpµ}syй¸ˮzwxyxv{}|}ƾ˫poyxsu}|tpjcbdfc`\SJHD?<=CA?90&!$&+.6AEJV`crsbWKEA3100=Tq~o_UWVSYbgso_VYUY\eec]YVSOKHDAPW^dedb`dbejg`fswſ|wronldflwƻлͽƯzprxwnddhpogXNG=3?HRXZ]djÿaqϹgF57lÿĪxtüwyrmxªxnpw|ȟ~xwyzvuph_]alvuscK:, # #!8QfڵýǸr`UjǺwyɤĿµȬsqu{~{yy}¼ǡzcrxpptvpjgdb`\VQNJFHGDDHDFGB:/&! #%#%*/=CP\cgqxwtuy}vi`VPL?847EWqǺh]SPRUakww[WQW^`Y[abhkhb^WQ\`diigdbceigfdfgjyºxvsnjklhlzͳ{xŷƻtx}{qs{}zp]LB=6:FU\afq{ý}~ȼrXC]ϻƿtmsϼĖ|yvqhagpurpbM<- "%"#$$ .;[u߸̾lbftϵ»{tv|}~ܸxcjlmsmmhec`_\XTLHHGHHLNOPOJC;64-,-368?GOZitzxoxĻ{ph]VRG?;=J\uøxaSKLOP\iſpYTW][W]jq{|vmgjkmmljhgefghffgfeoùvsqnknrouŸվzz||˰¬}|u_LD>9BEJOU\dnyiO6/5?HNͼ}||}zvyzrmqyûзo\W[_`^ZYZ\VQNFBQeó¶ȳӽɳu|n^[fr˾w¸ɵ|w˹ü}mc^UPJK^qz|t|twvsrt{˼yĿ}||zyyxxxxxxy|~~~}|xxxyxy~wl`UJGKNTVV]eljgfc_[VTRQPNNPTZ^cabbb^XSJECBB<3)#$(%$@bƿļ|zwy}|uprx²z{qkknmlnzɾ̿¾ÿթ{O."#"#(,+($#$)069247KpƹĿ͸ȱмu_^dlsð{e[[euƽ}nhtƴyuvz|}fWOPOHCEOXbfjihlzx||iZUNU[cp~l`\NF@<>ELNMex̺u{~|xwvuuuvvvvvvwwwwyyz{}saWNBBK[fpu~}{wurqoid_cabcfeda]bd^RJIJFC@?:3.*$!Oºϵºtoqvz}vruvtportz~ů~zywvf]YYYXWYlſɻ¿¿гL**3:<>80 "*2:?EIMRX`nucPHGLQƿ¹k]RPVXPF@=:5.+,,?f־ϵһźϽx\\agjsͿm[UYer}żsikzƽ}uqpqsuwwzyeTKDIKE=BDKn|pjvȷ|~k[VQGFP[k{xpjfcbdded`eibVOQTNLIFC;5.!?s½ƾ٭uopsvwtx~ppokihloy~ƽxwsq\XWXVTW_zȾ¾ɾ˽վ]- (489:3)(1:ABGJNS\is|ľhRGEIPúúֹo[RUVMB<73.***(5^ǾǷºö˷vYX^_^cxǶ{cSRZfozûre`fzshgjpxz{ywz{uhYMGGLPNIGMTVZccbadgnry|wsut\JBGVgv}gJ70$0467<@Kr{^VoĴ~vbTSSIIU^r|vpijhkjiknmidb`]]ZWPH?4''1Yûöݬɿwpqw~}qlkv|kkifffjlz|uqnlYXYYUU_l˿þȿɪt6%3655,'2*' #,(0E^othhʺvntzv_OMPLO[p}vmaTG891;nɿvqv|l[Xaloncdfdegmru|źxuogcba`^\`qƸxvxʽɿüĵѥZ49,( (2=BDJPRVZcjmu˿ePB;99ɾŻĽ|tvſĽzٻf\UOE;41/.*$DrɿſƺûdLIKLINax^QLQ[cnxvg[TWi{ƽ}jQQU_mtsnlloqojc_^[XWXYWVUX[_bcddd``cmpppurYG?I[izi@./.)%&1Gcoqilɹwnlyyrwxuzq\MNOMR]rǿ~qaS@>/2cĽȽ{rls|kYRXbgfeffedgknu}utwuomkiiiejzuppv}~¾Ž޸m(04*$ )4C6!$6NjppmtƸwnixzprqlorxlXJMPNS`uÿo`NH68eüĹwmen~mXMPX^agghgefint}woow~{zz{x{ƽvlnpstwxplkjgpǿý͇C+2+$ + !-5:=BIQVY^djrx}l`SJB>:7Ĺ¹ǾvviXOJ8/&"%%!1YҾ~y}þȾvZECFIKLXfqSLNXbipxĽ˻}vh[QQ^l̼n\QLNSTVZ]_Y[aefedchfda^[XXYYYYZZ[YYWUVZ_abnwnQ<6AUcn}QBLP@%+>Xqqqtĵxps}|yrtquz}|gTHLNMR`wýwhROAEoŽujcj}p[NLRY_egghfhknu~rqxŹ|tssqopw~¾|{yuokkllmnopstrg\TRTTNSjƾľ٠f'*3,' $/367:ȼĿ÷ºƻrf\J8& %$! *Cmз}mbdn~zrpuz~~ĵs[HHKRUTTZmuUMNYbjszzqjhnu̸plpzwh]V]q¥qeYUWZ]^^^^``WXXVRRUYgmofWOT^`^[YVWYZ_^^[\^`ciovuplmpussq]@-+:LXanxhMCG=*&:Pbsz}zp{ŽuuaRJMNJRay¼q`XFFoȾжǵrmilqx{zuodVJGLQ[^dhlpuy}δ{rmkhsxpnjfjjjmnmkhjjkmooppfe^UJA;;601Ec|rtʬP,,.,( +).,3@LSY^belqy{}|vnc\YWXVOJFDDEFB=:űƾ˾ſxǻzcM2# "!&=iʳrehw~{xspqruuwy}ĺmZLKPXZXUXfzYONVais{|od]`fq¬{l`^hҲrd_YX[WY[^`beb^_`]WUWZeijaUPW`ca]ZYZ[\``bcdeghinspkhkonkkkX:)):LXbq{zU<<6(,JducTU`nyºys\OHLOKTdzsb[IJrǵ®yvxonmnnqsutsl_PGFITY`fnu{}~Ūztogitnfb_XRSXZZ[\^_```__]]`]ZWSMHE>89EYjx}¸ջ_4*('% + -.)5GU[`dgkqv||~}uohbZMHHIJIJIFEDDDC>;ȱüĺ}¹w\>( !8gİqj~uouxwtpnnqqux¿ƿhWOPU]c^YYcz}XOLT_ht|zj^]alô}lbbrǦf]]ZZ^RSX\bdfbdgig`\\]edb[TSY`dc^[Z[\^^adfhilmjoroigkqkgihV8%';OZevʯ_>40)0RovUB9BOZgw¸|rYMHMONVh|ſvWTHNvкп~pnqjnpnlmpqwyuhVIEFQV`hpx~vu~Ż|tidlx{xyüubYVRKIJPQPRY^[[YYWUSSVSSUZZWVMIFNXclrƽؽg7($" #/-'5K\bfiknuz||}|~|slc[UQI=9;=>ADFFCCBA@=:ε˿ŹuzywyY6& 0aµwsɭsny|urxooopsssqzɾȽþ¶vhZW]cebabffo{\NLU_hutjijr}q\\nƮybY[``]OSXZ[`fjglrrlgeeeda[UW]ejgc^[ZYZ\\_eopohhklifhlqkffh[<&#?TcjsϽqB6-1;OplN@98219:87:>?><:8889ǰþ̽žymdenyyu_F-(Zμsx|jjpoonnoqszȾʿþĹrdVZ_dfedfjbi{|\QOXbiutpsyza_qӻzl`Y]_^YVY^^_chkjnpnidcefe`[X\cjlic^YWUURSW`jppmcfigeglqnjllY:#!AVelwĬVD:;CQl}q~pQD>;:8:AKS_l~xaNEBHOR]j~ļv[OM]qԽʹ´{qhdghihd^bjfUST\ejr~|wvvz³|ytkedhlszwwu\NGDB=;=CKQUUUTONMNOPNH@?FOZ_efryluЊ\=. + &#/Rn{|uv}~yvrmh`XLE><>AA<33863147767677:;įļżƿ{x{tmf_XY^r}xkijr~|raPB3##Qɷ~r׸jafegedfkprzʿĿļýƽh[P\`cbbceh^dsx\RS[biu{t{x{ùb^sfb_^ba^Z\]bbccgikllhb_`cdb^\\ahmjgaZUQONJJMT^fhh`accadjnklqnX8#!>RcmxƴiYMJMUiyvixoULCC>722:AMXiw·|{wsttgVGCDJQTaosYNKTaqԺyqhceijhc_gryd[[_goyysprxȺvka^afpxuntzgTGDDBA;=CJPSSROLKIJMOMKEDHS[aemyus|ƿةyP8#  %,Qp~{z~|ytoibZPF>778>ACA=<<83/121123469:ʵ¼tsz}skd^][[^dq~rjdbittm[OI@2.'!&Np~Ιrc[Z\\\`ionsȿƿʿ{cYPY[_aaabd`aly}pVPS[biw{xyzzxc_uèk_`begdc`]_bdddechihc_[[[^]]]bfijgd^XSONMLKKNTZ]^_acbabfjhlrnX8$"7I\jtɽ|h[XX\kxwu|iYSJLKF>=EMTYcku}Ļ~xqj_\VQSXQJCAFOX[ixn\NFKXlϼunfcchigbbo}vgeglvqkiq}°~lfbdhfhhmgo{xk\KB@@AA<>CIOQQPKIGGHJMMLIIMV_djs{|ǼǗa<%"(!*Ml|}|wof`XPJC;:89;>@A??>;61-./.00/0145¿Ϳs|¼һѻ¹¯yoq|}rkid_adgowwdUW]ZM9/0.%('$%K|ɶxiϠvbXTRQRXailp|ļȿʿyd_XVY]``a__daeluunePLOZck|}xtrv|ph{̺mc`addecdc^`cefedbbbba]XUTWW[`eeda`]YTQOOOOMKKOSVYddedbcdehouoY:%.@UfqzǬxicdfsxgZSLOVUPPV]_adelt~zwsle]UMIA<505<@?CBFU]er|h\OFJ]xƯynidcilifdgvİwjinyziderʻžzheekjb]Xa`o~ndecUIA?@?>=?DINPNMHEDCEGKKIIJR[cinu|¾ƽ۫k<&!*&!1Niwyqh\RIA=:95;:;<>=>==;83.,.021/--,--¿ǭ{Ʀ®wvzustolmpugTTWTG4,..(--* !Dqʾ{uěxcZSJGIOSYgqϺ¼Ǽvhhf`_aba`^\ea^^eheaPJLWeqƯzū{^]^]\[\\]^__bgjigb\]][YURMQV\aba][ZXURQQRSQPNNPTX[ffeeeddblrxpZ=&*<>DHLLJIDA@@ADEHEIOU^dglmtĿ»ߴn9'&),,9Ugs{zpg\QI@83246577:<:;=?<961/023752.,*)(Ͼܾ¾yz~~{|}˭lWV\\UF?><4882$9`ɿηvj\PJNRVZj̭tnsrrnida`^]aZTTZ`bcXNMYgv¼̹qZWYURPSUUV[\`djifbZXVUTPOMSX^^[XWWUTQPOQRTTSRQRTX]deeeeedbkrvqaG/ '9Shonuɻxkc[[XZZYZ^bmnsuwz}ungbabchlpstvsrpljfdddca`^\[[Z[]`dhkjjjiiiiiihgeb_[YURLD;4/-,*,09BMWTNN_p|{hPJFOkȷxf]]_dwrhjp}xliu|seSVb|±ƻwle_]ZSPOPXciga]ZSLHECA?<:<@DGGFC?<;;<=BDCJRY`cddcitýױk6*!$)01=T^eg^UME=71//246468:;<=@C@=734578<962.++*˸ӿĿ||qv~۽tYU`dbXRQK@CB8) /RƲqb]`gjkz¤fbn}¹rrzzzofa``a[TNNU]dh^SNZj{ýšүo]RTOKKOQQOTW\ahhc_ZWRNNNONVY]\WSUXUSQPOQSTZYXVUUX\bbcdegfdgnurgR:*#6Qhnimvodfgf`\Z\]cfinswyvvyzod^[][Z]_dhjfdc_\VRONNLLKJJKKKLNSX]```aabccd^^]\[YWVSQMF>85323:CMWalbXWh|¿Ŀ|lSJAJhѾҼt`WZ`dhaY\j{ȝoekofYLQbƼȼvb\YZXSQOQW]]]_\RKECBB?<98:>@DCA>=9679==?BEE@:678;:50---Ȥûſ|nt}~riuş{e\isumih`QQI=1(! &Ipĸӻoow}~~ʥjVDD[xxlm||th]\aZSJGUiw}se[al{ýֿϥyi]HFECDHIJIOPUWYXVUOOPPQQRQVY\\YUSRRSSQPPSUY[]\ZWVZ`cdffea_ekrtshP:13B]not|ź|keikgdcba`ceknqrqpmot|uhddecaacgjka]\VSOLJIGEEEGJKJKMPTX[]^]^`bcbaba^[YWUURSSPIC?=@BIR`jqvr\\uÿ¾mXJ@LlͻĿt`Y]\YYWY_l޵mb`e_P>LeƽȾ}seb`bjqnc[\_ejlf]MCBFF?8326;@@>=:41//147=FO[`a^\[\bilrĿƼͦpB)!! '+,.58?;70)&'(%(-/2358<>AAACFGCCB?=;>?A@>;:865ϭűûyprzyzxqgetȦtmyve_UI=1*! <]ľpYE>9;MhĽwnadryzvk_[^WSORd{ylmtֿ̝pd]IBA??CEGFIJNOPPPOLMPRUUVVWXZZXUSSUVUTQQRTUX[[YWVV^adefcb`agowys^L88F]oszľuhbfeb`bbaabdgjjjjheghot{}wtrnomlklje`^ZVSPPPNLLLNRRSRVW\^ddgeffjhiegdc_^Z[Y[Z]XTLJGGIQ\hqvxs_d}{|}}s_OCOnòÿſte]ZWTSXan{幐reab\L@Pkú|wy{xy|tnlpwyqfRGCFF>64359<:9640-,,028>>>?>>>ٹսº̽wrpwumb]]dvͱwpeXI>3+$+EiƸhQD7:>CK_yþ~pcTWciqqrtmaZYTTWbxÿ¦Ì`[ZF@>;:=?@?@ACDFGJKJMRUZ\]\XYZXUSRSUUUSOMMNNRWYXUSU[_adedcb_cktpbGCJ]qzƽ{mfcc_]\`aa`abddedb_]_\acflpsww}~|zwtplheba^ZWUUVUTVVXZ[[[^`dgklnlllnmlihed`_\\[ZZ\YUOMKHKQ\goqqo`k~zxmmljmr{{gWJTrȽſļ~og]RQVcrݷymfe]KEXvü½tp|_QKKH?965565310.,*)),05;@JRVVTROPW]ZY_r|nmxɨuG)"# !$$!  ((,.049=@BDEDDGHHEB@><==9;>?ABCDŨý·~yvqu|qcUQXfwӽ~rdUF:/'!2SwþμtcVOMGKMKN]u¿ürcOLRUY\emnf\YWZboʰѴxONUEC>968999;<>ADHKMNOU[_``_\[[XTQOORSSPLHFFINTWWTRRY[``bbcaccfn{|t\UUar}Ŀtjgdb[UV\_`______\ZWVXUZYY]`cgjpy}yqjdba_][ZXWYYYYZ]]^_`behloqpnmmmljgdb`^[ZYYUWYWSOLKHJOYekkjh`n}wutpkf`\^diknxo^R^|Ľsg`SEQg~uoncNK_}ĽsrͼtdWRLD=:5541-+)((&%%)-4:@HNPNLKGJPTPKM\p|saRTfyŨ{H) #& ##!*,./15;>?CDEDDHGDA><<::978:;>??@շȲĽ~yuopvyxiZNNYhuĭzn^N@4+"$>ažzm\PJJLPKGDL]rͽ|vtuxƿ|nUKFACIWhsnf`^bkyҼƢiEHRFF@;64555:;?CHMQTQTY\^^][\\[UPMKLMOOMIDA@CHOSSQOPVY\]_^__gfcfnz||pkejs}zmgfd_VNQX\]\[\XVVSQOPRTWWUWXZ\cir|ypjc][ZYXYXWXYZZZ[ZZ_`adgkmoonllkjgd`_][YXWWWY[ZVRPOKKR\jppoiev~uqpqxpg]WUXZ]_gs~td[hüvdVRC>ABDCCEEC?>=?>;899;:::;;ɮͺƻuohkklpsoj^SLOZft~ufVF7-%.LžǶsrtrdXNHHKKF?:=Mcy¨}j_XUTT]tŽ}cRH9:@Pfvvoihmw˵ֹ`ADNIF@:42356<>CHMRUWTVWXXVSRWWURNJHHKMPOKFBACHMPQONPUXYXZZ[\feb^dov{}vruzzpfddb\UPRWZZYWWPOMKKJLPW[[ZYXWX_enwyqkd[YYYYY[[[[]^][ZY^^`behkmomlkkjgd`_][YXXXWY[ZWSPPLLQ_nwwvspyqjhgoh`WTSUVVX_l}ofbcfgiikpx|}}}xh^meTGC>BeƸ{jOOj½̻m]OC<9630,&! !"'-5==>;87ANn{xsqrmdYN;0;NauP) (+(%# #&'+-03459:<=@ABADDD@>?CB@<=<=;;:::ּ~oe`ba\[][YVPLR[gu|n_O>1)"#AEIMPSSRRQPOMJHILNMIFDDFJMNJFB@DHLOONNQTUUVWWXX]ab]_gpyzvzvohdcfda[WX[[YUSRNLIIIKPT^bdec_[Z^dlv~voie^[[\^__`bcddc`][]]_adgikljihhgdb_^\ZYXWWUWYWTPMLKIO^o|}{wmfcUPKHIKNOVX`q~hXNJOMNPX`hlnoqx{i^kļpWE:;CRpļ~{kOLl¾½ýɰybPC;720.("%-6=@EJKKFC=733224>?@CCB?=?EEB=::<;<;==őξ{iZVXXPMMMMQONT]iztcP?2.&  6aͽ˨xdTFE:8=GKIB9:@Nat˫r\MHIJIJYyǸĻ|{wwi\J<>McvvneszŭΜmP=:CF@;3/059EHKMMMNQUUUUUUVVV]c_^enw~xzqddb`bdfda^\_]XTQOQNLLMOSYagknle`\^emt}unjfbbcdefeeijkkifa_^^`begkkigfefdc_^\\YXVWVXY\YWQPOLMRauvlfVTPQUX[\X]gxjUHCDA@DO[adfgjs~i[fºüsdM=29Lax|vwjQJn¼lWH?;1.-(# %,4<=@AEMUYYbovyyxʮwc[^bb`\fŷȺy|q~wgZCAMfxwh[iºìZA;:9<356534:@=@CB?=>A@BCDB=8479;5/+-27=@AAƿżõ}iQ@8?DD@@DGTPQW_i{¾w`I6+-*)($"$7b½ֳjPCAEHKPVYakvӽyprtropw¾Żuqtx~naMLVm~}rfsȵ˼÷UABA>;32127=BD=<<=>?>>?@@?=94225:>@?=<=@B?<989?ADGLNPRYYWUUVXWTY_cgiloz}wqpng\WTUVXYYZ]a_``_\[[[[XWVVY]ajqvzyqidabfks|xnhe_]^^[Z[[\[[\_`abceggghkmiigeca`_ZYXVVVWXWYZ[YVSQLPVby}xvvvtoqxm^VSVXYXY\_aado|l`f˿~vl\NA@BOf}}smmpriXIMxȽýԿiVLD511-)&&)-,**.103(/563211225:<<:==LWagoö~wm`OC6-,5FXm¿b1'1/*&$%&'&$())&%!!!*+25964345567889;<<==951('(*06<>ܿ¾ýùƹwfP@25:?AACESTY`go~w`K9/-(&$!$:gɽƮz]GCEIMOQTalzӾmimxjbahz}szοsE6>DB><735:79=@@=>><:741/-29<;:;===><:9:;?@CEJMQS\\[ZYWWWZZ]`beinvzof_YX[YSSRVTTSRVY][\\[ZZZ[WWWXZ^cfimpsxwqmihfjqz{ohda_\ZXTPOPPPRUY_adfhhghikjigeca`_YYXXYZ[[VX[]\YURMQU`v||ɮtjdjnld^^aadky}pflķĵ|pcTGKNWg{{{wrqtupdelrq`M?OwƹǼĬt_QG<6655200+,*+,//0*4860*(/28;:87<@GJOWdzŷ|rbO@5./:LauĿƵi7+1-*''%#$'(...,*'&'*,147653220012468;>?<864*% "*16ɪ˻vgSB017>CDDFSYdnsx~fO=3-'"'>nľǷӾkQHCFHJLO\gwóľ|lhnxvvzxƶ¾̟m<+8HMME@;9;>?=A>;;=@@@<;8520.-,3:<:9=;:;<=?@DHLNRZ\][]ZXV]]][_`fnv}tj_XNKLNMOQUQOMNPVXXWURPQTVSSUUX\`ca`bfnomjfdadlu{rlhgd_\XUPLIGGIMT[_bdffedefgfec`^\[WWXXYZ[\UWZ[YUQNQSV]r̵uwxupnqtqvsmv´wj]QJQYfwzwpigjliZ_musaOFYyĹz}ʴgVIC>==>=74..-,+**)&273*$'/79635=DDBGM\sɹ~|wp`M>4-/=Qdxʸk:.4/)((&##(,0121-++*./25755320.--/235;@@=8890) #&㻜~¹vhSC1/6>CBCHXeu|¼kUB6,& (BuĹø}eUFDEGLPZfvɾ¼{lksxƹ֯G-4DPSFEC>968;CCB?;;?B8641/...07=?<;>BCB@?=>>>>>@BGJMQVY[\^]\Y_]\Z]bip~~zwoeVJDFJMQUPMJILOSURPJECDIMPQSSUWYZYVUX_ccb_\Y\clv~ɽ|uonhc`]ZWSJGGHLRY]bdfgeddeedb`][YXUVWWXYYYVWYXVQLJRUW^n»λ}zy²÷{ncYTOQ[kyzpfbdfdV[jtscWVe~üvqv~~rlмp\NKECCCB<87630*'$"!&01-$!*46415=A@?AHSh|˽|uqleWE80+/?Ufwκj;/83*((&#$),.0221.//2124553210-,+-/13:AA@<;<5-%ڰȹvhS@306@B?DLcsºmVA6,%)DxƯmVONORXbkzûƿxmoyǽӻ_=4:?@>>@=869<@AB>869>2210000059>?>=?BCBAACBA?@BBDGJNQSVY[^^^]]\\Z`enw{zxriQGAFNRVYKJHKOTUUOKE?=>DHRQSTTUSUURQQTUUVZZYY_iuyrkc^^^\XOKJJMSY]dgijigghdca^\YWVTUUVUUTSVVVTQLHFSVY^mĸyocZSPLQXfo{{}}yqgbba\RS^klb`ek}Ϻvw~ug^wпyfZSOMKKHDA?>;4+$!#%-/*"'14316;==4+%*DużƮmca_`hpv¹vmrʴqZK=4548:;;;;88653223-./012348:;=====?>?BFHFDGGGHKNPSUXZ[__`_[[\]ckv}z{xqcMDCMVWVUHHKPW[ZXRQNJGHKNVVXYYYVWUTRNLJKMRTTQT]k}sh_Z[\[XRPONRW\_ehklkjjjfec`]ZXWUUUUSQONPONKIFDBPVZ`pĽ½ƾѿvnbWPIEADIQU^mzvsx{ytpqplhe^WOKTbg`bkrʻtw~sa[nwi^USRPMJIKDD@8.%#"$-/+#"(1543469:==;>Pfvld]TH:/+(0F_s¡pC6:2,'$$$$$#$(,/369851100000/-++*((*/36:><9632-'! ̩~¼ǵwkUC87?HHEPb{ǼxaL;2+% *CmϽĽurmlsx~voxõʯrWD3026=@=80.*,/0-)*,.13566998:<<;:<@NUZ`qŽŻμoeYNJB;6/269?Qcruphhnqmdeiopmh^SMHO^dacm~ûshlyqaZh{ızkaXONOLHFHKIIF>3*&!%/1/'"&+265333::>=79Kcyukd^UH:.,)2JgyŦuH89/,&##%%# "&+047;;30/...//--++*'&(//16<;73530,' ۼŸøxiWKABKWVQVf½s_L=7+$ (=a~Ļ巜ϴvpw}Ž;üvr}ǿ˺ëeQ?22789;4,)//'"&)*-27;;;:9767888:=AEIIMMNMNMORVZ_`abcba^WTZgszvic^MRXXUQJ?:@HPY`cbb``cba`_ca`cfgcac]QID@>;:<;87AN_v¾r_SRUWWUSRSW\^_aceedcdecccb`^]\WWVTRNKIGD@:66:?FMVatö¶ϵue\TJC:2,& );O`da[`dc\VZflon`RRFEKV_ep}ľzsilx~{t{{zvtv}ynf[`wȼvi_XQLBBDCBBHLGFB=82.%''-1/*%$'*/1100.59?=89FRtrhc^Q@3,,7OoЬxM9644-'""#$! #(-37::1,+*)*+,.,)(('()..+.352../122+#αx|ϼ°yl]TMO[ff]`jveRC;1*# (<[xþ͘wyҸ|u|}vsĽžɺֽ{cJ<522662..*&#%*+.169;;:9888877:=ADGJKMPOOOPSY\abeefedb][an||l]ZZ_bd\OD9-*,6BP^hjhedeggfffeehlliecYK?;97679856?M\r~k\XXXWVSQRUY\\^_``^]^`````_^]\YYXWTQNLJGB=:9:<>ER_jxüvw~xnnoollnuz|{phbY_r´tg]QHB>;6547:>>>;=GSoķznjg[J;03?WuΧsI:=@@7,$!""!$(-3799.,(&''**-,*()()*--+-22/*&'+/31-)Ը}suxȶԿ|yyzzrf^Zamzxlgjup_LA70&""/A\w¾loz¹ƻytt¾üͻвvT<.+.572*#"%%,,-/269;::;;:866:,%;Q`hieccgihfeehkolfa\PA40-./120/1:6:EWvºüϹvc\RHA<842&,>NVTOOLIGFOch]XOA946>M]n{qqrrqrsw|xthaaY^ovk\OGA=9::842,*.4763:9;=??@?58<<70(""$(**'&%07?BABJUj}Ƚ|xwmZH8;Ib}ɞkE:GPTD2%!"# $(-3685,'$!"#&&+*))*)*-,--/1/*' !&+1454£{vssvͽ|vssuyulddm|xkfi|{pmsnYJ;2)$#+8Kf¾•|˸ſ·ú~vryſ~r}ƹå~X:,'/62$!'&,,,,-058:<>><977:<=@BDFGLKJIMSY]fgjjlkjghkt~m[Xi|iM6% +%;Q]c_^\_ab^^_bfhd[TLC5)'&&'**)(*3BNYqĴyja\VYVUSTVY\^^\XUUWZ\\]]]\[Z[[[[[[[[\WQOOLD>8;BSs»ſľm[SIA977760)#")8GUXWPLGCFIQghVNI:0/18EVo½z}}{uf`c^`nǷrc[ULCA?@ACEEB:3-,-145226:?BFFBDIGA6-&$$')'%"",4>DGHNTbwĹmXOjz~zieibbpȷvgWLHE?;>?ACBAA<7441..240049=@CEORUSL@6-*()(%!&/:EKNOS^pjDN^r»ٸZ@@TfhO5'!!%$&*-..-,%# "%()))+,,-.01110+'"!'.1Ƴ|vqs~ǵymkgfiooh_cqqhoxuh\V\~{{nT82,-4AUiйǧĶ¿Żwv¿ſzyu}w][msspøǞmB%#&(! "%&+,,)&'-18;99<<==>?@DEKKKNSW]`hilnoonlu~th`bsȻxdL5*:GPYVTUSNURONJC83&##.8J\uwk``]^YWV[^^^][XWXZ\\[ZYWUTSSTUWY[]][ZZ[XRKFDELa{ƾ¾~tlbXOLD;77:=?>:8;FRajkcWMHJU^cj^JE?0&,369Ihø~nijcds̻tjZQG=:775>BEGD?;725<<7/0.2257:<=>RX][TK?61-*'#",7BLPPRZkȾzKUhxկWBCTcbH0&# $'(+,,*'%"!$')()*+,,.-1110.)&##+.ٴ{uv}slicadjh_VXguwxl\RKLUo|ĿsT73/3=>?CDJKNQVZ^ailnprqqnzwkacq}bC* &7JZXTUVQQKE?90(" .AQ\e^aqwpowrf^^]YTRX\[\\ZXVWXZZZYXWVURQQQQSTUTUVWWVTPOKGDPez}}¿»~re[TQMH@;<@DDGB>@IWitwjXNJR^ikeRCA8)#*159Hiľ|ohgabtt_ULGC;78>CQW_c`[XTJIIF@9524345665:MV[^YSI?81+% )4BLRSTVfxƺQ]o~ѨxVGFQZT:'#$ #+*,,*&! #%()++,,-+.,000-*&%## #(*꽩}{ɪ|rogb_bhf[PO`zoXLC?ES]q¼ĴtR9538BQg{ƽӮyzɿu{z|~û}}~km|vfcr|ĻpOJcѰV4$*+# #+01,)&,01587448?@A@?ABFHUY\bfjnoprtuvwvt~qe`jĹlK+'4J^^XWXUNI@60'"-?Vqqbmujdh{ymba`\WUY]ZZ[YWSSRTVVYZYZZVTQONNOMJMPQQSSRWRH>APcnyolr}zvyþû}{rcXSSNGB=?EJLLG?>FUgs}lXLJRbli]G<=5&#,5:=Orǿznhd^arq[HAFEFBAHT_ltuj\RLGC?98898546FNUZZUOI?71("'0:HT[[[Zhy·ɳZfvŽˡqQFDJOF-!#+,..+&!%'),..//////211.)&$#+% "%'˞|˩mde_^_a\UOQazv_LFIIFLU_s»нaH@:;BJXt¿μȱ⽗wzÿ|mgxpYNTbpy{zX-.JRfɝT"!""#! ""##'*.0651./279ADDCDN\ioy{xz||sk]]zƽvbL57EU[Y]^aOB3,+(""!"JmͶ`[guyqjlhd`^`_^ZTPOPLNRW\^][^]ZWSNHFHGGGHJLNPLIDEEJM]v}zxuuqqvtfa`aSE7-.8HUPJDAAH]on]H>BP\]]O?50-))3L[gfagp{eD"(BFV|ĝT##"### !!"%(,.1/-+.169@BEFHP^j}zqe]fx^HO[___]YI8)&(%!3K\bi͙g\dq}ztqojgeca`\VPMMMNQU\^a_b`]YVQKIHGFFGHJKOKFB?>AFVp}zy||~pgc`MA0)+6IYTNFA@HXgcS?5;HSUTF90--+/9CLXm¿Ż}rkdacgg[PG>9:92.07418EGHHB;75:;K`~net~üt}Ѻ[;7?>6$!&%')&'(,.--*!!&'+..,+(**+-,4886861/*$ !"#!РtlwѪkUSYacYMHN^vhVIGIIFNDTl»ѽbHGCEKScͺƫå|w~Ŀȹyy}¹vlgsʵren{kC/6@SE6/8I[gbVTYg}}V=&,@DNgX$(&$%%%#! !"%(**)((+.35<>CFJP[dqzwmbewľb]`bb\QF8+%2Ebo`hkuxtpjhgcbc`\WSPPPPUZ^bab`_[YUQOLKIHHHIILID@=;>ASl~tr|rf^J=0(-9L][SJEDKXc[J:5;HPRNA4-*,,29BL^wøzrlga[YSJC;54SfrnYNTf{~kL7%(17@QcxZ.,*&&''%" "%'%$$&),037>ADVk¿xqrxl\G<.,1>Rgj`WPOQ]cUH=;BNSRJ>0*),-26@Nfÿļvmkg^SNGEC?9:ESq¹}fQ@6;200+&*4DKUXM>9=>`˱onƼ{˫W@?DC?-++..+++)(*,-.+("$$'*% (16;>=<72+'%%%ǝ迗j``ffVHDDUo|hVF=98DHKOSTUV\izvjch˵i\TA) $;[ӧyighlt{sjgeecfgfa[WRQOPTZ]`bbaaa^\ZXXVUSQONKIGEEEGJYkunjlus]C8.19BWnuph`\ZbgYNGJPUVRE9-(),,26CVpſż~tjgaVMFEA?>AJ^sjSC5+(040-/?I[rviWMMgǚwj»Ǣ{UFEFD@32331/.,*)),,,)&!"!$'! + + !+17;@;962/,--ųݹsfgeVICBRl~~uj[K;0**0@Pg~ӽhT]]_bck˲ʲˮ|wy{xuxŽ}kWH927Ec}xssy~ɻzohne:!"-A\laEBFGIKLKIKS^q{pfdoϿ|bPC0 &AhǺ{nkmms~ynhcdadffc\VQOLNQWY[^___^][[[ZYXXVTSLKJIHJLO[h{ymb]dy~bF928@EZo{yunebimcXVY\\TK:0'%)-.3=Nbž{mtü}yoie]PGAA;;BNbl\@.);PVRNMTpsntسzƚvWKKHC@7::5100-+*))*('$"!!$! +  %+2:8:<;830.ϼŶԦkfcSGBCSlvrplf_UG90('-<]vӿo[cdgjgn¾ѷѿչzuntv~ķq]I;9,##*6Soymeeho{½uxldcmk9 -BPE/+4GUK/ ' %'0NWH:2+%%(*&!#%(,,./6:6011.)(((('$#" "#! ".38>>8/(%íĦ湑nd`READUnxpmkgb]SG=4/4Ans`deijglպŪvsors{~üzre[TKA:/$ %*3Kfwsyynk`[\ait}ÿeg»{na\`k}d1 #(*(3, +  :F<22+$#'($!#'),,,.8:<@ACAAGFHHD@FP]r{ndfoópQ8# + (FvĿ~plhros}ynfa\^_da[TNKHJLOPPSTUUVVTSTUVWWVTSNMKJHGHJS\l~}~~{yzyxvsmdZNJVeoZOIPTR^r{wpy}sihgdV@0  )028Wjº~}uojgheYI=:9CXvǽ|[KhêʨիͿÏoWSTKC?>A?5/01/)(''(&#!"!%%%#  #/5<=5(ɹʮ̡yjbRFDCWu~tomnmpi^UMNR[sac_]`biz|俏̽~~yunotz}ľzcPIA?JPI>7761*)4K_py}vnmkcc]ZY[`egqj[Q_~~{ung_`fmtuX+   +   )1/'.*(#"#%%!#&%$&,34:??>??CFHPTK>?KVn~n_iɿ_A, $Bp¿|w{uqohlppyzmg___`_ZTMOONLJJLNPPNNNNNQPOPQQOMKHEDEDEFLXkxwwutspoiibUGCKTlt\ZZ^__eo{z}ypgd^SB0!$+-4Bc|uqmgdfe\K;3?QoĽyhι㽝ֹôq[UTLA;?=:50-,-('%%%$! #$)*+)& #.:>7'þͲֳveSE@BWt~}}xsswsa[USUXczÿwzȠʼzqruxyiXG8+)/:B>1,/1466:DWgzypmkd`]_^][YV`nvdNRstlighioxZ-"#     + +  $$)'%"""#$ $&&%'.6=AAA@ACGMOW\RBCLcx}qfr̾V4" .Wüxqtojg_ior{{ofdbc`[UQPROLJJKMMMNNNNNPOOOPPNLKIFCCA@@GRdz|x|xtrrqplkjbb]SF>AERfx}l`bfjmmv{ztk^WN?0$+1AGOTZ^`enw{snleaaed_UKDMZp\M_pp`\_gtd6""  + +   !$ $#$$%%$$! #&&'*08DGECBDHMUW^bYOPXs|wwrnȴqF& >rȾǾpdiheaZirxzrlhge_YUUTSOLLLLNNOPPRRRONNOOKKKIFDC?=GWn}{wtonjjfc^][XVPJC;1,3:BIS^bbakw{~~trmXJ>0#  ",5CXmſ{rmhfd]\XRLQcvج۶ôľкoWLC:7870-/10*$%#"%%%#! "!%&&# + "0:CJν¼u\[bw¨vhSM>3)#&.=?EUj|~|yxvsokhgb_ZXVUQKFA;3.+4DRgy|yvvsplhfc^[VRPOLGB=60-)2?MWbjmow}zzwngeebRD7) $06CZs¿~zz||rmjfacVOOVbr~ýμԻյdzͶlRGA7230+(*++)%$$%%(('%$  !)ĿiNHCOblӳoM8'  6Rjϲ\A4D_ƽ|gUTWbt~{wsuйvqpoqw~ҹ[0.AQf|½~od`]_efbWJ@9:Ha{ýnF@Ghìm]K7)"    !#!!"#"##$%$*.26=EMTW\]^^acjifel|~shbi{ǻZ?-! .OyĹjE;P`nsv~}ulc^][XSOONNOQRTUXXWURRRQLJHGC@><:;;@Nbv}|yuqpnjeeb_ZVQMKDDA<6.($)2AOZbhloqsmnu{|}qgbcdaZMB9/("#-7>Pj~upox|soke^]RJLXfy¾ĽȱԶ޽ɸƭcLC@9312/+)'&%$$%%(***(#!   nqeLFCL]cw~ľ}\3!%   '4OvԿqVLWpºpcfn{þ|yupsٻ||usllotzʦnGRsxjcc]cnupbQD??H_vſaB.?e}}}ʼ|pW:.   !!#&&%$#!"$&()))(,258?HPUWWWVX[_ehhjt}vkdcoiG0- #5Tx÷ĴgFA\p~rv{|qfc_^[URPPQQRTUVXXVTQRQOKKKHC?=:876;I`r}|xzwrmkhb^b_ZWQLIF==>92(&/=IORV\fjg_`inkth_^ad^SF>82.*(()4=F]{~wsx~|spkd[UKGKWjǼǾ°ʰŢǤɽȻпz[C>?94040.)# "$$%%(*)'%!!"$%###"s{_RIOZepw׿zT3!%#! ",=_ŵxu{þIJuzĿ~sppla`lķ˷|{ʿwmhimrw|ױs}ǿuj_XY^ipoh\TJDEPd}¾ûhG8:Je{tbaxv_J3#  +  5;@? *!+&'(+,-,+*035:AFJNVSSUTSXaeflyytiefpuS8(! ,?[xbEMyswx}vnhec`\WSQTUUVVWVVRRQPPOKKGHE@<978:9BXmv{|xurplhd`_ZYURNIDA;950,&!(3>DEIR]ipronq|}rjge[NA;61+%"#.2=Rkwpmha[QG?@QjȻȷķܮвŽ»̵rYFB@845,/* ')##$#$''&)%$!!$%$$%&%$#"!! {ž}wsia_fpw~pP9!"%(+/-'+)&#""%&$$]ma0"'&0*++,/00/047:@DHLMVTUVTSW`cgt~uogghrgH2% !3E^vpRXttvy}skgfa]YUTTTVVVUUTRQQQOMIHIHD@;97878AVity}Ŀº~zvtsolhfa^[XWTQLHB?93/*'%##.6?DGLS^qy|}~zmgcXJ>93-($"$07D[vvmic_YMG@?I^x¹߿ȴº˲mWFFHA;:/1/%!(("#"!#$'''&&""$$%$%%%%%%%%$# b{̾~rhgknrt{{ßuI+#!(&!")/2254062.***,,-#)GaʰŽǺ{z{~ĬǰȽuliikoqv¼½{k`Z]_abbcfj`UIDH[xļe@)&/RYYJ76SuubP@0&$"MX1**2/20012235:>AFJLOOWVXYVSX`cmzoifgkvuX<* + "7J`s~nPT{rnru|xmidb]ZXUTRSSTSRRSQPPOKGDBB=9634646@Rfpu{}{|}x|wsponlieb^[YXUROKFB=5.(!!"'+7>FJOV_grw~yj_YNB940,'&%*5>Ohtjd_\XKGA=CSl}ûɿöӿŷȽȬnXJKPIB=9=:2/2/) #'*++)'""#$%%$&')*,-.10/-+)''\w˸|~vnmr}~mc]^gq~ź›sM/$-2/***1889840-++0+('$*;X}ѼĶǻxuswĹƶļ{smjjlor}ĸsf_aab_]`hmdXLCDVv»dD0*25;;>Id}ztzwm\J<71( #^őX9.135433679:BDJMQQQPWWYXURX`iwvjbdhozgI1"  &7I_m}xq{}~mqngoqx~slga_][YTSSSUTSRUSQPOLGB<951/.0137AQcotx{yzz{{~Ϲls}xsolkjjifb^[XWSROLHD>;1)"$-4BGNRX`lprv~o^VOF83/+(''*09CYu~yyyyz}pe_ZXVNG@=DShu½ûҷǧoZLKPLD?>BB=:95/ !$)-00-)$ #$$$#$%'),/0233333332e~Ǵ~mg_YROUbloniefny¶ÔeB+"!!+24123:3.+11477/)'")8Swɿ~¿~{yuwïzrmklnqw|Ⱦqidbc`^`beaXOJL^}ÿoO<(%,?Vk{~ƵtutbSOG=3,# !% 9qnjX6(188779;?AIKNQTTSTVVYWUT[fu}rf_ckt}xZ='  +7GZfv{}ymnnjek~̸haknty}ukedb_\VTUUVUUTVTSRPMHC951-,,/229AO_muz{yyyvtux͚rr|{yvtokhffgeda][WUTPOLHD@:7-$*5=IMRV]fpstvubRKHA5-('%&*.4=Kd{|~vj^XVVTRH??K[jqvĿåúɦgWGGMNJGEIJD>92+! "%+031-)$  ""#$$$##"#%(+-/011245678jĸrfWPG@BNZcfsuĸ̻i?( &$)37:;?BGHFCGJIEEFGFD=7347:=;6/+&%(9So~}Ľ~~¾žuyɴ}tolkmpsw{¹~rgedcba^]]YVYap̿jN:49Ol|{շ{wqge\RG=4*#!"%) / +'W罂L(2;;<>ACFHOPRTVVVVWWXXVWboyoe^dlwmN1 /:FT_nyplhle\^rǿ¸̶f_hkpu{|pifec_YVXXXWVUVTSRPLIC92/-,.143:BJYjt{~|||yslejqw}ռqnz~zvsmomkgecbb`^\XUSPNJIGB?950'$!!(3?FLNQV]fnprt{wlYJEC?4*%%&',3=FLLLRTQLD:1+%#$(,131-)'%$##$&%%$%#$##$%'(*++/02469;;l|ƹumbWQWcpxǽмrJ1)%)-27>ADHMPPQQS]b^UOPPMKF@=qn36>@CFJLOPQRSTUVYYXYZZX\k{|xpgbenz|_@&  1?GPYgxr`^eg\Xiľhbefkqw~skhgf`\XZYXWTTTRQPPMIB60,)),/43:@FTfsz{~}~|wnfWY\^dlu{{vz}{wtnmjhfda_\XVSOLIGEDB?<82.*""$)23*%$'+1:CTb}xtlaUPOTVXMCAIT[^m}~ûɳƯ̿ԱzL<644;BEFSTQNE<2-)''(,03/,))))(('''%$%"$"$"""####)*,/2579jyƷwlmxŸֵiP6-00/.:@EGJMRS[]cky}r\[YTOJECEE@7/,//1247=ES_bkpny¶|ɹ~{xvtu`nǽ¾~uokklmprw|xrzķmfbdfe_XSXf{ún`djquuy~ῗ~}~z}xkaYNB;702.('+*$(O~ӎB?BDIMQTUVTSUTWXZ[ZZ\\Z_s~ytmhcdnx~~}qT5  0BHNTbr~}iRSbaWWuĴldbdhotywmjjhb^[[YYWTSRPONOLHA0*(%&(,24:>BOcryz}}~}wlbNNLMQXaisvyyx|su|yywsqtqllkjgd_[XROMHFC@>>;:60,'$!&.8@IMQRUZ_fmq{vgSB:;6-)%&(-6AJ`pwqi_SNMSWWOFACIQVl}pc[Zfvrechjs˴»˞]),-.14:;=IJIGB90,,*))-./-+)+,,,+*('&$$"#"%"! $%(+.145Zq·»|{wI<13KWacjc]f{ͺ}ºп{~wnmkgViѺ¼{snkmnplotwy|son|Ǵnb^ekkfa\et¼Ŀ~oppvogms~ͪvole\TKE@81-*&()#*QtښeMTIKTTWZUQOPQUWXXWXZ\dq{unhdbdlswxxz|fE* !2>LOQ`involpjTJOPLO^˶Ǹp``agmtytnjidc^^]YVQPOLIFDB?8,%# !#',08;@J\lxzzwxytg\MG@>?GOT[_dgilrvzzzqa[o{yjf|pihntrligghgcZRLFCBA?=;9555/)$",6@HPUYZ\ahnsxrbN>532/,-049@LZoĿ¾yqmcXQPSTSUJA@AEKRky~l[JBAGR\oj\TIDDNfĿú¹ȾH&6BB;60+16:;<;4,(**('(-+*)*,..,+&'(''%))&$"  "&+0467Rduilqw|jWC915;>??&  0@MOQZ]`glkh[HGKKEJcƺój^`cfkquz|{rljeb]]\ZWTPMJEDA><6*$! &)069BDILQSVX]`caa[SYtnkdmȵukhgeagd_^[WUPFA>;:654220+% ".;FOV[`chmrw~~n[E2*)(',069>FTczǿÿ~sjd\TOPSVUUJACIQW\flsph^]^OGELV\bfhso`]fnnkiv;|üغF1H\\O@3,*.5;?93+%%%$$(-.+(()+,,+()*)''()'$"! !!#%(+/245BPmÿûrb[TQX[TKGA9888:;@@CEHJLIDBG[|ydb]rĿurlcb^ZXYZXRFA=9743220.(")5BKSX\bhorsxvfP5$/9?BDL^nſ}tibXSNMQVZYVKBDKSZ_dfcQ;038@BPhy{unb`gtzvifbfvskwý͹wx|ưŻ۾R&JPMKBH^s}oQLXXRMWqtu}{iQM^`cgmrwz~vvsojkic\SMKGC@>;95/-*)*+.3;===F[mysuuuuof`[VLC?<;:7789:;<=>:56Fdnbb_xе|jg`\[\YNIC>;975420.(#(2FHKTfyyqh_WNJHMTZ[\WOFDBDMSdgcM1&GXivuvtrrleab]WPLHGC;98888875418QswhccfĴxe[ZYOKDB@=;:841.+$! !/7CLQSUT]ckllnv{lZD/%$.6>EIO\p{vvutsvwyz|||zzunf_XSMHGHMW]^]XSME:7AK^`ZF*#07Nl}l_E76FX[XSNal^L@3&0XǺͿʞxm`y³Ⱥ٧a)412>X{Ȼ~V@<*#&'*)'$%(,.120010.,,,-----,+**+,-$%8eľ~p]XYajnoomjkopklmw׵׾ɳqlkiprx~yto_`u˾~xx{|xroieedb`lg`l˴xrmidb_Z]]ehiimnvx|{sx}wwpsϻ̻pjZSSUOD?JNI>+"%'4GQJ<1++7UovhW;BD3!:eƽɿٵqa^v~uxǻq:#'8[ɪiW0!&,2*'$ %*,0232320..//.-,*)(''(*+)"1^Ǿyl`Z[dmoqstpqw}|}~ܸ³᱉}{x~xe`s~wv|yof`[TSac_kþxиuqmiebaYTU`eghjlsruz~˹¸ztriqþʳưp_TNJEHORc{x]L>>B@BEGLPQOLWcyyrfYK>51*,/39BLRZdnstuy{taH2 + %8FR\[K8O}p_LOQU_jrxyxhbdidZ^g]aedfq}ohgimtx}tgflomh`XTOJFC@<=@BDCBDFIHJJGN\ku~|vpligfigda_[XSLFD@@>:737;In|mbYXrִkejdVSQNKE?9641.,*--4;HS[`ehpsuuwy}|mcUKC80;G>9, '@PvqfaYVtǜ~utpecb`[SLD@=:75669@GQ[aejmrssrttuy}uj^SJ;0=K@8;E[u|wqi`\\ZVTQONNJIKKKLNMQRV^ceb[RD7110132*!$##% 1OwZ?(#((!Goլ}getƨƚ`80<\ϱkF"!(/,(!#',1468753331/-*&%$$%'*,'$7_ɿ~ysfcdfnw}~~ծϿ׻tn~vvx{|~|jZQJNT~õxnfӶxtojec_XSLQ[befihjns˿uqskixŝvhemzv[MMW`cjmh]W[_iu}rfWI9) #&+17@HP\hpsx}xhTC. *:L]jnfYkobWNMPT]fjgc\]]\UNPVmyxnfglrrvx{~vnmmlic]WRPQNMLR\_`bba_\YX[env}yrlhhhhhec`_\VVVUPJE?:?I\|i]_bp۷}vojf_\YVRNIHSYagjknoruxvslhhsx~zoaSG8./68:BPf~{uoih^\XTPMKKHGGGFKQUWX[clool_O<113/*("$&&8Y̸jF'%+,()PyvrľǷrH/8Za;#(026/#!+279;;8:>=:531++**+,01'(=f½wy~zsnkkpyϧι̹zwrwtrvwy|x^QOOrwh^_|ٺ{vpjgb^XNGIQXY^cgkpr}žzttowƲ~nbbksx~{ngimuzmaQC2! #)09@LVemrv|ym[H:) ->Ga|lacen˩~zvqlfbbjmqroollqtxwrlefpu{~ufVI8,+07:4-% "$0Ej¤pM/).-/1Vƾ|}ŽȺgI2(HlôpI/'1373) &.49?AB?>;:54210///(Drþ{upltzutrqvƚϷùrxsĿzqlqsuw{üt`RHdvhYQWv¼ྚ}xrkga^WLDDFHIQZ]bhhqyvyvrv{uj]M?.#*18HS_jsy}wnaQA4% 0AWl{}vrf[QOLKOTWWTSONMIFKTzkdejmotw|}umheefffeeddddgkosvusmgfbgxyroeecb`][YWVUSOKD?C@Khynfhgkའ}{{{{ysomksuzzvqlluy{~{n]O=.*+4>L\o~xsoeb^YTQOMMMOPORUY\`goz}o_TOI>6)$ """"'8SyѿxX;/-+/4Yɽxuƽv`I3%%,ZźU6" ()01) $*19=<>?@@AACB><96420%Mxnifgtysx}{y{wtyʽyӿʽzhxwtº~pfmmoqw{mVB\|obSIPn½޺ztlhb]UQGDA<=FQVY]_gw~{{~yʺrf_[gx¼yrk\M?. $+17FO\hszxnbUH:0#  +2EZptg]UQLHHLMNKIFDEGHPZvg__djnsx}{qhcdiloqsqqrpptwxxyvplignwsklieb^[YQPNLIGB@G?KovnlkhmȦ}zxw||~zwsw|vhVD2)(4BSbt{vrkhd_ZVTRQRTVUWZ\adku~znd`ZPG93.*($"!#$!!",3EaƶiM<1+,1YǸ̺~iJ=,&4e®`='#)' %-26677:>BEHGECB?<:#V|yzxrhaaetshgpz}~~~||~̸|iƯ|ɼs_sytȿodhklmpuy~|^F[~qbODHa~|tܺ}vnic]WMDB?97@IUUW^kz~zvvw|¿̹xng[SQVg}û}vnhZK<-!%+26EMZgqy~yocWJ?5.!  4H[r~qf\WSMGEEGHF?<>DJNYcsf]_djnty~xlfhmsz~{||yxxxvtmkx{xurnid^ZXTSQONMKHKCPstmkihky̫|{s_K:+%6FWhz{uqqnid`][YVWYZ[[^`fjouz}upold^RKC90(""&+*+.:CYtǹydQ?403[´{zųlE, ,9nϺqL3'%##'! + + $))**+19:8DOXlŮzhWJDBgùԾrrt~Ǭf:$3>uȱmVE<3 !  $)58?EJLMM>u~~~}ysiZNS^s}ldjv}yx}|xuvԼv\ɿzwizɼyjdgffijnrzv~rfZclrslr¹zZ_ή~yrkeaXF>>@>:669:?K`t}}üǨm]SPRZgw´wldWI:-!$*/59EIQ[ejmi^TI>83/,! 4I[ourxmcZXTNHDFFFC<>GUbiqxtz{z{qiaaeejrw{}tqt|~z~}ztniedbcbaceifjemym`\\`djֺu_K6)5DWl{wuronifdcb__^^^agkqrwvutxz|xxz}tgZQKGGKRW]eoxη{ne`^{Ơ}yxyuoqӳ\6 #7Du˵xiY=%  + %.8AEIJ&N~~ufTFM[o}pio|~wu{vstֿx\·~~v{m_dbcdgiow}~~{rpzospf]T`}jtղ|vpjdaYKCBEB81,*.8CXq¼¿xŽľѶiZbbjpx³~th_PD5)"'-28;BFMV\ac_TH?61.,+  + 3GWkol|yma[YTOHFFGGDBCN^kry~dgedqvng_`bcgoty|yvxñ{tpmmpqqqtxz{wu{~|m]VV[^^|žھú~fR:-4CWn~|yvpnmifddda`_^^bhltvyywvy|~{x}{piecaelryսywuçyzȽ}{yz{wuqkgck|Ŝg9 0Enƶ~bD1-* "-9?CDDenYJDKWl}zuw~}xx¯yvxؽp̻żxg`[bfabkqxľm]WYdtq]Vatٸztnic_VGDHF?6.(%.8DNeǿÿxu}Ĭnooqswzpe\H;,# '/8<@CGLRSSRMA<862.(## + $8ES[fiqwi^XVTLDBDHIGEPW[gwzs\VRWguz}rrnhc___]`glrv{}~}{}˺}{z{~~pXX]VPmóĺ||k[@/7AUv~}yyyonkhfdba`bccceilwy||z{z}§ƽpeoǽ~zwvuvzxogfd`aafyƮxB + +';d|}eL<1#$+057TqrbSD=I\p~wx|{w{Óøʿ~~c\X_d`biquǿr_VV\~ʹplpupjiwۯxphc`_XKEC=4-*)6AYoɽrpyٺyuuxwz~wl`UF9,#&07<>DFHIJHGA510/0/*(" &6AMW`clwh^WTSLDBGKLKRYZW]jnjPNPXekifljfb`^]\Y_fkosww{}{yп|gaYMGdſĴvwraH84>Sy}yyypnlhgdcbbdeefhlpwz~y~ȲǾylsü{yxzz}{xtoic_ac_`_fyĜa) + 2Sk̹kZH8-   +  "$&)g||hXM?5F`u}{ur|ôȞ{}~|zk`W[`bciru~ŸxbWWrťƽundWUbt~}tٰ¿zrkd`]XPC=:5139?^ný~ruɭ{{~~ƿ~yreWN?3'(09=@DDDC@=<8.+,-.-*'!  )5=HOWWfyjaXTSMGEJOQPY\YQQ\ceUTRV]`][b^[Z[\ZXU[bilnpruy}yĶ{p[IF\ö|pp}wfL<0:S~}zxwqomjfdbbdfhijmswz}zɺҽty~{z}~|rkgd`\YZ^bacag{̺L %6G_z~ɵubQA4/15COYeu̶¿ys}Ժĺ~|zvn`QE6)")29>@DB@=<;:63/..,*%!  !+4;EKONc|oe[WTPLKOQTTUYXQPXdhi`WOOUZ\[VRTY[YUSW]`bejnrv{ĺ|v|~fOOUx»Ĺzkhq{xdI7,<\}{zxsqoligedfhjkmpwz~ȿƶw}}~~{z~}{srohcaa`]]_`cfkll|ĥh4  $?Rhruvtt|Ϳ}i^WVVUWVP@4*%#$-32.'"|ZEFE=F\rrgséȪžu\NPZisotyĵtefhjjco³ɿ|smkjjc[OO]yưǿ¿sq½èȿ|zvqgYJ?." %-4:?@?><;:;<9610-(%"  (28HGIMhukc\XWSRSUVXW\_^]ahmul_ROR[`XSPSY\YSRSWYY]ennsx|wceynWURsǿnfiqwbF5*Bh~}||{srqnljihijlnquz~x~xy|{~{y{~~|plifdccdghgcejrts}޼I&  + 1=N]iplhnwulif`_ZME?5+##'.4750,{nSADHEM\q}ynwƬ̷ľžĿ}eRLUcnosx}ʼո̷~ķɾĭ¸}ot¸ſʰý{yskaSD8, #)06;??=;:989:60*&$#""!'04HDIYy{rib^]]Z[[^_bgkllihgpolfa_bbYUTVYXVSSVYWUX_hkotx|}ui[b{r\V[vznmqx~taH:-Dl}~~wuurpnmmmnpqtw|}{˾{|xt~~~|{z}wpmlkhfhproggnvwwߺ.  (%.4+ !'+17Jivmfddecdfijnortri^Z]fmqoifcZYYYWVTRW[`^YWZ`fjosw|~}xutpomlllnqsuvuurmg_h{eXbxy{||{vl]LA4Dc¼}~yxxusqporstuwz{ru|{uqirDz¨|||zyzzmpzvwwrpqvywnkqxvwܼ7+3FMQXXD5% '1;GV]`gkoqvƽm_VTRKEDB?71+ *7@Eq`[VQKKVduĬʽijþ¾~wx~m_Z\`osy}}|̸ʶ¸¾sfƿȾӿ~}{zwuvqi_TG;0( !'+06:=><:72-(% #  )488?7LvzpihijlklquussurhYQJVckje`]]\\YVSOOX`fe]WVYafkpty~}zytyvtrppoojigec_^afkmooppodlĩq^_p|ung]RMCI[x¹|}|zxutsruvwxz|yzytqrnxյи{xvtsrwqem{}|~x}tosyuuؿwo~hE'!+-1;GOY\\]ahrxо{i[WQUKGGIE>6.+&&*.11mXSKCCKW]sоľȼþ»~{~yk^Y[grxvw|}{ɵùɿ½ȾʴĿÿynw̾~zy~~}zz{ursvpmfXH:3/   '+,3:=:961)! + + +#(  +':8A9197P|vrrqqqrsvxv{zsqqaNGIT`eb_^X[_]UOKJV\ehbVTWZ_dilqzwsux|zutsssrusnjd^Z\fprruz{sj{Ȼsa_qżyqiiid^YON[p}{z~~}}xsvz}ϻ׿zroop|zmr~|ttz}wvĦoK/<720+'-9CKOSW^ehw{ƸzjcYSQTRPLLL?<82+'$"|teN?0),8L[r˹ļŶ˻»|}qcZ[grwvvz{w¿ijþžƾ¯ʼȷüľs|þ¿ɷ}wuz~}{y~yrpqqlf^O@4-)  &+-28=92.'  "" BYPK<69Ce~xtutuuvwy{{{{}q`RLLXbecaZ[^\WPHCMRXZTMMSU\cgkov{{~~~ytlfaer}{qɶwbftùwlcbghfbVS^lx~~~}|¾~wttt|}ru}xvzztu~ƻпxS35BLRXaehkpt}|tnko|rĶ~z||~~|l^^ehhd]]eknkmpx|żů}|{zvvxx|~~{~~zyս}gP;2%/9BJOSUX[^bjvv`ZWWWWVRVPIA80'$~rpqhY7"'.2D[rЯǹż¶þveadknruwwu}íùǿɶſýԿIJ{tw~}~}{uojhfaXL=/% %((+//,# +  " + 'esW75}}ywyt||`4*7MfyƮɽȺ¸xpifejquxzwzɴ}ɾǿýüҾѾzvx}}z}}~||yspjfa[RI?3*!  + + $'(('"   +(69*)Rzxuwyz}vdWOXfoj^YV\XSUVQE;-)*++*.5@IU[\\`cinw~rȨm[Yhy~wodZ[p}xfUQRVX\cpzϿ~}}unlqy~|{G#,L\hk{~޵ɿ»}vuyudZaklnpnpt|̼uƺ¼ǻɹȺڶۼĴzwz{zsnhdb^UJ81.+'! +    + "#%&(+++% + -Vywx|~|w~wlc_`bXZ\XNFA@@??8'(%9=:EMLNQJEX[Vfaihmu{yspgddmzÿ~_Xp{~ϱkgtloyzz{fUNP[_X[a]agmuûvaP?999:<=4147DeĿǼ̸qkmnlkkv~{{ħy3 #9KSSNMYc`^cjkorxyobXNFDGLO~slqucKD?DP^inwz˾¼}usx~ui`cgcdjlov~θúȻɿƸѿξս˺½xvwxqjb_^YSJ81,'#  +&(  $'+,--+%  +?n|{||~}x{xtld__`bXNLPOE9F=83+!!$5A=@WUa_dak}zxlhmx~ľ}f]chlnoliewv{xvx|z}û{kWNQ[^XW^Y[][\cnvn^D7,+/124.*+16Ddø³sieefinw}y}^6 .>EJMEPXUSVZ\_cjpw}yh_TLHGJLzsw}{o^RKHIOW`jqsv|~ttw}wpkjd]_hkpy}ïòǿ˻ؽôп̸пxsstnh`\ZVQG6,($! /1%  "'/0/-+%  V~xrrpkf`]^dYMILNH?B=;81%#9BUv{ž{bV]u~nd[WUSSRPMWlywww|yy~ƬyoYPRX[UVYRPKE>>FMWZcoy{cQ:1,/5778217@HUpƽ¼uf^Z]fotw|zvtn]#!-3=>63231-.156=FOU`j|o^OGCGKKKKLNV^dmºŽubZW[cjlnw}~~}{qnnqy; #,517?@@?ACIJMPSY^cjortwxxvqjc\VQNN}{}wi_]bgid^XSRUY\]^cikqv|Ȼ{{|raWZfgqzwpoory}ʹº}Ѹxlڱ}ʼܸķ~rmlkgc_XPF9*!*41  +"&&&(/-.+)#  3rzlnomf^WUT`g\I@KVSM?+!4C_|ۡwZfzu_Pe~ɽᵁmytc^SMKMMMKNQ[bkt~}{wlgaPBDDEFJMPT\`cfjmnorojfc`_\|m`ipuvrh`YSTXYYZ_dgmrw}ƽ~~~weYX]eoz~tpmhijmtz}~~|y{vsv͹xxzsħwno”tktɼҼǸ|~ymfheb^VKC7("$*.'  !'**)))*+**# FxlmnjcZTSX^_XPKLOXI:8LkxxˍQFRRIC=Sepζɸýk{~qbXROOOPQPONNWct~ͫvqwrf[N=)',!! "16E\tz|}|{necciihku}pfn|´T* %.36;B>?@AAACFLQSY_dhjnnnmnonnx{oc\QORRVX^bdilqy~û}~ui_]aks|tle`_``bglsvxwyvqqxyvlltҼ{kizxrmzôqiqr{yqrءpZ\gtǽо񽙔˻~}maeb]WOHD<*" &(&"%(! +#%$&%$&*+,&*]vjklg`XTSXZXSOLLLQPWkxn^Rskbײ|YRYWS5/)#)KɥýyorfZTSRQRVXSQOVcuоnhlmbS:, $+$(&&%"!&&+9JYhu~x{zpjhjjqtvy||zojyt@  "*.5=;<=>=<;9.:bh~cPEm~feߦN*A}ŹuR84NЗkŹumwwutlfbbcZYY_ixƫof_RUV?73(!,:/#-,.53:8673//42) $(>Vs}{|rjdkv~~{~}{¿w. + '-289<877:;;>BHMPTW[agmqsyndZRNUWZ[^_[W[]^`gnv{Ǵ}z~|fZRNPUUSQOONIDDHNLLPUXY[[___^abdcblʵ{xqZRH@BUx{et~hejrƗmB5AUlĻº̼έp^XVVTRQSL?3,&"#085' *.242+%  +  + !Qud]\YOOSPOI=>B3CEHJMQX]eik{pg`ZU\_`_`a]XX\]_fnv{Ŀʼ}z~~~{vcZMJJHCB@@A?>?DHKJNPRQSSVVWVVW[^cx¯|sou|gRFFE?:Da~ú{y}ǝeG01>Kjƽȳ俧±vc[VUUVX\[QE9/(!&/.!  + ''(('$"! + +ewbZXVMNSOLB69DIb—[R`hry|X"#1103-#&;VrдpOIױƾ|Ϸzsoic][[_fpzѳn`YTNYkltwöec^TLPZ]XPEBLRNNTND6,(#"3Mmxvx|}z{|ytrtutv~|vrld`aizqq¿V' +  $'*-03467:<>@CGKOV[bfhyphdacdc_``[VWYZ\cjtyyþ}|}}vtuvsy~}m`OIFB<9689:;>BFIIKJKKKJMLNOMMU^nĻvnnwrYE?DJHB?OaͼoB-%337><=B>\{ֵʟĺʬ{vʹ{vsqme]Z^ckt|ɦc]\citô{oRNXagna`ktrtxpcUH=3%.Jh{vprt{yqle_^chnw}{zwsmgb[XW`ozj5 + + "(,.035:<>?GINSZ_dfxpjigiie`__ZVUVVY_hsy~x¾~öylilnnrwy|}|ymaQKID=:4467:=ADGFGFFFDDFDFHEHUd~umhnyzk[F4'/=GKIQZyI( 3>Hqȿ½|{}ÿñ¥ŸtbUKMWbq||sdR=-!  +$# &,*!#&& 7v^SQPFDC:1B<.SuBKnp̼Y7/7Yjnfkxtjg\UWPA53-6CUm룇׶ȵ~wtrroha^`hnw~v`ai|N=?Mbvu}{l_N;-"*BY~vsqqsz{rjdfjs{zwusmhaYQMMTe{|uA   !&(+/48<=?BGLRW[]tmkmmnkga__ZWQSSU]erxz¶|z~ƿ̾{kfhlinqsvuttj_RPPLD?76668:>?EEBBAA>>?=@AAEZrƻ~|togcfqzzwkZK>- .AMTanv|ӽ\2/@Sɾ~xv|¿̶ĺhXMOYdtoZF9,%!! +#-/--,+.1353&!"$&(,/3,# >s[PLI?><1,5YɨuD;L[dhu}uoocM8)7Soʾ˴~zusqqokg`cjoyưnahuͷw<)#-KnĻoYJ1#'6f}yxxwvyzvsrng^WNFEHZq}O  + + #(/259;?DJNRTslkmmnkf^[[WTOPOSZcpw~}ǻŹywx¼rkjkjjmrusoph`VX\XMG>:7668<<>>=<;;::;7;>@GbĶ}wpmgc\RNQUQNC4+&)7EYwȸc<&.Ee}wt~ѻú}|n\RV_fqwh]F9.*  !*6@EEGDEFFGE@2147:;=;B;3+% +GoYJC?688/-$FZPpɭcEHbzt\E- -0XȧҺ|yvtpnklkegjoyƿ{ggq|xpmmqȟN 7^ȹpaC,"Clzy}}zvusrmd[TKBDKc}])  + +  $)-048?DGIqigiikgaYVVSPMNMOWbmu}~žɻ~xuƿzqmmkilrutooiaY]d_SJB=85579;;:9666567573,+&#!+:YлzE(#"1Ku|vsžľú|{sbX^ffmz{cQE>1!44' .Cfȴz|Λc=,'#/Eh}}tmv~ghtĿ¿ĹĻ{}vmloqy}qjisžuqdO>80&=fgO:,,0/140,gҤھcX_rǼ`>#.gŪ{~~zxruywurqqmkmow~aHNZl`FGO\b`pZ4 '(%,a¬zeZB%)[|{}zz{xrpuzrdYQNOLEKYsxkYB6\}x{xtqwzy{¿¾Ƨzrpszķ|dPG>2%*Qu]F826<=<:FIoֽ^BLp˹sW9.%Ny߬y{|z{yxvqprtx}T-#9Q[jrhQ0 (8EOPONG<,)'.3/#:tĠT1! +8^~~|~{usnhlwy{|vk[LHP\c\QRYszͿJ0+!*;H\nù?    wja[XUPIB:4115=EQYaejnt{~zzÛxkmyϽp_YWTQT]kt}u_POhwsolheiqttpi\OA9hžjY83YҿfF!6œ{yrq|Ӭ~}}~|ztttvze= 1@JOLC8$ *,.)$.;>6&.]Ҿ|[9 )".Jxwyyvqoruogbb\W[j~zzxubPCL[lpcSPTu|}uiixƐI/501-&%'*,//7CP\mB +  +wjaZVPIC=3/.15CJU]_afks{~{{ƿЫki|˹{~{vru{n]Zpqokkkipwxurh[K>44:HED<' + %.Ek´v_J93.($)1?P[mz}s\\_dgilsѠf:')3AUyž{trlu»{{}}|{xxwxwwwwvw}ѩ{twz{ǺlWNE8.5^xUC?>CJLE.!9g¶rR7 , "++7f{wtslllifddc_WTUOFO_}}xrwz}}~}mXJEVfwtaPKQtuqsqzm]NJRal۱`=A:82*)++&!$$%',7FPǿF   xkaZSNGA:2./5;FOY[[\`ejtxww}¼ɦŶtr{nlnppqv{yslaTG=537A==9&   %6U|ȼs^LLIC5,*)')/9CPdywsxxtn^[\`a`citʜc7#&5Jeɾ{sol~»{ukifc`[UPKKJIIGFEGFFHHJKPYgkpy{ө~x{|{ÿn[RH;08buSDCDIOOG<;73210.+(&&""$&)+-4>GFM^_co֯x{{xr`VK?1:epPFFIOUUI=Lj.4WļƽoLFf㵒}xxxz}vP1'+)!)0*+49CNMJHC<2 *AHI?-',/,$"'* %5*'Ot}xpmloromkkmrsplaWVYRHPdy}vtsnfbft~xl[MOZiv{kQBGRxpYLC8:-#SHHCFC@<:7662.*&&%# )5CYrýúJ  +  tiaYSMHA9437:AQRONLKLOZ\`hknzǹ}{yeXI>97;AIFIH4 ;GVl޾|wvyƽ{f[N@8;`gFKORVZXK=LeK^ξhH\ð}}}zyymP:.5;3,+/53/27BFE@AGIEJJLNOMIF<6+ '"#/:@4<<, '024Khriljijnt|{xuvz}ymfdc[SYdw}|siekz}paRKTbmmk^L>CR~jN8/$!'U݅POJHKMKJJIE>82,)&%$ "*McǾýQ+& $" + ui_XQKJC<88:>EPPMHECEGPRW_cep~µ÷|w^N=68:AGLIIE/ ,Ggͻymlhmmmjjhmr~üp`]bia^[XUY_mr|̸jE47AWuȾxtx½ut}xh[JC9+    + !&)+)&,8HYuǵ~~zus|~~|{żneYK>=_{eHLSXZ[YM?J}\Sl{YW}ȴԨ}~~zyziP=5:=4-/59947ETmL2' !$$7ksZff][YWWXVRLF@83-*($#*9PeuȸO.-&"  !  + + + +vi_WPJJD>:;<@GLKE>::<@HLQX[^gr¼ɶǾgUA87;BHQNKC, (./.5A[yů~{srpw|Ƚ~xj`[YVVYejrw|®[:-5Cbĸuu~ykl{rcSG<6/'!!!  !# (.<^̺|{}~{rnv{~{{}~}{|xqhYFB`zbKMW\\YULBLeObŽiWb᭝|{}eOC?CE835:?>88>JID;;?CDAEJMONLIILJD8-%" ,74.*('%! &.@cǿN1.' !!"!  vh\UPJGA=99;>CEC<535:@INSWY]cjry~{w~ô˿q\NFBFMTQQG2'1DC<=ABB@=@EHKLNQQOIFD;752.&    &3EMSYZ^acfjlkliktŹ}txĹr_RQXVXVO?/).3?JRY_fmο~Ĵs\RSQOMQT[alwmA&$6N~ŷ}~}}ztn|Ѱ}mvrb\N@4+&$! $%$#+05:7/,*!$%%2.+,034/0.,%%'+Fjʴzx{|}~tkknsy{xx{~{z|~ɿtZPi~~{]GS]_ZQLHBMkjN^ºnW\ߧâ~|yxXDA>CGA7:AHF@AF<<>BEFILQSUPJEA?;AB??DFC=:4,# +$3Op}zzzwmmolhcdd^YYZVQYf|~}xplka\TOOWoq]PIKQ^c4$'!&234007GTZ_dck~kWQRRTVYWUQKC;641/-,,,+!%2HZnyJ.' !!"!!  + rdXQLGD@;9644712.,1:ENU[`_acb_^YURSZiwȼxigj]Y^__ZMB;;AMW]eow|̾zsx|}ɿu[NMLJIQTY^hr~d86R~z{z{{}}zwrjh{ݴ~pz~kXLF<5-% ,:IT[]VJ<:;=@??=<72.*'$+8<3) #7Vҽ}y{z{{xkejmrusuy}}}þiZo~}~t[JU[\TMHDBFV]]t}^QdǏԶ¾vqr|qR><7;BA;=BHFAAG=;=BDCCEKLMKDABCJMJA?FHD?<83,$  + +Pz~{ywwkaYSKFP_w~toli]UOMP_vjVJJWkþk7(-)!*-20,+17E[p~oWKFBDJRQRRPLFD?;74412.* #+4HhîwE+ !####!  scUMFAA=950,*,*+)+3=JR\bfdef`\SLBAIYopot̾sghgfb[TLHP[cgoz|ohffcZ^my}¾~bRNLKKPRX\dnx~W,<]}yyvxvyx{tsmhi㿇v}}p^QKF@4*  -D`suWLGGHKLIF<>=3&+,.45/&!!*DgƲ~yxxx{}m[deikkow|~~}{~¾{gu~|{z{jZTUYWPHFC>FHTgeQZuétfdlzkN><42:>>?CGE?AEB>?BB?@CEFGECCFLQTODAFE=@=963.($ + +'Lywj`YOKUgy}tqni[PIM\mtfbnút>';GD;9=@DJLIKPTbrw]L>46>HHLOPPNMJEA??<95/'""$  -;^zĮx?!!"# + + ÿuaRHB==950,&!"'(')2>JSbhkhggaZPH?@Mdƹn`nɳqnkec^WRZelotǿɳ|kXE<636JjûlZSOOPMPV[cmx|y|tJ#!Djѿ~zxvuuuvtqpnjrÿΒ}uxupcQB>AF>0.]ɻxKB;9:>@@=9BH='  +JB7.,:`λzvuuy{~pS_`cdejsy}{ywx}οqy~}|zzyyzzzz{}xcZ^UXTMGE@3/6;BBDEB=1*! +"LVXRZuñyvux{}~u^^XYZYYfv~~{uty|~¾~x~||}|zyzzyzz|~qZU`TYYRKHB>EFQgŸmVQ[pܾýp`TScwz_G;:42:;?ADCB?==@@BCEFHGABEHHHHHHIHD?<;;;;:9630.%'++*(*# /Hszwplp||zzuph]NHUqɿW1'.?Yp{~y]E6017:@FKPSUTPKKMJG>431/*'#! %6FTj|wM*   + p_O?88520,%''-9BFJPZ[\_[RPSbq̬ulmqzſvjb_`jsxzÿʾ~yrh]RJFD<:F^uſnb\WUVX[_bfjorrx`3#Lȴ~zuqommnomjilr˔||hV8-2;GW^S=0 AޱX=872+$0=<0&(/==>@A:) +Ti{˺xvvy{|||bWQRURR_n|{ysqtwy|{}{{}}zyyxxwxy|}qYWaY^^XQMGAFHQeøpWMRhķմƼ|j[NQ_uw`E9945::=>BA>;99;;>@BDEECBFFGHGFFFFA=89:;;;:8542+-//0,.(1Jvſ}{{zwvsmgYQP\tķd=/6Id}kQ<31/39AIMQRTNIIKKF=310/*($# #,JqJ$""  +  m\L=650//*%"!  )9GNPSRRT^hozήrlr|žĴofgksz~ķ{usmjhjidVJI[p|ld`][[^`dfgjmpuz~W-)Vðzsw{}tpmjijklieem}ŚsbZJDB?NZ`ihYLC:3, "FuQ5/-&-9>KXS=-).8+&4D?( %!.Hexwxz{zy|kOIHLIGUg}|~|}wxupoqsuvz}~zy{||{yuvvuvwz{~~~{o[Ycbhgb\VNFHIQeľtYHG_ϱtdVMN_ss^B676697:;?=;865558:>ADDECFFFEDBBBB=9667:<<<<:864676523."6MwȻzyxurmhcUU[izĸtN;;Mi|`F6.(*2>;83569;<==<:9:;<:7571(':Px¶}zyxsoie`RZhvµ[A:GdpU=0#%-9HQTQQJA<>?<6.,,,,)((%$"!*Q~{\HB:)    hSC6.-+.1/164/67;=<;EOixŤƼ}zvî̴īĹ¹Ϻ|x{~Ƿ~tolms}vu{{rifc]YY\`ejmptwx|pJ#:jɵsjcb``bgklpqprsttsojjgijmmkegxײ|a[o}]HA=:3%#/9:$2+#Bbsnjki\B)$"":cʺ}wwyzyvsvz|MCBGB=Mgnjmnppqohefffgmxƹzyy|}~|yttsrssuvyy{|~wuxunfflu{|xtocRGCNaz¾ƶ}nc^ZTPMMPRblx{[GCV͹ž}qjaXQTbvpZ=14227257784200/0159>BCDBDBB><9:;<863588:=>>=>=??@>:885,!)Wd|WB4&   }cN@5/.2797:A>6568:7=M^οŻts}ʨpgw̾yyȵĿȽzlfbciw|}¾woigc\XXZ_ejnqtwuy}hE !Atnf\\XVWZ_bjjllmnopligghjmolhj|ϲjfcA2$ #'.8(2WukaYbpkM/  #&Rɸ|vvwxxtruy~QEBF@;Mjh`dgjiljb_^]]`gq˾~{yy}~|zvutsttvwxxyz{{~{vuwvsqsw|nYC?K]vȴ{vuwx{ųfTK?ADHOTY[bglpxbNEOv̹IJwnhaYTVbupV>44/-3033653.--//138??>?>@@A>;9972'-@Rxǻº|z~~}uofa`]oһjG38MmtZD--5BU^]VQC7.,-,&!!#%'('''('%#''!);Z}xaH/  +  w]J?7338=>:=C@4+*1?K^xų¹uf\a{ɲ_\|ypqzp\w|~ztld`ftƹľ³~ria[Y`qtnigc]YZ]bgkklnqqtxz_>(I~˻|lc[YURRVZ\fghiihklheddfilnmjk}Ⱦɱ}pw|x_F5%# " -G^ma\V`qqX> +  !(%Gr̻zvuuwvsqtx~SE@D<7LmcV]aecfd\XVUSX`l|è|{z{}{zxvuvvxxxxyz{{{ywwxzz~xaA;GYpq`RKIITX`j{iXRQW`n}tihumUBFjʸÿtlhb[VWcsnS>66,'/./021/,+*.-//49>?>>>=<75323421125<>@ACBA@CCC?<:<<7+1CVzɽƼ}zy~~~vnea`m~ѻsO34EakR@>CRdmh_PA3(%%$!"#$%''%  + $-1)  rYG?978:>?8:?:+0/9Oiôɿv~|yumbTIQsϵȷw]cyt~weloniddb`WY`pýzlg\TS\psmihe_\]aeikiiikmov~sW:/Uŵ}ld_^WSQTWYbdgghfhjfedefimoomnɽĭnguwd]ikYO@5/# <\ls``^fsr_K!$! #).&;Wv˼{vttutsprw}QB=@83Jl_QW]a^a_WQPLJPXevī|{{|}{zywvuwxyyyyyzzywzyz{~hB:DSixmbSD9254;BLYlԹxkgbhti`ku[A>bɶ}sljf_ZZbrkQ>97+%-.-.1/-*)'.---15<>=<=<9642/1210026>ABEEDCDDEC@=<>>8.7I\ÿ|zyxoe``xѽ~Z62=Usw^PMR`szujPA2'""! !&'(& !!'*&,Ytna_B5'  u^J=974630110');Vu¸vzzywpg__WSN:Grɰμrtrbiôqhdfgji_]do~ǺǸocVLIYvùrlfa_aehllljigedeow}yiP6!;7301/..,('(*++-.2477;98643432/--158;?CEHHIGGCFFEA@?<32:MlIJ{{}|wmbclͽd>00A[svf_l{sVE3&!!" $'%"! #$&%$2JajeU>&  + ¿v]KA=823/-))@Wq˻ôzzsnf_WVZZWO8Gqǹzsy~xom{Ļtd^ade_^`biţƷpcTGCUtŹokeaachkonljgec`fp{raM8(0Lrĺumlkc[TRQPY\begiijihgfgikmmnrʿsH5@Zf]A:>P^_afc^O?.$  #I]^[owwgYF(  7IC4%% !&-13Rp˻||||ytmehr˸lH1)3Jau~xtxYH5'#$$"#%&$#! +  ,I^fSA,  + ¿w]I@9.&% &,''DhѾȻȹyxmaVMIOY^\V?Owýy{ysmmrvukeh¾åk]\^`\\[VTbr̩|m[JDVuųvkgdccgknrqnjhfechp|yj\D4+6X÷snpnhaZVSRWY^acegieeeegjlnmosɹ}Y:08A@=J]imlkl`R<.'&&$$/."CX]]lw}jXC-,GVRH5, '/0-ABK]uǹvtwvrqoqv{{aH320+Es[IBDVIHHB?:77?KZiwîyxx{~}}|~}ɾuN5-8SqycTX]em|{ndWRYrʫ~tkoqpmns}cLVsԽ{pbZ^lpVG?GSTNE50,)-.-+++*,.13422223344200159=>DDEBA??>CDCA?>@@44;Plı~|wrmjgmwʶvO2 %@FFB?<;;;?@BA><<:0/8Khʺytmgfhr|̶W6!7Rj||aQ<.+-.-# %&%  *@KOI<+! ~p]I3##(/6Beŧ|vmgZNE;7CTejiQ^ǿpcY^^Z]c_SPcrfbcfgc_]^djoorruqkfghe]WY\XPJnˤ̿|f\e¼kccegjmoqqnkijmrrms}sgdSF?ADB>;8789=@CC?:85,.7Jh¼zukabkx͸b@$"2KctyaQ?4132.&$!"(&$ + +  +"$%)6AKI@/  rZ>#"?cɿӹ~vo]QHB819512?HVdq{äxwtxy}}~|{zzzzz{z|}ʷX>13Lr^IL]hpqtpg_[[egkkkuysuxȻoZ]ʴ}}~~|{{{{{|||||||xsrppswwxustu~vl`UPWensyzfODDVozuncWI=863/53211/1255677788:89:=>@??=<988:;BDFD?941./9Lj|ui^ao̹pK,"+=Thv^SF=<;73,+)$"%,,& +   "1=GHB1$#"jM4"0Frŵĉ~{{wq^RIC7-9L{xxq\OLKLQWWTVWcinojedebejjhedca]WVW[adnkjjllkjiea_aa\VUv伐ǽ|qpqmhjnqtttsmjfdhpz}uxxihm{rdgͻ}ztrnheb`_diorsuvvrqrsttttzywyu_ml]SSgpx}xpjeddXZTKGNVYZQNZl~sle`_`gm{~|zy{~l\k¾¿wwvvwpquy}}|z~}Z6,-2V‹B3B@;=<;94101=@?@ACEGGD>60,-/2:Kh~{ug\bwϿ{U3!"3MezyaYOJJHA<8:72*%%% */.(  +/>FIB1&(' z[@22Cg|~x~vtvvrbVLF8-9M~ùaQMMGEKUTOQZ\ajqttrqrsqi[MD@70(!"&,16:DR_gigffecbcefcqܹ˾~sqnolorvxwvurnihkt~xztdeoxrjoɹ}zwsnkfeechlrvxwxwvuvvvvuu{xuw~mrxnc`sw{~wswx{źxhuvwvvvoptwzyxu{~}vP..?Px|D9<3023243235;ER_kszȩ~jlovwyxwtrpsqomnquxy{ϽU>6>=<9999;=?BEILPX[ZXWXUMD7.('&).3>QmĵwmgkwȺjE,$0Leuzwnfcdc_ZVURNIA930.-0550' +  + %7DQND3(%#hUKYzh[SSPHEKSYYSXcfac]hux}{uljr}|ti^F2%$;Zƾŵ]IDGOLMOTZ`deigjmqqkeR@.! +  (.9EZbnndY`k`s}uyyr{~zxqqprw|tvmekxqoɻ|zsonmjjiiknsvyy{}{{|}~~~}|}zidpʹڽ|yyvsjlonnmoouz~{]J/@uH+2@551-,1327BQ_jqy«~mngmnnppojhjiggijoqsuy|͹lRFRsxund^_bgjks}ɷumxɿ|y{xusttsruuuuuuuwwpms}yqd[VMC>;:;?EO\kxxtngcVPJC>;99ACGFC?>?=>@CHOW`gmoib_ZTOC4*&#"$/;MhxmjqwS8*2Lev{}wpossnkfda^XPGA:858::2+ &:EQMD4'%"kchɲrbVOTXUUZdfbZ[]SDF@KY^elid`[^iwzxqeT>)(;VȷN>CJORUY\_cjnnkjlmgZN>)  + +DXkj^X]calx֮¹|x~us}{uuvywqxulpynp{xrnmlkjjklosuvwy{}|}~{{{~pceuĴȱ}yyvsklkjihijqtz|~|}~wiT-GúV,,;20-+*0236AP]iqw̹pnikijllifcedcbeglnqsvzʷpWKW{zuux|}z~ǶwnnȻ{xyvsqqrqpppqqrssv|shmxwi[L<2<6,))+4>HTbp{|wrc]TIB=;UͶ}H=IRUY]aaaekpolhhdUB1,?SXY[XQ^anѡwxvv|{wy{ro{}uxnsǽzurnnlkjjjlnrtuvz{~}~{{|e_hyȽɻ}yvvsmmkgcceelptxyy{|}qjV/JŞY(&2'&%%(+027BO]hpwŭrolkjlkligcbaa`cgknqquxǸv[ISuƸwlq¶~zwwtpooponmmnoqrsuxxƬ}qryyok]L=3+"!'$,:LYhrz{qh\QGB@@KQVYXVUUVX[^eq}teWJH@4-+(#"/Lvŷtlm~;z]A9F]v~~wqha\XSPNJD=5)&$%'''&")=IRLC5*#t~ο|zvsvps{bI5(,34691-+.6AJRVNR_X8-8=LoʰuGBRXZ^`a`abgnqlfaVB*   +"0@Ub[KRR`|͚»|w|z{}{{{}nn~}~szǻ~yspmmkiihhjmprsuy{|}~~~{z||z|heo~ɹ}yuusnmkfb_abilptvwz|ymdR3CƦH$%/'#"$')-08CQ]hqx̿vopmllmljhedcbadhloqquyŹfPRrĶȸtewƴ}zxvspnoonmmmnprstvsv͹|iXM=.&/@Santzzqe[QJHIRY`dfeffjorvywhXJ<930-*%&8ZƾrmqĻpP=ETo}~}woicc_\WQIB:0.-.01/-&",?IQJA7+"oϿypsz}zzd5'$(&&)!""*/048-9Z]?5EEUglKOZ[]\\[[]`fioh^O?* + !"!"! + *H\[PFBNf~ȿŕ~~~}~~on~~zǷ}vqomkihgggjlopqtx||}~~~~}}{y{}{xuv|}ʼ}wssrmmlgb^__bejoptvy}sobS87VڧuP0#)/0+')*)*1;GS]hqzʸzqsnmmmljifgfdegioprtw|~y|Ļz_]rŽϾŹr_yŹ||ywuromnnmlmmnpqrsurt}cN6' "%% 1EWhx{~xof]WUW^dkprsvw|vjYK5441-))-Feƿrpy½]DALdu|{vqlgfa\TLE?54346531'""2DLQG@7-"kӼ|vor{z=+##  !!1_kNJ^[hmնeT_c^bVTUV[`egf\K5! $()++(&# +/AOVE:BQ^ܺwwx|sozz{~|uomjhffeeejlmoqrwz}~~~~}{yz}|yss|ǿǼ}vpqqkkkgb]]\\_ehkorv{||ulthZ>19n̋O0"",/5/*-/,-3?JU`iqzɵ~qurpoonlkijhighjoqsw{ytwľngv®¸r^{|v~{xvurommnmlmmnopqqsqo÷gR4$!%'!%:Zp}woifddmqvz|~}sgVH8:93+)0=Ng˾zstgJ?CVm~{{tqjhfaWMGB:7667740&!):KQPF@9/! !!|iʪpmos}N7+'/ctXXnmmlױc]ljceSNNQYadg]R; +  !',./-,-+#! +'@VL:=DIqԳ{vvw{vsxxvǿȸzsnifddcdcdjlnnprwz~}{wxztqwֿϾ}tqppiijfa\YXX]bfhlosrrrutsnhypeE/0`w8'112+(-.-08BMXblt{Ưqwvvsrqronkljhiloptx}wuywoxѶúþs\}~ju~}|yvtqomoonmomnnnoopnjʲp\K7+,.-.0=><0 (=[u|ytrqry}zodSCBC?7--:JRgwvpzƶwswȷsSBALeyyx{urjjgbXOID<;::;:73'#,=LSOE=9- ! """"#""! nlɫshm|dA1,$ :XabffgnfyҬioplf\LLNS\d^VK8 %*/168:<;85061($""!0LGCD9Gh̦||~fn;}|}wͿų}xusmd```abdegknopruy~~~}zszpyyxxyĬýþwtpnjifc_ZUTTZ]`baa`hkeeondcmooP8C|ӆR3&4-! $*18CP\gqy|y}wuvvusrqpponmoopqsyy{~Ĺtlsów_wysc{}|zzuqoppqppopoopsrkitczynZI:44>WnkmcM4"?[ts`RLMZZ@-4CNXZipirǼ~uqrímUHIQcsz{xptmf_ZTOJCEDABA=41%$4DORKE=7,#!!!!"""""!!! nkβ{mizeOA-)," /Jemmomki\sڨ~hqtm`NIJRU^`WN5"  !"',28;>=@CEEB?;:51.-)%!! 1@IVB7Gq~gQTu}~ɳĺzvtrlb^^^_bbdgjnoppuw~}}}~}yxyzoy{yyz|xtonfeb_[WQRVZ]_`^\[`aXXcd_aqooQ7>mwO8,4/($#%%)-4;GR_hrzȼq{w|wwwwvtstrrqonnnoosv||sy¼upmsʶ{oihlt~phu{frrot~oc|}{{xtnmnnoqppqppqqpjih^pǽxdZSYeriE#!:YuweYW`kfI58AGKN_rv·~rmrȱeOKQ`pxz~vpmjd^YSMHFGHDDD@92'  8JSTF@:1( !!!""$$$$$#$$##niͶstzĵt^IBD?0*&),.38N`ty{{vocVlԠ|ltseS=DLW\_YK<  !'&)05;ADEFINRSQNIA>=;93-(& +OSPC=6/(  !####%%$$%%%$##ljʶxvЫnda_]RJFGMQUYcmx}xngZj~tteSG:FS`d_P8'  '//430.66679>CDHQZcjpzνdx~xpvrttutttsrpnllloqruy{qir~xxnjq}ɽ{lcYQMIMXaeaacnn`wgWT[cxsf{wspmlnnoprqqppnljhjnlcVǽ}dK.&6Rt}wsv||pYKRZa_]kŽ{ph~¸ue`ft~|yvpjhgeb[VRPQSSKGB90% "3CKKD?:4.'##$$$&&&(%&%%&%$$lhٱ|psz޷ty|vtslimqsuwotx}ymjdky}znP>BEMZfeXB' "*4AIQX]afiegjmonnka\VPLE?:3+&$$ @^h_bΪjB("P~sw}}ǻjdy}zurpniecabbbeefehkmnoqw}zurhn|~z||zyzqv|v~}~Ĵr}yvqneda^ZXVWWYXVTQONLMHIY_\`orrS@JteJF=>EJPQSU\bgnz͸k`y~xotprrqprqqplkjkmquww|{wqrpx¹}ndk|¼wk_TNOQOTYbgu~|k_u}aSRRShyg{wrnonopprttrqplkijl|{bFt¶|kP<4$,Jn}|~~}q]Xbp}zɿ~wolþypox~ywvsmheffc\XVV[]XOF;/"!2AGE?:83-($" $%&&)))+)+***)((kgѾpny侇t~|{z{phfhi~uo^>4ERW`f\H2 "&*3@RYcinrx~~|{xyy{|rjaXRLEA<5.*(('#CVXOX̦Ũb: 0Rqp_Yix}dY]{}~ytqpnjgedcbbecdcfimnnnw~xtrhl}yvx{yxxhbbksrsu{wy~}xz~͵ckomw}{xspfda]YVUVXZXVSPNMJLHKZ]Z]mrtYLZ}nTLBFDGBCFMV[ZXW]adlyɳ_Ztypuqpppoonpnjihhlpvz{ojkuy¾|g\cxvfXRUUTU[bjxxgdwtXJJII_}i{uomopppprtvtrpkihjoe>iı}cM.!!(Jj}zvsr|wgcoƻ}}ztsxƹ~y~~xvvtmiegfb\Z[]dbXJ=2"'>JHA:5/*&"! %&)'*++,..--.-,,kfͭtnux}sfcefuxfXG6:O[ce`K4$"/5=GSahsw}zqf^VNIC>9300.),5PTKAK}λɻ~]6 )>C=@YoueXS]|}ytqpnkhfedddcccccglmlmv|vqpjjzvruzwvwiXLR]erzvx{|voov}˧fcr~{xtqkid_[XWWYZXVRPONMOJLZ]Z]lotaZfzj\QDJHGJILT^a_ZY\_aiy~]Olzsxsppooononjhhhlpvyvc_kz~Ĵ|bS[qte\]Y]eouw|oadunM==?C]kysmknpnnoqtuutqkhglr~j;[{reVE6'4,+'$"%')*&&'()**+))(''%%${kСt_eafwNj~rpjdonT7+9QbhggQ,!"*3BP_ipxvjaZVTKD@;8jojaOƘvћr[:  #/Pn}wks~jXSQKN`}}yusrolmigdbb``^_begjjowysrrmmzoonu{yl\H@Lg}}xxwgbfknlb[gvrrϧ£~|yvnkgeb`\[[ZXVUTQPPOPT]`_[jhklo}x|j`WKLRNNQW`fhd_YVVZdwѲv\E_{ztwsqnnnonlmkkiknrt|zoaU[jνaPO]qy|xlb]cuz{~|}odZUYwganzunijosrpnnswsqmjfhnslKDX{|kVI=1%" #-9Kcu}ri]ROMRX\Z^dgovzyy~}~Ǿyztw¸|xupprqrpokaS>' + + )->BJLD;2-*&##&*-/-,+)('''$$# ! tɱjYdeoNj~xtmdm~kQ3.AZfkc]E) $$15>HS_hnt}}tj^VPMIECA?>CIPLxy^YsӘ}oX5 +$$0Trvkyyl^QLMFGXu˹}ytsromlkgdc`_^]_aegjlpyyrrqptzmnqjkbRISl~}y{xyvcY[acd]V`lghzɵµ~}zwqnkhfc_^^]ZYXVSQRQPSX\]^kjmqv|h\UMMQKMQYbkmg`WRTWcwֱrZE`|}vytronomnlnljijlnpxyysj`X`qĵgRMUis~yvrmhb^[gtzkUTV[epv{yuv~qf\RMPi]9,%,=bmysnkjmpommmpqonifdhotpNAOºxtz|kUE:4,$17DTfw}wi[SRUXXTTXahossu{~|zzwxyyyz{|wtsv{Ķȼ{}|Ⱦzvtqqtx|xqjRA- + !.5?BIIA7.('"!"'+/0/----,,,'%$"!rd[el{È{~{ofjx{hJ15Phlj^M4%"'+/7;>DLT[ahpz|re[SMKGEFKMLQWZYliAkԣmU1  %$2Vuyqwm`XSLGG@@Ooؿ}xsqqomljfcc``_^_bfjmorz~xrstzɸwmi^fh^SZrxyvy~xzw`RPTU\YRX_Y]oxu~{xurpmkheba`[ZYWVTTTRQRV\bljnvgXSMOQGKNXcmnh_SMOUbyޭlXEa|y{tronnmlknmkhhhhkrqmhb]\f{qVJN]jt}vpib_\\[`jw~wpf^Z\aigis{oe[QJFFYpnP8.%);`l}}xrnkjkmkkkkihgfcbcirxwS=@rľxljmm_SD:69:8L[qwf^\][VLHIRZahjnuzyvqlggggceffeefhggjpzǻŹ|ĺtrslns}|n]>,   %6=ABGG>5-'%! $'*+,--.//-,''&#! Ȥ{ddjijw{rghqwvaF5CcuocZA*'-25:9:9?JXbsylda]ZOB;:?HV`ejmohb[SPOSUUWXVTRUW]_is}~}~roqffmxw_I*  *Uup_W>,/9CKI@?=1+=cis~|yurnjifebccc_[XY\_gq|]:*WÿƸscYSIFA?I\u{rl`[UOC6004?Q_gigdWNE>;@=;72-,**)+,-/25776410+)((&&%%˽wYRat|ټ~{soopoWHIdqc[IҪs_tolM)  3]|wssrpw||urtqkYNBADFFD84?YuȞ|yz{x}xspooljfdb`_^^`acfkotvx|wx¡qaa`^fx|zptvmjiflhff`_m}qhdcgyzyz{{zz{yporu~~}{vsqomkgd`]ZXVTPMNPPMJMYcmeix·qYWSRTM?@IT\^XOHAANdИlWH>]y~~wtpmjifgpqle]TONPSW\eo}Ȯ`H=DAJV^dglox}p__[SLJZtîlM8=MW]ixzoh\UPMMI@:79>=;BD7/Ac~fjz||yuqmkjeca`_^\ZX[_emvc@)Mtº|hZRMLKMUkvxwnk[TLF<203;G[kspjaNF<3/4;?JNQQMLPW_hs~Żоyw~yjcaUQQXXL2 $*5CF@<<:863//-013569<>A??<;711/-+)('ůn]bn{Œ}xrpoUJPnvme`WVYYVUQTW[^`abkaVJ@FNXXSLG>@MglTB9Yu}}wtoligdflnh`TKDBBJT^kxŮ`E7<8>IOTV\`irlZ]ULIO\o|~~|um]VNA.$3M]ahsxrie]TJFGE?:65978EK?4Ccwa`r}{zwtqnmleeb_[Z[\]aflsy|iI,Ee¾jYQQTXZar{p`X`uuqbZPKEADJS]n{zqfQH<3/39>FLRSRSYaowȾ~|ǶwuztcYSC>;=;.  + &-27>GGC;97542.--..00027:<:;::975533333çhep|ɒyrrUNVr{xrrpkihd_]_cgjkkkrcRF<:DQhmUNMRZdltwtqonmjlrw}}~r: %Q|{ywy{~Ӹlt\J8& !+Dl{slbXPkuyqklnlk^RKFCCB0)2IeǪtmvxnqpmnookgcba`^^_abdhlqtxy|~|wtxߢn_djow}{tnpku|rk]Ve~|p~wonoqrssrsz}~~~~~~|zutronkgd`]YWTRONNORTUY_bc^eymafb\[T?<>IVdtŰbE6857?DHJNSZev~iXRJDGPX][[RC1'$$!$>^hhkqrkc^^SE>>><957977GOE;Jgwcap}|xuqnnnged_ZX[^bflqw{{nQ1@\ĿgTLMT[^_mk^OA>Jf{pf]YUV]eltzoYOC735;?CJSWVYcm}û~{~˹urx}p]LA1*&%# $',3:>BGGE=:75431///-,)')0222345689:;>?ACΞ{bj͖xuwQIXy~w~xndcejlkiecjd^ZSNMShy[VQQRTX]_abgoy{|vzvpG,7bwuuttvz|òh80'5Jm~wph^\\rwukeinqoh[PF=:4-'2Pxîoksqiflqqjfegcba`aabafffkpqrpy||unp~Ü{go{xuwwrjnunqrl]Qbusqrpuvffjmkjjmojryζ~||~~~}zzyrmknmjeb^ZWUSRQPPQU\_`]\YhzhjjYY[L>657:8796;EVsМ}hWC3Rp|y{wrtxyvrmga^^[WQH@9;>K^qñaL?110346;CHCQi~}k]PR948/5711-%"*.*!%BnrmlcSGEHF<6798:=709FKHERi}wkdn}xsrqrpkif`[[`emry}~|pN6:Ox~]I@GP^gjkpxvum^K<40);^xxywuvy{xh[NF>8787?EFHRcr}~ľ}}~~rk|}z|wcA"  + &#/7>?@GG>@@C?725974,$! #&,2:BEFEA̞}dhzˑvsraY`uzxxqomif`YUSTW]bb]_csig`ZSOLMMKU_gpz}zyomJ9Iq~}vttrsuy{~ջ\?"4Otyn_X\clone^_deoiea^TH:2=Zórgnoiciomjffgccabbbdbfgihilpszywuv~ѵ~rqxomiowrs{pgpvqmihm~|wjgcaekib]p͹|{~}|~}{yxsnlonjfb_[XVTSRSTUY_ab`\Yeyi`ZZXKB96651.25;?FTgzƿsVB2/*+,15=@?H[p}n`]aB0,$./01,'&*4=HOQIKc}mdVE9?A?71469@B;15CMPMYi}qemz}xrpprrkjfcabfkruz}}}qP69Io{}}{\F8BM\^YTRWVXTK?1-*(;^~~rh\TNEBD?CILR\mx{{}}}}Ĺrjx|zx}xa<  "+18@FHJLH@<883/+(&$" $.7AFKǦrnt|ʼn}upmqmknqsxvocWKC=;;FWeidfj}|zpf[QJHFKV_bcjy||vgaJG^~{ytrqpqswy}Ԟj1 2Z}jVP]lorqha`dghks{vbNSkƿxdinibglkiffhedccccfdfhjigjpxytsxǥgfrdcbjwrqzxnhhn}tindbZY`fa^^Ȼz|~}}}{xtommljgc_[XWUTSVWX[]bdc^Yc{oY\`WMF?<><5259?I[y{xpYE=Vntppnlqtuvsmf_YTPLGB??EO]oaA0,%"$*/56>@Lczvix^?2.<=@@;79EVcs}zvl_QE=;<:21467?B;36DPVP[i~tafr~vqoorqjjhghjoswx{{z|~qS86Agqqqv[C0:GWXL=67?AA>81/.3Dd~}umgaXSURTY^gp~}ɼ}~{|~ɾsjqyzuyyf@  + &,)0;BHOOLIC:.&# "5EMʹyyݼtwrnwuofdmv~ueSE;88CM`nwv[GCWmpkmlkptutsmg^WRLHCBDGNXgw̸c?.+"&,.-9:BYu~s~]NN_afe_Z[fwúm^QGB99644322ORD4,,787789:=EUl|yrjgjkknt|z}}|~~~}{}~sfiuztvxgB" + .9;=?CEDA81(# $6@±~ټn~}wrpni_^isy~~r`TONPW`oz{tsu}wqnghklot}xk]e{wuqonmnprt{Ԩq9CvxcOK^qvqj`XV_hsȵoflpbfhggeghfdddffhhhegkrupljr}ټX>DUX\VXefdn}zqlkls}aLPQKEFSf}xx~~~~~~{wuspnkgfb_[YXVVUVYYZ\^`ah`cre\QBB3/3;?;:>@GSg؎euuZHFVhlgknlprsssniaYQJHDFJR[dqʴ^<.*!"&((32:Rp{xjj{}}ìu_L>9767993..?JPRPSV[Wk}ideuxtssuuqnnopsuuvvtrrrvy|{ypY?7=aigeosqsqu{ueO4 #1DH?3,+0//28@HNXbt{tux}~~ǻ|zz}{z|||qabm|ztvyr^>! (,-.2?ID861)   + $|u|Ɍqv|}ufd`]alu|{piggips}|yx{|nv~yvtpomlnorsx`!Cpzn_QObrwpjaYXakxŷzihoefgggfgeddcddfihjfekuvphiwѳ[:4NaOI\ɸxv~}}|{yvutpmieca^ZXWVVUTW[Z[Z\^i`bmv]E78$ '/545;>GVoчanoWHITbgckmjnprrqnh`XPJHGLR\gq}ɰY:-)!!$&,-5Jbx~ůzaK=8656:;4-.>JSVSPU\nsd^k{ytstwvrnnorsrqqrqnnosw{{zqZ?8?\fe_dfdhjmrx}wfWA*&3:71.././4>LU[^dpz}wz¿ŷ|xy}~zyz|}ǿr^\ds~zvxwlY=%!%!*9:4.5?4! +  +ͻucWW[fnwܞypp~w|~uga^cnw|zy|}}{{vsrpomlmnqru|ՖU,ActeZUXkwniihddlxiaifhhghgfedccddfihlihlssoirӻsB*+JWWV\[^imv}tplhegrnUP:6P|tƹ|u}||zxvrrsokfdb`]YWVUUTSX]]\Z[[f^_h`>4.#(')/9FXtƁZcdPIJM\a_imjknmnlkf`XNIKLR[fqǯwV<-)!$$'.GPUYTY`kx~yx{xuzƵͿyuw{{xvwyĿs`Y[fszzxz|}~scL:149<5,-0>94/)#   $(.2464697) +һ~ywxdSQS^iwlhw|ovspfcn}~}yurqpomlmoqstxȖkW>5I]x~o^VV_p};iZeihihhgfdcbbacefgljjlmnnmzɽO.(>PVUXWZdks|utnjfb^arjW_H9W÷~w~}{{xwtqrsokeca_\XVVUTSRV]^\ZY[b[]f}`<3)$3BVv|T[[MJJIW__hlhhjkiihe_WPKMRYboyűuW@0'"!")2CYr¾ȳ}_H<94--5976=CLTX\fzŮiSWiy~uqprwuoijlqrolkklnnpvyuW;7@YfdYVRSYZ\bhlqvz}}~snaN8$  *3<><;WzuHOOEJSNVX[ghaaaa__^\[XPQU\esʿ{_G9,"!+)%8Qo_D730-06;@GVgsͪu`QQaqwzvqnnpvtlihhghhhklqswz{`B6;P]e^SMONLIKR\dimqsssuzyr`UG1 + "6MYTNF?<8645;FZwztrw}olnxŪzx|{vurrtx}˽qfbbfovzzwy|}dD' 8R`Z]fnux}~~`A Ͷztwjcbenx dVYhQ[~}vw|zx}̻þ|sx}yuqnmmnopopqtwzȿ­}wg]V[hw¼lH[bhhhhieeccddeghhovrfbn}̺W6>ABFILQW]bgmsuwz~|{~}zzxtojeb___`ftslYFLqý{xz}{{|tpkgfca`_^ZXVUTSRSSVZ[ZZ^Va~tO+#!,DM\yħzeSJRfqtqmjkntsjffffghimpwz}{aD79L[fbUOOMF@BGPX_bfjkkmpmdPF6! 6O^YPE;;64/04=Rpwyutzskjqzк~uru|zvtprsw{}}}piedjouvtwy{}Ϻ^8  Feunmsz}cC Կwkeqgaf}ʮYC?F_`]TM_{zz~|wzûþw{~}zwspmlnoqqqpsvxzƼо}raYV`tȽzKY^dfiiifgeeddfggekmh`dwzz̦nE=?DMONKKVZ]bgkopwvuuwwtqqqpnjgdb``abkzpW<%)[Ʒ~yz}}}~tpkfeca``_[XVVTSURRUY\[XZS^ʯ_4,*&"!* ˸~qlkNLp˶gKIV\E=DGNdv~}uwɾ̴ƿ}yxusomjinoqrpqtvx{ſͱ~y}xm_WZiȻWX\afjjihigfgfgggee`\^m~ww{ֺU56APWPIEOQSX]bhlsqpnnlihkjjigeca``bfn{}d@'.Jz׼ôyy}|||tplgfc````[YVVUSWTSVZ][YXPWvһmG52-&(.+',HT\^abeisulgfghlrtx~t\J@>CVeg^WSL<40/1467=AC@@>8..>INMLOTUOHDBDNctxqsvwuldgo|z|{yy{uqsuy๒}y|vtv||snptqonllmnqqqy̷~pc]^ekilpsvy|ܬj;"! '?g~Y8 ȷîqG?cdKVxtX][Waarvw±ywy}yvssqoljihmnpqprtwx{Ǯ~~re]W]t¾¾a]^dkjkmkjijhggdh]T`vnӴ7/2CPPKLIHEHQ\hppoolgcbbba`^\[ZY]^adfp{ypmj_gqż~|vrqqomjea^ca\YWWTSVWWUTTWY[NPcƳ|N;38=8155AY~ͱeLEPTENUYYbaVRID@BFGKWgsw}дeJ6,'%"# %8FDSw|{|}}{wtssxx}_C:4-',4H^ĭjOFOS>LTVV]\RMFCCEKNR^n{~étW?2*'"!%"9GEOptptmlid_[\]jksZ?73-(+4?B<7:=I`og`gposz|wnkjeflo|}skflsqlnyμyooVIW`\]jhghnpkho}{}rjdb`[[X\dqҳİW+"SW7 ظzndUHAF]ŴWTaivx¿xoe^[]dihhfpox~vwwwxxwtttqmkkpmnlkmlmmitȚvttia]ZUdſhLfqchinxtnorpjb\cu}wznwпpO=8J^\VSTUPQbt}~{slie`_]][YXXX^]^[ZZZZTbb\UOgľxu{|{tutrpmkiea^ZYXTSRVXWTTZ\UTZiǸvTAHX^dpwЯmXMFGDABGHEA???CLS\bfpӿ[C-$"(8DHMT`o}pc_^^^^fogE0(*-039CXvͺ~rcTMGHIORTUVZ^bfjnptw}{iUJLR\eoreM8-#!#&''#! +  +#/9=A=;DOenhemtpqxy}tmjgccj}tjabfnrsu}Ⱦc[UU\`deginpm`W^zԺ÷y~{}tlhe`[VV[bn|̔fC00[];  ԾaI:CUz˘XS_kv|{wqi^[\afnw}sszxrqqqsvvssqnihhlnrtqllptty»ˬv}tdZTQXmĽó«qWdkbhovxmirxoaZVkttyylzȠsK>@CLYW^_UHJ]n}wokif`_^[YYWVV[]^\ZUTROVQKM[Ǿzsw{~uvtqnjhgeb^ZYWUSSVXXUUXWOR\lbS[mxѮmYMHGE>=CDB?==?BJQ[agq~ȨdI3(# )7@CFJO[k}}wqnmmq{~]A0,.348?Ni̺}rdVJDDEKNRTTX]adinotv|ygSJKRZenqcL6+ "&*(%&&"  +  1Bauҿwrieksnmpmjc_^\[Z^qv{|zvqmoosy}~zx};\KQRIW\fjg__k~̱zxy~{smif`YTV^eltթZ@W^> +ƣl``p͔XQYgwztna`adjpyzwronnprtsqnjgdceosvurrtw}}ƿ³ٻ{|wfULL_{Ĺd`dckuwqijwxfYUZtqgq~zmqʚmBAND>KV`cVIM^h~{umjkhb__\ZWXWVW[]^[WRPWOB=Moɿ|pqxzutroljhfeb]ZYWUSTVWXXVUSCL]sž|qzʨhULHHD:8>><::;?AGNY`hsͯmQ:.'" )3;==>HMWj|yykQ://279@L`}̺|reXJCAAFJORSX^`ejnptuzyfTJMT\cmqdM7*#())0,%  + $+($.H^ʽŭ~dwqgirtutj_[XXXZY\cfmqw|{ww|yw~ɰsqk\___XOLUl㺬wvwzysmie`ZRYbfilxəgk[;#! y{þƳЙgZVcw~yxyqpnlhgpv||~ztqmllnomjgdcddgnstwz{{yzwþٻҮwn~y}yhTHMj»½x\_govrokoulYS\tkcqkc}¿ɾɫvDCVOADOWZTOS]_xwsmjjid`_]ZWVUUUY^^YTNIR@16Vʿsqstssrolhgeca][YXVTTUVWXWTNAPfŸؾaOIGGC62687679@ELPRX^bgjnquuywdTMQYaempeO9*!"'*&!  />EJ]~¹ĵcQqkvujjhghlmmstvy~zw|ŲnfYG8:Op¼Ŀ߲~u{ywqkhd_WSZehgit}´ƇW8$" +klpu{ϣ}gS[s}}ww}tnqq~}w{}wsnllllgda`cfhkortw|}|{~xzγžkm|uyvfSIVvcalntmprrm\TbtlhqyzafǺƺI;KZWOGJMOPSXYosuplkjfba_\YWWVWZ]\ULE@A..Co|wrnnoooliedca][YXVUSSRTWWUKEWpĺȷ̯qVGCBEA2.121358:9;?JWes}ӻiSF=1("%(,.1552656?5Egvmiknnmidbc`][ZXWUTRPRUXSKO`u̽ð}bG;:<@>.*-../376214@Pap{ìwcVL>2())+*-/0+*+,,7HV\ac\X[ced`WUZ\RH?4) !)/14>\ĸ|ztk_OC835;AFOT[bgimooprv}}paTPV_cdilcN9* -DC=. + "1Kp˾Ŀ¶qFR–{jlr~}||x}}οĢ~fcsĮűyu~|wmfb_ZWU\bddgowؙxR8)#  +  Z[]`djnow}ɿ̽}U^jr|{zvpgeegjp~qtywtsrpooic_accdswzsoq{付շo|~{xkUMPfͿ|nodmkmk^JJj{tyseYfעoE6^pSICENLFM\^lxwqkigfda^\ZXWVZ\[WPIEJIdykehlnmidaa`][ZYWUUOMOTVRJZi|Ի̽ιqT<214;8,(+*+-160,(,6GZlx}~˷sh\K=2)+*'&))$#&&$'4?GMOJEGMMJJA>CH@6-%&.14Fi÷|ytlbNB6025;BKSZ`dhllklnrx}~ym_TRW_bafi`M8) ,:?C6$.>VrŸ¯|fE`ʛojjs~~|~|w|{~βƭɿ{nvxmd_][YY\bddhms{{zwtw{|z⻆pM5-) + +  NSY[[^cinqy̿cW_jzudYYXQT`_XS[o}rxzwxzusvwrsqnjecacqtumhm~պТ}|raRPVjĻvf``jbYKJcöy~xgXXtϺ|[YVWMMHRLFJM`oqrnkmonlhd`_^^\^ZZZYTSU^jÿqehjkliecb_\YYVSQRSMNSNKQ^nɵʵŲdF0+1550%"%&(+/1+"!/BUhw~|{};~ucL;5+&$!"##!!(05?BC?;86500//472& (/9RyĿywtlbQB4.-169JPW\aeilkjkovz{|zxn_UW^cgdeg`M5" #1>;9447Y¾zxtjaPA4,),28ELRX^afhffhkruwwvum^VX_decfg^J6' "&04;FTfzŹŽtM]ٱzmfmzztnknrtrmpw~}y}wpruzǹ|xmggilmrsqjc`ekt}xrpoou~wztns|}zcJ;71*!NMKNSX[\`bgpuzºܰjbdr}}y[LBFLUbpuzkUOS_iu{wrpnkh\\dn~|wϵpѰ{~zuwobSIJ[nʽʲp[NMOYg{usvvl`XgºŽ̼f@<>IKb~p^xwrmlqronjfdfffebed^QN^m~zlnqnic__`^[ZZXUSNVTSSGBKdpôǽ\@*#$#%/1)!$4G[oy~{{ƺu`D91'&*,+'%# + )7Fe˼|ztj]NA5+%%,4?FMTY]adcbdgnqssrph[VYbedcee[I9, #*1;H[q¿ľsVr׶kbk||unmqvyv{zsq{siegr}ȿľǹutƺxnjmqvw~{qc^agr{xrqqrz}tpnxneftxx}}wxxp[F:<92+'%&(%#"##!QPMNPUY][]aimq{Ӹ低ta_kx}zyzfNGYqq\Ybm~þ}xsqppm_VXm~vҸ~Ƶ|vpndVIDLbw̿[IPThkjjosrjgg|¼żüгU68BCaybywrllrsopmigiikjghg_SP^o¶}uoiedb^\`^[Y[YWUPXWSRIHSltз{qrĸ]D/('# )(# +-?Tlx}}|z|ŽtPD:."#%!  -?Osȴ~zshZNC7)%.;BJPVY\]_^_chkoolleYU\fifaac]M<- $+?Vm}ÿýhϵmdl{~~}wvz{srv~zk]V[i~rjuɻ|xz~vomqvz{tf]`dox~urqoot}ztltldhu{mhu}wommgVF?A?92.../-,*+,(!KNRSQPPRVX^filt~ϲř{_Xbow|~zvnlXMSo{gcm|yrkd``m}߾yslaYNHHQdu|jp˿[GYoriilnljqzýƽӶu@:<7Uzrdwwsmmssqrokjmmoomifb[W]eŽ~}o`Z`eb^]][Z\[YWTZVQQMQb{ͼ\B@Jiü¸dK6.*!$*(" + %8Mgtz}}|||{{ŵ]OA3(!    +&6I\Ű~zrfWOD8)%5=FMQUXY[Z[_ehkkggaXYahiia^a_R@-"(4@Pkuîxfahsz~yvz|wmc`bkvʻsdkźzqkmu~}upmrwz|z~}tg__bioyutpnqolot{z{vlnnpklnledqzyvic`_^SIEHGB;776675212.'!BGLQTTRRSV]egiow~DZͤ]S[iqvymecRIRk~xe[YWqrkb^euϻyi`Yiz}~ճż}|{{{{ulfWPJLS[emv||xn]m̿_Mdlihiio|¿ƽґ\B4+>XW\swxtqstrrqnmnpqpqkggc^^_}Ͽú~~mYSX``\]][Z]\[XXZQMRRZlX>.%-9flUC8/#!27/   2Gbpx{zyyz||ŰmXG80'  + + ")3CXkñ~ypdUNB6)08AHLPQRVTVZ_cegab^YZcjijb_c`SB3(*;Srzϵwh`bgv|{x{xk__pȿ»w_lľ~tlglvzsnnqvz{vwtlc]\^`ahr~tlhfgknlousvvsqigqxskimmhu|qkji\TSWWSMLPOKEBA@@?=<;;70*eYLINVYXORZceejqw|ɾԮ^OVemr{~z`]`M<=OURB.#/6@L]sƼƿpipu~hdlƻ}wwvwwunbZOHFO[abbfnmd[[}rnjhmr{ƾȾ㳆S4(1<=Onx|wvxwusonoqrqrmkkhbaaq}}z~{h\WVVT\]\[^]\Z[YOLSV^meA #7KzxcRJA3(" (23) +.F^nwzyyz{~~fOA7/   + ,5BSi|}xocVJ=2' *2;AGKKLQNPTY^`_Z\ZW\ehffeff^PF;;Nm¾}̼{okkotx|}|{|ywvsvĿĿhl}Ŀ|tnorzuokmsvz}yukb[YYXYVY_nz~ukb_]]beglsz{rtwrmgjqvsnpstnwyrifd`YROSURMMRRPLJHIIFEDCD@<6~U?AMTTKOXadcfmrw|¹ݸdSXdko|}~sVX_K/(!" +?WuĹæoupdfk~«ʿ¼~~}zwxuvvsi\SLEDP_d`Zaf^OI^÷vojjq{Źȼ׮j?4645Qo{{wxxspomoqrqomllhcdgi̹ÿz|{w}{~o^TRRZZYZ\^][[ZMLUX^kxW0",Iho`ZRG<6-)(#*?Whrwxvz~ϸw\KB8%  + + + +7DRe{Ÿ~wncVF:/)#"+4Ke~{xssqonoprrlsrjca_Y`||wmq{|}k[VVTUVZ^`aa_XUUX_lx~P+ !2C[sȼt`SIB>6&  (9Raknpr{ͰjXL?1# + + + +  ,@LYg{ʿwk]SA6+'$*5Q^kyüxj]Q?4*&" &08<@BDBABEHGJJJLR^gjh]ULGPg̭˵t`WVV[bjmonnqv|oitvʻ{~|{{{|}wnffilg\RLJIFCJKNNKIEDEGFHMRWZa`[TQPX[adijkjoopnoopmjghefddaa_a`a``]][VTUTTSSSSRPNKHFDƨ{UJNZ][WV\cejmrw{ǥi`bccfo|vj]A)'1BGINQXp򮍮_ҽɾ}qiecgltyƾ}~{zwoke]XRMJGQYVKEMXD8>k˿ùd^befnʿ˜{o[IP_n~~utrqpqsttsplkllcYZr¾ogkuzyxzgYMLOQVZae^[XWXe~H 4I^q~xy|ʼoXE7.&  #2HXchlpx}ίyeXMFC8 + !.Qcozzj[M:/&# +$,47;=>=;=AAABCFIOX`gf\OEH_¿Ʈȸvqnrvvzzxx|Ρkjo{̿{~~xqoqqgZPHB?;9<>ABA>===>>?CIMNXVTOMOWY^_dgimprustuuspmlikiiffcfdfdfcd`YYZ[ZZYYWWWUROLKȢw[QVY\YVW]bilpsvzŪpa_`adjx{o_D3:H]ghkp}ʧpqmllklpty}~ywshc[TPLJIHEEJPME?7Deĵ¿~^^ehhqزbOYjtyxvusvvxvuomovwoc]qÿrhhrxwtz~scOLKHJPY^]ZWTXez=!8N[l~zleacpsYC2' +  !1DS_ekouz־xfZRUM7%&&#&#*5BgvŶ|l[J9,%   &-2459778;=<=;AHMU\_]VNN`ƶĻڸpbhvĵ~~|qcUIA<8767::;;::89;=@DHHQPNKKNVWYX]bglpswwxxxvtrnlllkihgfgghggfd[Z\]]\[[[[[YWTRQžw_QSWZ[]`dfilnpty}dz}e^\ahmv{pdNDQc|ьyvývuzyursv}ú|{vrmb]UNKIIINB=FNH9-6cʽr_ejoqzʫcNYk{xwwwzy|zxrquzzsjk{»zpkqwuqorx}qc]ULHIPV[VRRXgtA0ATcgozwk[QGFP`o|ŭwZB/$   .AOX`hnuzȶvcXXZQ@;2.3*# "& $'-5ALY}ƹ}mXG7)!"(-/0422479895>HOUWVPQP_y¸ǻ¿þƿ~bdpx~ʾ{l]OC<:833576766447;?BEDMKIIILTUROT[agnptvxyyywtpppponmljjkkkjjf]Z[[[[[[^]]\ZXVT{VONQZ]beefjlnrw{˽qb\bipwwpk\Ziѵiųzy|õ|yvpjeZVOKIJIIJEEC;0/5VϿzxwyzwmensx}ÿٿyj|}zwwwy|~~~{wwywrpl|xuzppqqmhiow~}xoaVQSW[RLR_qsK1E_jmgef`TG=34:ESdt|ɲy[@- + +=JS\dlv|l^YcaTNB9=6/)%"""%*08?KYgvǺ~nXF4&"(,-.-.044253BCBIHHGGKTUOLOV^eimpquvxxwwqqqqpponklllkjif^ZZXXXYX^\^[ZXVUѺycOLU[_adegikovzȱ~j_agmu~{pnvquĽޙiŦͿ|yvrnga\SPLJJKKHBDH?*%?a|rnhhhmnnkjvzӼ}xuuvz}~|~}ulot}Ⱦrk}ulkkifjlpry|ofbb\PHUj}t]J[oql^RJC;3-+-3:I[kt˵{[@-  ):GNVbmxȽyfgli_]RFB>>;6/*),:DPZaoǹ~oYF1"&)*'()+/0./7?FP[]UJJWtüʿſȻëoddovuxõ{jXH@<<221///.-.15;AEFCJIHIHKSTPLOU^diknoruvwyxsssssrqpnnnmlkie_ZYTTUWW\[\[ZXWV¤]QW^acceghkovzйqb`fjs|~}thm~t̲ʽyurmjd[UNLIIJKJGAEG=-2`þpgc_^bgikkl{δϴ}vstvz}~wms~pǼpfzvjfhfgkomnsvqo[LEVsvk]krodVG9/+)()06;K^mw̷}]B."  '9DJS_nzŵowumef^NGFHIE>88=M[gpvǹ}oYF/ $()$#%(,+),:?EP\aZMEXz¾ùſƽɸt_Wenpt|ǹ¶r_NDA@743//,,+/18>DGHEJHJIHKRUUQRY`gjjlnqsuwwwsstttsrroonnljif`\XUTTWW\ZZZYWUUԾr]Y\]cfjlnoqs~îmdcenv~}}}|slynʳǽwroh^XTSEIKLKKKIA;97;853/,*---1:BGJJFOLJJMQUYXX\_cdcdiiknortupppppommoonmkigeXXXWWUUTUUVUUTRQqaadiikjnqvz{ʴthb`hp}}z|}{utmûtokbZSOMHKNONLICA85Ff·{kaXSTZa^akonv缒stqqs{|qpttɺĵveko\TWchiqngmyxouwxjHHZx~cfe[MC4&%#(-9H[n}ʶyW?* +  %2AHRew´lfope^SUgr]K7&#%"!#!$4>DO[b`YYvùÿeXU]^gwļŷnVE=<<:740..0/3+   &5CJUi{~ɾsy}ohgpr`N;) $%"-3?PWY^bmþ¸¾¬\MYXaq»ĶuXE>;@=:6201224>GNRRPPMLKLPTXX]bgigebaacdgjklnmlhhfhghghgfcbadec]ZWTPQPPOOOOOuaehmrtsplssvz~Ϻwi]dly~~}|}{vƽqkd_\ZXWTOJJJIJJ3Fnǹ}wk\OMRW_ekghihkzԝ|{zz~ppsuz{{zssyz~rp}zfYYfdfolbfrr[`iuqKUmaZC8-$ +4EMRRPPLKJKNRVVZ`dee`^\[]adggjnljffeggjjlkkhgfhhe`\XTQRONLLKLMۼrllmqstsprpqu{}k`fmxzz||ȼ¾tnfa_]YWYTRSOGEE6eqjef\TX`ejnnihihm}ઃv}nnpqvx~x}~~xt||l][efhpj^dqrcditvL]y~~TG2( !/7?Obw}X?0&#  +)8EO\o~|}ǭӱ~˹ʿ}tdUC0  )-&$<86;BFGFCBBBEJNRUSRQOMLJKKOTY]`acfjknqtvwy{|{{ytlf_ZWTOHB?>@Aɪqkjkilcahoonrwнwrjnv}|uu|}tp|üıŹ~wkea[RRjskgfcgjrzzvsuumkry~Ⱦǩtry{x~|z{ȼy|whZ\VaqqbafdjfcbcrUatiqywxO'# !%04,!!&4G^vδbD2% ;@EHIFDA@ADJOVVVROKHHGGIKQV[]^`egkotwyz}skd\XUOH@;:<=ھxgdfdffchqtouy~·|orru{zw~~{vsyÿĿ~laZWVhunnpqv~ztuxvwuuwǡķļlgdmny}~wpphpx~̿~z}zwldY\[cf`chfg`\^`lhgivzl~`@&/;5)!)6E[uĩaA+ !1R[]pwqzz׼ͼŸ}utqkcXJ:+ $*(" 426>Md|~ŷżÿd>büſsS>3'$'+/9AA?3# (4@VoŹzfdp}~nH)%%-gztsxŽþXmµ¾sVB8%##&-7CDC?FKKIFCBDIMSV[[RNJEC@>>:;=>@DIMU\dlosyqaXPJGB7.,Ӻp`^bbdglonkkloqrsuyx}ý}|{|vppv|{z{{zýƻ÷º}zxurohfccmuoeOKWy|ux꾥ڽeimuotuwutstwx{Ĺojtz{p^UOSVV_mlfa^[]hvrtxz<-:==9-(0;PjþӤzmpͰu^WYMTkwϾ÷{rlhfc]QB3'  @s{rmksǿ¾Ŀ¾ļ͟szľsXF;)%%(-8DDECHJHEBABDJOTX[ZRKF@=:8877779=CGOV_gkqw|xdXPID?4*&Կwfdcacioqqolknprrrur|Ŵ}usx~wtvwxzŸö|yvsnkea[[dopmbaq|wyة˿γx\^cpox{~~|yxx¹xmepzxe]SSRQ[ijda\XWat~S'%3764-#&,6LiվcTajƺ}rjhfc_SC4( + +  +@{~vlcafǷ˰žþÿrYG<-)*,1;EFECGGFB??ACIOTXZYOJD>8533455458>BHOZafltz~kYOE?;/%!Ĥpjfbchmooqmknoqpopr¿Ƶ}}vtttvu{Ķſ~{xtplhb[X]gotxyÿvx׾½óc\Ygmy}{{z~y}tnakw}lh[UROYgheb]VS[kvoR2#+794-(" %*3If×sb\rȼtkgfebUF7+    A|ym^UVüþƿ¾oXF<20/26>DEDBEDA><>ABIOSW[YNHB:6100344447;@95$ $'/EeݶjqukghfeXH8+   +  + !C{zn\QOķ¾ǽ֬žþmVF;43358=CB@@CC>:;=?BINRVYWLFA8410023444589>ENV[bjq|nWG93-%DZywolprnnrrqstutop}ÿƳ{z|{xyĹ}ytpa]XPKNZeγֱ±Ħӽȭt`luxz}|zx{|}u·Ƽwl[bo}tsdZSP[ijihaURVafoy`UUWdL=+&9G<0/ $&-Dd廒x~wlihhh\K:-"  &Dwzm[PN}ʻƽ㲏ľkUE;64479=A?>?DB<8:>>BHNTVXXMF?8311002344566=BLRY`fnv||hUD6/)#ƫvrtumjmqsoowqkvǷz~{zx}˽ÿʿɿxpk\\TSODBRjѯ¼ÿإ߸ݱmhtv||wrox~{wqt]\jtxxzm[PR[cjipfPLXb^eaZNJMRRPKIKE4$ %1FcÃĵzpjebg_SB2$-4H}sdZXzϾ¿þźèǼ{bSE77468;?@?=<>><:;:<@FKORUWQKE?<7424225546;;?HPYahoy~l_H=1(# vqpntzxrqztnxůʺx{z}{y{qnmjhjijnvʾǽĿzsnb\TUVE=HlҲӠ֬֨}qwwy}|wsrzyǻle|c]jw{w|p_SPW_egmdQLYc_b`YNKNQS^[WUH5%! ".Fc|魢Ķ|ridah`TD3& +:ACO}xledtʼÿĹɰĻs]OD8878:=>A?<8;;98::;?FKQSXZTMGA=:834104435;;@JTZafiruy|o[N?5*$;zsmjryxss{xs~ӳλ|xrv|}~óvj`WNGFCA>=;::>CHNfȶżʿ}ytpi`X]`NBHrӹþ¶Λͧ̍xsptwy{}|zyy}y{j^wn_hx~x{sdXRRW]_e`OKXa^]YTLIMQVhic\K4$!#$$!!.Eb~ucyʻŹ~sjd^e^UG6(,AWZRW}¾~vrppļ¿½˸zmXLA7;9:<>AB>868878899=EIPSY[UQKDA=:53003336<=CMU[`dgqrsuxz{|}zyun^K?2*!˾wjgmpvwyzvׯԿuwwvxy{~|ȱn^VRME@=;941/,*'&%$(9Mgºƽ}{ywspe]W]`MGQzŻȘw~ᾨĻհ֝omqsx|{{~|wxþ¯tg{{eds}uri^UQSUX\XLJU^]YUMFBGPXmqmbL7)%!'..+# $/D`}՘»ƻvjb\`]XL=,  B[ji\\}¿ſ}}s̿¿¾ľļ¿kXJ?6;9=>@AA=63554678:>DJNRWYVQLHE@;93013448?BGMSY_dhnmnnnnnmmid]VJ=2&"j\ZivywӪı|}~rnjmruxy~~ıiXNFDGHEB?=82/)((&%" #&3>IUlž~|ywvspm]UORN=B[žǺ¿ſȝz{ү濪ݭmnnt{~{}xþ~r|l`k|nnld\TQOSWVMMV^^\TH?9@AB@;52432477B@=;61+&" !""! # '-14Ca}ļ˽}{yxvsnj_WPMB4Dkɺ׷۴fipr||{w½ſzxyuccumljf_YSMRVUPQX^a_UI=43@OmqjW@1)%(1;90$"#$/Ecסίʿǿ|qe]VWWQB01hv}zki}¾ºƽҺlaUJC??>@CDB@:5020/147<>CEIKPRSPLHEA;73//114;CGILNRU[`ZYVTSSMIGB82/,'#ƿüs_Vclsx}|ʦʴvyqdeiltwxx}ѻ¯kUMIKLF?=::850+%"$).26EWnƽ~Ž~}{vpkcZPMB8M{˾þஙڹ̻ںcgsqv}xs˼vz}kbm{tphb_[UNPRSPQW\`XOG>64ARdh]J90+&18=6+"!%''(0Fescäsi_WVSK=-  F}|{wlkǾɽ¼ſɾżðꯑqc[TKDABBEGGFB<3//-,-039;@BFIORQNJGC@950,,//29BHJNOONOPNJHFGE>;72,)'&"Ƽôlb]bajz~ǥη|qtyh]akpvxxyſ´t\IB;9@CA>:5652.)%""+013=Xuȿyy~yrj^RHGB9R¾ǩαµƕhlvmny|z}}~tuĸ¼÷xqdhuzrf_\YUNKLONNRWYJDA@<;GYacZI=9627991% $,-,+3Hdŗ뼟vkcZWQG9+  YstknþſŽľ¼ĺīը򮁉zl^YRI@>CEGJJHD>2-,+)*-.68=AEIOROMHFC@:71.-036>GIMRSPKGDB=98960*&#!  źνed_VZip}̽rkje[TTer}}}ưйnYL@7./258;<:200/,+(%!  #'"&2MhĽ~wu|ǻxog^TI?B8Jû˾˩߲Ǿѥzjumjs}|vpy}vqǿɿƭ~|kgoysg_]]YNILMJLOOE=428@DNYe]N@988<>6+'.(&&7Sfw͸`ͽ¼}qh_VLD7( *jxtfavǼ¼»¼ż̿ʹ䴂vsj^RH>;FS]_WH<669=:0$',*02:UiszϽԾļujaVKB4' 0# (Szo[Vjwoptþÿŷɱƿٳ԰͖y~pcVMB:67DHLMPPH0++,-0/0259>?AAB?;62-%*&$)')9Qu{ſ~tou~ɿ~|yqjaSLG;=Pzȷ·˩ڬ}Reropywpy{}}||}~}q}ƺ˻}siole][[XNEEIKPPJB9437@LX`ZO>526>A7( $ .67EVj~ֹƷѽ߽ûwn^QD9- Cgtb\kƮ{oeddxÿűç¼ûб|g[PHA::=EJMOQQI=.$! $*28=?DEGJMPRV[_dghjlpy~~xpdZLA3(  ƹuc¸p`U;>m¼Ǥpe]PHN^lv÷^I;3-)&$"%(,3:@BFIJKGB<5/'*#()(3Rq}qkryɺ~|yumg_PHI67Wɹȿ迆Oammoyysw{}|{{|~~rwɿ}xnkjb[XXUOEBBHMLF?:77;EQ]d_SC87<@@5&&-4BCHKQV[clqy|yl^RA/# ör\ʿsjbJTȥme^SOWgry}~riitİrN7+*'##*4=DGLQRQKE=4.(("!!()+=aÿzmgluĶ|zuqicZOEH7;iͽ¾ɼҬӗZbfgnxzww{}|{z{}}uqwƳô|rlibXUVUQF?;@DC<6036:FT`e_UD<<==;, %.>x؞洢ļyn]PC8)#Rmy}wpkp{м̻ünhcYlǾ½Źýſڸwպuz|iXNE=668GKPPQPH;+!!'07=?BCFLS[epzpbM7& µwdż}{u_nȣmfaWV_jrsxyy{jXTYeƾhXF0'$!"%+46662-  +(Lًs߰⹟Žyo_RF;, 768GLQQRNF:* #!'18?ACEINXdp|rZA- Ķ~p{Þn|ɣoif\\emrmsvw{˸ÿmXJHR^t_GBA2)$"&(+.3W÷ý¾¾ٸzܿpxgZ_ksuww|}|zyz|}~yoqʺ}tpodZUX[WJ;0/.'&*.7CIHC;2-,,&   -cwzпΣžǿ{q`TH=-  &Q|wm`\gĢƺuqk[iŸƇodeyzeSJE>8:Giμþ¼Ŀڸy|貂]lÓbJ\mqv{}}|{zyyy}qmƵìyzs`UUY_`I9-*(! *.,1>B@95,'-/%  2ϓz㧦ίѩõĺm_ZRC0  +Mi~zl]`p~̲μ½¹}fv½ò½ɿȕadvzhZRH;26;IKQQPME8* "$)2:>CFJNTaqøhR<' Ĵ}|lq¹zsuΪvoh^[`eg^dltwz||ĸjQE=6AUkx}wv{yraXMD@>@?6531,+,.,69:GKOVZRJA:0*%+&)/,#!'.*$&;Wgki||g`O?[{y}zyuojf\QG8?XҾثȋfRjңlP\jpuy{|||{zyx|}~ywĴƳ}}tbUV[a_P>/*'$/314>A@=8,%)+" + DǛʳ̿Ǿ~qf^UI8*   &^u}s`YbsŶӹϽü|zſǽƜjm{|sfXQH<46CFJOVctǻpXB,! Ĺvy|~{sgh~ux{tpzϬyrnd`__^]aipstwx~¹xcVF8?MfpqjeebZRLB<8789773.)'),/9==GKUfe[M>60+%!%)))-')+2G^lquv^VG8Uy{yzzxqkgf`WH7@kƽ̿ҜۡfROkzVZhouuyz{||{zy{{{|}~|}ϸǸtbWX\ca[G6,'%" +4:88?A??:.&'(  +hѺ~rqtstzxstsյ֭οvneZNA5( 9s~lYVk۾ïųĴȽ½¿¼~ŪvxtlbWPG=68>IMQPPNF8,!#'+288410752,&%&(0:ABHHZtvkWD942.#!+.11%)0:LapyoVM>1Ns~|zzvnfeeb]SCN~¾÷ľɺʼ̟^^j~ˉ\[dmutvxz|}|{z}}|||~нǸtdZ\cigeQ>0,)((/8?=;=?@A@7211%  +AغtdTA9:==GWjxlij񭣕רºwtj^TJ?3% + )Iv_Uc{|ڶִ̻ӱͿĻǽȼſt~Ȼݮyoh`VNH@:::76.(+2442(*0;L^o{iND4&Ch{yuleefd_^ZiíඋҾſǽȶľ¿ʬ۩|m|Ҽ٘g]bkutvvxz|}}}̾dzvh_djpmjWB2-.-+3=D@<=<@FKIHGB4$ VХwVIJLGBAABDEKR[_\TLFFTu̎ΫߺvypcYQG;.%7V~l\^kp۾ᦍźݺ¼˾ƻĿtŽ̭˦vkf_WNID>@DKQTTTRH:.$$),26:AGKKTey¶u]E. íqp{vvwusuyzbTPNVj|}uhp{~||~а}qoqohb``bgjllnpv{ɡyc^bcmusjfgmkifd^XRHD?:631/231/,*+-29@FF@Tzx[FDDCE>89@DEB879CSevycG=+7Z{{wtmeegd`_mҫʐcbyŸþǽĮyʶÿsbckttutvxz}s|̽ƲxmhlrvpiWB2+-,+6?DB<88=LUY[[P>-  +aͮcH43;:@FKMMNPR[dhcVJ@:852057997669>@BHF@VkRMOPNLJKQW\XMGGQbru`E8"*Lpxtrmiigb\`wƤztupx緁cuݼƻžżþýԷϚǰڱjekutustuy}xu|ξȺ}tqswxpcS>-(*+(3:@>6//5FQX[ZM8& + oԳvW>>GF?;@EOUZZZ[`bcb_]\[YRLLRbīǾʵƿ||sh[QKA3*'#&8Yu~~obiʴꯉѾẝ辯пۺȾĿ{羓½rg`bZSNJFDGQUYXYVL@-#!&+49>@EGHRe{¹qX>( îolsyyz}mb]bl}}uouzzxvw{бupssjeeachiihiluyӲvqe[Zajr{qmlonhb]RMIECC@@DGKMLKKLMJIMLF_{^Y\]`]][\ad^VOOZiyoY?3!@g~vqqnjkjc\byⴈyzmŹϪҺýͬٻϷʫꬳwnqvssppqtz}µzxxxwm^O;*%('",177/'(/>HORMA,   ~ɳiM9-2:;?FIKPW^`^^cehfca_]YTNE9;RkիݿŻzn`WUN>2,&+Adz{y~o`vȿޗ~ȭݢ׵̼¾Ŀys–th`c[TPNIHITWZ\\[SD/"%*39?ADEHRf|qW>) þwrx~ĭneceo{{sntwy|}wsuͰxursnhdgdehkikqtx~è{k_YdyusnmomgaZSNNNMT^\^_bbbabfaaa[Wqvfbdmifdejon`Z\bp~}aJ:'7W~ztrssonmf_XtػΦęxީʨոqUTi˼þüľêʡкתzusmgggjov}q}ͶƭzrlcRB2($!$++&#'.:<=;2$   ;ݼY7)/@D<5/'#!"&(&%,20-(" + OmK5,+;BC?:?EISX`fkprsqtvtwyvqsqlaUKCABDM\ixÚ»ɽú~|{unjkdO>/)<^zvy~vjhoqkfba_^yij|gz˱ϽɱžߪѸȸ̾v{Ľָvj_ZZVSPOMVZ]`cc[K6$"(/28?A@GUi|úqY@)ɸɶthekgdbenw~~~z{|~~}|yx||vqt~̱zwsrnhffdfjkjmqwzӳ}vm`cryzutrrtsoke`]^admrvurpqqtw||yqnx¾ynjoqv}~vuzrW?. Bm|z}{vonmhaZenvШ}÷\_zrS>Gþſ½ǿİ㴈ƹ歞uoe`bceimqx}úӲg̾ҴxmbVH8-&#!"$'(*05.&  !jȴQ)$.5@>>EHJMQ\bluz|yneXJCF>51/4?KfְİҤŸ~xrmmgQ9(+Fiuv{}zqeaed^ZWVPKg}q⦆ƭɽĢ쾙´ȼԻνǹwĿͫ{sj^[ZXVTSRZ\aabaYG4$$,07?BAGTfyĿpX@*ưupigeglsvwsppqsutsstxyuqtʹ|vrrnhffdfjljnry|ַzsiYYhppxutsttqqiecdimrvxwxy|~|orŴulqu~iO7( 9bx~~{tmlmha\dkozسzozȞrNueR»ºȿſģϮþ񹣭uk`]acdfimpuz؟dĿϷymaRG8.('&$!%''*-37;6) (ŸtS, 1;==851008@=GWlؽvŻ¾|vpohQ6$-Ortuxzztkfdda`_VG=Oƪ|˝źï쪎޽Ǩ軤ͺű}{¾ܨyrl_\\\[[\[bdecc_UD3""*-4=ABGRbtkS<(˼Ծ|ojhgjmongdddhjkllosvspvζ~vrrqjffdehljmqz~r›rmcQThuu|ywsttsspmjjpvx{~txʾ{rv{z_G0! 2Zr~|xrmnmf^\ettyἍ‚‘bp쿃__ֹfýſƿĽçػxh_\_bbdfikpu|oƳʺynbTI:0-,+*'+--/28;A<.   ?Ýk:)'8?C?;@Q\UIEHLQV`m}{xre\KEB@>878+($&5Vϣ꾕ĴӽҤ޹÷wqmfO3%4Wu~yvvx|ywmlifcYI=Dyѹ|ʯ¶żs襚¿֧Ҥɸÿxݞpvpmcabbceggnnmid`SC1"&+2<@@ENZm|v`K7$wlgfgfd^[Y[]`cdfimrrpwιwqrqkegefjmlos|~cd{ʿѢjh^OXr|wsrsuxyzww}ưyxmT?) + ,Sjz~yvroqoe[Tdwx{Ó|͎ɚdnea~o¾¿Ľ̩ũ˦h_\`abbeghlou~vдɽyneWL=3/..,).23447=A?3   + eŒ`.!%4BJHGJQQI=65689?Nbqxo`YSOF9-*0-+')4FNnТÜսrYh칝˼ѾzpjbI1,Abwyt|yx{}smh`WPQzƟ~w칝ķqߧIJլâ̯ŵ|wܠo~tplgghknsvw}|xqjcTB0!%'/9>?CJSaq~teO>.Ĭ}kdaa[VSQRTX[_^bhnoqyϺvpqqkehegkonqu}\I`贊jg`S_|{uposx̷{{ļui`I5" &Ldu}zxvtvpaUPcxw{߷ǖyВo|ΰYiwĽǿż翝ȟzδ۵la^abbbfghjmrw}|ͲijzofXL>3/.-*'-387337=@7& +  + $Eeq`5(5DNQRPIDDB?ABA;68CM`ly~wqj`TMD90.0/.)#Iͫ᫒ֳ῎D+:Zzмòɷ{oh]C24Mkxwp}yz~vpkfaRiʬwຮʭqۭҸ߶֮Ӽõxzݮ~{spmloqvz{pfWC0!#&.7==AFLXdpux||{wttvxyz}~zslaR@3& ׸uhb^XRNKKNSUYX]dlnrzϺupqqkeifhlporv~yW6L̲șmlbVd}}ytnns}һ}yyƿtg]S=-#H`s{yzyxyq^PNcwsyĒ}ѕyħaj{|Űw]ʿžƜʠ뵒x~翢qebeddeghhilptx{ٸ®ȵzpfYL=3..,'$+3:73/29<4&  VoO=0$"+3:BJSWRC?ITVbc_SC88;FUdlx|slhd]PC=;8:<:6.(""$(8[sˊѤȡȶќX0#@gܯɽͲ}ofY>0:Vpywqyx}}vofc:Fpzֵp֩аʞɟǤöſw}ǿ㷼߻zuomquy}uiYF0!#&-6<<@CGQ]fjlponieceghhklmh`ZSE6)   ༈ggfYIGHMRSPOW]aehrڳ~ytreghiihhjpsw{rE):Ӡݙ{ijnotzyyy{|ztv{ȮŻ~nmn\?0$ 8Vmy|svwvun_SRalv~Uh֢בҜts{lqqֿwXǵŻǿſ¹{αuzѣҦuekk^dj]eehjntwxֺŵĵvkcM>2+'% !&+.///1;?5  [w_E*'1;BDEOQTTTY_etsndXJB>OU`m{{o`RH@<;94-,./0/-)# !1LaȬդߪ|ХuF%(NֱΞͬ´m^\=5Ggzztr}yx{xoheFE^t}׹ɫӷῤܻmvȼþȱֲ{vqr{|m]H2# %+18==BGNSUSQSOIEDDGGJNPKHEA83/'ѡzldVLIIILLJKU[aeit}wrabdfffgiosy}e5#zѤpq~srrnvz}~zsv{ɯŸ|i^eiV5'4Rhv}}}y{yuqiYOIXiј>V߰ؔܨy£ko؇Է}ɀWnͺüžƞܷŐ}Ѥ⤷٭velrghmafeeilort|à˺ǹpd^K8-($!!',-,.?@3 +Kqjjf[D) *4@HKOSWY]bgnqqpoi`YRPVX`muhYJA3../,% )+-,+'!,Odrë涏՜~|a@8Ir̪⦵۶sd^G@Sn|xz}}}|{{~wnhfRIW}пynﹴӺóѽ̮̲wPCLƸ绥ӷ}vss~~p_K2$ ',39>ACEHLKFB<81./034/22.+*%%! ¿ܹyi\SPNLHGIMTZafjvē~wp__adefhlru|[( +aԜis}zusx~xrtzpZOX_F" ,Hapyz}}}{tndSGBPcÃ1JĎڗ}ְol讍Թԓb`̸ȹˮ٩Ѧʡⸯ{knupllgfedfiloqx}ϷĻ˾~h[WF2)$ $+2520C?. >~\]c]F*$.9GRX^`cdinsuuvsqj`WQPWW]ll]QF@@:6994.-'')--)"!C[]kijԠ㻌øãظ{ntɱ치Ƨ}l`JH\qzwty}}zzx|yuplj\ORkþtpӺӽע˔kHHGIvҾľ۱ǹ’zzuv|o^J4' "(.4:>DEFGGC=9.+%%'+./244.+)&! ¿ִqb[VSOIHLRTZadlv鹋{sn^_bfikmpv{~PR~r|vpw~xnqyͽkSDHJ0  %@Zkux}zy||upbM>;I]Â=T؞՚ƅŁqӥ~ϜoYoȷį}ҬϹxsxskjkgedefijnsy}~źz`SQD1($" ,-07>?94>6$]{kvsZ0" (4CR]empolkmkgbheb[QIFDOQ[j~dTMJFHA;AFGDB2,)**'0ITbuǾﺘ彑͝ήڧtaJNartpqyztlnsuvuspfYTbqyʺºűƶ޻󼒤竗୉rKOLDqͻ}þӿȵ˓xyxuhZG5("" #*/5=@CDEGGD?:1-*+/3688:80-+("  + զg_YUPJINSSY`clvܫyvro^achknqty}nBA~tohos{}wpry|ts{}~˻|iSA<8   7Qesw|~wrvyvqaH43GbʌWoﯕƗʋ٬֔wғǮlR`ƹ½حᩖ੸ҷ˾̸urkglgecdegfipv{|ǹv[OPD3(%"!-.3:@?712)  \vgrhL)!"$.>M[gpy}xne]VLEGFHFDCEGKUanÿ`NGIIECHU^`\YA8/*($!>Rah{ؼǯܪߠmyǽظ̶ȧzzxനzcRYo|zuwvneeov{}|xoaUVnxuζ벩бܷ׺ѩ䴞ǜک[38@tŹuƸ̷ՙ|~zneVF6+%#"$+08>BDCEGHEA<1.-/4:?@BD?71.)"#! +  Ŝ{f[WQLKNQUZagmyܡwuvtq`acimosvz}^:1k‹yxqrsy|ystzvnc^dqxqqz~x|}ʼqbR?5. /Iapuy{}ulputn_E.3MrΑhDzʓŽ଄~󰖊~ῥiaN[źʺՠˏɸtqlfkgdbabbcdkpux{ƾǴtZPQG4+'"!(-39<:3-#   + ^znl[=&!%&"*7IZeoy|n_QF>8=>@BEHNS\dovϲcNFGI>ANajjdaME8.(!>V\ZoԾǪzqܾњר~f[d{z}~xqiku~}o`MF[}sŬ廳´ӥٶدۼ謕ˬ{YTYƷý~l~˷ާ~~~}}tlcVH7,%"!%,29ACEDFFFC>90015=EKNTUQF=6.'   rd]VRQPQW^eip|וmptusabfjpsvx}tL4$)WẮwtuy|z{~~sf]]fjmmkip}w{~˾{fXI80* 'B\msuv{~}vkoqnhYB+/JqɑsСȘǕ|󽝄}ockZdʼϾџyv䆌͵˿uqqffda_]^^^`fkpsw}DZpYSUH80-&#(/6<:5.)  #pxmV;//0,)1>Qbmt|scUNJJQQSTW\bfsw}ԹmXOMM<=BLNMKMOJ@6+#$AZe^mַ˸߲ƑڡΪwwЮơ}qĦjdn~}{{n\D6Kxz潸ɶvܺƵȺơͼĻtcz巏~{zxu{ume_SG8,%" %+39ACEDEDEA<8128@LW^b`a\PC<1("  Шzme`][WU]cjotʇ_cjoqdfgmquy|^6'&+$L|vw|}yj\YZ[_ccht{wzzyxw{phVH=0.* +  ;Ugnorx|wnomf_R>(#=av٦{ǚ֞zª{wpgi|lpļż⹳ϧy~Ӵ͡urqd`a^\]\]\_bimqt{ȲnZUWJA93+" !',4;>8-$ +={i\K?FLA2*4CVhry~zlb^cgbbdgmt|Լzf[XWYOGB>1(!!7Zqmr֯޹⭶ٷƖҵ\v𝋣ҵrw⺮pqz~zz~vcD.?o蹄z嶭ív}׾ͱԼͳҴĽ¿ƻn]v~|wtrpprrmfaZQD7+"  &-39ACCCCEFB=904:FUckpuvpdXLA7'#¾Ѻtfgf]\ehknpx̅ES]gfohegntzrB+!*.8Ew}vp{yw~}yxl]]Z]fr|uj`pfRA3*&"%% + + + /H]hkpuy~|tph]O?,,Wľ~过̧֛wž{`cn~z|ŵyм|vmZ`YY[ZZY[^dgims{¼ù}eSLPNA:70)&(/8?B<5+  5~ibYG?R`VD85CZmxzyyxqrvwy}ԿumnpqfUA638=DMRI=4+5Reoڪͽ׶͕뵹雝ξ՘LwӮ߽{뺞yprw}}udK;Ej׶þ¾ٽ޾w봽µղýĺj^tտơþ}ytrmmkkjjigghghfaYOD1&! #).49@CCBCC?:52.3>L]n{th^N;2% + ʼuqpkgijlos{{;JUacrlefnu{h8 #+7GTvʷtinuuuy~y{{rbahtqe\lhRA3    '@Ubhmty~~xrgZJ8$ +)Ulvҙཪ޺ʫ_j{~~ƶ±ҮqeSUTVZ[[[]_eilou}ĺ;gUOPNF>:0'$',5>A;2'  LeXOGCK\dU?4BZn|vlppoqy{ywrh]QJEEDFMSQK?.)E[qƸåס껻ꠐĿǺםWѤƙz¡x||tgRDKiǬзͮ螄笰׷ЭǬ¾¼øe\s¾ڶ¼}zupidb``aaabc``ba\UL@/%!  $*/49?AAACA>841.6ASh{yn\I8,  ÿpnnkigjnszp3GT`crohhpxvV(  -9634?A@=;759AO`up[H;+" + + ˲¹yttojkmq{e,DTabspjjnxlI) + !Xqfmcj|swz{qqr{rqurvnWH?8+  +   8M^epv|}~xti^N9#1o̧dVpˠįȰò׼sb]XY]dfda``cinqq{wz{||֪ݹ˽ȳ˶mTNBEKT\`dhjjlnqtxйyib_XJ6) + + +0j|zna_NHFKX`\SJVgwп}pjggd`_agjeS=0&-/5Ghȧ˽羢筫ܻρvg٢}Ƈvfj~}qh`]WWkѮz|̡ܳ᭜ϐδֹշ⸲ȼ¾eT[s~̾ߟ½ſzqhbbbfhihec\ZZ\^_bfhhe`UJ=6/+%#"##"%'+026>@?>:87;APawt`M?0'! ÿ¶ûҿslqnmpyc)>Qadrokkov{Y5   +=n_heisrv|{yuuxztrsl`[doxxrtmmvwlS7&&)%     +,EV`kuy{z|xnbWG1@ʛoJMyzvá谚ʹygZS_hdVMQYpyoilwȹϦϩƞnVNCJPY`bdfemoqsuy~|jc_UF/   + Apa_@@Nbj[OLKWgxҿ||}z}mTA;145=;769ANawwcNA5.(# ƩʼɵŹvvsopyָ`$8K_fsllkou~lG&  + ?\]efjruz~|vv}~~~|vlbXOMNEHFF[{yttkfgcP7  #  + +  +"<:87;AN^qs`OC941*&$$"""!ϰ״]`|˳Сu{Կ}xrryز]4G^frlnlov~{`9  +;yڟdU^[Zgrxyunr|ma]_daYQSX[[]bZRLGCFKRa\M_ytvlb[S5$&&  7IT`mrssszzni\N>" Kӫms̮Է]U`d\TMNS^n~taPLS]]qϾ{Ɨۿ`CCLZbhkmmqrtvwy~͸{lfe_O1   S{ztogVWamriYPOT^kzͺǬƿ~dOFMFCLSbЗ{쳛ªÜ㼰Ɛ˭ͼ[^ܼ垎~ge{vjfgYJ\|ʜm{ϲ󭈛ď㱟ÿνӢ̷ŴȶqKGXoyƿ¿öxpi]MB<:@ELW_ehihffda`bffjljbSC;861--//-,,0258=@CCB@?<:9@DO\m}}jXND;860+*)(*()$$! üѽȗ`8<]oгӥmoؼ{wuzԕQ&'Ccmbmrppw{jO1 + + 5WeDYX^`jsxqlr}ePKRYTLEFHHJOVZYVUUZ\hkm^]wqpgVON0"  &;K_lomosx~{tmaUM4Vǭֺ{ฒ}սoVW^ZZ_UV]j}|j^XVXUd˴oivǩՠgPGQ_flopoutuvy{}}ؾm`hpjT6  !owtywiZ`oug`ppUR\mѶƦɻdMGKBHXae~󬇙ֶ๩ǵČͤĪΑjkѵ⟔}be{vupdZZfsکp{өܥֶÍĬø͸˫ǶѼҸfFKZl}ո˱ÿȼ{nf\QD=98@GPYckibljg^YY^eijknhWD=>=844330002257:;AAA@@>>>=CKXesxk]UJE@;9754..0--))&&##þ³sRBHfzϳߐUT|ïzxƁH$(A`mafkosv{~~xp]C(   0FUml@KO[bhouwss{zdUU^gg_ZYWQLNelty}mgvnj`RKK6$ +  + +4G]jmjlnty~}upk_QH.Wȳå{{Ӱԭnb[\^\_ffjs~Ŀ~ph^X\qƻծrsʢt]LU`imqttuvvwz{}~ִj]hrp\<#  + %z}~|y~uhelpfkgP\pϻͽƾdLBC?Ocij~ϴǴȻϱśժǼŸؘٝjsѰԜ|df{xrt~{}{wk`\cm‡zxq̭Ηݼưóǰ´̶־d>K[jzɭۻſý}umf^VMEA@@GMU[cjhemlg`ZZ`flkmpk\JCDB;878853345579;=>>>=>>><@EOZdmrsssog]SMC@;96542455420.-**(&$"! ľµ؉OHN^ѻX:Kyvi< &<\m_^aovssy~}qcN3   +5FMYbesޏTGK]jgirzzrsy|ueZ`lvwspstsvzrlwlbZNKJD.    + +)>Xgiggjsuwwuqmh\K@$^¾ȵɜ`KXcb]_lwȾ}uiekþʼîȩlR[ekptwzxxxxz{}~ֱg^jtsaA(   +xny|uv{shfgdamhM[qƹeM@7=<965578998;;<<===<=@DJOVXYXXVRMHE=;98875389986421/.-+)'&%Ŀ̿oGK`ǺhJB_Ž|x_3!2Si[ZXlvqmu}}|kY>$  ,3DGTabf~XO\jgdlwypnsvvpc_fu}up~{j]TMLKG5 +   +5Q`ecehqrpppmie\G6 +!iŰbD@Xgc^kźxglȹdz{V^fmqty|zzzz||~~ãlfpyveF0"  + +3riv{tpqkbihgbk{]MYqҿzw}ϲʼfM@38Wnsgjt͠DZʰ˄ݺڣÚ߽~xego~wu|}smhYNCBCW`]kcSgrذǫķ޼ʷďɻZ*F_docHhߨڌüzogda\UNJJNUZ_gmprvtruslifffirkkoqgYOMJFCCDCB><:777899::<==>>>?@ACEFGHHHGFEDC>=<===:8<>=<:8653310.,+*ĿȿcMZŷcG=Póѽҙe6(G`UVVjtplry||hQ4    .=<:8754320/.-Ǽwc_zĽ˳XGCSìԻƛ}E 9PJVZeloopuy|~ydJ,  + +.@U_nuj^gxزx^Ubpkfdejrvuutonszspr~xxzaTRVRF7,   + +  1ET_eiljgghgc^V<%,ĿȾˬeG;CSZaiͮs]OcõɾU]dimpuxzz{|~~Ѵxhkx}|nQ;.%    4x~}wpmt|~y]S^qzfW^vvgewy`QH;=Oci_Y[ahνǭʢʃǧʡv}y}l]PJB;62/-%'#9>3>=A:=Ow׵͹Ӧª˟|׮˯W)>VevvG>jɷǽm[RPSTTNGGMU[acoz|{{vsvuopsqhbTMN_noc[WUPNOPONMIFB>==>====??@@BBCCBA@@DDBBBCDDDCBBEECBCAA@><:987654211˲sjlܸοxRQ[t˲ˮY(,@?Sdcdptpqwy|}|~v`F%   +,?R]gkd\^]g}qbZhstl^]kyyy{}{z}{~{rpWLSYTD.'    +  + +  4I[ejhfbced_YO4 3Ź¾cQHEQ`ajgEB\|ʾ˿T\djmorvxyz|~˾wegt{~sS>2) + + .X{zqsxf[dsq\KMX_ce_]UUpżn[QLDGTaaYY_PYoؼޠ̢Ԕݯس’Ĵ׵vngZMEA>==<865CLcaPbjF0(+ATc͜ǻԹѯ{Φ໡Z,9PiuF1Vs˽͹ڽľzfVLIKKJD?AJRZ^bnvvtsonsqnptpd[<7=<;;98766ÿħkawĜǽ֥gINhļÿj1%36Pf^_pxqovwx{zzr^C$  +1BYenqphaVHP}e`\mv{q\Zn~|~~~}}Żp~lQIU`YE.+'$  + +  +'@Vbhda_^`^XRG-8ļĴmHLRR[hkyªyL4E`ŸӿƹPYbgjnrswxyz~Ѽ}ghsw{uUA5,   (Ak}~qvnahs}n[KDC@BFKOMQpŻ}fUOLGK\eaY^gW]ilx○̜زïܠ˫೗ݧƿtb[YRJJIIMQQKFGU]pjZmzW8+!!)5U~׼۱ܹȺթjʣž^15LlxM-I_zûؾ˥s_RHFFE=97:DOUYaiqokkjjnmlqupcW-(1Lkxrk`_[YZ[]^[XRNKJKLPOONMLLKPQQONLIJOPPPQQSSVSOMNQQPLKLJIFECCAB@?=><ɯqmsٷsG[oy|{tlc]TU[begkmorrigo{}vcIFZjeXC8//& +    + + + 0DRYdZV\\PGE2! =ͼɹʼV?JZ\]v|×nE6;cøݿʱYTZegpvrsvz{}}~wotrt|t[I<.    +  #Z{pox|~p`hvzniZG<:>ACFENfzÿrULOHIO`loljk\Zbjl{Ƕնɴ٥誇}ٶЭþ¼~n_XTRQSX\]]_`\UV[`YG=J`SRK?BPWVUNMZrоþǿɨ}֢ըe7;0   $6DNSSUYXK;1' +Aѿ˶ʼtSJR]dgǥU<5Nsø̲^V[eiqvoqty{}}Ͻwkorw|qUE=3'   +  Erqmpz~j`itxodXQNLIELFMalvkMINGISjxzuqp\[cox黩Шҿ͛ȣ˹Ľu]WTVVWY^hkifdb[SW`\G/'09PWXPPWWRA7..6Lv˳𿨩˛ܵa;@Mb]903EZi{ϮƳǕ»{n_VTNF?>3015>GPVV]`YW]cekit~~yeIøȮƺļZSg^\s~ø`8.?`͹Ƶؼufbcgsylorvy{|μ੆kdivxe]I9.#  + +*P{|meaht~hY`m}ztrqrrnrwxvv|Y;?I?Pe~ywttĴɪ¹Þ¹|zsgYNFACFKNMP^mtkYJHR\ad\D&4FSOC@BFMIML4-Xû˵ؽܶZ/;JXhmV:BSqvaK71CRQVby־Ǟyi[QNNI>527;<<:>FMWVQNNVakoo|y^<# 2Z{{susokltyyxurppqtvwyz|{|{yyxxxxxxwvvwz}|{~~{wutspnnnljhfed¿̼uʯ͸oTEGE۾ikһȢ\/ 0I^afoqkiijjpsobH*  + + ;exrmehjg``ekwgaklebejuufX`frraT7    +  (?HKC=5' +BĤļɺǹUTlcb¾tH5=Vxƶºѿҷpd^aqznoqvxz{~~٭h_ishUE:/& +  -UhPSYestaX`pijorvx{}s|tU978:EFMNIFNZaZMABMW\lV?2% + '@XZJ@?EA>FRG'BĶקƽΦ컣X,9L[cU- !E\dlkaVB6AJIMVkzΩþo^QFDGD;20:ABBBELQTRLIJR]fpo|sY9#5Ywvvsolmu}}}zyxxy{{|}|{ywtsrpnljj¿θvp깄^OD;D[אYcѹǴe8(?T\bhljfefglkdU9 +    %Go{vjmokdcjoxieggbabelxud``jq{wdH.  (5?B=. #KʨĻëa`lehĩ\DEVoٿǽȳ{ma`pzppsvwxx{|~}|{zz{y{~աu[\f_G>;6+  .UyyaQORZbd\P[fumWV_lssmifmuz{|yfO;>IG\s}tzճ侪Զɲȳ°̾|y}}nWD:8BHIJPTPHIKQUX[bjll`F6;7!*JZWPNOL>=CF7#Mɹø޿ƭƬ]/3APU@.BFR^_]K848;BHMZtӱxcSJ?=@A:47;ACHLQX]]WSSTW_fop|sdN38Tn||zwtonqx~~}|~{{xwttq¿ƭon͈S02E\ֻlH|߷ϺźrA 4HU]afebcabgeXH, + +  /Pwzzvtqooqpoigeedcaaejosz{eZ`muzyY@,    !1;8' + + #NЮľϻ˸}tolkkoòpXU^lvؽȿʶ|lerznsuwwvuwx|}|zxvxyvqʾΤzfcVIB=4&  +   -Tw}^SHEJLMIYhzoWGOZjqme]YVOM[sgSJADQUdywrxǿʿĶvilRB=BOZRLKMMHHHLVainne^H94BMA- "8N\`b`WI@;>:,/]ɻŻǟؿϴi?33>D8(")7;9H]ggaRGFJMLNTj޿ýo[J@759<98==BELT\adc^[^^]_dhjuscWG3)DUhw{{tqtx|}ľ}imz}xqlKCU{ٸ׷~]Y̪˹̽|I  +?OZ[`daa_`b`Q?& +   8Z}yttxwqhhijgfigahikknwsc_ky~ͻkP;     + +  %33"Lг̷Իt]kniq~ƿiafquֽҹuktwluvxwusuu{zyxtsuu|sե~jUVK=+ +    4Sgs}vdNCFMSUWf{yof`jy|_OZhnw|zYHGDIV`l~}y{xrz~ſzgľx_E:;DSaVG;8;@DHPV]\WL;/:8;MaaL5% -ALPNGD?996- !Flü˻ͲɺʻʮؾuV=07@>BMMKNI?Ok|ws|ƿӳkSB9/.39:=BDFJOZ`eea[Z]^ZXY_`kkZOE5#(@W_k{}urv|·~qvrS>:;90FoߺйR]ίƿ~P* #2ESY_ca_\Z\VH5  + %9`}yvrlmlonliifcdhov}|wsndgx˵kG   +    + %)# ++Tھñ׳o^bjr{ĽwcgusyúǽѴurrrvuutvvwuwrx{|ym{}ʻʹ٨cXR?$   + ++?]wq[MNVXUVdwyvxh][\_k{{n[HDM\dgv~womoryξxîxkQE;8>LX`U>01459BIHE>6,%$.D[isugRA1&&-4>D?<897."8LhüȽǨέwZ=6H`qv{{tgbl}Ľ}eN;.%&.:?AGHHKQ]bb^TW[[ZVQOQTZ]XPE>uîƾh\dmyľunrmZŸ̽}nr}yx{|yvsrx~yrpo{´ɽ\<&%" +   #=Uspb[V_hx{uyznvqms}lfbhs}zy}ƺ̲ÿƺyf\M6 -CRVS?4153( "%-;M\s|qaK;0&  !7{ƿĿþ±ԻͶ}ly|k]X_dhiutqlc]ZYlpqpnkbZVTT\gprržľvgTC0$ *:CFGEEHVfldZHGDC@<;8<@GORUVUgmwvilƸлc@gѳëZ6& !7DLPSPNIC>6'  +,93+    IϹƮgciq|¾xmoiM˿ɹji}zz}~{wpsw~|qrҰϽʎYA'  +   ".?hufZciwļ}pnls}˿ɿ÷vzv||pY7  +2AGI90,,*"$,8ALZl{}kXE4(!)^ÿÿŒøñukxZB66:@FLT^f[^^^][VSVZ`hprtwԮvj_O@0"&7BEEB@FUjncVA>:654437;AIPV\_ot}~qebqҽȱԍ:,mԽĿǮ[7( +2@EJOKID;5,   +1CVzͻ{z~zwvz~}yrsmnwvh`cgny|na_aefgqŭfSJA3#   + +  +TÿƳÝxjgms}xmmfKŸ̻ͻmfu}|~|xtxwz{nuǭ߽վץaW@    "#%,;hmkmy~ƾtonou}ȷĶect}a<# #1785* %)9EWdms{~m\I8+  'Ct~nƴӼstpk]azýzcUIF@:78>CRSTTWX[_[cjjhkwսýugZQD5-%6@CB>=CShlbT?931023225:BIQY^jpy}o`TZzûýf49u~V?`şŽ̲\9+ ,:@EJEC>5-$  "6H[~}~|{zwupslkkha\\ahsz}xmc\`edeuǾͶye[L<'  +[ȹнֿkmjouþ|pnePʾ¶|mr~|{xvykx˽ŶĿucQ?)$4Iqwx}}}|δzmmnpt{¿ønWgֿ[9'  (,+.%(3=MYiy|m[K=,(" + +$#*WĻž×r^WODFUuĸuaL;/%$OMMPSYeolrvoiqŸ}o^NC5)''7?A@98@Pbg_S@92/1220-037?FMQ`gqz~wy{{qeYOSn¾όZdŖY6T̡Ż̶^;-  +(49?E?>9/& +  ';M_ª}~ytonmojg`\\YVV_jt{xsj[\^^f|íнvgWB, `÷ôԸ^lpty½xrdXúȸýx~wt{q±Ͼ`IdU + )>Y{|rkgo{v~xpw{}¼ĿºgXsºb7 #(('+'#%,;HOX_ivrdVJ=4) $!JƼ˴٫tVB:0*=Xutg[NHGB@EKUgyǹ}p\H9+!  ,:?>>78?L[`\TA93./0.,+.028>DHX`ksw{~¿^_chmu{~yweZRPQYu½ŷ͵q^f?Xϡźϻb?2!  %05;A;:6,  + + *ATdο~~{qklmfgaYW\YSS\it||u`]\_lŰǰxgQ7  +  c˺ϹϲvVkux~½vf]Ⱦ͸ľ|zwu{˹z[1/!! &3Ke}obTTV\htxtysyvvyùƾͿnc|h? + #%()*+16AMW[Y[`jywkbUJE9+  GĻƸƕodU:(#(Fg}ŷWQORZe{ƱǶ{p\E5(  .;>=?77>IUZWRA91...+),,036;ADT\hptvz~¿HKOTY_glntvvwwnbVPMNSb~ʻϨշq}úĂS\v›kB/ +!*3;>83,% + 6KZp{uokkhc_[ZZ]`gr|~ldabqʲŲ}cG+ + + ,º¦iPonxoniպʾʿútw{|ȿοŽŪtG& 4F]wȹ~w\K>7=GIIGUbu}v|ûqntdM9-" !(29AHJOXbfikopt{yn^OF?8/% + +@ɴ̿žx^I;6'5Rmyv_SZxλȵżykeZL?1($"$*17:;;;<=DLQOIEB=840,()*,/5AGS]mûָyO˫ƍPEßťpF.&,47/,(# +  +0G[hµ|yuqmmnqv}tqtҸ|^A)    +#aںϿԿªz`krzukvſú˺~yt÷˿Ƞk< +"3Klʼ~|~}|raSHEKXfk˼dML=*(-#  &+.7BLT[\^befrv{}{~}ztld[TPKG@80" (hyƼ¿εoQDE+%&,%'LdcJ3-:Q̺ǷþȤ÷YGHJLG<0##+6:<=?CHMNLKKID;2.,)(*.3:AFPVaglnptRSRPPQVZ[[]]\VKA6ٵǼȲǿnrpwrh{úǹøϾ~xvûר}T   .Inʾ{z{|z|rdXUWar¼þÿɾcJHC864" + +(.2;GKU^`cfiiuz}|~{ysmg`[XPMJC9+  J`ljozſùԵvU<15<0/35-"%1K_X9/>Ytƴ˴R<9@IIC;/%!*059?EHJLMLLJGA92-&'+/4;@CJQ[chkmq~WZZSKKT]XUTURJ?72DHJJJIEDDC>6/$&,28=BCEKU]begkv}[__YPNT\QKHHF=414=K[grýԓIoӧiX˯Y^wxŮW8 + + #+/91& +  #8Tiw̽ɻμ̸mW:+ +  p;ɿǰʭohWX]bd^SE<;Rm}~~nbktis̾ƿþy|{Ȼe! !(9Uw¸}||uj`][[XVRMGCNHIUcmv}þƸqSKFH?$ +(-1?CA9.#%).6>EHMQVZ[\\aglpru{]^^]WTRQIA=?>5/07>L[gv}\Ӥ`PbҺybQ`ȶdB$ !+1+& +  )@at̽¹jE2"  +s¾ºƧuhFEEFE?5)!Ltij´sdlŹ¼t}wǾ\ '.=ZwĿxxyreXPMIDA>:43658@GNWawŽývZTWN@%  */1962.' %/:CFHGDBAAA<60'$&(0;HNVVVSOKJNPX_eoz¾TRRVXSJ@E<8;:5148?M[jwû؂oo”ǰ}.CcjYNSYn˼oL+   + 0Gk~˼ǿĸƶzM9& + + wŽħoAA==;81*"GWZ͟Y@=IS\izr\f}ʾƽľ|eizȽ֋? + %7Rk}{zp[I>;5/+*'#%03689852*%""*8JTVTOG>736AJT]kzPJAGRJBFD@<:962195 >o|m06khE )9Xvu`^tɽ̾ſs[k}Ŀ¼Ե{- +2C\l{wrX<1/)##%%(,3J_ie[F9>1.9EISZV_WMGEDB>,% 0IƷƿw^m¿īè⹡ʿļL/"#%$#"-14,)*/5AM^p>7,1?<7?=<721465@HR\i{㮹Ʋà}x|[DD|ȸȯb?' +"2E[wÿɿȼnT=-    CȼմɩgKDQYE6+'BGKY[RQT3@GOTUSctr}qm^\yƷ¼ehoz½°ؚ7 '.=AFPfql\D3731?QXfomhaSKIIEB4+.?ʲİ\Xcgjm{ܷպ|K2%$&$$+8AFC=82.)&*0:AFJIE?=82,&%0(# +  # ( !"'*?RWcd[heXƹ²ſ}mcnÿ»ǶU# &8ZwxoS2(&" " #'-39?EP_m}ѾƿtY; ,=DJMLLLUaimonmkeZOD@CFSo~wbE6956FYdr|zngYPMMJF>2  +  !(2gźśgLFIJHVeĿdzΪ|ΨļuL5'$%# ,7?DDE@8, $.4?EFEB@80&!"+380,%#)17BBJFKhlRɽȺкvcpȻ­ŀW^C$+YȽ}tX7++$  !"(.5>J]qйȺyY8.AKRTRPSX`dgfggjdZLB=;?QqjL>E>?M]bltqf`VPNOOOI9'!%&$$&Kïzw{ž̬zM:;?;BPmۧ¿qO9)### !(19BHH>0""'16<>?=4+#)-*'""(05?L]rnB3/6==>?>;T\dhpºĻĸӻʬW8!    +,G]jtx¾uY>+ +D;ʾϼiC/ !(-,*N^U>%#%(%&',.19EN?:/0*9diQ³Կ·{pǺɮϺǮfOD:Db{y_@4.'!#,9J`wмȻǼxV4 3GSXXSQRUWVWZ^agbZOGA>AQsoSENHGR[X\`\URMKMRVWRD0:aſO34>@?F_ſȽۜνˮnO;) %&"#.:CF?4'!%,/34-$""'%#!#'.49CQbuS;427BFA>CZbjkrüǵʹa>#   '>Xjt{yο¼hL:,  YŻ¼Ѿ~YB#!  + "496+Brp@#/02229BJD5&%2ekUƶҾű̶ɼ}xmuŝ}fLD3* (:Mdz¿ֻrP0%9MY\YRLGHGHJNV\cb`YTOLNXxrWKTLIOQGFHCCDEHLSZ[ZM8   +").?RpĺT66AHCDW{ŷ~ݬrhͮ|ѱxeK9'$&!%08;73.'!!'*$!"!#&*/5;EVhzڨs]K94BH>?LainosϽÿιlE& + + ",@Yp|˿w[I:& +$tźǽĴúrX/031& $K]I9?F=:Hsa (/<93.++.26)$(4lp_ͼƾüǿ˼ŷٹq[T@6( ,@Tl~ƿԾ;ʵ³mK- /BU_^WLD<>><=@HLY[_]\YVXdyaW`ZUTO@::5;=BGNTZ]]R@& .<@CO`jw|X=:BIC@Po½ǹulqؓjyǴum|̭û|gTD7'""  %(,-//,% $(-26:AN]n~㽔aC4AG=@RfnrsvͼǺȸɽǿƺѽvM* +(,,-05=K_v¾ļiWH4 +=˹Ŀǹʾm8@MSM>.!"-0-*Q©l\EAiՇ)!*03478:4*  (5osgоӾگ|idPE6-)**)! !! !$#0D[rȽź¾伢³gF- 7J]daVH?<<;64379LRX\[ZWYmmemnfdZG>=8:?DJOUZ\[SE.%D[mszƹzT>8>D<:Edtas٧jfpW`p}æiSC=2&  $',/.)#!%+06;>BKXgt¿˾P.BG@KXrwywzĿūY: 5Nad^[]_cisººjUA-![ŴջºëSFJ`j\QMPFC3+%"@࿐tZ@Fۓ@24@GCED82& + )GGLQTSTY]VI4!:sʼ~ZHDEFIGFGRk¾~pf_vɔpqyyhIPZdM9),&"   $)++)("$)%,5MXuz~~ɿȾȯbB   %:e|v~ƾwdS;(  +0vʹϭǷkZQYbbcgeWJ20:CdɣrPH\ҒNECNXURK;&  2Ltzxô¾ʶ¸zkbUOKHD?98=BIICS]v}Ƚ˶lJ' )HftbD.  Bť˹ûɲp[NR]gjh\L2:VhIJsJ[̙aLFMXXUF1   Aczvx¶û񺍏ykd[UROKFAAHNTSLFNU_hvʵvgn|uvػǿÿ¾|hN4 &@LXYXY`kstl_YZ^^akrqljhk~vg]kotrojjknnpqnc`^[RF4)+?W{pT;5=GMOVTQLQ`qz}uod^X@JrڪmIEhdMVwiTF8)'  +  %()% #&:AMXchlpsy}¿E1D\ewȾͻyU0  (6G^syzƽpO6!   VǿȼҼвr[U\]WOJC0Dizώc}էxNAK]bZF* Rvypy¹²ȿ鳆wibYSPNHCCCIORUQMX_fnwȿ¯úëh_qxmjrıûÿÿuj]I,"&BMYZX\hwxyshdehgipurlkpxtaot|~~{lea_RB20=Tj_ny~hK1+4>GLRTMCAPdsy~|unf`ZWT>Hr˿e@^{qhvs`XSG;(#  #!$'.39?[anzЗS:H^l{ȿa9&5Rcheabxolikpnjgw|\B,   +9nľֽ¿»un_MB@;+Abm򻐤⸉KCUt~qT2 + + $`tqĿ¿ľÿ⬁{oh^VRLG??AEIMQTT^elr|øѴӼfX`zyuj\`{º¾½smlbD,&*-BNZ[[_kz~}~~yy{{xru~l{}kb\`TG??DHNUZ_hknuھɶqKMe{led[KS¾ľsfgeQ<322BMX[\amxzuopyx~~lb\]VPKPSLG>CJQQOSY]VSXdjjfd`ZW[akqx{~uprv}o^QVA/#!#+4;;6.2D\jmsxz{}}yurrtvutrnjdb^\[ZG:6@ejW}wf^XOA71+&!  + *16:@DLSarº鿃]JRqͼvD%'>Uz|neiv~{~wlYMHUgr¾ƿybL6$ +  2ƿҼ~ptwr͞cKK]aV<# +Dyh¸zǿ۩sf[TMHCCFNT[bjpwtruíҹ^?Imrfe_VJRĿ¿p\UUQG?98DLUY[`ktxng^Y\fwy~xqpimqtv}}lc^[UQNTTC3-2:CD=<>?63/+&'/20)%.DWbejlopprtutuvy}~}}~|{yvrpnmnpqpmljgedcbdYA.+;jnyk_XMB72/,(#"'*.8HVftŽȒiKQwĤ{L(.D`vrglyxuz|theo~m`]G?\~srtlht|ɸÿ¯~mTFEOUQGABKSX[^di{xng[OC;43:77==8585;HT]dty||se_[RMOG?EKGFNX_aZQILP\kwztpoihfiotxvqfZM<'%5A?6466- '1$ -63.19:1#1CLPSUYYZZWUTVX\^`aeb`]\]`bcfghjkmmnooppqqqkkjjkjjjmmnpqrttuokdQ:8DuՑ{ųm]M@5*"%'&)+(!!(/;BP`tѐW`xнzknuvpieilpstngc^`ensme`it|~zyvsnotwqbWTYblwżļn[L=) )Ǻüɼ¹ĸør^NGIJgtxƺ˿ƶٿpĔ{v~xtutw{àŤnT@[{w\PLdľſývc[dhX@9?=FRY]^\\amusrofYV[`cb_\^^_`]WRYcVX\__[^fejjd^Y\]^SNC=IX\OV\`aelrwtuwwv{wspnmnqsutqpohaYG<4-'%)(%/:<4%':FIJNPRRQNNMNPRRSVVUUSQSUVY[^adfhhhijklmpnjifdddeehikmoqtstpmlaN@@_鮌ó{pYD61+&#%'$"$'#$.>LanܢefwzxlZOYepsi]S^rxf[\a_bbcm|}viWPPKVcpüoZG0   AμĬǾzĵýҷrʗ}t}}~~ȷջ޵~{|}qZKHm}ttP5GnȾĿ¾zlciiU<7@?GRZ_^XUYcjihe`W\fqyxvsvvy{}yxz~urspj^XZ`ed[TS[^_VWRJMSRKTYVQQ\emklnlilrvtqnpx{rponprroqnid_XOG91*&!!&'#+56.%6@AEGIJKKGFEGIJLLMLMLLMMOPQTX\_`a`abdfghjiec`]\^`a`acejlmlrmllh]QIWeɬthR;,(&&(--' *5@Oewtmwío_OV_hnle`n~rXOV`WUPScyzn\PLLT`kx{ÿÿhQ:) !`ųη»º¸Ӿƾǿǿ¼ϰy˘|s|{ӾҸث}rwyvvvn\KJUz|qhH)Q~¼ºznec^O<:CGLSZ`^UOTZ_^]]^\fq~ywz{|ztdXT^ecWOQ[^b[a`WUUSMW\WLEINTTZ_^ZY]^][VVZafqu|}xoklnppkge^XRKE?92*%$),''+,$-79>ADFGFEC@>BDFHJJIJKKLMMNMORUXWVUXX[\^^__][XVUWYZZ[]_bdgffioonh\PQF~­nYG5%#+12-$&1G]m{辂ttųrkiimjhhksx|}yo^RPUX^^[]ixz{n\P\ahmstne~¿s]H5#;ϾζӾƿ˿ηǼʽķõ´༊œ{s~xw˨ӾϠus{xpohYIHVk~rR?4dʬɺƽsmf`THBFHPQTZ_]TKNQUTTV\`ozwolrxsjhlttprqu|zn_XZdcUMP[^g^dg`_bbckneTB869;AHICBFHHIGGILPTY^floppnklmomf_WPF@:64.,#! &/+&$$(6:7>@DDEFEA<:>AEEGIHIKLMLLLKKLMNMLMNOOQQQTTSRQPPORSTUVY[_`_U`mpqm^KA6aɨzeK=/""*662(!,EUq̓{sʺvc_fl{yxxy|}|uk`ZUPLKX]a`hu~}ylepswwxularyƽ¾hVB-S̺ҼĻȾƸɻͼ˼¶ͫ}俏yt~}zzŽǘxughZE9Hfzo76Kr}¾zeqм¾xjkolXJOWUXUTW[ZQIJMPPOQY`nv{scYY`mmhc`a\SZ\ftxn^VS`aTLP[\d[ekgehjnuxo[B1)+-4;?:<@BDEDDDHKIMU^chkifa_`baYSHA91.*(#   +-*%$#$&/9<:?BEFGFGB;8<@CCDDEGIKLJIHFFEEFEDEEGGGGGGGHHHIJJLLMNORTVWWHTaejobL81Iuաx\D6)!"(210117EVyמtŸleinmrzrgabfi_OFGFPURVg~rmruxztilpv}ļѽ̾¾ŻzhU@/%%'$dIJûýǶɼº°ʺϼɹ˞è߼{tzy~~ʸǘo^_L2+Hrol$0bx{u˸NRvƿ¾ǿ~nclwzaR\ec^XSTWVMEJLPQOOU\bgh]J@CJitxsjaSEBDSelbRGKY^PHPX[\Xeqlfgd_hol]I91-/5=AADJHJJGGHLOJPX`eijiTNIJMLFB;5/*&"   + '.-(&,--/6:;>@BDDED@<:=@@@@A?AEFGFCBBA@?>>??@???>>==@ACBCCDEFGIJLLMLCKPO[jdO7-6]桀sTB1&"%'%$&%+AA<73/*&"  "$%&%$&(,1489;>?@???@BB@>AAAAA?>==<=:<<;;;:;=>>;977>978755:?CEDDCCDGAAGRUL>%%0bͨfH5,(%!!).>PezͤŻ}ndkyynov|}yocWU`heXNMSOKD@IXbbQNHCCHQXa\Z`kokeppmijrɿÿȸ׾þqda^UHBQȺĽôüȡxjżóƹ˷Ȼ˽ر{u|~|vxwʧͶáw_LJ;)1c~\F3O~}w~¡hKIYqÿzjZY\eiijheZUQOOKE?BIJIILMKOJFCJ]pxbIDEGOSSPIQPGGPPJRX_bfg^QA=:;>BDD=<;=ADEEFFCCEHIIFGJNRSROKE?<;:51,)'%$%&''%$'-/235799:9=@BB@?@A@@???>>><<;:9877;<>=:766:5578559DIKJHGHHLHGJPOG;-2?CHLMKIIC<9762/,+**+,.030,'" "" !%'+,01367767:?@?????@AB>=<;9866;<=<9778:76AESX[ZXVVVVVW[][SLFOXq~eM=/""2BOxԦŶxtuuxzsfbWE54CU``c`ULJMNVTME>@HP[abZNMWbXSMNWaddlic\Zaq¯¸庺ŽzjfsƽβĿ¾ʺ̲úþѾƿIJ;ͿŽη˺ξљmr|}aWԽ˳¤sdRC5&+Myg34~qj{b]]g½¾}lZLJRYaf_VMHEDFEB>DIJGGIE@E9&$ &5CMUXLMMKMMIBKMT[`\PD;4-*.7BIZajmh\QJA:2**+/0==ADIIHE=840000/00//02445430-*&%&'(***('**++,***1133565459<<<<=>=<<=>@BC@?>=<;:9;<=;9778<9:@GJPYelppljkicemqtspmkw}}hW@7--=Vn}ңzsttz~}vfZVM?14DUa_b\VUXYT\^]UHEKVnmg\RS\fhbYX]fkkiha[W[hyɻ{įÿúwwûʰÿȹľĿ˷ǽտνǸƻxӖdnfZ˳κ񶙑~oaRB0(;`~jZ1>xpr^Odqv{}}}ľƿý~m[MFHJRYWPHCAADB>:BEFFGIBBILGA;>?BIR^ioqswywoc\TME:8575=;>?CBB@40-*)+./22234655555540.-,---,.1344422/.,134323223578767865557:=>==<;;:999::9656:;89AMXcr|y}m\PBAFMc΢ʻzpkiny~zmZLBEEDHNQSS\]Z`hh_`bec[SV]uoeYRUalph_\ahpqmjg_XW`l}̻Ǫ{rnpp|}öĿʱĿżͿͺû̹ſ̽Ǵt՘fvpfѹ출q`N:)0Rr}~y[L>W~rvbJYuxyz¼ýüm[I@;8>GHE>;:BDEGIB:G=,  ")5@GLMNJJJE97;?@BFE@=<;;::875445787459<>>?>?@CDCCA@=9657896400/-++),.34532.,)(&'&'$#"%&''2DYi|q_Z[kʢ}kc`bemlaN?5AKW]_[PIH^jd`flle\_nxtf^SRND?H[lvmb\\`eimnlg^YY`gwտǝ~lhe`fpx|xɳ۽ɾŮƾɳиĿƼͼöƲżɻuƏn̲_90*Otwq`A8`xh_cmC3Hryvuzƶp]F:." &&+3=A<96;>BHKC9G<)%4DKG@HA?A=866552489=AEGFFFDC@><<;:999:;9<@B?@CIJIIHHJNOONLHFB><89;64..,+((%)*000-,&$-D[mwmpxøud^]__`\VQKFMU]][\^baxx^Q`lia]an|~m]PW]UOTgy{pgabiqqpoodWQT`p˥mmoknxtxѹϽºȷƸƽɳľѴ˱ƽƵʽ|wիvյǴڻW?;IkwuaP:@k~vmdVD3+0^zwxteN=,$0:=:87;=?HNH>@Wrz}|rg[Uc`]TRQY]glvsnghksssqld\WRLE@=94025;AFKRUYTOJJIFACA?=<;<9621//*'&+-.+.)%!/EZm~þ滤l_]_`cif`ZXXab^WV\fnhto[T^heaags|zlbY`d^TVfu{ti`_bgmmprri[TWdo~ѹ|turoqopĻƹɺ˻ijýźºѳνĺ¶ſȽƹ¼v|~֩˷Ͳk^hn\JA\yg_S:' )Kzuk̿vhR?.!&188769:;BIHBMHF:#!1;;33=A91+$!2JRXVKND=>=C[s||yn_USUWXWSPPSV`fkjebeinorrpje_\UOFA93.37=CKT]bb\WSRQLIHFFEEFHINQX^cfghklmprqnkhfb_[VPLEEA=85210,)*.11//*&#!2DXkzĽݱɺtc^_agkqqjdaegcZOPZfnhibXUZ_`chouurjeahkdXWbounb[\afjkquuk^WZgn|ʬvogrʰϪǾʾ˽¾ŹÿǺ½κȳx}ɺýĻ·ɱ|w|yͿӣ¼Ҹ|Ƭ_NUv[Q=8sulǼzlUD1$)1685999I^twwpaODGLQSUUSQQQUZ^^[\agkmstuplgc]XOI@9469?EMXchiea[YVRONMMLLNOP^ahnswyzxy}~xsqoljgb]YROKE@;8663/0242/,&" "(5FVfuƼ٪ñkbaabmmpsne]\[[WSUY[\ZXVYXUX]gmrpkefgnrtj^\ft|rgcfloqmsvwm`\^bkxѾxkf{Ѫǰż¿¶ʼǿ¿ƶɶ¸ǿɮ~~̜Ľ̬ȩȾrivz[B()\~|o[G5&  %0686;>==AJNWZd_PQ]^ghkmole]FI[iaYULI>54?PeturlaSJGHMORQQNLJJMSTUW]ahipqrmjea]\VSKHCBBGJPYcipojgc_ZVXWUTUVXYgjqw|zyxutrnifb_[SNHEBC>;9:74/+#%.\~˻|q^L8' + '17859?@>=CHRbwubalovz{utvrkV_tycOICB;57E]pwwof^ZVQMJIKHIEDABEMOSRXY^`fhkhfca`a_]ZZXZZZY[`gjvvusmhdb_]\\_ademov{~}|zvtpmib\VSPNIFCC?93,#  (5BQ\dhn}ƼנľŻ|mc^ZXXONUVQKM`dfa^ZVSVZftsfafruvqlkrytiiv~|}|smjhd`bf^`cq¾ðþƻƸŵùʷµëɵȻƱ¿ͻyМ˥ƿԽƿsE7iƶ|qcO<)  *38835;?=9<@Jluq~u|kSKE?<:>SkwvteVPRVURPOMKKIGDAEKOQRSUVY]adfgfhijjijlnqpnjhfilvxzytokh___`dgkmsu{|zupjfbaZWSQOJB;/&#)0=JV_bciuĿқȿø}l_VQNNEBFEAJWkqwrnmnotv}}roux|~wnmx}{maYXZ\bebZSbƹı˿ĹɺϿƺӿͿľǷűĿɹѽƩq½Ļļ~Ԯµ]/"8]~ǿ}rdQ=*  &178314<=8;?FhpWOJ;>@F]uznh^QMPTTSXWVVWVROHJLNOQSUYXZ]`cegiklmnsy~}ytqqrx|}yvtljjilmpqxz~zwtsmid_ZQF>0' "',5@IRY]_agt͘½ʿ|hWLFDIB@?97I_uvwzzw~gUIGMU\cdRFYt|ַɷ˿ʹȷȻơͽı̿ƾ̾ɿʵĽܹm䶙ž۲ȸ¾÷ŻG"4`{{|ɿyiWB-   "-37402;>;>DK_iTMC9=BI`vvea^[[]\YWYZY[\[TOMLKLMQTWa^`^`bdfehklpw~~~zwwvvz{wqg`QE8-"! !'*2;JSX^bdhmzֵѼƾ屺Ɩ¼ǹp^K?@IQJFB>?SjsU?6ObomfZ]bca]YX\__^[WSRMKIJMRWZ`afhjjfeggghnu|}|~uiVE80,("$+27;@Q[ckoorxǫƳȹֻ۰Ö¼ót`QD?GQ^VOMMTkbI=<=<<;929gŰϷĖ¶ùмκȻžŵǸԽ|uϠȵܹþƹĿ׸ug~xy¼ubO=%  $-,,157:BGGKSawue]XSM;7;J]ijd]aefc]XV]^_][XTPNLLKOTXZ`chmopmlmlkklpuwzl[I>30,'#! !%+3:?BHUamrtrt{ɱʻúսղ޿±hSFAEQ[fZQRXeĸpYKD;2.+/1:Yïȸš~zùɾɺ»׿ŻôĸʹŸߺf~켈ï߿ż˼βto{úveS?&   !)(,279:@BDILS]o{i[UUTQA99CVcfdcfjkf^XUZ]]^\ZYWUTRSSUXZ`djqvyxxvuronnmnux|raPE962.+***-29AHMPU^kvvojovԹȲ˿˽оǵۼkUJIKT\`TLR^n¿¸u_RJA71.1:CXvۼĞȾ÷Żʿþ־ſŽúƽ̺¸؝q|vk뾭Ǻ̾sqȻyhWB*   $#*4:;:>@@GJLMVjwmaVQONKD;8@Qafdhkonh_XTXY[]^^^^]\\[[ZYZ_dkt{~zvqmhhhkpw}udTJ@=:74455<@HPW\_chx|tgbmy}}ӷDZҾÿ˿Ļ׹Ŀ¶vbYRPPQUMKXhwȿw`TNIB><>GJLGGPevvja^YVSNJEB:7ARchgkmomg`ZWYZ[^abbcefdcb_\[^birzxqlhbeinrwz|vgYOIGDA@@@AKPX`fjlprl\]m|xu~ֹdzž͸Ѳÿſ|mdYMDCDBJ]pgXRMIGEEIRbq|ʳʫº³ò¶ƿźοпƽǿнľӳܽ~ջȢ忼ƾʪ}p_K0 +  )4<;89<=FILF@@GP]hni`YUNNPUXVPHA;56BVfliikmkfa^[Z[]`behijkmlhd_]Z_emv|urhhhhjmprw|ynbZXURONNOPZ_gotwxy{gUXl|zuvų®ȸij̾ıˬþżzmeXG;76:KcxsaYRKIFHLScvĥoirϿʺȼü¹ǻŻ½ͥƳУխ¼Ϳ¥szӼ¿tdP5   "!)5;:68;>GHIFA<99;DHF@>?FEDCA;5217:758<:HOUZUK?5*'2F_mnjfffdbbdd_^abfjnpoqstpjdaWXZaky{slgfhjhnuz}zvrpmjhghhot{~aMP`ju}Ĩ͵κĺ̻Ըν¿ɻwjaWG8/03=Rk~rbZWSOJITg}~whY_qyidY[ivztsȼǽüýμƿռùƿ¿ʱſ㵍ڳͻǽ{~³}lW=% !&%$-266338=??@DHHEB@CGJLOQPUUUTME<4%(6Mgttoghhggghgha_aekmoqqrvvqmla\Z]bkz|tolifllnry|wtux{}}WHSQUh|ϽؽжθǻvgZN>0-/5>Pfzzjc`_VOLUixjZZfnhb[]fklltøƽ;ǿɻɲwrrȵ˾ɾ;øپѰ­λݿ}{ʾp[A*$)+(,045238;679=DINPSWY\^_a`\WRKC=84//6Kcqtnjkmmmoonighgghnprqtvwtrqid_]^cp}|wsnkllmpu|}}zRALOXkȵűžʸ˸dz̰Ǽn^O>214;@Pcu¾rfbc]UOXp{oe^_ingehhb`fuȽǽп˿Ŵнt]X_}ƽ÷ùŹټ}ƭǶԼw{t]E/(00+.26421351259@HS[aeghijljaYLA7343823C[mrqrrvwuuuvmnqoihlqqtvxyyyxrld^YZfs}~xtmlklou{}tI4BOf{½ҿ̶ĺIJɲؽ˫ƾ{gVF:6:@EQas¼wbXWUOLZwyuojp{vsqlb^fx¶ǽƽȳȲĻͶrWUcŸͰ˼пå{̮¹ɵvyƽu`H2! +22-/4874.+)-/46:AMV_bcdeddb]SF91-13:10)=[~ԿɾһӾǵҶͭžp^N?88FLTbvĿ|\LJGCH^yy~zusnltӼҿƱȻɳsZ^rϿ߼ø˻ܽxxϯɾ}}¹vbK5#!*24//4:;90)#'+146:BIRSTVUTSRQI?50/23;308I[eglsz|{y{vqqqmiovzz{|uj]UYatvsmhghklsvd5&AhȻ־ҿٽĹҽжҴ¾ŽxdTE<9IPYfz`KHGFSnɼƺ{uwy}͸Ÿ¿±Ǻ²lUd{ķϲǺݽɩnͮžƾǻygQ:$#%,3887;>?=4-%"&+/369=EGGGHGFC@=843246>:79BLUXir~|yyundjt|x{}th\YZcp}unjikllowX2/NvƹοºǼչʿ̺Ƴʴ׾ǿ¹tbTD<:HQ]kĸiRNQQ`Ľ}|Ŷ˾ĺƶždRgǺܽĺʺŸߪϲη¼űʾÿ|lW?'')/7ADIIFC=5-(&$%(.133:<==<;996542358:=<=<>BJNcn|zm`eqzxy~{vjb^Zdtwpnooilt}{\GOpοпŽ;Ӷ÷ƸѿâŽkXK=66GQ]lùoXSTVdǫĽaQk¶»ñèĸƶŸɕǪҵƯĸ̶ʽ}p_I2",568AJP]WPF=5-(.*((,..,0133221010225:<>8;?@>BINZdryxvy~xmjw~z{xlfgls}vsssglt~kdvнͻϲʺ̿ʴּÿȿtaDBD5:I]mľy[TZVj̿˿ǫǹɷŪ_SlȻ֯{ϿȾúϥ~ǥ¡ðοĸѸĸÿÿtcRE>EEOPIRchhi^G;:7/0,,,--)')((('*+,.06;>@A?8;?BEJNRZ`ghkljch}}wxupjhq~zpcdjplgsvxnpsou{wuzvɻǺƸδͻѻ̽¢sQFE97I`t»_UVXnźȼ˪ǺūĦc[y÷ŸŲĽż鸣wu»Ŀ¼˵ƸĿ{rh`[Zafoi^iupgeZG=><3310/0-*%"  !%&/28>BDEB;;AEKPV\biljkie\Hk~}{}l\UWWOGMOV]YS]m}wqsmpzvuxz{{|{l¼̼ȼµʰмվǻã¿ÿfPJA9Lf}¼ǷiYU_züö˧ɻһhfͿ~žµٳԻſ¿þԘ_ǻƾİʺÿ{ustvwswd^TE?@>98632/,($"$049?DGHE?AFKQX^dkqssrqmfP{~}s\C67=>=9730+'!!&(37=BGIKIGHLQW]disy~uκznnYF/'0=HKKJKH<-(*4G_{yvhdpx||usuy}ƶ̷ȹ־ѽƦĿļͳlWQJUo¼üzxuttpszyb[o˺Ǹɬļ¸Ʋžǥs|õưڻگ־l5[β}~Ľw^OICBDD@?=830*$! !$*-5;@GKLNMOORV[agmx~Ἣd[U[SD1,4CMPQNJB3#%={|ldmrt}}{{|įιɹͼӺƾȾ̺Ƨǿþü{^URWp{yƽzpkcYSIJQZhzycap̷ηɱżȿǸͬ}ŻŽƸ̼ܾġ[,P{ͯ}u[LFBDDCB@=94/*$ "%+18=EJNPRQUUZ\`fmryѰmig8:CW_O?9ALUUTOH>2&(prinont~ϽҾʽʿʹͻз־ƽôƧǿ¾¼l^[Zn½wdZUX`jū|tminpuz|iltʶɻȳƽĻѴʽúԽijſ寙ǪݧL$AlίſârYICACDBA?=93/*!!"'-2:?GMRSTSXY]_dkrxyٰùUS~]*8JfhWF=DP[]SKC:3-'#*sxorpjnyտdzɺʽ̼ϻ̳йŦǾ¿xib[lüp\PB>BJV_rͷrwxʸȷǷȿȴǾļԻºοþΡг€ώB %5m±ί}ƸrYHAADCA@@=84.(""! $(/5=BHNTUUUYZ]aemv|{ׯ̶oLNl8HYuiYB7:HTXOG>50.+''%:}svqikr{һ̸ҾɻҾɯ͵ʿõ¥Ľýÿlii{Ŀy|w{ѺԽ¯ҾýȸŻìĺǸ˿Ǵô۹־Чr4g~[nɹϴøɺpTG@=BFJKA=72,'" !"&-48BFKNTVYWUV\djsz}ɛ̺p[=Wz[KXUSC;3(%"Euysqpqy̺ҽijȺŷؾ¨ƱɻżijpivδĭǷλǹ̻ȼɴĹ̿ðƶȺٲޟOY|`Spy̲ľ˼ȻqSJFEGGEBEB<4.)!!"#%)/6:AFKPSVYXWV[ahqw{ļdP?UsU7GdcBDCBLSTF<0!Y|qoqlrzկӽųƸñ¨ҽϾξϾҿļľӷuk»ԼƸλ˿ɴ˿ǷȴǷǽҽ¶ƺǼйľ辠ٲ׼؊.PsnΰþsXPKIJIFDC?;62.)&$&')/4:?DGKQTX\YZX[`govz}|P;ATiM2BeX4<<0:KUK?0"'svrtadimtܬɳƵűªι˵нº¿ذ~yӿ¯˿ʶĭõ½ÿ̿ɿýŰޥԤ๯s $=ɬcbв»ĽrbULGILOOCA<850+((*-/5;?CGJMSWZ]\^\^bhov{~޴zphE2EU_I3>^}~G*32,7JLG;," 4|zeeddgq}߿dzεƵϹ־ȶȷͿϼȾѦûǽĸ̾ӽþγŲɾƹϷ¾ҕӹ̪ٹ̚O  +# XUFvϱ||ºǻwjZRNNOOPHC@;6/*&./48>AFHKNPSX\_]`^aelsz«r`edb\F9KWXF5:Ra_B2304CKAB4'"'F~ypgcdjmu|­ѱԹɻǵҺóƿÿ¿ϻƼͥǾĺ¹θдƹʾĻƑůθźŮh, +7v_M]ZQB@UZMA68NPLC;5/;FECF4()+T~tnmopvz̰ԯؿüøлƻѰĺ۴ɵÿѹĭÿľ¼̪IJƸ൒i]ͅ8' .n5Bӯywwepdz~|m_][XPF<337;ABBA=?CHKMNMQQRRUW\\]_eowf5AZRB:B`]?54:SNIA;51:B?GL9.4$4ZӶӰŮƿĺӼƼٽĿŬƳѾʲļƶοͳҸƟԿhYp[  & &ies뿋i_lmpĹ{~иud_ZVRJD=<=?B@==BDJNQQQPQQRQSUXY\`hr{ôf,7UM:8Hi]6+0;WPN<676>C@DI5-8(9]ӺϮîþæĺȷĻÿ˻ɵӹ˼½۾Ӷճf[k1 :hդvUVYqɽ{|¼μȾ}ph^UQRRQMIC?=>BFJMOQRTULNOOPTZ^`cjt}ı|kl6?SH79Hwd"+AGSI803Q@.2G{d!'?K[R:-/~l''F_zsF'*+*;~r1&.KdwF'-;INJ940,)8\{ǬȬùȽĤȽþ¹̿϶¿̶ǨȷŸƮqdr~՛~َԽ+ +%9CY̽¶{utvxz||rw{{Ѹúļ}wwurnha\Z^^][ZZ[\]^elxĻ~gi]1.aU*C=/->ws914L`|oB(2<=;5IlϴҴ¼ȽťýǻĻ̼}ò¿ιü¾ʩͿʿҺq}Ⲃ}ܼЋ@ + +$(B÷~zƲxrmioxysswov}ȶƺȷƿyrrsuwtnh`bedbaeimt~uQHgi4&UK#<7,1Hjo=79IWoc<,8=:9EPe[8.<<7LM*#J>!2'%AZbXEBLJHOL<5769H@ #2('Fb]READGGHG;;=8798B4//4Vy¹¸ŭ¿ĺ;û¶~}ɷŹ¾Źȸû´őǻ٩tЗؐu}w&  -eҮ~mSKʻƯȹnWGITpˈmüſȽ{ҽ`L@63-#QG%$2'(Jg[QIB>FLC?7;A8455?5% .Khv~̿ǴĭþĹüĿ}}~úýôōǫݬ}‘қJ  0r`IHśe[ҼdWkɲnZJXt{ľ澌Y.220-+XM($0$&GcVMH?6AJ?<0295377>9%-Iaxwu~ͼíþù»ȷÿµɷسÛͬ١zm" ,sۺvSTͨϱs^F;32E]̲}~|ÿ»ʑnP'020+*XW/$-!"@WPG>2.7@@D,%,.4<>;9*%;Vrxqu¿žý»¾ȿûǿýԽǽʹ¾Ŧ־ڵxI  + *pݩǪtT," )*-2zθᰣwZD-0--(0g_2$-# 8HTO:.24=QT5#%(2AH8658IjrqxĽüؿ¾Žż¾ºĻ˴¾ǶŽ˼۶ڣxнҋ&  /s¦nTH=,/,,6@?3'Sźا½qS<1.)..8vg6&/(%4>][;.>7>ikG.)%-CR;6ENSvvptyĽ׾üƽſƿǼį½žǼͪµƫٴڞpǵ֫^  "  + 5wȴgO;+*3269:?IK>-BBA>;:=EKGACLH:>Mǵ鵢utbG0$!#%%&)/24301B]{௜yeC9BA9/34!5qo2(0-,'/c]0!A44njVA.2O`JFVXMbų}ƽIJÿ¬ÿÿĽȯ¾Ǽ¾ٱ}{Ƽݡ2 +  + 8|γt]I8./>BGHJMPW[_WMHLIB6>tİĮ¿Ļsc[ZWRIDBCCBABABBEFHSW\ahq|벀vbTlkH64142 3lk4(.)%#_W+ >71\qp]@17M\IJNHBUŶɿŵíº¾ŸλþſĽɯͿ{ľƿúּ}a  7{͒na[C9359=DKDIPT\`gmsm^OFCCBC?N{ƥȾjRFKR`bdjptuvqrqmikrvsoeYPR^hy|ȌhhS9JJ1)+5MD432/ee7-.*%]Q*#?<1GXrb;19EPDGA68L{̽±¿¸Ҹ¿íúýȷþǿþſԼ¾Ⱦɿıypt'   5z٨lhsp\IEGKLKLMRX`ekouw~qcYPGEFEC>a˸םûufTMVemqyxuty{z}sieeea`j{ūd23=.&$5UI300+[Z:2//+YP3,AA34=j_44?AI?D5&1Gzӻ̿ķѹĻ­ùĽ¾Ŀóÿûſͷƛoqŷʮyz~řwkϙC +   4x̲vvmjhc]VQM_fqy|~~pilbPEF=F;VޞķwQFBSt{p]STcw|m"52"6]L0+0"(PO=7/20NK>4:A6')XQ/7EDH<=++E{ӵ˱ɾǷ¼úºµſ˼Ŀ½½˴Ǡyʠt\Zfrٮr?  +  +2wĜ{{}pmjebfjmqyvtwgG=CGF,?{䮢µqXLFN_xtf]_jvxݯ^ -/:fN+'3()HJC<-21:BI;.8:&$A=,6DCD5.#(Bvݶʾý¾ÿùӿêſŽteafxܺ{˼ֹU + +   1vϧupsxzzw_HWy|nKWǬĿ~cOHcr¾vg^_o~~~xВP1+!$.)/@tR&$;70CGNF08: !5YD+G73!).482*&4ZpĴϾ¿Ƽǽųƺ{zŷɺDzß[Do٫_  &lDzn`ZyƿĴj\cyýfQMPtzywW7GO:,1GvW-.53<9A]G472-".OC!:=:.# '066+)&"&0CXtõrƵʾôƼؿ¿Ⱦůɽɼzu|ǻȲȩmRtH   +  )pϻu]^}xĻyjhxǹ~eOCYi~}trٱwTOw\54604,DfM2561#:A/#&'465.&&/9U`cYJLd}ʿ̷bE³̷ÿŻƼջ˿Űʿ~vx̹Ÿ¾ɹóѳƾξɻm0  + +    6ʽþr]_ϻҞxkɢn`pýnE92Mgm~nqʼtM9ISPD=Qu]735/4*@cK-088(&>?.#""*0+ @Xo{}{ѭ_Qź¿ƹ½¶Ƽӹž˿ŷʾxvzű¿ɿǼǾ»ÿ1  + + + +  9̸iVf˳ōeɜvd`}ĭ[9)2BS{gbȷmM=FOVL?Np[72307-AdL-/6<47G1!#+9J^msxyrɴhu¿¿ļżѷʾƼǿ~vrxмǻ¼½µȿɾĵ` + + ;ùxdPa}~f|qkgsſ²u@,')N_U;ChX72439.CeP622;= *F3(6GMJFEZuůn~̽ɹýκż϶Ⱦɽ}sw}IJƱ˾ǿſªͻ~. +  + + + ?IJǾwi^[k~ldqkgfinoprr{z_coU<'';Xl˾ZB22B_X8?`U97958*9]P>7-7BE9 +!*0222CZxѶtiĶ˿ɲżε¿ǽ̻ȼyyҽȸÿÿιžéн̹ݩI  + + +  EȮŽqg[Vj|iZUUc^YY[[UQP^m{񵃅xrS_vlN,C̷uTH4,:]_@J[T<;<76%-QLB<,6G.C< $%%$ "2AYlos´»ĴĶɲĿɲ¼óò½ºѸĶȻq"  +  + + +   +Gžʽút_^`f{pfhgdaaaaa]\a`_YUUZ]dϸݹvǶtYNdƸa0!+ȻkP:807Q^UKXFIA@I2%GMP6 >MO,.2 &(&%()&2G_mwھʾúĺűɺļÿɱ»̾Ⱦʼƿɿ黥ƶиľّE  + +   KѵǶmdpz~yqe\afea]^adb_[WQHASavʼ֝yϰvZGPsùj9' (źkPA@9?WbVHIHVG9A2$ 8LY9)[zrI.C5$&2BP[ipqopvŻ̼пʿ˳ɻƾÿȯ¾üϼžɽֻۼg  + +   RֻЪήžzqrz~mYeqnc\_g\[blvxpiJ;.Eny涕ſҬaCA^—uH5 .ŹoTIGEK[bWE9E[H6B8*&/RkA3yʹA/E:,);~pREASqղźʳŷ¾ƯļҾŵƶļ»Ļʷоۿ͹ѰN + + + + + + +W㺨ǹĿĽ{xz|d^p{l\grncYZ^TV^isyxuaN4-:DYxro۾ɽЮtP?R} ZE ;ƻu[PRVZ]^XI2B[F6H?.0(WuD5~Ϩ_*(541 %6Qcx_C.'*@d̩ľſ÷»η´ǼþƭŽϾ˻øƾǷ¹׾¸εּ?  + + +  [̦ܬû½tt{iYXgspcfjljd[TNGKOU\ensuq_M>2=ZҾd^ºԳdCCkkO"Gɿ|eX\gfUUYL.HfK0=<72 OnC5ji9"(::"=`}ubA%)4Opȼ·ǾѽóĹǿ½īƾ¾ɵվĻ½ɿϸƼ¾жҩt/ + + + `ոѮ㸰}jemygcis|~vosnkkmgYMHJLNT^lwziK1/LȺ\c힢߷WAUȿxO'VĦf^\jeLMZQ0QuT'*5A5D]GATov~e;.AA'$ +  + +  hӱҞ׼žvsrmjhe_eqvcZZd\X^ii]PVX^i}l]?I_u׻¡ҿШdObIFʨ~aTDMP@TmbKM^K28:A;".8P[4%2J]vlU`S@:;2)$! %0;ALuòĴɹ}þžͿɳ¾ɹƿɽҽʺǾ{-   +   +jն֝񱙚vrortrkd\lszqbTSX_^bipogadknv`>BkܭбԴrLS~ɿ˭}C+[˾r^M=8=@N]`IJHKK=6A:B.%Sf94ARgztdRNB-$.9(7@TF6KXH>&,@\rz~{cC(.fϵķƿĹúǼű}˾ҾôÿɶٺݽJ +  + rۻߖyxtvqmdTD==BJRW]i|åʫhB.Nʯ̫Ȧckw¸þҾcYijֹydOF@412.*(?kp<"6G^N88?JK)(5OafviA"  #Wû¸¼žø¸ȼƲʽĿ÷Ųľ̾ɷҹ~6 +  + s۽͞|vyz{obQ=/(*5ANZajrzvx|ǿ{[34Y|ӥĥ~awƾʽƽws|ŧov鹘Ӵv˺^NE@329;1)7^f:$7MfS:+-NY2,0AP[qwQ.  EqҾżľʿdzɽɾÿ·Ŀijľ̺ȺȻݩe' + +   r۾ߵ㽧wtwwtdQ>/% "*5DOY`eibely}é÷s; .O}RgףϼsVvº˽fJE\xȽpSLVi̪ܛ𵇑־{թ;ZLHA10;C701JV<*5Mk[G-'S\1,,7GXoz]< 6WuĬĽĻ¸þóüdz¿¾ſȼÿ;¶ļǾȼȿ֜M + +   p¨ϵг|qmnmeSB4-)'(&+2:CMUY\`is|~swĥ~@NԦϼtUzƽ~svIJϰډτەpǵy\SQH0'3<85-8IB42GiaU0HF !(9OeroeUC-1G`{ȽĽ¾ĵƿƲ~Ŀɽ˾žƻǿ¿ȿƺϑ<  +   + nªǶܾ~peaa^RA4./11/(&%)2@NUfmu{|`d|{}=Gxǰĝcȷżüӹʹ⌅ދ܈ch^YYL-&/65,/DH;1Bjg`4:/,BTYUQKE:+  0@RožƿµűĻþ¿ù¿ſĹѿ°˶#  +  kê~}llfUW^NF6))/43/#,;Pc|ySXqejlH,#7Iּʷƣûſҵ吁ɈƍqѬTVv\E6 #"00.(5RU;>O[M/ )230/29>9+  ";:KkǻſĶƲн¾Ϳÿź·¾¿ξ̾IJֿg    + k˼}un]\^SSVF@1)'-0-'")3@Sexz}X\ugd~nS5()",lʡҐÿõʲ樝鳗Փz̢SVq\H:&*)/-+'2NT<057- "!"(4BE=3';MPMVfxYQehhzcrm;2& %C_ehr}үξøfRJ]X]]RB,')23-+%"$!$ +*#!/=JMMQRC)/1/+3IZsX/:wŰŻƽź¸ȷžzÿ½οÿξIJ¶Ž½͡E  + + + + +   gΪ~zsh^WULGOMC@:0,$#$$" !(/?ORKUefNF\japkdlj  +)4GrƳxcjdqjm'8]ӽǺԷ|ɯX6GTUO(1;1%&&'#  !#&*/*&'-9CH_OEKWXK?>UR>Ik̶¥ɬķȾɾμ¶}NRPNLNPQ_fr½˿ÿŽɿ½ɲսȹŶǿҽɾʵz!   + + +  + + kϡxtj]QLMHRpk@0.()#"!#$4ED=G[zgC1&5_knoee%19^ˮտɴ˥zܳoY/?OTT..;2(% $!#**),-+0,'%'*./KU`bYPRZZ|yRMnʱǭŹɾſμô~%4HVh}ĸʻɻ¼¼ľвĻ¾žѽo + + + +  + +ḅ|xri_QFDT]mjcJ3'&%"$%497CXtyX0"!W|tifw"  8Fa󹠭Φտµֲҳu^WIC>=U\7.72'! #59973037.,*-0, 8XsnWM\n`[oȹƺǻʾ˺ôx"0DXsĿ¸»¿¾ϱ|}Ļ¿üǼй_ + + +  + hŔxuqi\MAASalaQ9(#! #(-+$*6;;G]nqP, @ͫsxs) + #9C[ȭϵɽִ¼ԽrZU^VG@V]=#'/)  +#6;<8349@IFA:9CD7 +#%##'438ALPOPTTQevzj]kmƸ³Ƽ³¶ʿ%%(+))0>Sh~}vqqv|ĿԬP    +#0,7t}sf]SIELeuiP:+$$(/07?HR]kuv^?*# &;ER}媐ʻ͵ˠ϶Ϧpr{_9))JH)  +.=C;/'3BQUK@9:GMUbq|mqtg|čdg|Ľ¿÷º½ƾ3357429EWj}wqqsw~ÿ½øѾ̟:    %7;Q~}{m_WPNQ[pyfI1'&*2<=JZhuŷq`I8/(@;9?J\mùз¿tnqxyĶϵwcQJGD>:8bŖ+ +    + ,BMm}}~xfXQLQXdwqR<8?JT_hv÷~o_NB- .??EkվʿҳÜ庳Ågsd;)%D9-!%**% +?ZpzatΦj^ؼ;ļ̾ǿ½DDBAAEJScrþ̾ƻxqu~üƻ’pD-$'.;qٯn* +  +   "6Tw|z|}~~~saSKLXdkv}uoxȾnYH;3-+')'/vԻ׭X    ++Qxž|||~|yshaYfz}voifZZ[^```^]\ZY\_\V[b``krpt}sr{򸛢Ӻ׻ŽӟǨţϲϾwonkkhJ)&$ %/* %KjZZn{z~s`kuxлĺƽǼ~|gikmosw}Ŀпκÿþurqw`@8)!!'DɾĿŌB    + +  +&=k½{wsjecet~tb[TKB70*&%&'+---++'$',+('1003##"9ջn    + +  +&;bʸ~~xrgSJ[trgjaMC331/1211341-+*&  + + +  #'"(Kr֖߰x@?uкδŴhW]D1#",1.,.$ &Tb;H{h;$=gn_XSIL^b]]ZY\bghlv|̿zwvzz{|||~ʿŸ|z}jkmpvwz}|ºƼɽÿܽulf^UOMMQY^ehp{ƿúþrçqQ=1%%#CӪS  +  + + + +  !0Ksɸ|~}slg`RKZpv`POD0(#&*(%#')&))'&&$  +  + +  +   %ASv▆ȨnPaŹįw_\jX7%"&&)/*,( F[DTvjJ.'"!$*;[}te_VUQTac^b\TRU\biuzʿ{zx{~Ǻ;vzĿqprtxy||ùǹƳſƮ|pkd^VUVY_fjpwüľ{i~ֹu]K.FEYjhXG:&(69Ldlabi`ea]_ZSZNFBIV^fqzu|ƺz{}żȵ}rrsttuy{~ƹ̽¾͸ysmib`bdgkot|üþpaxб_ME=/,,!%7iԻک\#    #8Tx˽|xxy}xrldVONLKMRcbXQOA0.((%$*+*'(%"  +    + %09IXjֱ°ukĶ˫qַnͽxrwntrWB0' %3Tx`#(6N^_YM< (418MWXcsqqgZSF>D<56BS`gp{|ívntÿsrruy|¹ŷ¾ÿĪzsokjkjlmqu~wf\tǥvRBA?311"-N˽Ŷʼn8 +  +  2Mm÷|yvxz~|xrkc\OGGIKIGUYW[]L<;4,"%.30/.,*&&&&%$$#  +   +12'"$3jΖźyɯοs콐}ʑlz̾{wraXJ>4*"%1az/%;LOG<, #".GW\dkidVKLG=A;42=P`my¶Ϳ}tp{¿rrqsx{~¿|wy}ٺѻxrrqrppptyŻp[XsθgLA@A<57':kǽпҪe  #Eeǽ~zwvy{}|~|xuoic\RF>AHMLFSUSY]L<=8,/9@@???89EMKEXJ859/'2;80 &1>FE@>;8>::7510.-)$ !"#"%'$   $--174)(7vǺȪۧdzqhejkks|kL:7GxW/+"   +)@6"AhD'+3BSctļǺ|zſ¾ɽzvw¼rruzƿù·ĽíüȷźhQKG`_HDB9@OK60Vǯϛ1  +  *H}|vsrsuur}ywpbZWSI<6@KJ@AH]H+.3-/'582!%3@GD?=<:?;97741-'$"# "&(++.13/*#  &05856;4&6]züƽZbӸϷlJRSDE=)#"  $0!#)#+KjoT9%4=FUhǶ}¼ƶ|xpquzƿźεüϼƿ̴ŷtTHAC\ypTCCD=ANG:=fɳx$ +  !$7Xxqomlkr{~{tme[RKD44AJC66=\L13901(262#'6CJHCAA?;9643/+'$ #(.2678::84/'$  !.& + "1(-95APWL==EVI4:A:;0165(*7DMKGEEC:9631,%  %.6=AD?>976/% + $27931584?YnxÿÌPMkľĹzgTDDC'  -?KJ=0'8/5KNY`ZD$ #'4J]i|ƽ}¼xpqv{¾ήĺþðĶsW@98D]m]PHHGCFMKOsb  !.Mr{wussqkmilxxnkqc[ZN>74129@??2?IJK?9??5".:GQQMLJGB?<961+&&0AH>+&";fǵl6.=9BNg_5&1:?@Pcmwô½yulou{Ǽ軱ɾú;þ{gOA@;DF]sv`_[SNPV\Ucݻ,   + (=]~|zw}sb]gXKC<<84/,*%%0=HRVTL@8/+%   *9Lbrֹþü½бƚcƺlXTTZb_bilpqUZçv8)65>QlY. $+)(.DOTazyknt{ý̿ɾȹ·wgXF<<>ME\{}{shmj_WY]^YkחZ   + 1Ljƿz}yuxrfeh[J:04BLL@4'"&.3   %. '8' "/E_v˿ºw^Z]u~wiXsQQg½~=(44@JWbc`^\WNKJHEB=:<6/(&$##')19DPY]WQC1  + (;,!(')4DTlǻĿƼ\N[dd`X@Yįy0#=;:16?A3 "#>zǺû|utw{|zxy~~z}}yurmifgfgkruxyvtqmkfc`]ZTLGEED?<>BMdµɾµƼϼƽźxyveUMIEFJLHH_{|onnlg]RKGCcϹV  +  0QtwdQE>- +32$&-6AHKME@<9-)?IWbeffd_YWVTQJDB?:50002113:CNYae_YL9& !)=;.*189>JbsƷpH=Mea^Ѱ|NC^Dz}1$BA:,*,2.#  ,TǺºzxy{~zqlebeedcaaa]\ZVTRQRTWXVSRMGCA><;9740-,-.))-5Ecϴ̿͹ȽŹrkw|eZQONJLOQTSevuklg^[]XNLPι™< !5Y}ypYLC9(!% !*5:>A;;97*)@HWdgjlmkhggd_YROIDA@CEIHDFJS[eknjdXF1"##,BHABJU[cpʶiA2>d{ZZvbGPqŶ0&GE9, #*& A{Ĺÿ}{zz~}zvmf]Z\^__aa`^\[XXTRQPOKG@@:4/----//...)'*+/6CVv´ıȾʷȼúsjvzi]WTUVTTV[bdjslejfYYhi[[d¿o%  8_vkd[RG0 + "$%'.165)*AGVcknuwvvtusqic`ZXVW[`cc``bekntvrlbQ<)*)4O\]fvij\GImuVVf~hTQh|,#GD77& && %]ù¿}zxy||yukf]Z\bgklllihedd`^\YVQKF@93-,-/0659><2,-8@KXnǵǺ{u{{}Ľ}k^^ZZ\][Z]`nprvoksuehxxecqŽߠE + +8_yume_^ihT+ "*54'+@FTckry}}|}~~}yusrrruxz|yzxxwyz}|ysiZG2# *55Df|¿ǸxttWSVn_Y[kq&?<2>2)$## B·|ywy{{yvid]\_emttsrqnmmlgfeda^ZUMHA;;<>ADCHNJ<46ENYf{³IJŹɿ~}vs~Ƽzlcbda_bb_^blz~||kl|˻ʃ&  + ;`ysoh]]`z}h1! +76)+>FTcjpx~~xpbR?.%$%'3<>U}ĽϿvYPOifhwh$320:50+!$$!"l·{xxy{wthb]Z]dlrrrrppnnnmliihgcb[WPLLNORVRTZVH>DR\cný˿öȽzttz}|skimlifhgdejx}~|znwھҬa %@c~~z{~}|{wtqpomkmqtxz}zzwl^ag{w=  !1><+*NwDZøŶpRTnz{tO')1)/2-(&$&" Kǹvz{yxzxqeYSWZ[clliihhgghilmnnlllppmjhged`aaba__[V\hzֲÿǵƼĻovɿ¼~|zvrprux}rlmntttxB   *:Rnzwwzztia]^]cinsw|~wnd^ZYWgnuv{ucgfV>+"    @nj?-/5@GQ^gnt{yuqj`^`v{rnaUMHS{ǰĽ»vPMmytnK#$,/23,$#  $_³ʼ½u{|||}{tdVQTWYajjihgggiijknnnljlqspnkhgf``__^^_[TYi|ȽÿϿȿin|ytpnqsyyx{}¾˾Ӆ) +.A]yytuwytj_ZX\aejnsx|~zuojecaflqrt{~f`[Q@/$ +  + F~p5%19EHR^gmsy~~~}|}|{{xqlgc_``ju|s|qe\S]ǰɿ¾ȼ˵{PFczoiK($-00)"#"!%7xʲ˽¿»w||tdWPU[\dliihghhjjkkmmmljlttsqnjhga_\YXX\[V[k~ۿô·¸Ľ{]jĿ~ytrsvzwx~øռs$  +!/Fbzzsxwuqg_[Y]^bfkotyz|wwvsqonnmfikijpy{th[N<%  )M~i0'/8LLV`glpuxyzzz{yutqlhfeeeeafr}|vof`iŵ¸ξ\L_{miO0$ %),)%&&%"*Sȫ}˾¼{~~zueVPV]`gnkiiihijkiikkkjkmsvuqokigd_YSRU[]\aożþ»½ƽźüpUc|wtuwzvw||zz~~ƽĺ̜X #5Lfx}w|xrle_]]]]_bhntytz|xrkfba```a``fpwweXN9# +  +%:]s\5./6PRZdijmqswyyzzwrpiijknpmhYQRUZ_fnxw|~wyyuqlwƼƿʽع}dWcyliT7+ &-,()&##"7|Ȫshh|ÿ̾û||{{ztcUMU]`gnkiihggiiffiiijkmsutqmjgdc_ZVUY`aeitĵƼȽźϿžƸ~cP\ſ~yvuw}}tuvqppuutstwz~{|9   +%>Ulv|~||wphc`_^\YZ^emtxwxxy~zsmga]\][[]`dnvvbWQ@(% + +  0QtiO<4/:OV^fjkkoruyyzyurnehmpuytlTE<::;DOZ]elroh`qy}ywɿ¹Ѿʻӣd[YfwnjV?0 )0/*(#!Lʰtd\gw½½y||xwyzvaSKS]cinkihgfeeeccdefgknrtrplieb`^__cfjkloyȬпǺóǺſպ˹ĽnVGSľ~ywx}vsoighssqomnsupĿ̾ԸڲW& +   +)E\pwx{}{vqlhb_^\YWWZbkrwzxsptzyyxwuqnlf`^bgkqxy`SUK0!"  "Ck\B7.6HNW_gklmqtuvxxvspnjnqu|~rcULKHBDJW]fjf]YWep{}}Ż¦gLOXj{rm[E7#"+0.)(%!  5i°{ieekÿüwxwtuyzxbTLU`djoihfecbbbaabcegimpqpmkgba[^chnprrot~ã¨ƨ͸˶w\H>K|ļ}z{|xpgdj|}yuqortsȿȿƯД5+   !*G_swvvzvqlifc`[XXTSV`iqvvvsonoqrwx|~|vurlgkopsww[NYV='#  #,S~Q70(;SLV^glnoswuuwwuromosvyyi\Z\YMFHPW]XK@BHUfu|Ժ_GP]s{vsbL>(").,)*)(-)Mȵ|l`^rý̿}rttruyyudWP[ipmghedcb`__\]^`acdggiheeeeedcgpyyvsrvȿέϳĢ~ʽ­º{gRA8HiĻ|{{wpgekƾɼp! ,(   !,Hgtoqsw~rjeec\WVPSWX[_ku~|wqkga_^ahknjdd^_aiu|{ty^T\U:(%!#.PpnK)'6AHNWaghjovwsrqpoppqnrv|~zskdcgfaWKA>;877:>BUbpzɹպ̿saftzqh\H. $,.041***c¥kair}{vstzžpqrqtxxsdXT]kolffdc`_]]\[\\]]]^_cdcbccdeiimt||wurv~͵̸dtúwkWC61Dd~}uqjbchƺνܓO&"  #-Heqmnqv|ofdcbZWVRTXWY\eoz~{vnieea^][YYZ\cglt}yyZMXY>! (HmzxZ=%)9CJQT^egipwxrqpooprtyzz|~{wqjknmh\NC:2,)-3:?S_myȢ~wpfS6 %*.3.&'!7vԾtlk|ø~~}xxy~~Žlorpruvrg\Zcnojda`_^]\YYYYXXXXXY`a``bcdfkmqv{yspot|ʫǿµ\kƿĨƿ}rfYF6-+>`}oh`YX]x¸ŷl+   &/Fbmgkprwkdab`ZUUUVYVWX^es{~vpoqd`[VRRUXfnw}wZJTT>" $%(;ed@/%-=GMTS[cehovxqpooqtwx}|xwwwvsqrwwsh\R;1'&,7CJT^kwû~ztdE)"-51)#%HŮyhox¼Ĺ~}}y}ľgmqopstog`_gnkfb__]\[ZXWWWVVVVUW^_^^`cfhilpqtqigjpyɩþ¼߾ϗúϛּŻnbUJ;.*,=[l_VMJMm|pop|ºɿ״اN" (2D^gbgmoshb_`_YUSTUWWVX[`mt{}zrlha`_\\ZZ\js{~t\NPPA/%!!&%+4=QstP/(*5AJOSS[ccflstoooptw{~}ytpppnl_afhhc\VLC<79@HQU]gsĽ}sW:"$/-(!,X̲yzw{ýø~ľ¾ahnnnopmgbchlgb`_^^][[XXVVVWVWXY]___acffdknkjg`^dn{ͫȿʿǃŸ˾zoaVLB7,,0=V~ſfWMFCF_qwoha_qĽͮr6!"*4C[`]ekmpd_]`]VSQQRUUUWZ\gkqvxsf^`__`abdhry|{z|sZHMXS@.'!&'"-*AYmzx^?..5>FKNQV]dbcgmmlmorw{~|xrlhd_[RTY\^\YTVVRKECHPTYdsȾӼ~lU@/ #"%;lͲzowľø}ü½[blkklljfabghc`___^^\\YYXXXYYZZ\`a__`bbdbhkda`ZW_l~ȜǾҢŽı{л˾xj^YPHC8..29Qvſy[JD?>BMdw|ywxwvrϼ˿=%$.5CW[Ybiknc]]^\UONNNRUWYZZ\]co|}vpmifgkqxz~~|z|tU?LgnS4()&&+'&/>Xy}`C.57>FLMNOX_d``beghjosx{}~wrkb\RJFHKQTVSNHGILIHHPWSW`tκuf?'  &,Nηwelƿķ{¼þU_iihhifcabee^[_^`^^\\\Z\[[[ZZX[ac__^]^`_fg]XYTS[mߺǾКüоɼyl_VTMIF:0,15KnľmJ83216?Shs{˴лg"%! %/6CUYV`jjmb^\^[TMLLMQSVXYXUV[fu~ywvw{{~}{z|kR?Ki|q[C*#(&$.6SbxmH3/;>DHNQRQX^c_^`ccbfmsxzzyrmd[UOGCCHRXZRI@@;9;BJSYOT^vٲǴо\@!  -^Τnksƹz½Q\fgfefdb``cb[\_^^]\\Z\Y^]][ZYVX_`_^]\]\Za_UQTRR\sĽ䵼Κ·ϗ꯳ŹxkaXPNHFC8-(-2Hkľb>*#"!%5H\k|ͲʮΣH"!$$! %-7BTTR_hhh_[[]\UNKMMORVVVUZVUX_ly|tpx{{zzz{y_RGKa}].#"8BRQYaS84>?AFJPVVTV]a^\]ba\cjqvxwtsne_\XUT_gt~wi_RE73;CHIMQ_yǹc<  *eǪsieqƿķw}[\^bedcab_]\]^`__^]ZYY\[\\]][VRPZXWXZ]\YZZSHJQOOUk¸ԙԏɽsfZQNIFD?70,&"1IlW..Nku̽»ǹY9 " !%-5CYYPXcb^YZZYVSTUNMLLOQUUTWVTRV^f}vrutzyvz|n[RGQcj͗&#8NN@78@ADHOSWYZYXWZ]```aeiostttmnnnmifdotgZLB:6:ECUj|¿ܼjN. + (pˮr^^hþ}uyb`b`a`^\\[Z\^`aa^][YXXYYZZZZVUSPQQSZ`edaWRH@FRPOZpŽǾƶ͐Ж׮ȾwiYNEB<@>:2,(##4Lq¼wN'%?Zjv¹Ͼޜ@!#!%+3BZ\PSZZXVWYXXUUUNLKKMOSSRSURNPW^oxxrpusxysxzkWOFQdiУ6)%'-;:87=EJJGHJMRUVXXWUVW\^___chkqrsrqqqomjgfknvraI96@GVj±u_E3+8}ocep|~swda_ZWUSSTUX\^`ab`^[YWWVVWWVUSSSRPPU^eifbSK?:COMK[týýüǏčĴ¹zl\MA954==82+(%%7QwýgC  *CYepuĹ²y' ##)0A[`TQRSTSUYYZWUSNKKKLORSRSSPMLPT\dlpnkjmrrwwqvwjULDRdfϱ\9$!-!'4@FMUUNRSUWWWXWUTVX\_``_cgjopqptsspomihcbbfpypT?;CKIJ`|ú¿ęǘĊ򼴮ºrj]M?4/-.884.))&(]g[RHFOQSVY[YWROLJJKMPQNNMKIGFEHIMOVZbhmmtsmoqcRD>Td\ѫb+7B('7N\SNVcfeedcb_\\XXWZ^bccghkmnoooppoqqqrsnh^TJDBBLQVWUNGJfoвŷ|n`[\dr¾è|{/-*()2@J^aec^ZXY\[WUTTUTVURRSUWW\\_cb^SJABCB@>>Jl˷Ȣܹߴʹȷž½~seWH>5.)''*-,&"&+AamB*  -P}û̽ǿC )(##:Xd]THCMQSUWZYWRNKJJJMPOMKKHHFEEFFHLPV]dklroikl_RB>VdX|z9>G:=ES[TQ[hmggiffc`^\[Z\adedjjllnnnnllloqqstywk]M>4.4:@ISUNNh|˽оŴĿҿj_ZZbls~¿ζĿ}vz~}~~+)&#%2CP^beb[VVXYXVVVUVWWVUUUVXWUV[acaYRD@<:987Do²깙ұӫȻwndWI>70,((()'$%,Dd¾jA+  "Rɵޅ!#'$3Q^[TGAJQRRUYZXSNKJIJKMLKHGEFGFGEFFJMSX\jlongii[Q@>XcSw؏JBFINOMNS[bggffhggdbaa`_`cfffjjkkkkkkkkkloprt}}vhWF91/5@IV]VUh⽾øջĽȵ}k`VU\djwÿҽžz{}|yxxy{~.,($&2EU^aeaYTUXVUUUVXXYYWWWWXYWRSY`dd]WI>31343@q뻟Ի}tkbXJ>81-*(''%"&0Gg¿¼¿hA- Uɹ˲b  # !".IXWRD>HOQPSXZXTOKJGIILJKGDDDFHGEDFHMORWhkomdfhYR@=XcQuWDDNXUJERdhaZcdefedbadbabegggiihgigggiijkmoprsdRGBAHPU]a[Yhǵ¶̮xhWQTW[dp~¿ι~~~ƿ|{z{}1,$!$2COZ\^ZUQQSVWWWVWYWVYXVX]^ZVW]ehdXN<2+-013Cvù쿥ƯǸɴȪļƾxl^RJE>7/)%""#! !3MmgC2&  uйù;x9 +!!!$EOWQ:;DOMMT\\WSOLJGIIJIFDDDB@@?CCGJMNPV_gkjgc^YKADW[W~|I=FKRKIT]\YZ`acefffeaddbejgadcbbeghiknqrrpprz||tj^VTXQW^^cddiп¾иm[\_WZ^bfq}μ~||}~}~.)"#.?JUXZXURSUVWWWWXYZWYXTW]_\[[]a_XJ?2+(-369LŻ򽖗þƿ|ocVJB<64,'" ,>TužŽjG6)   +  +$ȼѽO# #!$!$FR[S99>NKKS[[XUOLJGIHIHFCBA>>>>>@EFIILQ]dhjhe^XIBHX[ZПc?<<>?>@DDGILO\bgllh_UDFLW\`ƌR?MU[[VQQTV][XVUWZ\]__]aaa\\[[\]aegmpuxz{~}}ztmkkbahlhmwϿŴIJ}fcdhfbZSRVYdhtý|zwwvvxz #/=ITWXXWXXYXXXYZ[\]^^ZWX[WPKIIHD<1(%$(18=E^þڵ˿ɵ˽~tgYMD;0)$")1=Ll¾ƿrS<+&"   _ŽļŹ(     (WmnX406KJIQY\ZXQLJGGFHFC?><-)' 1ԼҼŻڟ`'  +c~{]4.4GGIR[]ZXQNJGFFFEB??=?CGJCEGJMPRV^eknnh]R=JOOWkϩuPPWZTQQRRKLMOPPQOSSUVYVVWVWWVX]cinpvyz{~{sg^Y]`kogp̺ɵôjdccefeb^\YSNPV[bluǾþ(8JV^][\\ZZWXXYZY[]^]^[YWRD5#%).02210/0238Ff¾ƿлƻ}kXOF<0+)%   #**.:LbrvW@0+(  + Eѳҳжz; -klA54CEIT]^YVQNJGFEFCB?>@AEIMEFGJOTW[ekrrlcZP@OQIVuܱNMR^c]PGCEGHIHGFJIMRSPQUVWUSRT[akpwz{{|~}wpf^XX^mrn|˻̼ñ}fddbehhe`ZVTMKORT[`gjosx{ž(8LY][YZ[\ZWWWXYY[]^\[YVSN?0!#'+,.001/..-4HlµǿŶmT?3+   %16;K`wźzZD4-* \ƺĬȱɲW#  ,jW?1ADIV__YTQNJGFEFCCA@ACDHIGJLPTY_akryui]TOHVSIZ޺mZSdocPEEDDDDBBAB@FLMILSUVTNHFLRbiqwzzy{~zsnha\ZV\mvwʼȶDzzeceffgeb]WRUPPSUTRRQRVY^dkopy}{{þ¼(:LZ\ZYY]\ZWWWXYZ\^_\ZVRRMA1(*,+*+.-1--,-7MtɽϴǹĻɵ`C*    0?FO`uŽ}\F72+"j˺ɼҽȾݥ= ' ++hhE->BHW``XTSQLIFCCBBBCDDEGGOQTX^bhlqy}veVPLL\VJ^ңtOQ`]YZKGFA?>@A::?GHEHPTTPH>g|^XTQJD@><=??>=?DHLIGEC@@@GLSUUUWW^WNKOQPRTap}ϼüɾҽnkphgea]XTRPRWZ^][WUTQOOMNMVX]ciptw{yxurolkfcdm}!!%5JTYUWZ\WUU[]`bba^\]]^a`YNB2+'&&&*//3118@\ƻŮY/ + +  (/6AUdnv¼gC41*$'  Z¶л̲2 ,l|[@3?HQW\`]^\VQKEA=?BEHIJLOW]gouxzzxukaVE@DSd`Qfǒ_Jaym_[ULC=::9:9769>@CBBBA>=<=@DDCACDGB=>DIKMSbsʷ½tpvmiea[XUSSSW[^^^\XUROKIGFFFINRX[]eebb_][[YVV_o!"$4HRXTUYZVUU[]acc`\Z\]_cc]RF4+%" !(..302=HdþĽƳ`5  '/6;82432/..03115;ADISbwƵȿƼĨwsyojd^YUSRRSWYZ[][XUPKFB><;;;;>BFHJIHGGEEGGCBIYn!##$3GQWSUXZWVW[^acb_[XZ[^bc^SH6,#&./2/2APo̼ǿ¿ƶ¾ɷk@% +!(/6?EKR\kxžiD41+&+& =̷dzӴ΍B +  $[mE7FSLYk`cb[XPJEBBDGIMPQVW_fmrtttqkfXF@KPg]Xe˜jV^[^`[QE<8850,,/46*.7>B@<80/,($" '&).8>=:89:=<976664458538G_{"$$$4GQXSUXZXXZ\^`ba^[X[\]ab]TI8,%#,02/5H[{Ƹ¼ƾŸ˻pG/# #&+15;AHOTZ_hviC3/)&,( KʯθôƲL! OO7<3/*% $*28?FPjϷɯ{x}soe_WUUUWVWXZZXW\YTQLHEDA?=9877630.,*))*/*',8Po!##$3GPXSTWZXY[\]_``^\[^]]^^ZRG:/)$"+144?Vkȼ½ľķʼwO7." %&/0147>BGKQY^dgls}iC2.(&.*$a̼׽Īȳ½ق  +C^?3Ok}ʴ}omq}Ž¿ʽ\E?539FR_m˯ƴ˱y~ywrmifffeehihda\VTQNKHGGGHHGD@;620,*)(*+*% (=\t!+BRUOPUYWY]a]YY]_\YXQIDC@;3.161)#$-7@Vtlceg{ȿs{ǿ~i`\X[bdb[VUYafmrykF/-0*,.#p϶˽˸ȳߕ4)lUBOLMbdfeea\WUTTTUXZ^adimnoonmf`^QG_o]Dm٣pNORSVVH@976/*))&# "&&&+*-142/1:=BN`p~Ѹɸ̱{y|zxuromkooopolhe`[UOKJJIIJIIFC>:7620-,,,-$"*9Yv!-CRVPRWZXY\_[YZ^_\XQJA<:83,.296,##*;Jaxf`irþ¼|tw}xmfbafgd`\\aiotykF0.2,/2!5Ŀĺ˷üž֬^ "iôvPCHSbdgffca]YWWVX[^adgjmnonmjf]UPVdcOJ{ΙjSEEOVLB9781*&*'$##&&&)((,0214AHPax±ǹ˰}{||ywvsuuvtsolg`\VROMMNPPPOMHC@>:640//.0&#'/CX^cghhfebaZZ[[]adgjmonnkigfZNVhiUHYaCCS[LA99:3+&+(%##%%%&%$&+.17@L[sξǽȰ~~|}{{yuqlic^YWSRSTXYWURMIEB>973//.2*()0>[u%6IRWVY[^\ZY^]]^^ZTOG@6/+)(%)077/&$*DZvvej}c\[^n{}sleceefejpx~±mJ412+.2Pν¾ô̓A + +  XNFXYbegigfed]\^^_dfimoonmjgcb^T_reORnܵ_SWTC?===5-,.*&$%%'%"!#%(*,2=QhŮ~ysnkda_[ZZ[[___[XTNJFB>9530/2+()/Bb{';MRWW[[^^\Yaa`_[TLFB<4,(&&$(+0.)%'1G_zocvžwl^RZfvóytmggfhknu}ŲoL51/&)-N~˽IJĿΓ[(   LwXUT_ceffgffa^_`behknoonmifa\ccknYQjs^G?>AB<314/,'$&%&%!!%(*+(,C\{Į{upkgedba`abeecb_YSOHD?<84323,&&/Gm)@PRVX[Y\_^Zcba]VME@<81+&$$%(((%##)5Hd|mcǽhQLSaq÷~wogilov{ƳoL60-"%*ižƻƾǻ]%$  AqWU^acefefea`bbcfiloponkhd`ZfrueP\~Ψ_LHGD=5591-)%&&&$!$'+,+'*GdĮ}wrniihhhhiikkigb]WQJGB>;87450)&2Ox*CSRVXZWZ_`\bb_ZRIB>851,'%%&*)&$ ")6Kiqc~ĺlUHLS`q½~tijoszdznL60,!%+eƿȺ͜B +  !#$"  8yºZS_bcdefgfb`aaegjknonmjhda\dxx]RjڷiZLB=7792.*%&&%&%&(*.-,0JhĮysqkjkkllmnoonif_YTMGD@<;:794.-:Y+EURUWYUX_a]``^XPHB?763/+(()+*&$ "(4Lmpb{mXLMPYixsllrw|dzlK60-"'-aмɽǺÿ> +!"$&*+& 0p\Q`cedffgfbaaaegijnnomjfea\_wx[UtֺhN@=:862/*&&%%%(&(),.06NlŮzurkilkmnoosqplga\VLID@><=:;863A_Ƶ޶qsž}ɲphqyĩZ9' "##$&!! +  *Np¿vk\K4% '3>GW[]^^]\]^YSRW\[ZVTPPQTTUWYXY`oz~uvx||~ƿ̿_;-19>CZp{o`k{v_C3-09BWkվgF5;Zy~zxwxzy{ym\QOP_q~wqokhddehhhkmr{¿hO@H[xxeQB?DGKD0(4VojH.2UqxhWC2)))-2:?EHJIIIIJKKLIIEB>:7523233434320.-*'**.5EZny}}~~}~{wpoi`aimlgbi}~`:%  + 2BWnxog^Zagp}~uh`TPNI>3&%%&%'2>KSUOE=4.Ϳ۴rvȿ|é~|nhouĹ|V8%!""""!  + +  +,Rt¿vl_M8(! '3>HVZ^```__]YRRW[[YWTQQRTUVVYXX`nx|}~{yxurpt}~}|aC89=>AUgkaZbn|t`N:.*,3;Ob~ɼuWDD[v}ywwxyxxthXOMO^p~yspliedegggikpx}¿bOCPh{hVLJKME4"")BYwlM5& + 5VrwhVA/('(+/5:@CFFFGHIJIIHFC?<8651212232311/,+)&)*.5DZmy}|}}~|}yvpplhjonjecox^QM># +2GVh|zph_]cir~yqd[OJID91%#$$$'1>LSVPE<3,ǿձy~̾|{˿wtjfmr{rP4$!  +3Z|¾wmaQ>/# %3?ISY^acccd]ZSRUYYYXURRSVWWVYYX`mvy|vqheb_`gs{{y{n^KCBA??L[nzxkZOJRVaqkWOFLSZcdXI=3)$!"(0EXss[S`s~zxwwwxwuobRLMO^p~{urmjfeffeefgkswy}þqTLK_}½n[RPNG<,%9UupTA6-&$#=[sveT?.'&''*.28:755400000212/.,*)'$'*.5DYmx|{||}{|}wsmmkloqjb`g{oB$)9Sfr|rjdafks~vm`WKDC>6/$$$&&)4AOVYSH=4,ήϿv|ʹzq}kabiov~gJ3$!  + + + !>1-2F`utcQ<,%&&%&(+/47<>BFGEB@?=853234././/000,,*('&#&+.5DYlw{y{{{zz~}{soifdfhh_XYkX3$',/=FYqrjgfimuynbXKC?;4.&&'*)-9FV\`YLA6-̰çwðrl{uc^_flrx|q]G4&!   + + )Go~vpg\M?,  + + + !1@LRX]bdggg^ZVRQRTUVTQQSVWXX[[[bmuw~yrmjib`^]`fmr}|zuqt}Ƶo\OHFEEC@?@??8CR]ZG,+FMDAHQ[de]I7$ '2CRiŻxsw}{yvuttuvtrmeYPT[bp{tqkgffdb`_bhjjovy|yýiD8Fdr\GCBF?- !>`|s`WVUTVF@AQfx{p^N:+#&'%#$%),06:>BCB><:8410023.....///++*('%#&+.5DXkwzxyyzxy|~||}wolgc^^`]WS]u|X<16?IYbsqijllmu~ug\OD>92.)+,..2>KZbe]OC7-Խæzpkzl]Y\bhnsu}~~~||yxpeWE6*$  + 3Sz|upk`SG3% +  +  .@NTX\_acde`]WROOPRTQONQTUUUXZ[bmuvzytnhimpxxwxwxxwyxtonuĻµ{bI7-,5798:>=;1;IUUI6)%)(2EI?=@M]hkcM:+# '/ANawĶ~{|yvusrqrtuqnh_SNUan|xtnjhfdc^]_bddhoruz}~~{ÿ}V54LqnMD@EB2",Hd{q`[^ceiZSP\m{~wl[J7)$&'&$##%'*138<=<97431//011-....///,,*)('$'+.4CXkvyvxxxvwz}~zy||}{tmgf`[[ZVUWt~wn]H;8@Q`nwphkooqw}jaTJC=74123559ER^fi`RE7-÷ǷwƼjesq_USU]cknot~}{zywupng_SH;1& + + + +  + +  #=^yspldXM:*   -AOWZ[\^`aca_YRMLLNROLLOQRRPTVW_krtomidckzxtolovýyxɾyaG0%$*155:>;5+4ALQPLHEGBCKG96>Maovp]L4)""#$&+:ESfwü~}ywsqpopqsvojbWKGP_q|wplihec][\``aellptwxyz|~~~{y}~½kF+5W|o]NJC4)(3Lh}n_[ciovh`\gt~~|sgWG5)%()(&$##%'*-14663200///000.....0/0--,**)&)+.4CXjuyuvvwuvy|}~xvxxy||yrje`[ZZXTW_{laPD::BM_p{lfkqttyrj_UOID@??@BADP]elpgXJ;0ĺ~rȼw]XgvraSLKNX`gjjnx{yywsrlid]TI>5)    'Ce}xspmg\Q@/! +  +    .BPZ\[[[^`ac_YRLKKLPMJILOPPLPSU]hprdb^\aqvqkioy~|{kdYMMVf}ļ|eL5)(&.45:=9/)/:DLTY^[^UOOD3//?SdkiYIB6,,..,-40&*6FTijQ@50,.17:;970-1;EO[ehbXOG=3*)9N\eg_TGD?:64336=GQ^q·~{xvuvpnlmoqpqie^M;6FZjyztplkif_^^]]^__bdhlpqrqttttttttspmq|¿}wvK,,AhǼdO@3((0I]mmeZ[kvzsnlry}{ywm`OA0$"&**++)'#"%%%&(*+,./01210/010/..---,+***)-.05CVitxvvuvvwyz{|~~}}|||{zyvutuwwrkb\SYUTRJK]olZI93CT_l|z~{hbhr}~}wqjd`]VXZZZ`hn{}{tgWICvc\nzcRMQXcb]TIEGLSX\adhmt}{wtrokie_XTPKC:0)  +  + !9Z~ztqmi`XK>0$ +    3FU^_]YUV[^`_\WPKKLNKGGGGFDBBDJQVWUMOT_pugckox~xvuyuTB0%!/BXyxkiXI83CVcrzzygaiu|vpjg^^_`dksy|o`SKwhajwyi^YWX`a`[TNNOTW\_behl{}{vtrnif`[USOKD<5-$ + + + + -Hiztolic^TH7(  +'8JVab^YUTWY]\[YUPONNLIGFEB@;;=AGIIEBJXj}rdcnty|uwzp]?/ '3BWm}reXK>515<@@:4.-,,,**2>FA9/&%).9Ndrtqhab_YUOKHGFHLQZk}}}{xuqomonllmlkja\SH@EXmy|xromljiddb_^]]\]^adfhghljhfffhicaaizxy}Z2!/Gn~}ÿdD.% +=KV]Y[htzysoswyz}~zurhYG7+""',-.-+($$!!"$&(*+01234321//.---,-..-,-,+.*-4CVhqtstuwwwwwyz{|{zyxvvvvtsqoqqrqjaWQFLJF=4=YyxnlXD51CWfv{wzyfakzyrmgdcfmwxi\TķǾ{|{vokmpqpkd^\Z]_bceeht{~yuqmgc_\VSOJC>:1'  + + 3Rw¿{tnkhge\O=-! + + + + + + + !/@Q^bb_ZUTUVXXYYWUSQPNLIHEB>67:<@L_uudety}}v{v\I3(# #)0>Qdotl`WL@979@JOOIA;6562(!$,034.(&,3DZq||wpjkid_YTPMRRQRYev~}|{wsonlkpnlllkig_XNIHQeyytpmkmkjgeb`\[ZYYZ\_bcddfea_]_ab[Z\gz|twĿtP,%9RvqlnwjL9,  #0?NXVVcqxxrnqvwxz}xrnfUB4)#$)..//-*'%!"#%'*+,12345432/0//./..///./.,/(,3AUfprqstxwwvuwxyzyxvussssqpnlnopme[QJ@GG@7.?c}tmUKUckjd^XVWYTG848AISSLFGHTi}{uyxwrnhda`\XUYbox~{z{xsmkjjlomllljgf^ULINZn~uqlkklkjhfb_[YXWVVX\_bddca]YYZ[\VVZg{Ŀ~wqsyþnG*)BZ{td_dn}hRC1! !)5EPMM\mxsminsuwz~zwpkdS@3*%&*./00/-*(%%&'),-.2335554311111111001110-0'*1?SdnqprswwvutvwwwvtrqppponlkjmmnjbWLD@DC=1(>hwlO4+0H`lwzuuzhbm|zqhb[YYbp~vicºþzqnljiigfntw}~zungada\VOID@?7-%   &?e¼¹~xplkmqe[J7% + + ->N]hfgd_ZVVUSRSW[]^\VUQOJD;4,.1479<=HVlngtz|~zzhQ:+" $*///+% "(/:DGB@<2+5D`l||y|n^VWfrzoigeu}yvnib]^cjq»}|{wuxupkiijklkjjkiec\QHGO^oÿzpmigijkjigc`\YWVUTVX[^`a_]ZVVUVVTUZiÿzuttyžhC'+G^~tc^_h|scOA2#  (0?JGHXjtoifkpsux|~}zvpi^O<1+''+./111/-,(()*+-./1334543222222323122332/1()/:9=:7APm{uf^^kvtmipz|umfefjmyzwwvsprrpnljiigffghfc`WKABL[ivývlifegijikieb_\YYVVVWXYZ[\ZXUSRQPQS[lzwx{hA&,Kcxe\X]t~ugR?5)!/:GPLLYfmlfchmpruz}~|zvoiZJ90+'&)-.02220/++++,-..122444321211232313445301()-9M`mrqqqsssuuwwwvuronjjiiigeddeeaYMB<650,%>IMKR^o}vjddirz~{vrory}tliiklu}vsuspmloqqolhfdddfffa_UH<>IWcm}tkgddehijmkhda^\[YXWVVVVVYXVTROMLNQ\o½|ww|kD'.NiuaUKMb}}pou{w]G50% #6IV[US[cflfcglnpsy|~|zyvohUF6/+(%',-/23332,,++,---013443211000122212555300))*7K_msrqpqqstvwxwwurnmgggfecba_``]UJ?8.+&'$"Au~shJ@44KboynnxyobWNIHNSY_ciqv{zxqjc_^ŰϺƿypnljijmmmmoqstuttqojhfdb[URNIF:5.)%$  +*Gjͽî{pqw}zvv}xeJ3# &0=IWblooplhlnle_[[[XSRW_dffghgdZL>65667:AMTdq{u{n^RLE93589;:9758=HT`jqu`SNRQHJTlvk^W[bhieaac^enx~|rlkmor~zskjlkd_ghijlkgeeeegif_YOC9:CP_kx}tdccehkmljjihd`ZYXXTTSTUWWRPSRMHHIP`wyw~g?/4Suxqt}~zdPB@O`rsnhdirzkU?2%*=SZ^ZW[`bc`bejimrux{wtrmeUE71/,)*,,.02210-,,,,-./44554322232222225556520/&&'4H[jnoqqqoqsvxwvvtqlheeb_[Z[[[ZWQH=2,*"#&#*Mv}um[J:44CYm}wkdly~vnaTKJMRRYadcaacc_ZWUURP¦Ľ|rponlokkjkkmpqrqpolhffda\VRNID;70+(%#  4Ps˺ټu^TVYv~zznS:* $)/7CR]mw|zwqjcihgb\ZZ[XVVX\`bcfffc\QD>44447ANWborfYOJD;79<=;::=?KTcq~shf]PLTkxm`YU\dgeb][W\ckpuxx|wpnopu}wwqljmmgcddfhkjgfegfiicZRJ@:=FRalz|teedgknonlkjhfa\\ZZWUSTUVVROQPKGEIRd|~xx¾kD6=Zy{pgho{zcNA=HVbca_`gut_F8+&$&6I\cgc]^^^^\^dgikpuxz||}~vrph^M>0,,,,,--/12321--,,-../3455544332321222455532//%%&2G[iooqqpooruwwvvtpkgba^[WVVWUSPI?4+%%"!"$2Vz}uneUD624CVixug^cn{zmf[PIJPWcceed`\XPMHGHIJJֿù{²ursrqthgegghjkmllkigedca[WRNIE<80,(%"!!  )>Z~ʽsvzvpqsǚoM;41Ii¿~~x^E2""#%(-6>IWhr{tjbfec_ZZZ[[\\\\]_cca_]XQHB65338BNW_ixudYOHFA;8@BA<9=FNftr^RTm|qe^W^goqka[UW[_cfhikr}|tqnnt}{rsnjgiigeabcfijggdghki`SHB<;ALXfpzreefhmppolljigd`^\ZXUSRSTTPNPNIFDJVjyv|rK?If{sh\Z\tiVJFLTXZ]_fqzgMA5127FWfnsohb\XVUW_dfgltvz{{{{|~upldWE6*')*+-,,.02210.----./03455554422321121344421..&%%0EZipoqqpnprtxvutsoie^\XUSRQQOKF=3)" (Be|smibP@116CSct|rcWYaqz~ytfaXOKOW^okgfd^SKB?<GWe}oZVn}tibbitsg_]]]^``_^dks{yrliou~}qqnjhfgggcddehiffbfhlh]MA;9=HT`lwwpddfjmqpokkkihfda^]ZWTRQRSNMOOIEDM\rzuvÿzUMWqypdUNNfwvg`]^b_ekr{}lRE990%%(*+-,,.01210...../003455665532321121233410-.&%$.CXioqqqpooquwvutrnhd\YTQOMKKHD=3)! 1Ss}vmkkdQA.19FR`q||xo`RPUgoxzyxupfbZQMQY`nmllh_TKCAADMV^cŴµѹú{yxwwxiecbbbbbdefgffcc`]YVSNHE>;40,(!!'())(&#"! ,8Qnskq}DzpYKFD[sŸtT<)")?]¿x^G1#$$%%%%#! #'+.08CNYhwyqjea]XVUVWW[[ZWW[_]XROMIC=/027>HQUbcflu{oaXTNIIGB@CGJKN\p~d\r|ulgnvxkhdaaa^\Z[^cjt~}tkginvqnlifeeimhgfeggdd`dfieYH;67@N\gt~tocceimpomkkjigfed`^\YVSRRSOMPQMHHRc{zurw¬\T]t~xqj\LC@Sf{yvuxqxqWG:;AIWflw{n^PLKPX_aejnquz|~ytpl`O:,#$(**++,-00100//../0113456666633332232233410-/(&$-AVgnqrqpnnqtvussqngc\WRNLJGDC=5+""(Ad}yohmqjVE04--+*+,,*'"#"#&*.16=IT_lzxqid]WSRQQTVUSQQRTMIBBCB<7,-/7BNX]edfku}ug\NKIHIIHHKRX_fuicv{unku~qmiggec^^\[Z]eovvlfehp|vihfa]^dijhgeffdc_bbc_RA515AR`ly}rmddfjmpmlhhhffeeea_][XVSRSPOSUQNNYj|vsqyĿƬ^RTfsrke^XM?62AToy]K;;CLYgkxs`QJILT[^diknsx{ysrl^L1% %*,***,,.00/./0//00123456777754543444344421.0+'$,?Tdlqrqpooqstsrrqnhd]WPKHEA=84,%$5Uutiepzq\J36<851,&#$(/551*'!!$)2@OkþrXDIZqwsyzleafki\O?;2*#(;[waI:2113441.'&&&(-148@LXbo|uncZVTQPVTQNMMKJB?7549FTahghkr}vng\RGGINSWZZhlry|rnnllw~j_c{|xuqox~rollopkfeca][]aguz}{tkd`aivxvqf\X\chfddeedc``^\UH8--3@Ramzxolghilopnlffeeddedaa_]ZXVTTRRWZWUU`q}wtrr|¾ü~XHBNXWSMHD=2+(3Eb~iS?>EP]imyxcRJHIOUZahjnsvz|~}unleT@'#+-+*+,,.////000001233456777766665555455532/1.)%*=962-)$#"(1793,'!! !!(09JYvǶmYC5:I_u{wwnfbp~hPFFC7*! #/Gm~hRA42259962*)')*/367?KXbn{~vja[XTSZWQNNMIEEBAIRXUQHB=?IXfmhkpzzysg_YQHLNT[clruxm`TMIHDFP_\QQ^~~{wutrz{rqorvxsnlkgc^[[]elquvoga\\cpx|wf^_ddbbadeddb`[WNA2&*0?R`l{vnljjknqqnledccbdeecb`^\YVVURTY\[YYevzvtrs~¿zT>4:CAA;762*%#+=ZyrYCAHS_lo{{dRHFFKRW_gjmruwy{|{|}wohd\J5"+.,*++-.///.01000123345678887777666655564201/*%*:O_hprqpnoqsponoolhe^VKEA<5/"!$Kutjj}kX968BO_o}}xsssqrrqpne`\\XSH@?=@C@;;@CIMNS[`eiid]UQPQWRLMPSRQMKHGIIJIƵyrʸ{topsvyĿ|wjgeb_][[Z[[ZXXY[VUWWSPJIA?;852.*& %%+6;6/-''$$%&#!-8?GXi°qS<3-09H]ntpi_]Z\dh^QBFSkvS9-'# )' )5Wv]H=518>=950-**+/479>HS`n{zohc``^\WUUTQNJOU^jrnebTMLM[ijjnw{upof]ULDFKKYfnvteZL?6323*-5<97H`}|~~rnptx||yvvsle_XSPSZ_cfda]VW\cks{tc]\db`bfgb^]\UMB7.)+4CR`pspupruvtqmjfdbbdedaa`_]ZYZ\ZWX[\YZ]jz~zupprwvO6,)-110.)&&),2C]xxdPIN]n|}{aOIJJHHO_llnqqopuzz{|{{~znb[R>).1.-,-/12311.00123445567789977765666777754244(!)9HXehoqmlpplmllmonhc\RGB;/'$ $Zunuy]?==CO`q~~ytqliea^\ZVSJCEHJB:38==:9;?EEFGJNSW]`a_]]`dfZMJOWWUWSNHC>>=ȹzʶ̿½ykhfc`]]\XYYXUUWWUUVUROJHB@=:640-)#!!&176110/,,**'&#)5@HQ`qɹl]E2+%)+3>JSSPB@>AHK@3,8Mj`A1+(&"! "$//(#&/Mv|bO@:5;A@;752/./58;=AJS^iv}~wqonjhcacba_bis}{i]UOWb_kpzztojgbZRKD@DKWgxrfPH<3.,,+//34/0Fa~rmru{~~{xuoic\VSORTVWWUSQSUW[ajp~©qhgidaadfca\YQH>4-).7FUbr¿rputvyzwrmjedceefda_^\\[Z]^ZWV[[Z\^kx}{wqnoqvwZ?,#'/10/0159<@OdyjTMUdzeQJLOMMR_ilnnmloswzxdSF2"-/.--.012321/0123445556788998887677778775424/&'7FUaelomkmmhkjjkmkd`XND=5+$"/awryzbFGKPWcs~wrnkb]XTPNKIIC>>AA<536::758==??ACGKPVZ\^_cgmtka]aefeda]XSMLJʼ˽Žƾ¼zligca^]\WXWUSSSTUUUTQNJICA=;9620+&!,3458:961/,,+*1>JQZk|îlTG5(" !(/564)('*11'0OphF2,)()'$! "%04/(%(BhmZH?;?FD@<763248AJTl}{mcTPLIIIIIQOMF;6-#3a|yu|{hPSY_aguwohd_UOJDA?>>A?<;;:855888547;899;=AEHPTWZ]biotrnkknopnmkhc]ZWɻźʸyomidb_]\YYWURQQRTTTSPMIHCA><;841.*$)04;ABA>71-.1/7DQYcsbD8,&! %))'#"#%**#7\|ðmJ6.)))(%# #$&24/-,?_yfPFAEIIEB:9657:>AEIMSZclryxgW[ddbl}ukb\VSE?HSais{Ƶsealidabba`\VI?6111>GR_ly}uty}ulgeefiifa\ZYVVYZ]^]YVYXWX\gs}{ywuqkgknwt[;)/=HGHNU\^^chloquz{zyy}v^SZnbOUYXRQWaffecbcgntŬgK:3)+/331003223222233445566667789::;:;:9:::99996535+%):M\`dghhijkgghigd_[QF9/$!!!%$:`~|xv}|~qYZ`ilow}sh^WQJE>97788===<9787666422484567;=@BIMPRTW\cilmmmnorqssrokgeŻ}spkhc_[ZZZXVSQPRSSRQOLIHDA>=<:740,&#%+2A@?Kcr[OFHLLJIA?<;=;:40*%#!!&-8CMQPI>8;@CLZhoxнuL0*-7A@@:/%  #*-,AVsfRD:3,//-)),.0ERWZV[kĿ|fXKKOQQQLKGDEFJLKMQU[bjosǾzbNQ^btwqh^UME>88?MZhzur}~vqvvwxzzxwrstpjhhh_SNMI@?FDEB=8;CKKR\hpx~rgbbcb`]ZYUNB7228GIHGCACGJHKS\gr{se___]ZXXYUNC:68?DNT_hq{Ľ¼xqmnprtqh\REA?DMVZZ[YZ^\XUVcs}zvurpsronkgb^eiov}~q_OJLV^ipqsvz|wpeXT^mshk{üeQOTU\\TT]`\RPJENrҾ\A7:EFC<;??<:86432246888888777889:;;;;;;::;:;;;;8765)*")>LKLPVVTTYTVXWRKHF7.$&!5T}}z{tjl{{y|xha[TLE?:8655556510//0/./00/123220346888969;<=@BJSZ`eilkljlopqpnowwĿ}ungb_\\ZVQNNOQQONKJHGJHFEFEBA<80+)(&&%"!#&*6AKQVOCCUhomkg_VPLJJLJGLXelw{smkilmjebdfeqvsqibgs¾wfVQUY\_XUROMNPRRTVWZ`fiuȽveZf}{uogZNEA>AHPSSXWY^^YWXfu~zvtpnqpljhd`\dgkrwzzxx{~~|iVMNYcptqptx|yuoc^hztkl|vXD@BPY[UX^_U@GMNVtʺjK62:AA<57?A=:96532346767666766799:;;;;;::999:;::9865%)$$6CDELTSLHJKOPOIC?>:1&"-@Z}{ztmp}}ss~|ztrsme\TLFB?><655522005311330///02452101357767579:99;AOW^gpuwxuwy{zzxxɺu|~~|wzþ{unfa[]\XRNMNNMKJIIIJIIIIHGFE@=8520,,)%"&()3>NRSOGDEIVapyydLDOdx~}zupjfghfho}vnjls~o`ZZ[]`_\YTQPSVWTUWWX^dm|ɹogo}wpjd[QH>9=EIUfs|r^V\k}||}}||ursspmnopppqqqqojggimm]YL@:2:S_`YVXPHOHIMVbq}tg^UVURYa_b[PGCFMS\eouy½ù{xvv{}wpfZND?<@GNONPZ_\[^^\j{~xusqonmjigd_YTY]dhjnoqtvwwwwz|~{xwwyzr^QKQ`knouyy{}|xsu{~ss}o\F57CRY^`ab\UD>CNVhƶ{iQ>6422<;7567;<:::9877777644455346788999;:;;:9888877777-0,!%.3<=CKLD>>IC8102,$ +" %*8L_j}|}{vrrtsopvzzurv|xplosuqfXLD@?@A@<7740.,++/2565530.001223235533345666789:;@KT]hs|­ǻ{}}ytvtxxuw}¾zric[\\XSPOPOMLJJIJJKKKKKJIHC@<8631.,(&)))2<>FJKINV\[Z^`am~|yurookjjhfb`[URRW\adfikoprrqrtvyxwvttttz|~|}xcSKM[imouwvvxyyy|~poruvq`OE:27DPW]_bda\R<;OZexjZLB6/12336655478:999:88877654344645688898::;;:97777777778891""&15EOZhuªƾxvz}}}wqm{ľvkdZ[[XUSSSQONMLLLLOOOPNNMLIFB?<:631-**)).6AJQPJIQYhr~ʺvhZXbrwnkltynebcglhfc^YWYZ^\\\XUY`jz{xskaYNF?::?KWbjs{}{}q`PNZo~zvrljed`aegghjklmnoopnmjhffgeXVK=4/>\hRHFKRPPUbtqi`XVVT`oqsmd\Y^dhnt|ſǿ~}~vl]QD@?@EHGEIPVVX_ehuzwqnlkighf`\XTOKLQV[^adglmoonnprsuvwvtrqtuvwxyyytuwz}~iTIIUahnsvusuw{~{zy~tni`WF9/035>JQX_bgmlh[VOM`ˣwYNG?2/.05854.01334447878788887654568688:9998:::::97677777778<<2# %+/,))-306MhmS4".2)"+30-.13/4Ljwtyr`XUVY]c\Y\ZTRWuUB32444334/.-+**)+14455422///000000/.../012345667;>HTbsī~uw}~}}~zru¿yld[[YYWVUTSQPNMMMMOPQRRQPOMJGDB?;852/+)'+08BKMHKT_ryƱxrh^]etxompsuvonxuoorz~¾tjeejomkhd^[[\`__^WSW]iy{wtofYQE@<=@GR]eipux~|j]PR_t~zslecaa_adhiihkklmnnommkjggebVUK=3,=]rRIGJQOPVaqxple]ZXVdw||voifjnsv|żxm^RIFFGIJHEEINQU_hp|}zvpmkjhgeb[VSNIGKOUY\`cgknpqppqruwz}|zvtsrpppqstosy|q\OIPX`hpuwstw{~~zxtpjfb_\ZZam}}soeQB.%")4=BJPQRTRPNQZiwzpielx~~xnf`_cdeffhhikkjlkkkkijhhfedaXWN@2%,FttgVLDHMSY\\]_aciqvxzxoid[h}~{|Ļtj_UQSSRPNJFA@AFKVguzxutmjhged^\YUSPKHKNRUX\`djmqtttvw{|}~}|yxsrpqtx|s]TPU^gowy{}{paRH?CIPYbhmqx|wsgR>*+-4=ELPS[dkt|~zl[dsWC;=951.+)+*+,.-,,/0111012320./1579;<===<=<<==<;::9999999:=831( .jʫeXyu<$#:OTOD8?YoxomhflxxU7*.51+-Aa̡nH2'$!!"&)***+**,--./022//..-,+*)*))(*+,..//01232103@Reuĭz¿~~~~~zszĸrg\YWWXXURTSRQOPPPPQSUVWVVUSRQOLFB=@<2*)&%'*-4@QcoͿusplijsvh^ZWU][asý{wy~ÿzoimrqrrplgccadgf]VZcp|vpkea\ULECBFPVVTUNHCDM^oy|sopz~~vkb\[aefggfghjjiiihggffdcbba`YWN@1 3Vz}dTBFKPQNJHKPXdpzxqi^h{¾ĿǾ}qj`YWXYYVQNLD?=AGQcu{vsqnhecb`_\ZYYWTPMNPSVW[_bjnsvwxy{}}{zyxxxxxxzj]TW]cfluz|n[KA?IWep|xreP?+.2346:;BLT\dkjfQ`kykZG<8864331/--.-.*)('()+.....--.0/,*+.258:<=>>>><====<;:9999998:>:760! + !QoO-#"6HMJA27QhwxojkfflxvR8',LtśmF.% !#$''''&%(*))*,-.---,*)(((''&&''))**,-...-+),6EUcr{űľ~}}ulvɿ}xurpprvz~¶vk\ZVVXXURTSRRPOPPQRTVXYXXWVTSRNID>C?4,+(%$%'0AUit˽wponkjsxrpnmspu{y|tmotrtutokgecfih_X^fsxrkf_YUPGAJHLU\\[ZWOFEM_r|ytrv~si^YYaeghhghiiigfeeddcb`__``_ZVL?0%;_{o\CFJMKF?;@FRbq~~ul_gyýź|pjb\\^`a]XSQE>;@EOas}ytqljea`^[ZZZZ[[XTPRTWXY\adkpuy{|~~{xwwxy~scY[^_`bqy}o[JBJVhx|riZF6%*,'" )1;BJPOHHNYjs`PC=;83/32200021,)&""#%',-,,++**-,*()+0388;=>?>?=>>>>=<;9999998995472%" Al_4+%%3AFE@05NcpogghdejunJ(7pϯT4'%$ !! !#$##!!&&%%')******('%$&%$$$$%&&''()+++)'')2>LWdmvzzyz{ï~žzûzsmhecaabdegiklqvֿ~o`XRSTSTVRRQONNQUTVY[ZYZ[XWVTROMLGGA82/)&$)@XoȽvqnpwwrrtqtxyvplhfjmlb[^gvyrmc]VPLJHGLOSZ\]bibcb_blux}wnnq|~~sdXUVbb`bdfggddbba``_^`a\VVZ_ZNE;+-A_yvcQIEJE937>>>>==<<;9999:;<<6413028WI* 4^lG803339FG;7DTZXXZaeefqsD%PǧzR7*$   "$$"""$"#%''&$###"!"##$!#%'&'))$$&*.7ALW]bgilmn;ſǴ}zqld[SKDA<<<=AGLO^ep{׿scZRRQOQTQSQONNQSUWZ\[[[]YZWVTPNLHHD<73,(#)A[svrqv~~{utvtx{|xsmjhjnme]aivxpk]YRLFFFGKLQX\_hpz~~~xrngdeq~}~teYVXa`__accccbaa``__^^_ZVVY]TI=4'$4Mev~uiXLDD>306?K[kw}{truz¼ĻxnfbehlmiaXRJD<:=GXhy}wqkica[WTRPOVWZade`\XWVWX\_ahmtz~}zxz}~yqhb_]^en~vnllsz\D4(  + &N~nRD98:7112452,&!!#&)(#!'&$"  &%" !%*-358<>?>>>>>===<<:::::;<=76232(2NrX+ .WsH6***)/9A6.7DIGIRZ_bfo}hFMr̪xM- ! #$%%#""""""""" "$%$%&'()*+-18AMQUY]adeõźԼ|{zvnf[VOE=2)#$+/@KX`bgyԼÿzk_TQMJLPOQPONNOQVX[][\]_]\ZYWSPNJKGA=92+!)B]vž{z}|ywwx{|wqnjkonf`dmw{tkfYVMGBAEJONS\ckw~|~{tlfba^ZZgz|z|~~q`VTX_]\\\^][]\\[[\[\[[\WSTXZOD8.%)9IZhkh\PEA:34;DP`nw|||}zyyþĿxpkilnrsof]WNF?:$ + +R]<06:743331.(" %*-+$$#!"!#&).16:>?????>>>===<<::;;<><>8532IoŴW*,S~}N7%!"!%.:/')1678ENV^dn{uýЫvE! +""#!!!!"#"! !##""$%(*,..15;CFIMPVZ_ʻ}|ǽȭzvqfUG>:3,'  )8FOYk|ӹrfXOHDEJMMOOMMNOVYZ]\]_a``_\YVSRKMJFD@5.*E`zý~{~}xw|{uqkknnhbgoy}wplfbZUKB=@JRWVZeq~~}~}vk_XUUXVYdr{zvvwyz||jXOOT\[XXWXWUTTSTTUUUWXXVSRUVMA5+%!$,4?NXZ[QHD>9=EJR_ksxz||~}¾üvqnortwwska[SJA< +->Ojb3$09=<952.+(&""#$&'&&  $&).4;>???>????>>><;:9::;?CEHLSY\Ǹ|wu|üüŨ}ri_O:,&! + +-=L\kqrӹþyl\OC=@EHKNOMMMMUXZ[[^`bccb_\YWUOOMJGC8-.Kf~{}yvzwmlkmhdip{}tmhebbYQE<9@MWXX]k}ƹz}|zz{|{{yumbXSQPPU\djnqrttsswzeRHKQYXUTTTSPMNMOOPQRUUUSRQSRJ@3)&$#').DR_mszzy|}{}{wsmhca][UQOLHG?FQ_hic]YXZ[`dhknquxx{|~~~urnkkkjh_ZZcjptyyi7! Ra(!.:77851-($#"!!!#%' !!! !$&*18???>???::99899:=C@;:;Txǽ{T10OkaD+#""&.;83-++++2CGJMLMLNRUVYY[_beedb_[YWQPLIGD8-!6Snĺ}z|{w~{omlmifjq}zqidb`_UK@9;CNTSU]oĶ{}{yxxwuske]WRQPOHP[acfjorqppu~ybNFHOTSPOPPONKKKMNPQRSRQQPPPOE=3++* $#&2@GVWTPHBACPUZahpy~ÿĹ~wttvxz}|yoe_ZRJEADP\hottuyzywvtrle_\WURQNKFD?@@?@@@<;:999::5==;?AQmrI+&.E_tfK1&""&1AFE=62/+3:DQ`o~}mX9 +    !"!!&,1541/039BJRX]_Ƚ{tv~´|yqkbWH9+" +-;VcmpzwdSA65:>CHMNNMNPSTUWZ]affeb_\YXRQKGEB6*#")A\uǾ|ywwxwz~{{|xx}¿}xspnojils~|}wpib]XUPG?>CKNORT_w̽}|zyxupmaYPMOQNJELV^cgknqrsuzu`KBDKNMKKLMKIHHIJKMNPQPONOONLC>7355'! #/=GTWXTKFGHQU[agmty~yxwzz|~yqga\VPJEFNYdhllotussttpkc\WSRRRPMFB:@M^jokgfgfffilmorvyz~~{zvtux|xqmlkknruvy}{Q5  &gɷJ "+.+&%"%(($" !)('$"$',169=?@@AAAAA>=<<;;;<4<:88:AKWhwɓdH<2%    !#$$# "*.11+$ &1=LV]adùwsy¿¹pklruttuuneQG5! +  + +.?Vb]_s{wzhTA438<@GMNNNNNPRSUX\aeedc`^[ZURLFD@4*''/Gd{¸zqjgfffdfqzusvwtv~¿¹z~vrpqmlouxtxtnh`XPLOHBENTQMUYfð~|zxtni_VKINPKEEJR]gnpprtx|r[F=?FKJHGHHHFCBDGILMNPONNNNLJB?;9>?0!+??@@BBCAA?>=<<=8>:0% '3BTaaZUPG;9;BN]lu˓U'! +     "%&&%#!"$*.1.',=N[dhiȹ{|½nTR[biorpj^R<1 +#$ 5ERU[hppoiY^pZC315DRRNSQ\qȫ{xrkbYQOMIGGFNYcjorty{qWC76;>ABA?>>?=>@BEGJKOMLLLKHC;;>FON<(!)9HVZ_]VQPRNRX\afmqw~{su¾ú~~vle`YSOOPQQ\\^`ehjlnopniaYSSWVTROE918FWgqrrnonljjlorty}|}~n]UUY]cmtyxT+  + + +([]1 %163)*1/&'$!$&',399=@A@ABDDCA?>=<>>AACEFA=NfcC=Om|bF6'-ASdlmh\NB;79BNZ`jrx|}qaʥ?" +    "#"! !##!!#%.//+$+@TciihȻŽ]DFTgmqpkaRD," + + %''%##"  +)6GS^efcVPBJvs^H859@FLPNMLNPSVXYZ\^cdfgeb^[UQKD=6.)&/?Vo¹|xvusrrsx{}~}wropppyxy¿Ŀ}xutqpu}}yupmligc`ZSNHF?BMMHQUczŭ~|voh\ROLHFGIP[elqtv|sX@3149>@A>==<:<>@CFHJNMKJJGB?9;ALXWF2#-;IV\_^YSSSNRV[`fmrw~}sqxymga\VRQSSSVVXZ]`cdkkigc^YUUWVTRNC807CVforqqrpmkklosv|oZKFER[grx}~yiL' +  +  + + "4\b7 '041394)#""#%*17:=@AABCDCCA?><;=;@EECBADTeyzUFNgmO:'&ATfprneWIB<=BKRV\cghiljhRBȱR  #   "%%#"  !"#&+,,*%"/CUdjlj̻~~ƬV>EWlppj_Q=,  + "'*+)(((&"  + !3M^a[VFA3;?DIOPMKJKPTX[]\]_ceffc_[YOKE>82+()5F^wü|xuttttpnnoqsz{yusrqv}zwsnjhfd`^XQLGF?@HIFPYlű|um`TPMKKLOV_ipvz|vZ@0*+49=?><;;99;=ADFGJIHHGD?96:CRadT@'!$.8DOZ_aa[UUVNQV[_fmrv|ulnxþ{pjc^YVUVUTQQRTUWYZca^\ZYWWXZXTQMC8/5CUepqpstrnkklntyrVA3.AM\luxxx~{tqkeXB#  + 1Bg_9 +  +06<7+##  !&.5;>@BABCDCBA?><;=6AHF@>GTfov}lRN`wX@+"=Pdossl`SKFEGLPRSVVSSUTT>,cx?(!   + #$$"  !"%%&&%#! )5GZflmkdzˮVAJ_kmi_P?)  #&(**'))()*'$  +>VYTSHB3:ezgRECGJNRRNIFGNRX\_`aaffec_YUSHB=:5.((.;Og}ƽz|~vssooopruwzy}ÿ|trpsy{zzzxtnjdb_][UNIBC=@LNO[dwǴvj^RNOQTXZ`hpv{{^C0&'26<;:79;=@BEEGGFEC?9505BSfk\J4,)2@KTZacdb\XUVOSVZ]elptz{mhluľ|rmda\YXWWURQPQQSTTYURQRTVX\]ZUQMA7/5BTeprqttrnkjkmuzuX>+"3?Pamrts{{wtqomkfd`ZQ@& + +&+-0FrwZ:%",54-+**&!$,3<>ABAABCBBB@>=;<6@HE;N]hmmjϾè}Q:CV`a\PB1  !  #')'+,-2750& ++CMQUOI8;c¹}lYKJOPUXVPIDCGMSZ^_acfdb_YSNKB<664-),3BWoqt|{~|xvoqsux{|~w¾~tqqt{zxxyzxuoka_\YVPJE=@?I\cgt|dzvbWMMSY`ghmsyfJ6,*38=??<;;9:;>ADEGHFDDA=73)//+'$(# + %++553/'",3<>@A@@ABAAA@?=<;8@EB8=[|ǻko}jS?/%#&3FZejmkcWOLKJIGFDED>;<;<'C͗A'""# + +    !%.367AIVckmkiǶµqI06DOOJ?5)  "! %(+/217?>5(  -=JRRM=?dq`SRWW\a^VLDAAELQVY]^_^[WQKED>6254.,1;I`vúmmz{urqsy|zsuw{|~xtqqu}{vvuvvwtok_]ZWRME@<=<>>ADFHIKHEB@=73(-:Neuob[UV`lsvxyvrle^XUUVWY\agmruz}}|qnoqv}~upfda_^ZXUQQQPQQRQPPOQU[_bhg`XRJ>2+3AUhswwvvurqqtweH/!)+3?O_hmokfdc`]ZYURQSTUVTZ[XUN8#  +  +!.9@CE`x^F;:73/+$   3574+"*1;=??>>?@@@AB@=;;;>A>7=\}ȹvqj]K<0(%&1EWaeikdXNJFB?;98<;84521!<{گP3#!       !)4<@@JR]hnnkiʿ`<')5<=92*% + "'+.22/4<8-& + + ,:1/56228CRh{Żigu~xsqouw|~{|ztprv{wsrrpqrokh]\XTOIA?@ACEGIKKOKFA?<95-0;Plxvru|tkd\WXXXXZ_fkqtxyz}{vtrv{}ÿxsihdba^ZVTSRSSTTTUVZ^bfjlnkcYQH;0*1AVjv{{{{{zz{kO7)&&'1@P]be`[XWUSONKIKORSTU[]\][J5  +&6BKP_}fPFFB=41*$"  %*13.'# !""!'/;<>====>?@ABA>;;==>>8;630-35412.+!"3aK/"!"  + +  + +  +   ",9CFFNU`jpqnlûnM/*.0.(%# $),.3/),4/"#   !07781;e}ma^eekqpeVJC9<>ADGKMLKIFC@><:0.6834=IXmǻhfpzyvuu}{}|uprxzwtronlmmkhf^[XSNG?:JR_ûxqsz~gWNJEFHFB??@CDFHIKMNRMFB><:713>Sqzpg^YYYXXZ^dipsvxy|zwx|zwljffd`\XWVVWWXYY\]bhlpqrpndYPH:.)2AWky}}~pV?1$"")7GSX^ZUSSQNJJHHKPUVVX_`^beVD0  + *;JTYiĸlULKGA:5-)()(' ,20+(&$%%#%-:;=<<;<=?@ABA?<:>:;=9;Okysj]RID@:511/.(;NVZ`faG>;9641/'.2211+'!'Bb}g8"$#  +  +  +   #/=GIGOUalqsqp½uT;&# &(&"$)-/20,(%"   %$(%&7a½~qicbouyvnbRCB947<>?BGEB@??=<;428978=O^uidlu|~~}~}{¿¿unr|wttsrkihijga\[_WOOF=@H[sļrc\ZQMHDCBAA@FIGJPQMVPIEB@<847D[vtib^]^\XW]cgpsvy{~~xsnmkhea^\XYZ[]]^]fiouyzywsi\RI?4*&1C\q~{_@-(&$(0:GRNVZWRNLHJLOQTVY\b_]aikfaD1  + .?LSVU|ŻlXSRLEA<4/+)&$ $-32+(# !.6>==@6159@KW||wwziTKD>:79:95228ET\]__E?91043/3-(*14/*!.63, $      +",6?CEEEP^kuvur¿sQ6# #&%!'2:A?7,! +  + 3`þumjhpw}{vk[M@935898:=;;;<>??GCCGHEFK\j~lbenuy¿{tt{zrooonjhfghe`[RYTNLB;@Xpxja^OG=:>CFHHNQPRWWSPLF@=;:9BJ\tvja\[\[[[_bdilpsvx{}zupomifb_][Z[\]___gjpvyywwri\RH?2*+7JavkM8+%"+7BPW[VQPOMLNPSUWZ]dbdhorqocQ9" 1BPX[]~s_WTOLKG?82.'$"    -54-($"".4;?<:;<;>>====<<@:668;DQltss_KGC@:8999647=IW\XYUC<7/-22/0-*+//*$#"  +   +  +    %-7?DGELXfptsqpL2 $((#*8EOL>+  + + -\þ|uqpu|wgYE=5764222448;CHLXY\^ZVV[kxûqc_dlt}}y{~}u¼{vxsmjjihhfeedb\XGRPJF?BGYg~|oe_YXWZ]`abehlnpsvy~ù|xsrolhda`]\[[]_bcgkpvxyxxqhZPG>3*0=:;;;<;;;;;;9?<:966>H\x|tnlVEEED>88:;88=BMX\YTOB<6/.10/,-,-,*%!! + +     +  + %.9CHDIR`mvvvükE."+1/+%! &4ES\[L4  +)S½|yy{qbOF>=:500/138AMYalputmecdtmbbflqwzxwy}zwtup½wx{pjgggeeba`_]XSEPNFC?EU|ƻźvaRKIJKQSTSROKGEIKIIO[fywmh[TQTX]`ejklllpuy|µ~zvtqnjgeb_][[]`bcgjptxxwvogZOF=2*0>VmtZB0$1KW`]WTSRNPQRSVZ]bglpsw~w_?$  +';<;9:::;;::98:;8326@UlokiTEHJF>989:::@FNVYWSK@:6421.,'+..+($!  + + + + +  #+4(!"*4:82*'#)7GYfnm^E-  $Fvxi[OFB=610/139DUixvolwĺrkjjjkouzuux~|upljkjzzxniggfdd`][[XSNHQLBADSjobZV\ZWURNJJJRZ^cl}ÿ{ql^TNOQT\elkighksx|ǿ|xvsokhge`^\[]`cdfioswxvunfYOG<1).=Vn¼jH2!/FVcd]WQNNPPQRTY\bhosuxzeL/ +-BTakpv|ojgc][UNHECBB3-" +!)01.$ &1;@?<<;9:;:<<;;:14860048779:;BGLPSSNE=77961-)$(-/+'$# !      + #',.129G[pzX3##(1=EE>50#! !)6HYkxyiR:&5aþ~paVJD>732/016BYtxzſ~xofbekpprtx}wnfbadf~~|ukgffdca]YWVSNILSKABL`züvd_XTQMORaju}ƾ}pi`YSTPLR\eccacgmsz~~zwsokihga`^^`adddglrtvttmeXOF<0(.>Wn~¿vJ3)@Seg`XRNNPPPQSX[djrwz}rS: 2HXcinrwkjnmlkg_WRNJHE;.$  %+.&*5>B@<<<:;;;<<<=:-1420259F\|m\[bVNNMF=86899:CIMPRUNC;55870)&$(+-*'$##&*)"  + +   + + + +  ""&1F]r¼lJ*$/:IRTNE@2.+*-045:AM\l|u]F3&!$$%&&! &Jÿxi\MGA:6721/2?Zywf[Zahhkmnx}yurlc[XX^e~wpgcbba__[URROKFKPH@ERhͿ~tkhffls¿~ph`^acWFCKUX[_bejmvw||z|ysokihgcbbcdeffbejpstrrleXNE<0(1AYn~||T:#$:Nbf`YUSPQRRRTY]ekrzxaE1 4KXbfjtxgagotxtnh`YQKI@5/-+'$($  -9AD@<<=<:;:;<<<:.1300577>Sqp[W_XSSPF>98:::;BKT\be^O:2032*%&&'(('%!$(**)"      + !2LeydC$ $6BR^a\TOJF@>BGMPX]fq~jTC930%#! !$')-.00( + 9p}naQJC=;<42/0>Z{ķ}gYV\ccefen{|z{~}unif`WOLNUe}{sld___^\^ZTQPMIEHMG?HUiɷ}yvzDZtl`dmp_E9=JPYaehijsrvyz|ysnkihgedefhhihadjossqqldWLE;/'4DZo}~||\B*$"7K^d_ZYYQRRRRUZ^chq|~nV=1#5LZafhy~gZ\htzyvqj`TMC=65663/$ $" ".?DFA<=>=9:9:;::823303886;Mhu]V]YUVRF?::<=;;>M\htzsb<1-/.(&((&&%%"!#$#   +  "6Tm¸zU9 !$&*;J\ikjii`ba`binnqqszyl\KCE>:51..13646<7% -e¾yl\OGC?;92-1>WwǴfWSVZ[\]bjtyyy}~vokjkpx|yqe]VUSJAAJVfxrkb[YYZ\YVRPPLGCFFGJNXlļ˳}vqu~˵{m`jxz`=-0@X`inpvgops|}xsomljihecdgjlkafknsvrmj^RJ@4,,2E[q~cM;5)'?M\bbb`\SRRQQTY]hjq{vgVC.$;OXX\dujcd`lv~~ui\RKKE<;>7,$ "$ "0?ACDCA=;;:9999995577;@=:;F^{tvnhdb\TPMJB=>=869EPb{{N1#+--.6.&!   " $$ + 'NkxƿsP5 '+.2DRdquvvw|~|}}~{oa[\USLFB?=<;8;@:+ +d~raRIC?=82,/;RoɶiXRRTSSSW_hlmmoolf`^]adjmldWPIJGA;=GUkzqlf]VUTVWUTQPPLGBBEJRW^jwŹİysos~ĸȴzlbixw\7%*Hbisww{kmnpx~zupomliheccfhjibhloswrmh]PF=1+,5F_s¿vbQI;+*6FTafeec]UUTRSV[_giox}ubL8.-4ANTUX_n¾viXfo{~wmgZ[SHCD;/'   +"!(6CDDECB>=<;:999973555:?><:DZrzn`]dpvwwsplbWOLIB>?=87:IXr^>'%,.-.83,'%$$#""&%$!  :LUD#   + "=a}ɾwrqw~iH0 $18<@N[lx~~{}~|xqnoonjd]VOJGEFIC4# +ezfVLGB@93.08Ibxʹn[QNMKIJMSW[\\ZXTQOOOUTWZZTJ@<>?<;BMZr¿rid^UOOOPQQQPONKGC@EO]efhk׾Ӿwros~ϳwupb^donQ-!*Xqxpjjlr|}wrpnmjhecbdgggdhlotwrmf[MD:0+-;Meytg]M:7BQ]hkihe_YXYWVY]agjq{~l\RFCACDDGLbÿxW]cnx|{wsnofZTQG:1& #1=GFEECB@?<;:9877622337=>>=GXkuz|thYRUbpx~|ufWNKGB?@<77=Kaк{X901/,+1.*&##&),&!&,#!   RxZ4  + + 4Vyyqlhnty~`B. )9BGLXcr{|smjiihjjkoquxz{sja\WTSSL=* /hĽkYOKHF?8214?RczwbVOLGDDFHFFHIEA>>@BDJGGJKG?869>ADMZfz{nb\VOJJLLMMNNNMIFECHUfolebзȬ}xvz۽xnrn^YY__F(&6jujiksx~~xsqomkhebaceeeejmptwrlcXKA6.,0BUm¿{qhWE@H\fmmkkga\]\\[]`ckox|s`RA9436;V{͵bYW\fnrrty{uic`WJ>2$  (5AJHFDBBAA=<;9776511103:>@@K[kstz~vh``l|}saQHGD@@A<79BWqУ_ME=2-*+*(&(.4<93-&#$& P~l? + + 'Ejwpjknqw|y\A-!,>JRWakwynf`][YYZ_dmw~}upgea]UF0 5mŽo_UQOMF@9537CPfqǶl]UQFBAC@98:=9631369<;9;=<8573--4I]wytpcTNSdjonmlhc`abbabehmsydJ91.28OvƝrYQOWahkpx}|sonf\O>.(#  &4?KHECBBBC@>;96543/10-07=@BL^oxx||uszwiXJDD@>??;8?Llɮ{l\LB9:;:ANcv}yj]QGBB;;==::FW{|rabbcfjpvz_=!)2760& #0Jj[9 + +  +  + +  ;hĽtnicbdjqxyyxy|v[A+(>Raklv|wtqmiemty}woh[C-##Oſoe]XVSOJF>:=DWg~ȹujb_TH@AAAL\gg`N8(#$%()))-5=DLXdov|~~wplhhq}}raSJGEFHMQRQQNIECGKRYesth[TɰεüϴƶrXHHA7EaxglzvqnmmljheaadfgehmqsuwskaUG;0*0;Tlg^]bjpmhdimolnpnjilnpqrtxy||`K?=DNdýórb[eprqty~{sfWC82-,,% (8EJI6( )4Teqku}y|unbK4) *Xujb[WVSPLD>AGYjŴtjda\NDDFL`v|dD* "'*)(-:DMUboz~wqj_W[fr¾yo]NGDCDHMRSSSOHBBFLSZiuufWQŪw{ҸƿѺßtXGKG@Ojn[bxtomllkjgdaadfgghmqsuwskaVG:/+2=VoűZWW]lwysmjnnlorplnqsvvx{}o[OMU`q~v}}uk\G<747;96;GWdeaN<,'*1;BA@ABBDEEB@=9631/*020/49@BBB@>=:864201-.48779Jg~vrcYRJDCCC>857<:7DeۿW547?N[^YPSL6%!1Lg|hT8 +  +  $Tžytngc^][\]]ZXVX[]_abdhsxvvvl_J8(.D`y||~yneZR8% Bqzpe^^`^WMFCDK[uſ|tpkg_\VRVihF, $)08DR\jot|xsqpk_VOS^p¿pig[KBABGNSTSLFCDEFKQXYfvjNDLĨ~\SlԾŴĨo[TT^{ykjs~zutvwtplkihhgffdinruxsk^TF9-*1>YwÿҥlNPYgqvvvwvroqqnnqprzrigp{½~vfPA?GT[`SGCDEFHA=7437;>B@?@@@?==<9752100-07;;>CXu}zpdXNJECDEC>9::>=>Ps޶PE=FV`a^WXP;+('$#*:M^mtraJ-%  +  + ,Cwž}xqic\ZWVVVRPOQUZ\^^^afgglqj^J8).Eb{uw{uligdJ4#+N|ÿvkdefc]SKGGIYr}vutroc^UPUk[=,).4=FRZ_mrz{tuuobWLKP\hr}vg``WJ??BHPUUSLGCDFGMS]_jteJEPȱbS^ɷ|deq{hjtȨqr}x}~}zwurppqqrsqojorrvxsmbYK>0+/:RnҢjKMWfqvwwxxrpuuroomp|ñytw½whWKJQY^^M:2013584347=BDDC@??>==<;753100..3:JRSUbq{q}}p[M4  3f}vnga^YWVSQMNPU\beedb_ZY_fbXF4&*>Vn~dip}{yxvwz{}|}}~rlntwdJ38Y}phlkhaWPKIJXozusxzywng\V\nqVEBFKT\cefqu~{wy|xi\OIINVZajy~~~~~}~{m_YYTMDDHOVYWTNIDEEFJQaagiYDFVɹlZ^~ɸg`bzļqxʩkly|{qntu¼¿}wuttuxz|{yxruvuvwrmh\M?2,2;JbҠgGJUfqvvwy{utwxtommp{Ǿ|zÿtj\TSX^`UD4/13563124:@BDDA>=>?>=:9631001-17=?CQ`uzy}ysh[QJB==@EFEBBDB?@I[y֮|UXgd^`hg]LCDE@IQZYOEKXpqbfszrU1 4þ|tngd_[YUSPLNS]gnnmi_QKPUQJ<."$2CR]NTbs~xrpnnoqsutttstx~tpw{_DEcſxoqoke\TNLMYmƿummpw~zumjo~zmlnpuxyvsx}zxqcPGAADEHM[`fnu~½~yywxwwvuxz|seWRSRPMNQW\\WRLFBDDEIPb^^YJ=FZûyinIJqjoùu{ndhotyzsmjns}ſþxvvxz}~|zxz{xxwqkj\I:0,2?><=?@??:852001226=ACJ[n{keg`]WQLHE@?ADDAAFJDAEUp͒`_khdfkjaRNRRKRZa^O@?F\ftpXHUpiH&  8|vmjd`\[WUOQWbowzypaNB??;51&#)/263@Sk|vutttvwx{{zvux{~uqzhQSlwvtnhaYTPQ\mwf\[bn~~|zwfQE>>?<<9::;=@BA@:75100237:@FLVk~n\RMMMKKLKJFFDCB?AGMEDMfܢmennlqnldYY^\SSX^^RC>?MQckT4:Yol`H,  Jüwrlgdb^\WW\guygO>50+((" $&!-Ge~{jagtudW^wĿ}zvrlf_XVS]mû~kYJBIVlü~~xfPE>?A><<@CFHKOVZdoyþ}tnkkkjhgimqpdSF@BINSUZ`c`WOGB@BFHOV\VPJBAQcĻʽкaRfɿzqot|znf`\[\UYSHHU_aeikhdfjotw|~~~|zwspquy{|}vqk\H8-'*11<979;?BB@=:8410135;:747<@?=68<@CB?<:9510136>?DO^on`YQGJIGFHJJHJFDBBBEHJNaᅧrooprmmfaelg\WTXacZND:=JUP>34+,+$ +  *HrĽzuromkecaeox}scRC6+%'),/+$:[wzkQ<5=HMOTd}˻{sbbbeku{vrmhe]cnȼ|q_K=:@Lb~oWE@<87777:<>?@@@AEKPUY_fmw~xoifc`_^[Y]dcWJ=1-6CPSW[]ZTOFBAFLLF@D;5444;D]fs}̿lGAC_ͳͺػcKKVl||z|}oVEEGEDA=@JZeicjdZZXcxt{o{|yzvnkmlrz~paN@6249CJZpÿϡaNWgy~xx{{{|{Ķ}~}}{z{~zlYMJMOND>9:@BCGLNPSW\cgnv|~}}¾yoiga_^]ZWZ__VI>0-6EMQUXZUOKA><@FFA=:1-00/1758<>BM[f¿lSF?Tйͺѷ~cHIWm||vqpumWGCA==98BRdkmktk[ST^pt{Ǽn|~zzvrtqllnms|}wgYG<415<::>?@A??<;8755489@GVn|soh`\UQKFBBCBDA><;;=DRj繁fjplijlmje_^_``_^_bc_ZXUK;/*"! + +  +  $)Akž}yxnmijmsvw}}}{uk_VG=3.-+#/H_t{vfQ;/07DN^qyiYOGDJKKKLRX^lu|wsrondfmzĺl`YTUatyaM?>=<:9764558:=@CEHJJKMNPQTY^cefffffhmvÿxqjh_^]]YUUZZVMA3.7DKOSWVPJE=::=BDC@<6479755331/.5?IRbyĭufUFRuɻʸŮ}eKO\ozvjaageYNIE>?>@N`oqqr}`RV`nw}÷n}vrpljkifghkpw~xleWJ:1*'*0;@HT_s֩fQar}w{}yqkghdaekvʸ~zw{}ywvpg_YSLGEC?=??@A?><<=<::877:8?H[xutuoaWSPLHFFECE?8669>Ha~їqkmihnutlc^]bde_X[hqpjf[H5/3.*"     *4Wzyvuuvxy~vn[N>52/&&:Nfwwo`O?6:BOT_p{rhZMD?>>LMNNOQUY_erÿ|urqrqgglx»~scZ\gu~urvpZI<;>><:9854346:=?EGHKKMNNMLNQSTSSSSTVZblwſ}xsli]\[\XQPTXYUJ;48?HLRUSMHD?>@DGLNOOLHKNNKI@BCA=:9;5*$"'08BQk˾٭jTev|~vmd\WXWW[`fuŲ~|{}}xrlb[WSNJGEBACBB@=;87:::;::9;:ALc~rqrk_VQNKJIJHEA9547;BOoⷋpgjgnsqkga\dc_XT[jwtmcVD64;3.$  %3KvĿ}|~~n_MB;4'-?Yo}pdSH?:BMUSWex~voic\XRKA:79<@GKNOPSUWYZbp}{urqqqihlvƼzsnkq|tooruxujkpþxaL@8:=?=;:96543468:@BDGKMONKJJIHFEC@BEGKPV^q|xsmh\ZZYTLJOV[]TE;98AELOMIFCADIMQUZ^b_]]`ddcVZ][WQKHMQUZ`l{zk`\f͵Ʈİq_geddb^VNNQ[m~eKNUbllimvzYWansx{zww{´~vnga`acedb_YTNKGD>7/)% #&,=OeɽۯlWiz{of_YTOQTXY]kz~~~}}zoaYTQOMHFDDFDB?;85368:;;;:;?GTk~wpmib\ZUQMLLLHD?97:<>GW~էwacilmklniae_XSU^jqmaTI>55973)&3Ch|o^PE;,"%4NgyxgUF>98@NPOS_musmf`XSQNIE?:41158;CHNRSTTVSRXcnyý~xsrrqiimwſoe\UQQYf~{wy|sgfhſ~iP>448=>;::;:8666667<<>CGKKJJHGEB>;946:=@DIOer}zwtpieZWTRLECFRZ]UJ@938=DHGFFHIMUZ]`fklnmkmtyz}}|{xwtsklkifefgʬ}zztbPNf˽{˼ưn_qme][]\XXYfpRRYfng`ixhaemtuvvuuwyŶwmd`abdhhd]XPH3/)$ 0Ja|ȽڱnZoztnt~ynhdb_UY]]ZYdq̽|}~~~||zh\VTRPJFDEGFC>951035:<==<LNU_gid[TPMIJMMIE@<744444BHNTTTSTQPV`cgvÿ|wtsqiimw¾zpYOHEEHQ^r~wwyld_juú~m[E7116:;99;=<;<<;:9:=<>BDHFEFHFEC?:71379=BGNZ`hwĹztroib\TPKHB;:>LSTNGB915:@FFIMQZbjnnoty{yricd|˹|vvpWFJZƷ{Ǵ~uwsj``jprsospqrwynchxȷwmefkqrrj\MD:0 +5Dc~Ⱦÿ۲r\w{x~xhZYhwzpmoqqilpl`X^l̴xw{vuzxf[STSOIEDFGFB=830/25;>@?>>BPd|udfghd^^e\UNLMNJD>:730@FMQRQOORRW`^Yarx{wsrhimw{i[QKE@ADJVekpx~pjp|{m`XPZkzùqaRA64/4::88<>>??@A@>0" *B[rɾܳs_}usvxz{aMARgy|qqw{~{~yh[_jūwt{yqouth\UMNOLHEDFGFA<62/-15:@BB??ARgo]`dhgcceWQJJNRPK:9?FHQqǛlQ\b][ac_YVSSQMGB>:9;98:>;>?<2)  !#/6@KQU`lu{üvi\RHC4+#'1D[oypc[B6./3:GTay}`GFDIQRLMTU[^[UQJCJMQTTROMNRWYZZ]bhz¾wrooghuzobUKEBABDLXdqyvvz|}zc^ksrxxzxi\YV\ny`NE?6-23469;>?AAABBBCCCBCEFFDCCGIGB?<:49;>EPURRRWiý~whadaUNQC:7:7/2>HMKC<;703:EKOVajyýtv}Ǵw\G^|ɸȺwlns~|v|ʲ¾|su}|wfQ@/##7Eesd|yrwyv\OOWi~vtzwokvtifjzͱv~xnebbbfmobSOOOKLLKEA@B@>;7210/25:>A@>?FO`xzlb`cihcbd^WOKMNKHE<?ABA>60+)%$%()(-49ER[`fpz~ſ{pdYNI<2*-6I_r~xri\S:.&+/5@OmtYHHKQOKQ^gqyxrlc[XXXXUTRQOQTWYZ[]`mxqnlfgtzwwww{~zwsmhc[RJC@>?@EN]n{~k``a^gjp{~rf][aqxhUG>91,23579;>@BCCDDEEFEEDFGGDCBDFFC?><8<@AHQUSQQXitd]`[OIK>65:947CKOJ?98745=HQXamv~¼~txķtZNeĶǻxnou{wùɰziV@/$" ! !':Vzsd|vsn|nRPUfyxonh`aqtppuӹx~ti]TOJOTRD::?BFHIGC@=@=<84221169=ABB?BGP^s|qefionhfge]VQONLIE=>IWnənKGLOUNSONKKJIDB=;978;>ABCDA<6322013459AITainr{tx{pdXQH>57?Pew|uolibUJ4"$*+8MroMGEFEFUg{nid]XVUTPQRUXYXXV]lǽwoljegswmhdaddeda]ZXPNKHEB?><=?DQcw{jZQMTYfu}ugehu~qZRH?84/-5679;<>@CEEFFFFHHGGHIGDA>@BB@??><@DFJPSQSU[h~º~ob\]WLGI>88<=:?KOOG:33667?LYgt¿pbiȻ{|e@Meʺ¶uijpsimtyxxqnnqmip~ʸȯ}qWD- !##!!%)))(&$" *Iotdy}neqXRSbuxh^VOShwrnvĦ~}sgXI<2983'")4:DDEC@?>?:9533489>>?<<>BNaugWSSXbrsnoz}ytmcYC?<:522278:;<=?ADEEFFHHHJHHHIGC?8:=??@BCCHKOQTVWZ]`gtxĻ{mc_]XNHJD@@BB@DNOLC81046;CQctǿ|f\jͿ{sku~fA?Mk̹Źk[ZavziYUWVTUROOPNQ]kϷÿǯ~m^I7$!$%$#" !$$'(+04542/,)&%!#" &Enwfv}nfl}`XWbuzdRJGMdwmgmx˱}zvl_N=11,& *5=B@@A@?>?865469=?BCEGFFEHJOXfu|~{ysjbZTPMLJHNnʿکeFDII>EAA@@AA?=<<:9;?DFHJLONNOPRONQPRY`ms}z_H5+2CewmaVLKN[l|}zyy}}{wsolntuuwupieb_[^b`VN@."%%%:U{xaK:>Qg~l]TQQRQORWXVSSPOXpúvnkgbdltvwxum`ULGFEFDCCCEFFA?><::;<<<=@GVft|}qmfglwzts}vg[QJC778965688::<=>>?BCDEEGHHIHHGGEA<56:>AFILORV[\\_elooln|}˼{vmfc`XPMMLKHGDBCIKG=5.-16AJZm÷}e^tžjer}pPDD\wμ~¶~bOKQh{zq^J@;99::::;2(%%$%&('&&%%%&),.137;99:;::66579=BEEEEFFFEGKMT_ly{ri_YROLMMY|ɾpH@CC9A;::;==;:<;;;=AFGIKPTUY\__\\__agnw|rW7*W»l`URT_n}|zyxxvqh^VTZZ]ba\WVYYZ_fhfc\SIB9;PhiQAMiĽs`SNKONOPSUTRUQLN[yývnlhbafihhjf_TIA><<;98;?CEDA@<9888:=>=>AIT_q|usvxzts|p[LD?;6678679<:;<===>>?AABDEFGHFFEEB?:35;AGNUZ_bfjjjpy}ruʲ|vqjgd_WQNMQOMICBAEE?71.-4=LWizúxabo»psp^R[tʼ÷y^JDJarrgVD8106<:534238>CEDB@<:889:???>>AENakx~vsqw}~tnnwwcPB<;;;86568:;:;<<<<<<=>??BCCEGEDBB@<749?HQYcjqrv{{{v}оrkeeb]SOLKMNLGDABCE;1-,.:G[hz»qcdȼuo~{vkqº÷sZIEJ\jh^RD<8;6596543222268=?AEJMNPONJD<910+##()$!3Us˅ql~}tskbbhgcXPP[flqtja]k~~m\WZntzymedktzȷx{|yvxywphSF?FKJD@94/023210257;=@@?>=<=>@CDFHNXgxztoj^TOR`}ˉ[?7<6:554677437:;?@AAAFJOV[aglpoty}~jM%*[˺üymb\\dr~~}|~ym[MF646=A@GPU\fp{ĿɿiTHBCHLMMLOQTQI?>Pt½~tnkh`[ZWRRTQPLG?81,3228>EEDB@?=<=?@?@A?=<=CY]fvwspxzv|{lhit|}zwnaO@5224;632479;<<<<;;<<<=>@@ACDDCBBA?;87Oes¾oix̺ųƳyl]\hµnWHFJZe`WOHBALbvyͿurkYK?;=DGD>?D><:866558;>BDFJNPRTTPI@<00/& &&%#7Rx͉vl~zoea`^\TMJPUX_ie\Zi~rgeipqrstoicemuxzȴxx|{|}wqaRKOVRID<6124652.0379;<<<;99:897545664269>==>DMV]dkt|toopw|le`fpqeVNB60./0/4/-.37:;99:::;;>=>>@ACCC@@@@@?>=;>EQ]it{ξ~ðn[UXWPLMJDDFGDDFGFG@5.-3FYqjkϴ°eejwżŽuoaWJFP\]XPSQMRcrxôtmxfUKGIJIGHMLHHFDB?<:9<;;:;AHMPPPQQMGC962/-*##,+6YХn~~zg^[ZYXZ]VNKOTUV\kzrooomnifijeaakow~~ÿwqx~||}|yc]XXXTKB<7457730/269;<<<99989;<>BEHKMUi~{xuoibqü㽌bF77=;87;<9525678;<54H`¼sjfb^ZUNGCDFIJHF@:3/26;?BDCDAAAAAABB=<;9;=BINY`glr|~vqnq~ohbbe`QC;2*&(*+++)(,28:;;;<<<<<=>?@ABBBC>====>>==@HTbp{¯̺ƺlUNRQMLOKCBDGFHMMNJC800:NawserǺ~yμĵûuhbWPFDN[^YNX^ZW^iq{{zvlaVQXp½rk|oaUOOLNNMQXZYTSPKGDA??><<>DJNSTUVVRLGA=9;;6-&!$*(.Kl֭v}rsqe_]\_bd^SKHJMNVkskikkjle___]ZZfn|{y}|yuhb][YTMEB>:9752123699;;<::9:::;=@DIKLTh}}tmrذ^C:???@CEB>;88788;?AFKPRRV[binv}~n]NMXfqyȼ}{|~zsmnv}{}o_E==EQ[emt|ǾtXD8>@ABBBA@=:8:>GPXdltvwz}|trxnib]VM?4+'$$'**)&')/5:<==>???=<<>?AACBA@;;99:;<=?DMZjwîôlPGIJIJMIBCGJLPTTSMD826DZn¾zfft¸n[bfoøƿoa[PKFFO[^ZUesm`[`gje\TJ@715Nh»óoeyĺufYPOSRTUVZdihb`\YRNJHDCBCDGKMRSTVVSNIEDACC=2*)),*!*;O}¿۳zzjbjz|ma[YcfhbVLEDHISlugaaeghk`WUVSRR\kü~{uoid_YSMHIEA;621255556789::9999:9<@GIHL`u|ΨuM==DFJORPJG><978:?AHLOONRV]hmsy~rb`fmu{ĸĿ{xz~|xuv|{vv~vhRLLR\bjq}ww³_F568;@>9412682-2:7545689<>><=>@AAA?A?=:;@GO_kx|lg_UJA:2)&')+*)($'-3:>AA?ABBA?<<>@ACCB@>98778;=?BHSapŶ³nODEFHJMJEJLQSWYWSLA419Jbt{kbf̿kWUUVZbmyǾrc\ONLMU`b^dtyfXTWVL>501230GcƴmbqrcTJINVZ\]bkprpnid^ZUSONLKKLKJOOQTUTOMJKKID<613223-%&,4:m߶w|hXU^jrrdZU\`b]TLGEGIThvk]X[bgie\SRRPMMVj|z{~{roiaWPKIHFB;400465432456887767646;ADCEUiڹXB?EMTY[[WQB@;76:?BJMOOMPU[ekpx~|lhmu}Ǿüxqovvk^YZ`glrz|{wȼhN;646=?93./01,)+2Irº~of_ZRMGB=;78:==<:87656567;==:;=?@@???@?>>?CI\hw|xy}zmi_RF=:8.--.+(%##(/7;?ACABCDCA=;875579=AGOZiwŽtUFGIKLLLLPSX[`_YRG<00h»}ndZUMGB><966699887557789<=>?;:;=>>>?=>?@?>@CO[k~wniil}yqndWJA=;531.)$$)059;?ABCCCBA??@ADDCA<9742359=CLTaq¶x\GJLMKINTTX_cgf]TC8.3@Servx}¿|ngbj}¸}pjiilqtuuwvbQHAFHB:9CNRY_a_`gowxv»lYNGOXalw|{|ytl[D4.!#'-19`skjzȿwlx{gaVJHNT`nxzxutrlc[USPQQSRQMSTMA:;?<;<=<830*,MϨl~h^RLMSVWVZdowulcRPLGA>>?GJQZgyl_\^acRQRSQOPUj~zunf\SLGC@=:63565543479::;;;;:9855;CHMWdsԬ|O2AQ_bcb[QCA=::>DHFIJHFJPU]bipx}tv~ƻµ{sllsz{zurptx}xx|±eS?8;=6-+*&" !"$2^|l`WPID?<;96558777766579:=>@?<::;;=>>9;<<<<>AEN\nvkecs}~utrooni`UJC=752,&  &,367:>@BBAAA@@A?BDDB?:720//37=DOZhxw\ILONHDLY_chlol^SB917HXfotw}ynf^^h¹{f]_cksxvtruvpcTHBBGKIDBHOQW^`_^afmtx~yrt~fRFBN\hr~~xrhS9'!  $%&+0=ht]Zwĺwmwp_]VKJRVfz{rea[WUVVURUUTNIFFDGHHEA95.3?h½زo~x\TMNV^`_SNO[krkaMKFB><<=:877789FLNQYaxǾƕY,@RadbbYNA@<<=AGJJKKIFGLRX[bjr{}{Ǽ}vomsz~ywxz|zo{¬v`F::;2('&$"#&('+V|j^TMFA=;<:7567877777357:==>==<;;;<>>789889<@BHRaq}smpy~}pkgcjjjf^UJB:73-&"!$+2699;?BAA@@?A@C?BDDB>:6/.--27??JKTe|iYUWY[QTXWSTcr}uruz~wqmeWMKGDEFE@<;:;>?AEFFGJKKLJIOGDHMKHKTnʾݰl5?SbdcbXK?>==?DILPPOKGGLQSW^fnwɼɾ|vqou~njlty̽uTB<;3+,*&'*)$ #Jyƾzi]SLGEA=:8779::9753220/28=@AB?>==>=<84/.38:<@@CQcr~}|pgb`jmpmdYQK@91+)'&&03578:<=@@?@?@>A@BB@>:52.-,-26@AA?>=>=<81,*.5:=<9??>?>>??AA@=:41-,,.38>FWgwdL=AEFCDO[r~uaQA??HU`gmtw|útmf\URYmӿubIIMWbihfcehjhc\XWTQPQRPMLORVY\]]][[`hmmknx|cOCBOZj{[7')(#%>Yhpkqpb`k~fSPOILTat~|vspojaUMAA4;m˜qZQKRdpro`O=6>HMLGGDB??ADIP_sl`VX__^]]^``^csukdacipqtvpheb`^][XYRKIHHFEEDB?>>?>=>><747;CJ^yƽƿþؑOBCbi`\MLFGFEFIJKKNQPLJLMMS\dkrx}ʼǸĶ}usxycORaxƴ|aNC<80,$##":f¸tdWMHJGEC?;9755532100.--04:=?@?>====;60*(+29>:8;FXgorrzymfefggnmkkjgaZKA6.-.02235789;<>>=>=<<>>@?>;73/**+.39>G[k}_D7:@DCENYn|{dPB@BN[chlpu}zrot{|vmf\SNQbsŹzcSBCEKQVXXX\bggd_\\WSSUUPLKMOQSUVVSRQV\bddkt{aL@?MXfu}f>/8=0*E`immxȶnb`h}w`ONMHKTcuzoaXKH8;iùװxnVLEN`qtpaQ=25>FGIHFDBADFJUeypXUU_hllmjklmmp~tke]_bfgjt~{wqonnlie[OHEC>:443223337::6-*-38:Hdø¼iEA]ga\MJIHHJJIHGHLRRPMMOSV]ciqx~Ƿŵ˸zvy{x~l\[gxúmTE<8.' "1Xør`UKFJHFD@>:8321/..-..-,/38;==<<;<<;:40,+.28<>AHSepqnjnqvuk`[_eijolihjjf_QF9102574457799:<<<<;;:;<>=;961.((*.3:@G]lż~[@04;CEFNVhyhQAAFS_fikouti\UQS[dr~zukdYPHL[k̻iUJDFFGIJMOMRX\]\[Z_][XUROLLLLMNNOPPNLOSXZ[en{x[F::IR\irqF8DJ:2Lghlsƾob`or\MKJEHSbtxi^ML=BpùqxiTHCJ]lpmbS@317@EJIHFEEHIPYhywfXY`oy{{|}}~wokcdecacjq~zyzzwpfZTQME@::;==@ABCFE=2-/351:Tuû½PF[fb_NJKIHLLGDCGLSTQPPQX[_dir{űȿι}~wqmvsosx}u]K@=0'#" -Muûn]QJDGFFCA?;82/-,++,-/../38::867889982212358;EO[hxzqole_ao|lcYV[bghmjgfiigaWL?7468954677899;;;998899:::63/-'(*.5;BJ\k~yY?,09BHINQctmTCCGU`fhjmu|ofa`cfn~jSLFIOV`jqx~|tjbWMFK[mͶo]PKMNMKIIKNHKNONNPR]ab[PIJNNLKJJKLMQPNNPSUV_grxxyy}qS>45DLS]fyxNO_o{uqgXPNSanzre^WUW\`cihfefhge^TI@<;986566677899877776889752.+&(*/7=DKYj|rT?+.9FNNNP[nu[FEGT_dginvzfVKDBHMXlw_HDFP\gqz~~vkbULIQezƩsdWPRRRQNMMMOJLLJFFIM[acZKCHQPNKIIJLMSRRRSUWW\cjnmnpu}}}iL7/3@GOX^pX?8>5!-@RcqmtyºrgekXJJG@DO_rreSL:<71.+))++.20.-/121.,/03454-269;>CI^s}p`SV]a``flwymh_\WTSTWZbeffgikke]SLF@<77556666788776545667630,+'),19?FMXh{ygN;-0;ISRONVi}dJGGQ[bfjpxxgXI>7:>Ia{s_[[dnuz}x{xoeWON[sնvf^WSVONNNOOOONRSPJHJMX\]THCJSSOMJIJNOSTVWXY[\\bgifgmtvuwwdF3-3@GP[apiE00, :Sdrvqy~f[crøuji¾fUIIFAFS`rtgSK8@A@>;72/,*+,./31-,-//,-+./2344/39<@ELUor`WizoXTXgnicd\[XTPNNQ\adfginqle\UNG>77554444566655433455530-+)*-2:BHNYhz}r_G6.0;KTSNMSf}iNIGOX_djrz~qbTD879D^z|w|yqr{~{rgZQRbʪi_\XUWJHHKOQPOSWYWPLLPUWUNGFLSTQNKJKOQQTWZ[^_`]bffddmtsqstbD1,4@IS`fswM/(&"B]o}xs|uVFCO_l|ȿvmj½}aQGHFAHUbtsfFB6;bŠp_UTLMPPOPSV\^\O=.*+6;CKS[dijrtkbckr{rx~|y{zspjbZcmsplhfixsh^`hov|wy~ƿ׈\RSUWJIHJRTG9?P^beeaadhjloqu|¥˺|rqqtvxutoor|wh`cltedtwX3!%#5^q_NA;:<@@????><940//24453/,()()&)-1333248_usqtlOC=?DN^oxml¾ľrXI?@BEMWixr_K;5E_ɵֹse^VNNLMNMIMT_ktlS8+*3<::7324665641,(%$$&(+.011249?@?=;8797677743530-)$!"$')+-/259=GUkn`lȾ]?;FKOPNNOQT\enqvz}~sbRGAA=:620...0233331,,./0/,,(,29?EHMYnxZB5+7;8:AO__SLFEO[^VF:5,## #'?ZxucRC;;==;=?AA=8546678:8410//,)$ "$&*-06:51/.-/122331,,0330,*(.6=BGJO]sxW?5-5:?DGJOSQT]myzoePKLSUXetugb\YXVUSbelw}ûsSOfj^_aba^ZWRRRSQQPPUVURNJIKNMMOTX[\YVPJEAA@?>>AGMPQOQSUUY_egnwvbD0*2>O[bodRD>>@O^\^iyzgZWQWZWST^fknsx{ywzumdcbXKA<=EJNYgx|hUF7,/:L_oifjprolmtux{ͫ~sibZPA<><77ESr{]FFNcuueUB59@@3  %7Miwj[K<8:=>=K]tk\{ʿŸi?.*08@GR\dbakƵs\NHNHC>83/.,-/12432//2552-*(09BGJNSezvWB=85:@EILNOWVYbijc[JEGOTZj{~ua\USU[bgy~ƿ`Xlιlb__aa_][ZRSSUUTQOOQQPLHEDGJMRWYXUTQMHECCCCA@@DHKLRRSTUW[^enwr^B-$,9M[bjwtZJDEERbdrswxqf]YW_gjgjpwxvtrrw}}umea\ULCBDC>=9ZiaSE:469<=LW\ci~׽q]SPRLF@941.,-/12443225651,)*2?Kex|{oe\UONJC>>BPbpx}|}zvtvyҐ_VPJTVa_YVNQbktzywxurqposz׼u}͸scK4170-/4:;CJH>5..(*,0230.(('%" !(18GP^q}y̾[<..((+9Obpryҽ|YNPU]dVPKE=72/+,-/012154431,(&+2CO\dn|}}}}}͍]WQGQafa[WQR`chjihmpppptz̠|w|ǹnedgZTOG9//7VnøŲvf[^jrwwxsoioqgTJQ_ljcZVbynK5,7AC;87/!'" + 1:<>>7//37=@@@=8/*,./12100-*%%%$ %-4:J[n{|ʺiH;51,'*?[r}ؿeQ;6CXfi`XPF=61.-+)*+.-,34551+'&-1:EGHR`{sf`SVeknie_UNOUQLCBOcqrbRHKWfz¾οwyҨ|l`IDA?@BCBBFGIKLKIHBBCEFFFHMPSURNLKJKKIHHKNRTVUSPONNPRTVUTS\dmqpeM8,-I\rδn`YYO<(3Kky}zpkjcZONLNW^[RMR\ky}{|œjRKNU`dfc[UTV]^]^`elrquzө|{ouǷaE;=B?:861,/8>Uųre\^fouyzvodc_VJFP`kje`^ltUA:COSOKJ?22+! +%/:>@91/249<<=<:4124332210.*&%%# (2@ABCDDCB?BEGJMMMNQSSQNLLMNMLIIJLNQTTRPOMNORUVVUTX`hrvp[G20;Rcgjp{vw}ukfgnv~~ytnkceinoqpoklnoqv|vomortw{}yuspnnlkijlmpnoptv{~}|xwuvuwwuniddeeehkjfaU@D`vwmgedW\`b`djpxz}|iX?."+Ilſ~wpdWOID@;?HR_pzh_ZO:,9Rqz}qcZWZ`_cfkt{wodcfr{xx|½ƕjQKOV`egcYSPSUWY[_enrux|ڳ|tgp±pG( &-/)&+--/6*?dŻϾ|md`^emsz}wn_UIB@ES`jkifhu~bQKKV\ZXUL@@9, #7=C>4111568:<<::::75210/0-)'&#"/;EN_n˸v`I936219NgzsZE:27:;>J^ljd\TI?83-*'')++,/2440,*)*09AELZkxdXK=@NTYX\_ZRMMKMP[qtgehn|̾vtŎa\[G>:7679:98::;=>>@?BGMRTTUQRSROMLMOOOMIGGHHLQSRONLNOQTUWVVV\doz{m]<7>Qbipvzumhhkor{ztnjg\\]^^___Z\_bfmu{~||~{xvuvvuuuwwzxz{~{zxyvxxwqmijhgeghd\VL=Ff||l_VRRLMOOMQW][_fpz}m^F3&0Lpȿ~vjaZPC?DO^qɧthbR<2B\x~}}m]ONbz}z|}ysops}~ÿw{ȘmRKOWaefb[VTUTXY]_fnsz}࿘~~{phsôqF)'/2*%)+**+'5Npɺzmfe^djqywm[K;8=IU`hlmnro\ROW]\[XRJME7' 2;ED:4224557:==?@?;621//2.*)($"-JV^hlqv|xdYY\_^]\YUUM>.   ,9HI?8659867:=>@CB=831/.40-,+'! '1?P`lt{wg]N;247ALTUYizygTC=?EMMJFGRdovqkdZPF?83.-,,+*02563101-4;BLWbkstqnlkhfa_ex~oft|vomkdaU=31)(.>R^]VSRYbpzvz|z~z{şhBFOCB<4/.///45847@KV_kov||kbabca_^\]ZTD4%$3FJB;::>;99:<>@CC>;631/20../,&$+3ARds~|nbWJ?:BGFC?BM_pxzxtneZOGB<620.+*0354210206;DQ\_`[WLFEGGFBGXs~lbrzsleedgkbI:0!$5Oac]YZaky~ut{~z|þӶ]>AKFB<3-,-/068=@EJMNLKJLLMOQSTU_`][alsskb[Y[ckqzuncbadkqompuz}}|zzrokhfefffdb`[WRNPRV[airy}~~~}{z||~~}{ywvvvuwyxuqnonkfgifZPEARop\KB@ANKE=7310/15BTiz}vhYKCBCGFFFFJOSTTT[fpohSD:GeĻ~zwogWMHHCFf½hG?Vq~h[Vbȿƽ~wsponmha[[bl~~~}ztnebadhje`ZMEQg{Ѭ{WQYbfggfec`_fkosvxz~vsrqqu}ñmJ2(& )03352.-2:Jb|Ⱥo`VQSRMMOMIA;7:ALZerwz~xpkjjjigb_`^YK;+  + +-BHB><=@><;;=>>CC@>:74221/022*)1=L`r÷pjaRHHMRTOHC<79BTPFACFHI==AK[o|~|wodZRLE=840+)02420../159DS]YOF?3-17::7@Vxvm~yumc]][eqlUF8&!1K_d^Yait~tsy|xzľΤvR::DD>8/*+.138;?CGJLLKLJIHFECFIKJHECBBFIJFB>Yvojtŵysomlhgd_Z\eo}upjjlkd]WIBN`sԱYS\ehhhhigdclptxyz{~ãkhhkqxôrP6)&#!$-22242.++-5G^Ȼ||n[OKMKC???=?;:?EPao|}~}ywvv~wqooqrqrstuslef`[PA3&## &>F@==?A?===>>?BBBA>:641//2650/6CTh|˾ljcRKVdjeWG?;3-.B?9;ADB@:=ETfu}wmc[TMD=951.3441/,-.248DV_SE:3(&,5:;8C\{~uph]WXUbrq[M@..FZ_XSenywrwxuxÿľúǗhJ74=@:4,().259<@DFGGFIHFDB@>>=AEFFDBB=AEHEA=>EHA7469G@=AGQbs}pc[[`^Z[akv||~}xtqjc]\VK?2& %$"4ACB=8?@CDB@=<;=>@@=71./1354337FZoȴqkfWPh}jQDCB5)0678:BJPQ\jtxxxv~xunf_YQIA;74:95/)')-/9BGR\VJ@7.0>KPNEKaľ³~vrhZVZR_ijcWG:#!*CWWMG[x|wtpt|Ŀº¿ǺS:54690121/05;8;?>;9:>=?@A?:5368;@CB?<=ADD@<<>;:CWhlgVF6>=;720149=?><;;>@@?<<=DFGHKMMLMKIIIJLMKPW]acghmmidbed``fmrrnjhfdbc]VRU\bioty|xvvssstw|~qg]YUUY`egtzyzuwwxyz|}}}|{yyy{|{}~}zwtnlhgmsneZUXi}{sla\UPPPQPIKR]pwXB3+),/0/03688;FZjkdVH:@[~zib_begjp~pcZUPIEDIQ_t}yz}rU>;a|u|}xtpuú}xtstolkkmmjV[bghjmqvzruz}wv~xng^YW`oּaYdgmmmnqttt|~~~ϯgUJFQ\cjtĶ|[B5/-,-.//12369:987:9CKRWbv|utzxm_K=/2564334CEHPT[hq{ypmjjjmtzqoj_RC6,('" -8;;:8<94...02456:@N^qͽvbY`zrnfO8+.15;@DGT`oz|umgaZURQNC@;4/-.17=BIZmsqpjcbinmjmrumfbXJFLao{|qcRF>=DSbd_\m{mgir{|¼ǽh:.5=;861-.5>;<<:852/-+08;:9:<:;<==<=>BCDFIJLLOOMLKKKKNQUXZ^bdfijihiea_bdfb\UQQNNSURSXbehkpu|zwuvrrsv{ypd^WWZ_bcp{~xvuvutsrpoorrrtw{{{zz{|}}xz}|xuomgejrrmc_am|wnbXTVZ[\_fphUF?:@EC;5588;BPcomcWJ@F`s`ZX`is}{{{voe\SKD@NYfwwsqru{hH2=`vwurpx|lkrxzz|ulfimuſxtnlihhiigQYfnnmkjuzwtqnkny||pf^YZgwg]demnnnnqux~vsv~gPJEBIRXbk~¾{W>1.-+,-./02*06;?ADEBCEEHP\gw~xx|~vl`N?-,056425CIS[_dkrw~uvqgZJ<1,'!  +  3>@@>;BDEEFFFFCA><;841///158;?KVftϺxbZj²{_C/,).48=BP[jw}~uqjfddedUSQMGA<:9<@J_w~|}x|pic`UGEMhvxk\SQQT[bebarĮmimtzy}ü¾ȼ`/ ,
:534788<966:>>>:9630.,+*19;98;><<<;<=>?@@ACEGIIMLMMLLJJPRRSUY_beimlklhddb_]YTNJIDCHMQW^fgghkqw{|{ytpnpqnpruz}{~vnd\TRV[__irwutxvsqpokkiiikow|~}yyzz{|}~wy|}|xtopmfbfpttlhiq|ukhimorv|teYQJMOLGEHKHMWdszrfVMGQh|na[[et}}|snf\QIEEVdu~vrrstpuwyeH7C`plhfivr`[]`fkou|}xpcZ[TRiĻzsljhecba`S]jppkfcow|~~vnifju|w~znc]Z\j|×j`ggloomknuzvomrwzױyN>@@DGINYfuyV<2/-++,-/03.7BNV]cda^^bfhfeu~}vlaN>,*-45215FTaiknruzvxvobTD6.&   &;EGEB=DGHGFECCFC@?>=:711027=BHYdq}ֽzknDzoQ=1&(-4;BNYfsy}yustx||nopoh\NE:;?Ld~ylfa^TGHPlyxnc\\__`_`aaxƱusvxxw{¼n6$7CG=>;60/14>>=:89=@642/-,,,.5<>;:=A@?>=>???@@??BCEFFHILLMLKOPOOQX`dimpmlljggaYUUTPNGB@ENWajhhhhkptvusmfabeimnpsw{}~xsnptslf^WNKPW\^agu|xvzwsqrrpnihhimsz~}{zwxyyz{{{xy{{ytokqog`bmvytpot|}tlf`[URTZaeejr{ykVQP\rzl_Z[fy~}soeZOJKNXhz{oghkortwvuz~}eOGNdlggjvxfWRV[cklrw~}ytpl\QM@:Sw}vomkid^ZWWZdmrojebit}{x|ypjddmxxzzz{ysh`\X\lÖkclmmoomjmqw{}~{qkhgf͝d<07=DEDHS_lzxV@41*''(-4=Dam{}ul_L;+)+34/19Qbrzz|||z|zsgWF7.& + *=FGEA>CFIJIHFDFDCA@?<96445;DKSfp{ŨƳdV@/-27AJT^irx~~~nYK:;ARk»¿}whb]ZOFJVp{{qhd`glmjehknɵ~usw}¾ĽM*#).027950-059<=9537<00/.....37<>=<>A@?>?ACB@BA??@BCDBCFIJLLMKLMNRZciqtwqlkkif\QORTRMB>?IVbksiiilpsttqmg`[\`eoqsvxyzytokiifa][VPLOV`dackxzytnmosrqkjikntz~{yxvwwxwwvuxxywtokgqng`anz}vsv}|yrhdhqz~|n[Z\h}yj\XZgz~|yrlaTLHKOZgu}pb[^eilpuvuyxw{~ubTRSaechssdWV]fntwz}|xrmleXMD5/Hj}{wrnmicZSOP_gornjedhqz}zxz|umb]clvtrqpjb[YV\oŘogopnnmljknrsuxz{|~vme]X޿T1'39@BBFOVfrtV@62+((/?Sixɶzsl_K9,*.6506C]q}teTB4,$  *8>>>>=CHNSVVSRONLKIFB><:7:AKU_qz}ио{qW@1)" !(4769<=GNW`dedca`]\ZVPLB?>AHS_gy}|ŷʼhPKPQXafkpstypXF?@Jazxsoe_ZUMHQ`v|zl]XY]`lsqnvósikpy¶ſx\@2$%&-363/)'%',-+'(*,/13447768:::7669@FIGDIHDCABDCCDEGIKLMEHJMU`jrw|slgc`VNMRPG>7:DVeihhilqw~{wuwwvustuxz~usmf\UOMED@97=KW][aoxx{}mf\Z^ehijkmosy~~|yxuutsqoljigeca`__lmjegxyy~vjhhnzqcVTYi||xwwusjbUIA=<;:AFEHT`cSH?AIQRQXet}ytljpl^WZdkknwbRGKV]abacc`[Z]`WTNB2,:O|upmnolhhjmkkh`VMIJ[eptrnjiqw}~{{|tbW[fqspmlid[TUU^vХznplomjjllhegkpuwz~ypf_ƞk@+',+/CQn|{p_N>3,  $/13;ENW`kuxyxy|zwutof_[PGJS]is|~ڶ̾}]T\XWcioqpsz~fOA?IVfyxqnl_[VSMKVd||q_VVWU[`fnu~Ż|rmnvoOB2%&+./2-%$*,$"&&'*/59998754566547;?CFGHIFCA@BDEEFGHIHGG@?ES_iu{shb\XUQJ?:=9EPVY][WU^gow{}|xj`WPHB><81-4AJTVfzviZRT\cfiilouz~~}wwvtsoljhea[WW[^dghgo~y}~yqoknu~nd[]ft~wvzyqjc]RG=8311.)).;HM@417>CCDPetw{ojhjgcbhqsw~{s[PFISYUNRROKGIPWRRI@8/6O}sjfd`\X[]\[\bfdc`[VPLKYahmomlkrv{|{zz{ygZWXnz|unoql_WQT^w֨ooryvpkijifdgkptx{~|}{|}}slӺ]7'&,'*7EKLORYepqUBETm{ȵwuuvtobRF?@JTRJKSgz}pjqx{sdTC6.$  *7=BM[bw}um`XY`is~~}ȝùg\b]Yciorrt{zdPDGP[hywoki_YTOJJVfyxoc\\ZW[]dlt~Ǿ~uont}u|sƼkW=/'&(--+))'##%'(+.479987666654459>ADEFIGC@@ADFFGHIIIHHCBHXgq{{tjc^[VN@317HQWTMHB;:5.,3@JRVgsaVUZ^cggilqwz|~~}yyxwuromkhc^[Z[[[_`dr{~}yqomry{qkghp~óyttyxlb_XMB;631*%)6<6,)-579=Nfu{|stkgeiiinuý{th]STYZRHEFDA?AHMLKB;817Nqf\VNHEECAEEHMQSSSYYYVTRPPT\dikjhhmqx}|{z{|l_ZZjvzstvrf\SWcyѣ|pv~umjiihfhlquy{}zzxxy{|}}yɪzH*!#-(*6DKKMLRYcp~v_Vbwʮ|qpqqqneYOKO\hdYRS\osdXUV]nzn_M=2(  '4EPYgvukkqw~{x~ymnd[bhpuuu|yhXNPW`jyľvmhd]XRKHKYgtsngdca]]_clvôvokpw~|~sk`Yi~uihǼgG."!%,0-% "%%))*,/37988998642137:=ABCEA<:9<@BGHHKJKJJHGOaq}zskf_\UH6+0=^feYG8+#!!):Ogx}seTF>:7431-))0=EJShm^YY\^degjoswz||{ywvxz||}}}}||zzzywusrsnheca]YUXYbt~~ypnnt}{wwxzú~vqsxteZWQE:4223+&#/5-'$&*+3:Ljxuywokgdbfjp{º}{ofcd`UKHIIHGHLNIE;685:O{me\PG@>:::;;:<:8Pjxg^\[]egjknswz||zvssuxzz{{{zyxyyyyyyyy{vpnnkc]Z[[bvxpmltwonrm^ROG:1,-141-'"$+47/)&%%)5AQq}stwmffebcgs}smje\TTTVXYZZYMG;:?;@Rs`SOLF@??@BCEEE@=769=BB?ADINRTUTW_cdba`fmv}~~~yla[^hxnV^n½vvskklpknrvxzz{vurpruy|ysrruyѼa8$",8@CIPOQSYbqūuihfdfif]TU_qq^QHUeq~}rg_YeZMB>;876223579;70+'(-=M^zstwldkiebestjd_YTTUY_egd`VNA@FCFXqmbXJAAA?=?BDDC@=<;==:88?ACCALPY_ccegns{}}|qcYU^kzYfv÷جx~~tqnpuvy{||zwussrsux|~|yqmiilsx{fK"+=JU^^\]`gtȲtjec_Z[^ZNCCRkxfXX[ex}mXJ@:;=DIS]fp{Z: /EVn~~}}yvtƿ|ž]NP_mpqv}}yqnt|}ywz|~oh]UZnwngc_WMNZfkjjmoliq{}{ǷqbYX]jtz}ǻ}xng`\WOIIGOYO89JRPIPk}~vƻzmrqA##$#$')+,)$$(-1598536953434679;:9;<>@AFGIKMMMMYk|{ulaZPD::8:BLPM?0,/=Uiw|smtsieoqldew{{urqoos|wmXSIFJFL`w[F@=>=987AWrjO6 !8Pl}ti[MB8,%#$3IawuS@IO@46HWl}{mfafkkhjqvuwxwutttvwwwwvttpnnlkmnnknqrrrrt|vfTNS]akpuy}|ywyy{uooqqnjXQD:7=HQKGA>ALYcinw~~wqow{vvwtncVMKMD<3--28<@;402=IPWF6/6G`u}{njspedknjbdyzyjROFDGDLa{bI50;?A@AIXcnv~zvvrj\RLIEB<<;;98738>KW`glqtx|}|}~~ywxzzrdXMTap~úð`n͢stwtsx}xrplmqtxz|}|zyyrmmortŵmA%2IR\jonosu|Ȣ}d]a\TQMC:48JcyzmbZapvndN@49DLPOFFVsűK. "/Ha{}zyxwuw}¹m`mwOCGT]_bjtyzxx{wssqptyi]`kv~wvri\RR]honmpw}pddfdn|xrx~tlijaUTbkbRHXdrdHFZglZD9=KY_[YbnxfA7?SοL"##"!""#$'+.062.*(),.233006@IKQWY_ec]\QFEGLVbr}{}xohdZOE42MrucSE7-?Xq|r]F:4-($ )?`}V/(3>M]k{{tkhglnkkmtvxwutuxtttvwurnqrrpnkjikjjijjlosof^UOKIQew|zxyvomonkkmotxz|}si\QJGC@@<;@MZdinnou||}}zvromu|xupptqb_abOA.#'5@;5/)'.@ROA1/;Riu{vnjhgea``bbfvy}|phVNEABJZhwlaWMC@C?9=O`jw}ysicTL@6358:01;JRT`otuutx~~xrozuLA@Xeo~guș}{}{z{||xupllqtuwyxxwwvwwy||xtrssrqſ~P.2FR`qz||}z~ܷoaXTONI?4/6Hbyxpe]cmpfYB72;JTYYACUpȱL.$$0Kf||{yvutxͽl_kpMDDOVWWbmtttvy||xwuuxxohkrxxqf^\cmqpqt|ÿvicdeq|xt{ztl`XUSTbwpTAScuhG=M[gT;,,9HPJCIT_u{O018HnƼP!!"#%%#"!!"#&)-/1/*&%&(+.10//3;DPX\bhruqeZPMOT]iv~|zsjeaXM?59V{yndTIG\o}jR9/,''?PW\rŲh3'/9FVdt|pkhjljjmsvyywwxyxvuvwurpqqrqoomllkjjijjkqld[RLGDOcu{zutrlijjgilpv|}nbYRKHEDEMZfnttpkkrwyyyyywuqomr|zwqpmgbivqjfcL=+ #2>7/'" (9IH;/.ADRdmuzzvtvxnuiMALXn|gwŘ~|{|}|yvplkprttwusqnmmnqs|yusrqoV,(:Lauzzͣ{bNJKMH:/*3E_wvh`\bkk]Q:30;JTZ[=BTp̴M0)"!%3Ok}|zvtqt~ʸnencqnPLENSQQ[jtoruy}~zyxyyyyyyxpnnqrtz{ofbflrruyƼ|pcbgpsrxpg_SG@IWs]B9FXL'$/E9("(7HQG;9AOgriD,27A]T &$$%''%# !"%(+-+)%#"#%'*-.//28>DJNU_lsvsj`[[`it}{ztld`\SI<=Jiuj_jt{mXB,$"$7V{Ŵx;+33>LZk|zslkkhjnquz}}{{{{xwvwwuusttuttsrpomljjiinjbXPIDBL_r{zssqjghhdaekt|xpic^[\\^fpy}vjegmrsqqqppnmknw|xtpmkkcZ]kxkaI8&"1?8-""0?;2)-?Xmy}vmggffbZZ^gv}{~vg`PHCFIJMPOJC;2/7BOYp~iUD:3/622546EWfr}{qijpg|ʯnPGPsyhz~}~~}ywqlkorsruqmgb__bdfpz~wrpomb6+8Nez}|߾lNHHLF6)&.A\ts\XW_gfYN=62:EMUXAHZsϴO3.'$$'4Qm~|zvtpqyȴ]Ytl{sWULW]YU\hqkpuz}~~zzyyvmbZZ]bejmihq}xg[UWbltw{~}³sfgt|qm|j^SJDCPb~lQ:9?6 # #0BT^XC8ARilZ>)'-8IZq~V**(&&))'$!#%(*&%$!"#%&&)-./0351249DTcmtpiffkt|}xtnf`]WLB=I_|~{zeQ@3')Hh|C2509DScu{qlifglqw{~}yvtvxwwuvxyyyzyvutromkjmibZSMHGO_q{yvvtnkkjfbflt}~{wspnyxwy}yh_`elniihikkjhks}}zuqnlige^Z]gzq^C2"#1@>3'+72-,4JcvyohffeaVW^nyy~qe]NFAEIGEECB@<53>JftpYF7-5/.10/8GZfu|ujfieðdIItȻ}kظ~{xqljnqqpslg_WRRUWZboyysqoo[JRbsݲ]QHJE3%#)=Xr~pXTUZ`^SK>614:DNTENauеT982...8Tp~{ytqpovƱZ\̲xsv[XXfmg][_egou{}~~}}~||{}xiTFEHZ`ghbal|³l\G;7>QduyzzupqyƷxrx{nǼxhYKFLV_n}~lJ4)$  $1CWd_E6BYogK*  (19KVg~X6,(&&))&# #%'%%###$$%$&*+----)&$&/>Rafjjjlryzwmga^YPD;@UszxugO;.+' +/KrxH6438@O^n{wojedgpuz}yutuwwwwwxz|}}}||zyusqpmje_ZTQOUap{xxxwroomilnqw|}zx}|~wh\Y[addcbdgiigjq{|vrnljife`[WW\iz_=,!.>B8-%%2005D\r|qjgeb_TWcw|lfmz~xvj_WNE?BEB?>>=;::ATfs[D5,""*2138KWpvlkĦvREjɵrϰ|yqljmonmphc[SMLNOTZdoxyvuuȹºxyΪw`LHB0$"'Ws|{ywspnnuƲ_dҷ~xqTOZjtn^URScktyy{}}|}|}~s\LILbhooherźlYE5#&@Yswtnow{xtjbaen~Ƹp÷}paQDDRbgqut}T-# &8N_T;/=Wk^>&'%18HfmT=.)%%()%! "$$%%%%%$$#%'*))'%!$5FQ\ejpw~{vshc^[UH>9DaqhbS>/$&%#;ZulL=88:AN\ht}vmeackpv{~yvtqsuvuuvxz{|||~~}|zxvunkhc_[XVYalx}|wwxxsqqokmmllnqsuy{}~|{||~{xy}~ype][^bebachlkjjny|wtolhgfecbf_VOMXr¿c;)(7?82+!$17@A<99:77:53/*&&(/;ETatԼdMOJGC>AXr}zxxxvspmltȵdeҽbE>GZhcUKFH]gotuwz~~~}}}||~rc`brxwr|ú|hS:*( 2Linh^\cd^^XRT[fuŸpfreSE>?N\_jlgq`2 !#!(8F>+$0CSI, *!%$0KWH:/(""&($ !$%%%%%#"##%'&$" ':L^kt}~}~wpnga[VL@;=OmzdVK=.' !!%KlǾnln\I@<>>NakI5*+'#248<8,&.@IR^o|tojgfd_Zmyym^UZj~xljpwomgaZRJD>?BEA7101;PmwfD4Pʭpxķ躢|xsmjkljhklmkid_ZVMD?ADHSapv}~vj_ZǸ{osqì۶[H;* #(Ce|lcWKCBBFMMKIJQZ_vlVUKDB?BWqzyxxwtolflwнe_y}hV?,21)&&,=LVXQIHFCIJJMR[dhvoVI?Px~sqplf_UG?=>=:D]pu~O)#$!#'(! "*20(.*% !#!##$!"% "$$""$ + 'A_s|wqmlki`ZUC3;Pm{`K<-)(!8eþjWPQJC@9=BBKZ^`mx}uhbbbchossqorutrpppoonooooorqqruusqmjfb_\WSRWbpvvvxy|~~{yxwgd`\XYZZaaabb`ZVVXWWTOKIOYfmpqtyroptxxsninw~zvrnmjge_`_`_^\[TSOE9:CNhkG?960((-<<<955:@PXbmtvspjghid]Z_vqrsu{viehlcb_ZRJFC=>AGD9/*8Jf{]LdǪ۹Ŵ渤~~~}zwqlgegkmnprqojbZUID;417AK`kx|uh\W}n`[qırVA-"!*Ef~}uj_WWX[fggims{~ӿoXOE<;9>Tl|{yxvsnlelxȺvo|neYLLOS\bb[VNPRYafnt{}|zxz~~}|}}}~~~{xzvrx|v|q^PF:0.29=5'"#(7EW^]TKIGFILORTVXXevľsbP;Ab}re]WUVUUWXVOHUiyM&"&!!&*& &%"!'% )'"  ""!%''&%"!!#''+."6Nh{}{ytokhge\VRE8BVsuV<0()'$J~ĸkULMF?:0:ADO^a`ksx~qiedcfloonoruusqrqoppoooooqppqttrpmkfd`[TOOR^lsttxxz}~}|||wtqonquw{yusqmgc[\\]ZUKEBJUakrwzuuvwwurogmv|zuqmifda_]]]^\[ZXOOKC859?K_ss]FBBA<69@DGJHC?BITY^dhhdbbacea[]d}|vzvg``c]\WQJEA?>AED>56+$ %2970/39>CDDGNU]a`XOLIILPUXWQJFQbzü}jH:L^{`NHKP\kv{ysnx~R) "$ **&$#! !%,+)'%$&)/046.! *H^u~wvsolhec_UNLD=J^zfD*"!&%0cſjM?B?:6-=>@C?77EWhtyrjtⵡ~}||{zxumkklmnljnpqoi_TM?>;72/-.?M]ltvxyʽ}mM93-*3=L\jwînO535H]dvɯ{mVMA6.(&#%+2Rl~|zxtsrpmkps~üǽ{wzzy~~t\K?=;@EKU_ekrvwvvwxyy{|~||xu|{S7'6AKZm~yt`acb[RJHPQQPKG@<>I^yúeH3BYz}hXU\xzbI6*  !%&"(,# %*.158789;;:8879ARn}X7)8Yxmgmwi\SQI6,' # !!)-&#)/47<@@@ABDA<9;GXg|{wtxqhdcdcbTD87?M^kpqsuwxyzdH( 5`yQ*".9ELfpsvtbRU^cjqw|}wollnmlnruxxwwyxxwvvuttutttuutqjhgec_YTNMR]fgeemlmkjkps~~~~zy{|}~wtutplkovxuk_W\bjnqqtvroligc^[VUQQRTRRPQONMJHED@;61*#&08>DGIQSOKR[acbaaelsyupg`[ZXW[`a_`mxspkaWMIIKU\gquslf`XOJGFC@C:49DTfv|}{s~nuDZuҺ|zḤ{yxxyyvttoiedgghhea]YYYZYUPLGD>;444;ETbj±lcgyzfA%"6=Qelx~zyںtR;* +B^vŢrG-#8X|vmglqy¼~iTRQWew}{yx{wsoliecftµ{XF@=;;;@FGB9217658??@BFEA@EUhuzvutrlebba\XJ?7;IXdlijklmortvx{lN7# #>esJ&-;HW`qz{ys_PSZ^dkpx}xqonkjlpuvwwwyzzyxwwvvussttuspkheb_[VRKIMZdfdcihhfegmq{~~xxy|}zuqptwwww|ysnlkksyui^ZZ`chlnooomjfca\WTROMLLLJJKMKJGEC@<;83*"'06:>BFKIBAHQU^[[bmw|}zvpjhdb_bedbgyxtqneZMD?>EM[isuqkaYOKIGB??729FXm~|}}vn{q_fuxwäyٳ~{yxxyywusojfdecbba_^]^`a_\WUROJF><89Mi}smejqytghlv~{yxx}ysnjd`^ct¸wS,#$##$(0..27DDDEObu}tqqqjgcbb^VOB;8AQ`ilbcdccgkpmoruxz|~pV;'% + (AdjD& 9KZjtw~yr\MQW[`fmt{ytplhkosvvvvxyyxwwvvvtrrsssrokhc`[XRMGEJWcfdddcca`cimvwy{{zxwz|}yrv{vplnr~vjc`cju{p]PT^cdfjmmkiifb_\XSNPMJHGFDBJIHGEA>>464/%  *..03=@;42;CEXUVcs{yvstsrnhjifo}xtmmjcXNFBHNZiuzwtc\RMLHD>9318EZt|mkk}r\`nf̭|ү~|}{zxy{zxvpnjgfd_]^_`abceeca^\\ZTOJFA><<;<|_O^zrsrj]U9,#'2:EN^gqurpvŞ~U3 #-@dİplr~umjkmtö||}}}|{{zxma\ZTKKZr}Z2 "((()/6@HMSX_dilnqruy|~}ywvx{nVc{vkaWNFBELW_b\TMFABMazpU6'(8SimniXDAVqzvdN9146>O`f^UG;+"" !$(,$ %7<=;!#&*036:88876;AEEKU_iz|wrmjihfda[RM@<;CRagi```bceghmnopopsv}bC,  "1Hd{f>"*Upw}|tqlYKRTY_elrzypkhhmrtuttsvwwvvutsppoqrqoldb_ZVROLIBER_cbddca`_aehsuvvttuv~|z{umq||rh`^`cjmng_XVW\_^^`fgc``_\YTPNMLJHEDDDDDDCA=;:53-& #)+/8=@BB?;AMXfhjoy~z{|{{yvsvmjoy}vsswuqh_XSR[dpxypc\RLJIE@;4,.>Wo~~pm|}ploȻzѬ|{zxy|~tqlgc`_^\^beghggddcba`^^WVRNIEBAvp[ay~{~}~sg^]]YQOD=9@HNU]gnqropxǢuR9 $=XźxpllmrzȺ~yx}~}{yusjb`b_XT]nc; + #"#%+4=EHOT[`eiiopsw{~~{yxy{p}~qeXOGAEKSYZZXWOHBFRfwU7$ /?[_XC(";Zo{zh\N?1-*.8I\ec_QE6-% $!!!(1+#"?]hZ& "#&*.245:98976:ACHSbkq|zvrliihec_WNF><=ES^ee^^__abcdhjjjikpvztZ<%  $4LbywtzcJ.4`~~vus^LOQV\cipw|~{slhgjprsrrrtttttsrqpooopokic`^ZUROLGACQ]babba^\[]`cimruvwy{{wuyysh`]dmuof__^ZVWY]^\\__\`_\YTPLJJIHECBAAAACA><973/( (/28BISUXWUZepyzyyz{}}~}zwztquyokizxupiefgiqzvkc[QKIGB?:5.-6Kcs}ttyrq{˩zyxwy|~upmgb`_^^`cfhhhgggggggffeda^ZWTS[tlfpjfmuvsnoquro]QEDFJLPVW\ejklpprokiq}ǤwI*" !  ! *JhԸĹ{unlknt}Ÿ~xvz|ysnjlmsɾ{Z; !"%*19ABHMSY_cdjkoty|~~{{{~zi\PFBGKOQRW\bZOB=ASpxR-:>;)-M^l{mZE:40,/&-8IZegh\TIA6,'&#! !(2.#LK#   !"'(+.2445:99:749?BL^py{~|xtpkhfeda[QF=::>GS[``\[\[\]^^cdcbcgouuyvfL2   (9N_nrv{lbovvutmcE*.Ur~fMIOTY_elsxx}xokhjloqqrqrrssrqppqonnmlhe`_[XSPMLDADO[````^ZXWX[]`fnswxy{yx~sj`\bo|rVDM[]Z[^eifcdcc^]YTNJGFHFDB??>=>??=;843.*!")39>GR\insttx~zz}~}{|wxqf_[^\[YW[`dt{}pdaXOHDC?>850,0@Vhzz~xst~xù~vttw{~xsnidbbbcdgijkiihijlmopqtrqomkiiSl}nk[SVZ\YUZbheaNB:;BMXcpxwtmdetĝsM.#'!"&$$''%(&#!*>]ƪyomikpx~¾~ywy{}|xrkecfnò|e= "'-29>BHNTZ_`dfjpuz}~~~~~}}}|qaUJEHKMMNS\c\RD;=;;;<<;:73/.*$$28?FMWcn{{z{|}~}zwk`XROONOQYbju{xl_]UKB?>=<;5/,1@R_qx|ypuƻ{ks|qq{ȽͶtsruy}}}zupjgefhhhjklllkklnpsvwyzzyzyzzyWo~pWGA<=:7=GQRQJDCKVdsqegzÔc>'%%"!"),-(&**)(((%##((% &8V}Ⱦ~plhinw{{|}|{yxxvsoljddnȳwxY3 !$&*-17BIPWbny{}{yz{|~|}zskc\XQRSUZalry~}xqeZVQF>9:;=?7,,8HT[`jvzz}suǬ|~}t|biymeesƼǭutsuxz{{zxsolllmmnonnnmmlmoruwyz{||[naM@44/(*3?FITV_mz{lm¶޿d;"&()+.12.+*-+''(*+)%! &)(%!$6Sqsnhhlvº}wvx{{{utsqqqqpbcpͳxbI/  #%')()+.38?HOX[X[_ekptuxxz{}|vqnnkiiihgehfmyiZRKMNOPPQQQMJMTc{sP2*BQUTMT`rtG* "+4;BO\cc`\VY]`[PHG>4*%"*.'1 #R{թj1  "%')+/0246645345512=K]iu{|}}{wvsrqlgd_\WRKA7029CHIKKMRSSTVXYX[[]_birxzr`H1   +$-7CLZjw}m]UOKKB78Gc|hD@KNSX\bgkruxz{~}ysojimqstuvvvvutstrpomjdb`_ZVSQPOIIHJR^dd^[XXXUOKDIPX^djnoqrqprx{}~ysi^biycA@LSTW^de^VTQMOOLKIHGGCA?<988866630+'&! "-9@FJOV]hrz}vx}||}}yvtrpomcdfhjpuz|sk^TQKA946:>C9-.;JRTXeutv~}{~ʷ|{{|tnusbgrjdanĻܷ|wrx|xvuuxxyxzyvtsrrssrrrqqpqpqrtuwxy}~Zj{nbUQH=7;FS[hsprijϹhA(!&*-.2696757=B<3-.//-*%"!$$! *:M_nu{{yοvpiglt}Ⱦ|vuwyutrronmllkW]sǷqZE6+$!#"  #%'&$"!"(-5>HPUSV[agkopstwz~zuqpnkjjgb^b_f|ucWNMLMQQMIHJQ^k|x]C3/0>JNNNPaxŤ~O.%*2;DJS^fhd`XWXXRKJOG?62,% "!!&*#- 9i˕R #&*,./01234555545526EUht{zyzzxutrrpmhc]YSNG?6119BHFEGIMNOQTWYZY[_aekrysiV>)  +&28?FSdorqrrjVD@HF81@_iICHLQTX]bglosuw{~uohfjnqqtvvwvuturpnmkhba_^YVQPPOIIGFM\ef^ZYZ[VME6:=AGOX^acedcemttuxwl_Z\ltytrr^KHNTX[adb]YWTPNNMMKHFEA@=<87675543.*&$ "'0:FLORW]dmu{yrt|~|{vux}xneYOLG=5149?C:0.6AHKZi||soutsvw~ywüzqt{rroihmqojbiɼƓk]^_gq|~|zwwwwvuyyyyyyyxvwutrrqruvvvwwww}~Xg~wm]QP[ju{}osղ^C)!! ',/00378>@DLX_WL6752/*'%''$ #)0;IW`krqʷwrjgjr{|wwwvqmppnkhdb`ITqjL8.--$!%(%###$#"!""$$"$+6@JOQSX]cilmorvy~~zwuronmib\XV`v|g[OLHLRSMGBGUj{tcQ?AEKJHKP`xĢ{L0)0;ENQV_gjfb]XSOHCHQLE>:5.**&)'! "!$Guݵn" %)-012.//01446556649J[pz}z{zwtsrqpmgc\XQKF?7119CFEBEIIILPRVYZY[_cfkrxkaN7$  '7;=CN^gibbfbL65DA30JujMFEJNRUZ`cgjnsvy~}uofcglmnsuuuuutspnlkjgb`[[VQNLMMHIEBJXdf\YYZ\VKA///04;FLSVZZY]dkhhjj\NP]oy~r[MOXuod[XYZZVWUQQTSNPOONKIDC@?=:86657652/+'$ "'/9DMRV[_dkry}ypr{}{yuuztjaWNID;3/29@B<3.06>CXkxfYQP[iv~hZXYY`q|ƴ}rvio{tvkensrundhگpAHMSXaimlsrvz}{{|}yxxwutxy{||||{yxwutssszzyxwvvu|}J_x~ſ|su|n<- #)+(&.-32*/98??TtqS@1140-/,-)! #,9FPWd_[h~¬}ulhjqxz~µ|~~zywsoljknurf][TM:LnùuP8+&#%!**!!# !$&&%#"# ".:EKHNSVX]djkmry}}~{zwqnkg`[SQRazr_OGDMUWQOJSbv|tbSTPSKACGPavf?249ER[]afkkfa\[XQICCGEFGDA>:96.'# "HizC).!#,.14/))(+-1010246;HYe|{z{zzwvvusrokc^XTOHA;5338?B@>ACGHJNSVWVZ^aciqrriZC0$  )3?>@LUW]SPTN9/32,+7[}~iPBCFJPUZ]_bfilqv|x{soieeghktuvuvtqpomgea]YWWVQKGEEEDDB@ESag^YVWXSG<-' "*27;?DGIMQUYYWN>8LexmPK=7Q}tgYWMGFOTRNKKKMNI@879:9999996874/*(' %/;EPX_cfjov}~wz|qos|tkcZOGE?6248:<@5,+.29@Yh|xsfVE<;>HRdtzdVKA86:CMq²mP749:6455/&!#&'!(4BPY_`ZT]ozȳ|umhjouwz¿{vz{~|uutqnlkmnpkaYVTTTj}aJ6&"!"""   '3>EEJORSW^egipwxy}zxtplifa_SLITm~pYOGJRVWY\guxtdUVMVNDKXizaB9=CLW]`gmplaYY\_[PE=>:4+#-JiӲX?5&#,,//'$"!#(-01235;DScmzyyyyxwutsrpnjb^XUOH?941.1599:;BFINRVXZbdhkotx{x{wungccdhnprsttrpmjfb`[WUSQLFCA@@@A>806QnaD@6>b}xqeVLIGECHEBA@<999:87667779961,*(")5BOZdiosx}z}wnlpw{oe]TIB?8104:<>@5,.6>EKU^dc[SRTJDCJQVY^]ivxk\Y`he`Zcxҿ{j^cyqdgqqfagkikqtaeƓQ!?XprfXOG@EQ`jppppsrqqtwzxyyz|}}||}~}{{|~~~8F_zysomrvd\TORRH=4-(+.++, %6DIRTHIVʯaB?HH<4794-*--,"'1@P]dh]WOUci}¹}wpkjmprv{wxy~|zwqoljjihhmhb^\_jtȱrK,  )39@EHJKPV[`emsrs|~}xsnkhfcbWKAHa}l]KGJS\dp|yqpaSVRa[LUmrZECJOU^finrsne^_ad_SF<:DC@=5+(;Ttɼu[@-%**,*").0114?O`muywvwxwusonlkie_ZYUOF=62/,*+-25669=>@=:ARbk[WUVVQE<6/#!$&(%!$8YuzrQ:62DqÿdVSLCB>978976897534559:;73.-+*2@MXbjntz~|sifgks|}yrf\SJA:3/+.5=@B?4-/8@HNVYVF1&)2>AOftulfWVZfonie_`^br~wi]duȻx`Y[b{~z}|odenib_fjhhkr_cȗZ-F\mm`WX[ZW[efa_dihiklpswwwuvvy{}}~~~-7NnvomsxxdYNJNTRMGA??<744-:Vmx{eXaòhPOVQB9/55/-/-(-3>LZdhj^YRWbewȯ}unjikmrw}~ytpojhghfeh^VZevϷ`6    #)8?BCEHNTZ`jnmnz~|wqlhfee`REI`|kRDEN_n|ohfZPVdxs_f|gWIJQW]errqqrrqpjhbXLC@CA?;88=BGNF?8.!")4IenK2%&%($ '+-+.5BVhtxutstuusqkigfc`[WZWOF<5/++'%%,1446:AHMQUVV[]_dlmlYH3'%# #5?A>8/4I`j\>8AB;17MeeRCDLKQ_ozmbdoc@('<>AEKPUX]`eiloqttvz~yzvofcflruwyxuqmnjfb`\XTROKGDAA@BB?;ASdk\XUUUOE<70&#Aatk^F:84Jx¾zkXFB;7661.574323577:97400/6=IV^dgjov~}{sd`]]`dhifhiklkkjibXOG>72(((.7@DE@81//2;EW\XC)";EZzwhN?9CLMKORckihhWA;Oq¿u`_]Ogztsupjingbaimkijq]dzҡb2FKNLO^ymXRZa^^cilnqvurqosx{~'+@fxrqsw`XQRX^][URPQLFABEYooq_[[XTVMSM>5762=BKWaghgb_Z]edsӽ|rjhhhosy·|wsoihgifecWOVmƤrE +     /5;>?BHNV[diikx|{}~vojgggeYOSd|{^KGPev}ibbYVbxzzv`WNPW]cjxywtssrsni_SGABFB?<657<@LGBEC9+$07CYy̴vP4" "'(()/;M`owyssqsttroiheeb`[X[WPE;1*(% %+/049@FIKNPTZ\`bgebP?,#""  &7@A<0#/PssPINE<:=LZT?8@B?BO[agmSKO[S<17FECDGKQT\`diknprrsw{~{}|ukefknrvzyvsoqokfd_[XSRNKHFEDED@;AP`h^ZWURLC=<5,%  .PhocSB;970+("%(1$!08Nl}xdV8)$2BEA@AWbVC7*"Ev|`YSE`{ohkx~woqgdeltuuvxelzyݫd,502>W{ĺfY[QMMXdjossspmimrx|)'9bzvx|~q^XUZ`b__[WW[ZURSZtɵzy}ja\^ngLGHFOQW^eijhhgcfhbkĴwmgghmqv|Ƽ~vpieedb^bYQYxɼ{sy˰V    + #,48;>CGQU[bcivzxz|~|snjjje^XZfvo\U]rxf``Y\qi]XVW]djow{~|xrkghe^TH@>>DB@><;<>FBBILH?:7CTm̲{Y:# &('$.8H[juxwqqpqssqnmjgeeb_]ZVMB6,%!"'*.5=ACDGISY]_aa\UE9'  *;CF@//ZcYQ>9;@;4-(# + 997765656752-($"!#&,6AHHH@=7/$".;50-)#!  $ImrbXH<30KyúǽT5/12+../.,**,/13257HGKT\eq|}zwwy{}~}wqnnphfb__hx|tmb^ZKPjm]TZbgmrvv}|vssskeXJ<211/5@LSVVYIIF@79EVrwU7!#&(('3E[muupopppqttrojgdb`_\[SND9-##'*2;ABBEJRY_`_ZNE92%   "4=KWZI4LwkS=E=?@DLQJ?:8=B:-.95BJGGUeoqgYJDBHMPU\cfijkmorvz~~~|tib`hr{|yxurmjfa]ZVUSPOMKEHGDKZhnkd[RJFC@8520.+&%(% ,Qtr[I@91.MzĽõgE;85-/00-)%$&),-026;DMZgqy}yyzso~yka[ZUPJC932/+&#! !!#"""#%'-/6?HKHD8*!%%7\kC, 4X~wopjhw`JK\ry|zwyvxxtsʜa5,4SƽqU;8@IUdoole^^cjqu|0-;a}sg``dtztd_\\`egghhlqsqv{zǿ~{vpofzķh\achnswz}noµtjghlmorv{Ƿs`SGHHixj]PHA\{w-    ",16:=BJR`oww}~|{zyxx}zvutsppqjb_]bn||q`\^TR_iukf_cinqrsv|}}}}{zvrdRA2+(),18BP]fn]\TPQZep~qlt{ydD% #)'" &/?N_lpooqqpprssrokheca]YWLD:0$#'/9@CEJOW[_b`WKE6+ #1CTae]Rdk^RFDCCGJKFB;7005LVZ[bqyz{m^PE@CIORVZ]cimlmrtvxz|}xmgfhjox{{zusnjf`^\\XVTQNHD@@DOZeoumf]SLD=9761.)&$#!"!! $.?\uo]M=35;Imľ}ZG@<6774.))**.146665;CQ^jsy|~|||zv~|qgaZZVQKE?;0.*$  %+025:DMRRQC5" ">kxN- 8_{yzxrou|yYUdtsosxy¤wK/2QzǿiI822>Pblrmd_achnx,.Ahxold\[_gxxtlhcdhkjikkmqqqrxútyrmlcxcU^chnux|mq̾{ngeklnqty}ŵdTLD`uhZM@88Uuʶ0 + + $,4:CKR]m{zxussuyy{yvvvvuttmd_\^jxzqb\ZV\mtyogcdhotwxxz~~}ypaO<.(&)+07?KXepxxwzwi`_s|nQ4  %+0-''-4ERbnponooooqrrpmjgca_[VSG?4* &-8@CFLQX[]^\TJD6- $4J\jpjaqpcXMHGDFHHD@>=><7139dnutwsaRF@BHKORW[`gkilpstvy{~~}~}xojffgjqvyxvsplfa][XVTTRMFA?>CSaltxoh_WPIA<41.+'$""%%$#"!!"#(1Fbqi[L=57;HgiPC<<<=;52032479:::8HRY[ZPA/&#"  + -NwQ1 :d{pifntprrgb[]fs~{qmsy{˽qO5(BcſrN9-*3BYdlkgcacdks{#,Hryuumc[XTQV`n~|{}}ytqlhhmqolpopsqmmrtdurli`u\LYbgov{~nsvicjjkmquyz~Ժ}dQ?T{|x{rdWJ>1)0Op|úҽ4 ! +  + *2;CHQas}urmjlpwz{yyyzzyzvofa\^gtxpc[VZoyngddinv|~|zvi[H7+'(,.27?<;;748?{vaRE>?CFJOTY^digjnqrtwy||}~zsohebchnsvwvrmgc^YVUTTQKC>>=DYlx{|rmf_WOF@651-)&$"#"!('2MgmdYI?:<=E`¤zYF>@?@@@@@?>>CNV]chlv|zxyz}{~uj`[ZZZYSMEA74.)$!"$&'),049=DOZade]RA83.&  9[W;IZhnplhefmuy~|||~}{xqhc^^ep~vlcZUa{sifgins|}wqk^Q@1)),168866>N]oruy{ztq_XMGLZlv}xi\TPMLOPMGDHOYbippnmmonnnnljgdb_]YUNKE<0&  + #*6AIPV[]YUOJEA=4+ (9Ndsxxwynd\UOGDBB?<<9:;;?>DZsʯ[D:=5/"+Dfy]H. 9hwrsvmns~uidjt|~}||xngiuɬwYK7)%0]X9&!*8>JW\ZWUX[_bfjpsy|#U~{wtsssvy|zti[UTVWRKEGJXi}~}~wj]VWbqvwxwsppsy|}|xvsmdacvXAnufWpO9JXalwzovtdffefhjlmsvz~ǧaAOxph]RG8'"<\v|zxaZgz˹>")' + + ++/4K]nxvoic^X[\ZTQSX^djmnmmmrpoomlhdca^\XSLHD:/% + + &,7BKSY\[WOIEA>=4-! (:Mepsw{zpia]UKFDC?>:9;BFKSZ}o]N@75:@DJOUZ`cdgknoruwy|~|pkc\[ajqwzwngb[QJFB>=;9847Hg{tqmhc]UNKHD?82.,&%!!%/(5WleXTD>==>BSfþɲZB84258;===98632236;AHQ[eow}}z{|ynd]XWXZZWQIEC@;60-+++.01258;AEJRW\_a_YQNMLFB72*"  'VtĺF#%!  #&+8N`fdejou{}|{tmib_clxzp_YVYl{{zvpopuy}~seVK>81-,/46997328CNOPK=-$$*358AQcrz~~zwrngbZ^a`\XX\_bfhklmnrqnnmieb`_]ZWPID<4(   (.7BKRVYXQIB@??>5-! %9Mckkt}yqjfaZQKHGDC=>CNW^elwj[NB:7;=BHMRV[_afiklortuz~vpg^Z]djv{wlc]TH?:41012206Mnzusojfb\XTQLG?953.,)%%(,095A^ngYRE=879=JVsư[B91.037876.+(&&(+/;AGOWbmwy~{}y~vkb\YXXYXUQJGFC?:53110244573'!$$(28K\sjcTD3& DmoLMQ]o~zsnkifd_^fsz{|wttqkeepپvJ% %.7ktV@3+)#$6HMORRROLIJKNUWY[_gpw;prokgb`^^Z[\]]]]]\YVM>49DWfx~{zxq`RNTckikrow|xx|{wqf[VWyQ7ryhUltOAP^fs|~}ízjifdcbbbglquy}Ļuuxmlllh\K@5AJQUPXnywrs|^>EfM%   + .F^kny~{tnkd_biq|~ul]UV^n{zz}~zxz|{qdTD9,+*,/26864335;BIOOJ?3,+-05=HVer{|zsqpme_UY^a]ZXZ\_adgkmoqpmlifa^]\ZXTMFA6-"  "+/7@HOQTOKC=;=>@6/$ $8J^danyqkie^UPNLJHEHQ_jouyqsninzzndWMC;7;9>DIMQUX\begilnprv{~}|~wsj`XY^cospcXSG82.)(()*++6Qtxwsokieca\XUQJEA?;84125;?GFQerl\PI=2.16>Db|¾\A74112440-%" !%*/:>@DIR\ekr~y{yvw~|pg_ZXZZ[YUPKIFC@;8755465558>BHLNPOPRTVRNNRY]``]SI=4.,-17<@FNU]hvplaTG@;9WyxXTT\m}~yyz}~|vpid`^ZYWZcosqx~{wutqhc^^\WSTc|ėmF$ "0;i~k\NF4'$1?CDGIIFA<:;=ADEGKPX^kqz#I{xrlfcaab\[[\_beigbYL:/6DTar|{ur`TRXfkfekv{vqeYTU¶S7t{l[psVL[dlx}zͷmkgda`__dhnrvy|uimsz}wj`MROHA8Fcrrnp~jNXQ% + + + *A^r|}}yrmic^_fjv{rh[SWanxus|~xobSD6,""',047941/1593852230+&#  &,18997:?HO[gw~xz~yopwwmd]XW]\[XUQMJDC?<9777676559?CKMPPNMPSWSMLQY_dljcYPIECDIMSX`glot}tpg]USQOee^VUcw~|urmg`ZWUQQRV`kminsvqmjgcZSMMLGDF[uԭxI& + );bzobQ>18AA?B@?<82/.069:;>BHM[blw?axmhhjjc`bgjiltqeTB3.5@Qas{}~||}}th]Y[dfcelz}xrfZUWbK|~v{e`ktw||uq{ξzlehg^Y]`ciruuzznilyrpry~vnbSA:GZtqjgp~p}·U+  + + +  !1=V}ÿ~zwrlhb`^^hkvzoeYV[k{}wuv|zspaUK>0'&!*15778248:97559===>A@=FKLNR[gn~upopkgZ^_\VRSYZ]^`cfjmomkhe`YUVVVTQKB=-$  !(,.15;ADEDD@@?@@?<::3% +  &4@FQW^|~slhge]TOPRONP[cgq~tYOEFP\_^RPLF>:88349>DHLPV[`defginqvzywutsrnf]WSRTVWO@0% !&(&!$8Y{zzxtpmmmodca^][YXVVWVSSTWU^ddkqgUNR@*-2-'Db[<058971+&####$')+-2/+'(-4:HTfvzqu}skfnzmf_YWZZ[ZXUQNOED@=975457888:>ALNQQOPTXXVPLOZ`bmmjd`^_adaemqsywzxpgdeiig~~xZK@Ja{~pkpljd^XTQOLMQY_aabcjkd][XSLC=>?<>DVpӽQ- + + 1Xlyp_PKKGAC=886203=?@@@CGLPYenruxzPmvnjiikhhospnph[K=.'3EWfu{|}|z|}}wj^Z[`a]dpƽ~xmb^cn`vrx}~zvmiuı}ogih_[]aciqst{sf_`f~}tdURV[VNLWiqqfu{·I)   +  + +  *E`s̿~{vqlid_\[adp}yoeWU\jx|yy{zunfWK@9/$ )27774147974112@?>?9;<@BCA?93' &0:BKNY{|qhed`YQNOQPPX`a^cmnhJE@EKPLGJHD?;96515:?CHILSX]abcegkpuwxvutuvsl`UMGKMLC4$&*(#!7Xzyyxrnlnqsonkheddcbccddddd`dffhibX\]L73.";[}V8.2452+'#$!#&*+-,+" #+5;EN\it~wosz|xc^gwha]ZY[\\[YUQOOFEA>:76589::;=AELORRQSW[]YPJO[dfljgdcfmrrsy|{yojmruu~ydTGNbyxkfmfeb^YTRQQQSW[\[Y]b_VMJFA;759:9ADCB@83) +%,54$ + )+'!!4St{}zuqprvzxurommooqonnnkea_^bfga__ih[KB01TrP7/-0/+" "%&)-/.,'##,5<>FOWakyslotw}s[Xdsa[\\[]a`]YURQPHFB@<:88:<>?@CFJMPRSRUZ_aZOKR`hjkiecdlw~}~}}uqrw|}~~|xm]OTew{l`_c``_\YWSRUUUVVVSPSTOE=942.-069;>DUqƖ\&  + +  -:Qhokhijrx|sh_]`enxvjdehfdjlonljiis~{urjpz~wtlP;8/#.H_kuxwwxxx{|}wlhc\PKXmŷ~x~xs~ɿĺsihghjccflor{ocbpűwhWB8@ACFJMOQSSRTZ_c]SOXejikieccks|||}wvwz}~{z}|vo`TXfs{xj[TUY\]]\ZVSQSTTRTUSNHGB;4310//26:@FMZṟuD + 5FXaba_[`fq|}z}~vrpminsy}|voj{yq|~zwkK443+2F\hrutvwxvyzz{xqj`NFRfȿ~´|icekpedgkmpywqr~µpWHEGFD>K_vd;" + + + +$*)""6Qpȯ}soqrokhbZSKGHHRcu~wqdXVi~}}seVG94/(#!"),52.,.//-7:><:520059>GMKHOW\][Z\_is~}yyyz{rkaZZ]`beeddcb``a_\\ZXUSLLLKG>5." $+169;;;=>@CFLKGDB@:530'  %(766:Uwnf_ZVSMJHHGGEJMLKPTW]R?1*+1741-06952.1688?@BDDHKOQSTROPUZb`[Y_hjgggfeeipu~rjgp|{sklpv{~}xwz~~~zl_V[fmpporl\QRUT]]]]YVRPPSSQSZYTEA<953349::9LVTPKNT\^_i}Ư}uqonkgc^WPHECBIZn{uoaTVp~~}mX?-#"#'/2<6.*+-./7;>>;8522239ENNJPX]^\Z]_eq|}{z{}wskd``dgfgfeca_^^\ZXWVSQMKIGB:1+"'-48;:;<=@BDGHFB>=<:70+! $'836Ff~vng`ZVTPKIGHGHMQTSPMJROH?744733136752169:8;CIGJOSVZ_bcfghiloqtrqpnf]UA5%"#%" ")5DRX[Z]]\XTQORQPPQTXYWPH@8.%-PxtrfYTD1+0Kq|zvpnsk]M>?>;646788-& + +%(*5.8W||toh`YWUSOMLLLOORVSJ?9;@EEA:54456665327>CC>+ (0:GNNKKNQW^gnywsoqytt{yzoaSOJC;9BN^ky{zzywrturuz~|}yxvlberx~ƾ{meahgilmlqy}įY5%'" "%$ +@YrҺ|xrmf`TPNKGFBBA:/)11#$'##+5860++/3437:<;9743-4;AHMNOKRWZZ[_c`kv{|z{wmhilnmjfb]XT[XTSQPNLLHC>91+&$"&+268;;<<=<;9874/-.245+"&-0.3*ADILPUZ^deddefknnmprrlaXKA5*# #%'!#$%..,,****&%#"! ! 2Sux\YVC34Fe{|uvkiiqtogaYTK>1)" &$#$" &)-6H\zqg^\]^_`Z[`mv~wpigirwwvyle[X[^_\UTPNKJIHKLMNMORVQRRQNQX_ahlhcdfgihgdcejoty}saSHFE@=>:GYkweXURPOLQK@G_d[_][ZWXXXY^]WYcc[ZRNQRMILHOPJFMTYdxȤ}nJ*$$%0:?CBAACKT[gszxy}~~}|wsk]JJD:5;AEYgtyxy{ytsstx{||z{~}{wtty²|}̾ud[_egdfmnku{ưS;,'&"!%(&"$+4@b¾ں}tmh[JA;9:<><9=>BK[n|yyvfWLT`oz}zvttvwzynsseKC=;92' ((#%2893.)+289:<=<:752125;BIKKKJKMRZ`aa`ejsz}vnlnkljg`ZURXXVQJIJMJIC9.&$& $(+,07:98999751/--++-147+$ );7>5+1+Cw}voic_\ZWTSSSSNRQKIF6#&052/027<=9410?EMPG;7;;?DFJOV]\^abdfkmllmomib]OF90*)((,($ !  "$"!"  >?CHKZcnw~{urpþ|vke`TA7*! (6CVesxxxxxtttuwzzz|||yuȾ~ȳ{g\befdfjlhry|N<0+'$$).22+$(7Hgݽuh`QD=7212554:;AJXj}}{yuh]PU[abdefjkmoppqqqvskhe_ZSIBADB:1:94*'-232-*-4:<>??=:742157;AFIHIGHIOW_bbadipx~uonjjifa[VTWWTOIGHKHF?4(" !#(+./2897220/.,*)+,.00/.-)#  F[RL<23:W{uoic_^]ZYWWVVTWUQQQE4$(253348;=;71.7>91)$!  !!&*--.05B\tyk_\ZVQQSQORPORZfkrvz}|vnhejpu||ukc_][Z\XWUSPOMNRTUVVVVVUUTSRUZ^fjqtofdhijigefjnuuvx~ygYRSVZdekvzxwyo`YRMNNVTLLZ^W\\\^__abbeaXV_cb^XUXWSQSTWTORZ^^drxP/ +,28;;>DGIPZbjs~~volž{rc^\UF0.DVesxwvtssuttuvww}~vʹæm_bdeddhhfpu~įtJ=71)'/<;=:0*5MeãxgZOEA81,*+,+38BJVex~ztmfa^cfcZTTUY\bfhhfdaf]\eYKR[RKMSVPF4550-03540-06:863378;?DFGIHIIMV_bc^`fmt|~tmggfea^XUWVRMGDEGDA7,"!&*-002674-*'#!"$%(,254/(#)! *goZ?64Pvysnidaca_]\\\[Z\[X[\SE-"%4;98789=>:0**,/0+%)14;BFHILQX\`bbceeigfgfd`]QJB;88774/)!!,,(#$"!"%())&#!!! "Twz|zh\bnrh[WX[SJCB@:750-)%" +!'*)( "$%'(+.00./2:70/7B=>=;@Rnſ˫~iYRMH@92-*'&*3?ISav~wkb`btzyhZTRVY\^][USOUJPdSAUXZ[`fljaJFB=:9877435;>@B?@=;9766:9:=@DEIJJILU]ab[^ciqw}xndcbb`]YUWUQLFDBBA<1&"'*..-.21-'$ %)-1686/%$ 2nxZ716e~xrnkebedcaa___\^]]^]RD.&#-:>:8988;>;/&#,18AFFFHJQUZ^_aacecbcb`_\RLC=;98884,$!&.-+&$"!#%$"!%)**#!"!!"Z|pP<5268841343)&%"! ).1/-&'*+,,,,*,----/6CUlwd\\YTQQSTOB4.,7@LU]bfipqpojebabo|smdZTT[ZYXWVUVVXXYYYXXVWXWWY\^ir|~qdciihfedfgjmqy|{yuw~nhfdb`aa^TJIOUY^dikkkijaUT^a_YTSVYXXZ]\YVU[bgsşmH!*04?ACDIS`jkoty}tlkiabhdV2#!-D[juxusqnrstsqpqt{z|}˷~{ӻpe`]_cfgglqx|zyx~}wԾwrs~mM?;;855;6:@L`xļӵkXPNNKF@7/($&/F>G[MB^{r]LA94:779=@AA<<;:9989;::;?BBFKKILT\`a[]agnuz}}pec`^^\XVUSOKFC?><6,#!'*,,'')(%!%-169;;6/%  +*ZmeJ')=u}xsokfcffeecbba\^^_^WH9*+1<@;549659=:.$(-5>DEDDDJOU[]_bdccbcdc`^VPF@;:88;7/'! $)++*(''&&$# "%%%!" !"X^B/%*482.,+'(&$#! #*120,(**,,*(%# #%((*,1;J_zqf`VMEJPUQG9-',5>FJQW]dggeb`abev~viZPO[[[ZYYXXXXYYYYYXWXZ[[\^`isufciigdcdefgkpv}||tnmjgdbbaVHFKTY_gknnnhh^ST^a]WSQVYXX[^[VSQW`jžX;'0=>=;;ALSZ]dimrx{~~toswux{t]5!(8M_luvsqomoqsqnmorxxz{̾xzwzz}ο}jb\]aceijov|}xww~}}~~{y{z˱{kbiwlPA:;:5113:Jb}ڿhSIGNOOKC9/*).9CN]owi^dpybSMTQNKFCA>5<:?KGQrcK=6;9:;;<>>989::;<<<;:;=@?CIKILTZ]^[]agmtz|thc]YYYWUROKHDB=;73*# %**'!!" "*37>>=<6/'" + 8CC0'L~xtplheggggfedd^^`a^SA3+4@ID800752697.%")1:AA@@AEIOUY^aeeffhihebZSIB=;98:81)$!$)*('()*''$" !"""!P|||[;' ,662.*$(&$"  %)1210+& ! !%'+.DIONH>1&)0789?GOWZ[\[]bglzq_TQ\\\\\\\[[[\\[[[ZY\_a``bcjsylgkjgcbcfggmnptz~|zwv|xpplfdcb`XOMPWZ`fjllldb[RT_b\XSQVXWUZ]XSQQYgvvB(789756=AJNU[`ekmuy}yvt{}hA!-9FTaltsnnlkilnmjikowxz~~|óz|s|~~ƿrf\\_`chhlpw}}wuv{{{}{usw|Կ|iehm{rQB:971-.8F^ydzvaMBBHKPNH@95038@KZgw}yk[_i{iXNLJHEA=:75059:<@GIJMTZ[[]^bgmtz}xleZUUVTRNIFCA?:61-'#!!!%+)$$*2:=A@><6/'#  + +!%/_{uqnheijjjjhgefddfcXG:;DNSJ<44521353-'$""%!%,5<=<==?CGLPTY^cegjljgd[TI@;:::971+$"$')(')*+'%$#  $$"HmursH(".870*)&#!%+.52+%   "+=Y~fRGJKLKJE9-*165239AINRTV\elr{zh\Z______``__``_^^^_bfhggghmurlmkhddfhhglklns{{pf_YVTWVUWY^lzvmmia^``\\]][Z\`dgihh^^WPT`a[YTRTVUSVYTRU\jġtL)#*.242246;?FMRX]agimsy~xrnnwz~~{tq{}{ulL0/IUan{{yjVT[poi_RIFGBA><63.*,0884RֹÞkG8777764322358;>AA<;:<==:B@@?=7/'!   8m{vrniejjlmlkihnigih^PFNQWYOB::31/01/-(,++,(")2899:<:=?CGKQVacejkjgcYQE=9::;740*$"#%)(((+*&"$"  #'&+Ebyofrsx{{S.".88,$%!"')),(  0JovdXTQNKMLB5.5:8203:BHMOSZfpu}nda`aaaabccbbccbaa`bejllkklovxqpmiffhkjifhkoruuvj\K<2.+),-/5?@AB<;??;;CEIKNRVYYaccfjs}~si\ROOONJD@>>;5/'('')('%,%"*,)#$'*168;=>;<;;6/%.P}}xromknmmmllkkkiikkd\Wc^UJA=<>1464,&%%)+.++.+4;99;1*<<5EBRRUZ^^[XOH?<=>=;70(#$($!%+..+&#$!! '($' *59VxaZintslc][yb?1KK5++%!'*)$   5Vwnh]QKNPG;53:DC84;60-4>JUe}ukfYIBDKFB=85205332-*&$&%+))WñҥuE200220./01/049=@AB<:=;75=FIJNRVXY_bdhmt|yqbTMKKLGB<;;841++))+**(-)%"02,"!&/1469:=@B@><80&  ;f~|wsrqonmmmllkkmkijie]X[XRJB=;<;0&&+-$-)'& *712GDPLOJQifhv{zwqgZMHEA>;%,/'#*&(+,*(%$  &&$))28Qswhceec_WPLJ_teNI]V:-+#!!(*($!!" +EbxbNGKMGA88>HH=9==ACABJS[cdksz}xjffgijhdbceffdbccilqttrqrqv~{wwrlgefimnmkkom`J:   #Cbo_WUUUX[`ipohga]]_b_[[WPNT^`]]\YWWWVRQWe~kC& %----(5>=567;AGHEA7/),4?N`}}pe]PC>?>;97520/10/-*'$#%&+&%F{Կd9)+/21.+-03-*-2;?AC>;;:758EHIMRVZ[\aekot{~yjYKFEHD?:77520--**--...-)"$57.  %)67788;>AHFD@:1'   N}zxvustpooonnmmoljihe_XOOMIB<98:- #'#%%()& + 4;OnqµümJ1,8D---#!%*)**))('"#)(*$!) #)/8Kcstoje_ULD?<;F\xtf^`m^=,($! %&(&   $(*  !"!""""#$"#5MkiJDHHGG==BKKC?B?>;5..5BCDGKNQRRTZ`egijbb][Z[]^|ojdcfga\^_\XUPNNT[_b_^^_[]`cdebbbaaedcflmnpswy|}xxrilüɿ~ywtaUV^[akt{}|wpicaVUVZajruroonlgc`ifccfugXVTV^irx|]LIUgyzyzvnxu{kZrڴo`ZKNSSQJ?667;AFIGB:0)(,5F[z|zym`UI>:;8565521/.-,+(&##()*)(9Te{㿮mN.%*-00+'*-2-(*18=?EA;:;:8:ADFKQX[]^bejmtz}p\KB?C@>;962-+,,)+.1440-(!%58+&-.69;<>>@BLJEA;2(! ![~zxvvuvqqpoonnmqokhghaYIKLIB;63+/.% +#+.'#0DNWk~sqdN/13+$! %'(**++,)$(5P]XD'$(,.:IXhrpkjaRHA>:9?Oakjeeeem\:)%!!##"  &'&%%  !""" !" ".Ed}kHBFECIGB@@=401,+*+)''*.-19>BJSahv{tmkmqqolllkijlnsx{}|||{xxyslkovrj_Y\eosyvrmg\J8)! ###%*.6>DMat}z~t`QIHKQVUVZ_ab^YXY\]^VRLKS^`^]^]ZTMLPV~G!''/697568<<=?AFIKKLPTX[]__^\ZXWWWxphed_PECHLONMNRX`fhc^[\X[]`bcaa_`aeedflknpsuxxy|{sjix~|{z|dVU\V^iu~wnga^VUUX_ejlihdbbcb`_]]cl~žia^\^djmoquy~|~cOIP`mxxxwsj]Vq{ykmswtjZPp̟sZPKDR]WKD@=:;>BFHEB=4-)(-?Us~ywti[NC:761///-,**,,+*)'&%'((+134:;:HkݰkYF;+)(*-,($%'/,*+1699E?969<<<:>BHQX]aacegjq{raOC==>><;60(&()(*.3671*$ #-0$,4672'&*,"&*..//1* 0Ctj. !"#&(--AGOUX]bdekX9*##%$  !# ! %3IghFBEB?BI?4-$*1/(%%#"$##&-:ARg|vppuy{slijpttsx|~~~z{{vnklpiaWRWbpw|ztmkg]PC<8;>=>AMQVZZ^iu~yw{p]QLLOQQNR\begd_]\^`aZUNJQ]a`__`^TLP[lɼp>% &+2555577779;?BCEEHJNPRUY[[[ZZ[Z{tqlbQDKPVYWUUXYaefa\YXVWY[]_^`__bffeglmnpstvvwyumfemzϽzzyxy~|¼¿l\VUSXcny{qib^[VUTW\`ab`^ZWY^__SSWevĺncaabdgfgmpruwvqnhhkuhPGK[gopnjbXNJgr{d[`bf_UNSy޴]KC=AVdWD?A@=82,'(7Mj~{wsmdWI>631/,+)''%%*+*)''&&!%#)3-$*,+;bψUA722')$$&'&$$$,--,.036C=4/3;=<9<@GQY_bbdeeipz~}|tfVG=7:;::4-'%)**-05651+&##%"/89;@HLMKKIIHHE>4)"8o{xvuttsrrqqpprrmgikbUGHGD=4.(&))%%1) $>cʂώRGVZUSRfuwrA##162!&+-...1(/Nj5).2,'&)./=LXcjgdhcZQKFCCBBBGPZbekmY;,# "%&  + !  !" .@VraE>B?985/% "16-!,'$"#/EZiu~~xwy~{rkmv{yw}}}}{tnji^XOMTaov{{ulkojaYUTY]^`epstqlkpvyutx}qeYRRSXWTSZfkknlheaabb]YQOT^a^YY[YPKWiƵ]3"$(.0/05112469<<;<=ADIMORTVY\^`a}vlbZcdfe_[XXW\_`^[XWSSSUVZ\^__chgghmmnpqstuvsojjmt~ý{iipty}þ}m^TOQYaiortwskb[VSRQPPSVYZYWVSNQX[XKKUkĽm]]^__`cfpqrssohc^ajyhNBJ^oojc\TLD?RdwmMEOOYVORaɓ`E=92=UcUCAA=;;=ADFD@?;70&%/Fbv|xtof_SE93.*-*'%#$$%()(&&&&&$!+$-99Ik|F5322&' %'%$*-.*((.4G@3+0:=;;>AIQX_aacfgjqx|{}~|vm^N=27652.*'*,..03542310+"#07:=AFIJGGFEHHGB8,$ +L~{ywvvuuttssrrrrmhjmbQCDB=6.*'&#  *0=W}xh]y"-t߶^ZdiiPH>2,De@585,('()()(*/%%Esۺz5*253-*,..3=L\fgdfge^TLGGIDCADMYejooZ;-% $%! + "%&'$ !!"" !,@VllZC9;;60!!),,,)/84'"840-%&4?KUmtz~}}{ssx|||~|xrjdUQJJQ^jpvxrjjqnegeku{||~ursvzwqpor}zph^WSUXZ`aaaeostusokebab_]XV[a^YSTVWPQfö|I $&%(/-.0256665559<@EHJKNSX^bd}wsqmlie^VSRTVXYZZYWRPPPSWZ]``cihginllnpqrttspovw``ks|~ÿ~l]NOSX]befgc[TLIHHKKLNRUTTRSQLNUVQJJVsƿ\UWXXX\afgjntxxsohm||bF:Fav~rbTJB707Qq_=6BBSYU[pxG433+9R^QDC@8:9;=BDB>>;92(#+@[r}zvol`YL?4.*%($! "$&'&&%&&&")!!325Fiپn:.266))%*'%(,-'""*3ME6,0;><@CDIOU[_\afimptwx|}yreS=.530,)().0223452/4694""+25;>@BA@?ACDGHD;.$ &Z|yxxxuuuttssrqrnhknbOBB?:3-*(""#.Hiq}{mk~٭H0CicT]S:Eh\8,.4/+&#""%+"2\׭l2"553/+-5637>K]fcbffd^TJGJOHIHJNYgnpnW:-(%*(  +!$'*,&" !""(.:RkaTA57;7.!##'(171&+9@<:70(%%",5O^s|xx{~|zyti`PKFGNYekotqjkrqgjnv~tppqxwqlkjnw|tmaYQMPVZ]chlkntxxwvrngca`__\]`c]UWW\^Z_z¼[&!)-/03566543458;@CEGJPV]bewkplf^VOKIKPVX[\XPONNNPUY[_aehjjihllmmnnpqpmjywcahr~ľb[RNPSQQSQSNG=9:?=@EJNPPQQPNLLMMKIObxSIKORX]eilpsssvzz}kQ<5B^v{naXP@34FjuV=8@AP_l|љX3,0.(?JNML@689:==?><;9864/*-:Qh}|zxk[SMD;2*%!"&$%())(''''$ #+64EoȬl91>3./!(*($$'"##):ROB3/5;>BCDGLPSVX`hmoqqsy}{{ynX?/,.-,*++.2200320+6AE8" +"$136898757=4@H:893.9G<$,*3;8:?<@<:95115/%,@Ykt{~}ywtk]RC@?AJV_dhlqttohdekv}rqrprwzvpjfeiot~wttkaTJELYac`bjw}zsv|uniea^`[\dgddii_[^`kľz1 +$',36754544446:=@@CGLRX\^~thb_ZUOKHGQVZ\^_[SONMNPUZ\`bdhkkjjmlmmnonolifw¿onsxûudZPMLHFGFHG@7459;?CGJMMMONLIHHHIJVorNEFLPW_fmmopnjjmpv~xjRH:-(6UrzhXAPp}}sZEAGQatƻ߭~I.'(),CKKII>479:;=<<;:98761+-9Ph~yurgXOIA:0)" %#&'))*(),*'&')*,15SǤi<2:+(*!$'&#!"& #$,>[XNA:=@@@BCDHLORV_hmnpprz~|||{p[B2.0/.-.0353/-/000BDB<3/# + F~{{{{wwwwvvvtnnmjoqdQC<<9//3/+# H|oqh_dt~λU)3/#$(2HauҾd*,M>./--.'#),-:UukWR]fwzlWI;159/%)AZp~rdgx}ywmpuxvgZV\hyƲܶ[9,##1LNHCD<2489:=<<<:87883--7Oh}xrnjaVMHB;0( "#&'(()''-($&+-*'$/TɲV4,1" &&%&%#! !#$$&,>\YQE?>=>:50/0008@HB1!$',1579;DDCC@=96+" &\~{|{|xwwwwwwuqpomrufSA986-.3/* '-HrVQajw_)(77663)',?XtּoG9{h8#$-4. /BOOJJPVYXVTXg}lJ1*5:GVcfea^a]VQMKIJNSY]`dikprZ7(#!" $)*)&" !"!"! #.E[woH<;>@Slvɝuwrf\[de]TIFPVRRXSI;1*&#:Vq{uj]M?7./5>IS[_^`dlqoe^KJLPQNMPOORZclyuog_ZZ\^`ba]ZXRJBAIZnxridgp}}tlfcbfgkqroquqbTVo¿W( #&'*-011246688;<@FKPTV}|xqqmf`[[\\aecbab^VNLJKNSY]`behkmnonnnmljjheZRc~ºͽq]RIB<979:86346;=>@ABBACB@?<:@HXr¾bF;>CLU_ipvupiegnt~~wiUC=@Bbu~}zompijoyyx{콋aF2.!2TSH@B;34::;>>>>=878:60/9Pj}zxvoje`[UMHA:/&!#$&&&'&&(%! ""%Fv[7$#&$"&%$ ##"!"(8URLC>;:9?@@CFJNSW_gjlnprx|{~|teP?4.),1:DMNKD>840/19@@2! +!" &*/59>ADFEB@=<;<2)  0m~}~}}yyyyxxxvtrqouwhT=653++.'%'Y}m`ZV_ۼ~J7:BGIEFU^ZP@58<::>9@Oez}reekw~tmjiiow}{umjhd`nj6 $(+-024777;>AFJPSU~}ytqme_[]adijhdbc_XMJIILSZ]acehkmopoonnkigddXO]ssp}{Ļ¯{f[UMDA===<:867=>>??????=<<78DQjvXA69?FNXbipojfeku~~wlbVF8)/9@;66;Vex{wllpkhn{ɕeL;/.5WTG?A=59;=>??@>>767;:55=Vo|xupmhc]XVVQJ@7+#!"#$%%%$##"!$ 1ObdN0(#%& ! !'#  .JHGFDDDFIEBADIOTYagjkmoru{|{vkZH8,%(1=LY^]ZSI>7259>@6& %''*.4:>BDFCC?<;<=>:1& 7x|||{{zzxvtqpwxhR:210)'&'#>ýkQmķ`3.0:7,$+Itwe]`gsnQ>.%*8H[gid_^c^XVVVSRTZ`egijjvw`@,  #(*++%""""" $5F`v|ZHMZsĺ`JJVi}}{n]G8)!6HlumaP?0(%#&,7CNTWYX[dnrmf]TIB;8;BKVakuzlf_WRNMMMLID>9538G[pxkhis}}tpoquz~}wleem~ɿwC #&)-046778;@DIMO}wrmh`[[^ejnnkede`ZMJGHKRX]ccdgjlmooponjfc`bWQasmiy|vzĺȳphe]TOGFC@<:98>>==>>==<:9:7;LbjN<248>ELT\gigcdhqxtnaRF=3(#.;AEJSWY]cpz{tuqy{ssvpmp~þ÷lL=3,)%>QQG?B>:>>>???@><755;=<DMSUW\[SIB@ELT\cgjjjmqtz~zvpaQ<.$)2>N\ehjf^QHC>;<>4%  $%,16:===>:;;:::<=?8-&  >~~}|zxuqpwwfN5,+)"!':sT:W˩vE.!-Ut{laRB5-)((),4?HORTST]jtvwnf]YURU[clu|~vn_\VRNLKLJEA<5-,0>Shx}wqmqw~|uszzz{yqsQ + #(,/1246;@DHJzvnh`ZZ_glonjebc`YLJGGJQY]ddefhjlnpqpnjea\\TScqhfx}sv||{}÷Ͻ|yzrg_VRMGB?;;==<;;;<<;87;9@Xsz\C4/136;AGNZ]_\XWWYQI=0*($"+5>Ndzsd^hw}yikzzz}zrteH?:5+%2GHLEAC>;C>>>>=;:9734:ABEPn~}|yvuqmhc`\ZTOT]]R@/! !"$(1-# #4:JanqtxreRB;?HQ^ehihikotyxuthZB2)08?IVagornf`^NF?=2" #+/366400.1478999@;3-' D~~~{zwsqvvbJ3&!4xTKn˯^@C[szfO<%/=h̹jN9;=;=Hf{qgc\ilZA502=EUgpoieegeb\WWY][_cghlortvfM=, %&),.-,*# !" ! ':OohW^o}a./)'BgƺwX=$:\ztdVD60.//0/.2:DJNPNNT^jtyvutwwstw~ytqi`RPNLJKKLKD>92,.5I^u~wpmot~wty{_) + + #%)+/37<<;:::::;77;9.#%:L@FD@B==E===<;986634M]nvsmiikje^VUX^]acfhmsvqsgRC2%&)()*+++*'$!!$&&$!  !&9Nlp]Uh{vϑ7-.&;YºmI'!&$)Jy}vo_O;/-13453/08@FKNKHIP\hqxyzqkh_VIIGHIJLMMG?;4/4=Oh}xoigly}vss|ǿi1   + + +  #',046{y{mf]WV[`cgfbba]XQIGFHNTXZ`bbaemrprnklf\USLSU^kjkxtkglpsu}ŷʵ{uoiedYHBCHD><<>=<;:;=EY}ƾkI4-+*& '"!&($ '(34V~[Tgwzmpw~~}ǽþ}Q71496.%!,?LD>=AFGB<<::;<<973579=HWg}{ppqrkb_ab_UJK]toB ! ! '>ZudC-1BS\bfgiloqtwz}}zz}ynfJ@9<@DLT^bhlnoqulh\L=54112676345::85/)#!',39<94/286*""3[~}}}~{xpv{cA) ,IƊ}Կ}dXen|ÿ|hI+&9|}eHE;),>96NWK=:JmâW/9J^m{zuromhihd]\]__adfgkpsrro`?#"-+('')+*(&$"!!#&(%%$"!*B\r|mUQ]jttw~yǻb-'0.)D}pY:""$ "-`xk`ME:56;>@74248>DKLHDCGO\ht}xi^WTOKCCMWQEC8353.3?Yev~xplt|{yqscn¨{y¿u4 +  #&)zyzle\VUZ_bc`][ZVPKFEFKOUZ\`baaemqqqmlmh_YXX_agqnlwÿshflnps|þƻu}yoln{~yuq`LCEEB?>@@?<;8;BRkžgG3,'#    1B_qVWbjfgksvw{~Q81430*%'2@IC>=:72,'%+15:<93/,42' 5\~}||}|xpvz`=%  !!\ʠؼ_OUh}¿}gN<'+_ռoL0$( (522=]{E=Bcr~~yuspjigc^[]__beghlrtutqcB$ )(%##%%&$#"!""#%&%$"! ",CZoyxT=CVqmpznG &12.5jξv\=)! !$(UteYJE=9:>CG:6456:AGLHB>>GT_lvuh^XVRMGGNTNB;548628DZgv}xpkpy~}w~zw­qaJ>FSŽ|8  + {xxkc[UTX[^_\XTQNIECEIOTY\]^a``bkoonmmnkebfpvux}tnvɸrcdjnquĽ~xus}{plmżyaG:<==>@@@=;825D]z¼bC0+/) 5Xo`KMVZYZ`djt}ÿ}P4/0,'#%.:EHD?=?BCA=:889;;:858<95/+('-03651*''/.#8^}|{{{~~}yqvwZ7  #++[}UKSnq\C)7fǺ|[8( $'0;OtȀMGQlx{yvskjgc^\]__cfgjmsuvvugH(%$! !!"#$$$$#" "&/CYkt|`7&7TngW_otR:&%05/(*YعzZ<0)! En~xreWLA>:659>C952444:CJHA:7=HQ_jy}rg`][VSOMONE:128@>9=I\jx~yxphis{~xz{|ĹrH1-+(2?HQb{=!!  + + |xvjbZTRUXZ\ZTPKHFCCGNUY\^`_cb__fjjomnokjpx{ovÿ̽s]Yait~Ģnlifgnu|y{kabzƽÿĺ|_?/0238<=<95605Ji}_A-&,'   #'HvrRIKKHIOU\htzL/)*%#2AIHE?<>@B@?:8899;98:8*B~⽝mI/21 5Uvxme^SIB764/+,/5/*(+*)/;FHE<57=AOYhtz~{pidcaZXWVQG9.,5DMI@AH_ly}xwpfdnyztwɷQ72& +(   %-;FLjzcSL>>@FKQZdsÿzK.'%#6FKIB@=>@AA?:9899:87>@EKTalw{xspmlhed`XTTNPUd|{^H9%""*""+3898:99998753310//..+,-013434:73/% .Pv{fG/)5DON[fnpnigmpsuy{}|}{{{|}}}zxuuwxvsmcTGCGLOWY[^`cgiihgge`[UNHE@=;:9:840,*))..,,'#%% +. 6etQ.-7' $*>e{p_QIB=:0/-' " .AIKC:664?GS[_bglpwywy|somki\\^[P>.%0@TZPA>Can|~{zrf`gs{thfw̗N4:22,%!"%''%-9FTh}D  yujdZSRSSTROJD@@DGNT[_^\[]aegbafkmsssphgssygOOc°xgcyƺ¾xza<'"!$),*(%$.3Ef¿sW9$ + "2FSgu~yupgYO99KMH@>>@ABA@<:988864>BGPYdls|}zvrnljfcd`XQOHScwlXG.#%$)  #$%*2:@BA>2/*'&$! "$%$$+.-,&)9a~fE0,9ENKXdlmkfdkmpsuxyzyzyyz{{|zwutuvvutl\MGJMLUXZ]^`cffefhhe`ZQI@;777531/,)'&%('&$!#" =a}}||||||}}~{|||xuvlJ'!,1,(2p~:#'-?h~{qMcdnwZFCHITbe۰bSYo~{|zwplda___`afjnpsvwusvrZ;(&!""!"%%%"! #$%+19FUejmnmpx~zdA")151160,45-&#!2DNMC3&">p˷iN5+7*%+$+Rwn`L<3/,+$%"  $=JQI>94.5:ACDIQZ`lrqt{uutqm__^XI7*'9Na`O>;@bq~~qbY]ei{q_PLTcne?C;7.%!!!+0-2EYf]G78@cszjWKIJKXOA72368R{E@592+(&% $*-D_öK!!  {vmf]VRRQRQPLGCGOUW\`_YUTTNUZXX_hksxzteVZc|~}xt}çDzĻ}~nL5, !"9Hf{bH0!&+)&$*495489716=GVk~lWKGEDD@==?><@ELVfusE# 8KRKB8;?CDCCB@=:875217=HUbkquy}~~|zywtqmkigcbecYOJMemM>-'&! %+/10-,,+*'#  (:XtqN76AHKFR]ehhecefhlnqqruttstvwwzxusstuvvqbRILLGORWZ[\\^ccbegfa\PJB>;84/-,+)'#  =`{wxwwwwwy{{~|zzyyvxxkF$!*480&8x[!&IoztR20SʯƬΙnjjn}yzywrlda_`bacglpruwx}xyt^>(!!$&%&%&%%#$ #')'(-2:FSaeeffjs{s_>%')$"")30-4/&(7;107>LTSNLE>6%'7NWWM=6;>;3/23*&1 7SWYF;/'$$#"%%#%'&# )=NUK?<72010+)1ANUhrqtxy||umc[RG7-1=N_gY?17Bcs}taJ:621=7-&$ *^GD><82-(%"   .?WpM  !! }tmg^VSRRRQOKJKOUX^\WRNJGELJMQRS^jov{u`NNUgmrttux{ƺ}~wQ6-('++&",B[v¾wY=)%*+)*8ELMKHDAMQZhvudRA206FDBA<:?HMT_hnpqskB$ (;IMD848=BGFFDBA>93/.17@LZfnqs}~|xz{}}|yuuttrpmji`_aidVNN[q\E2%&!$$".14773,(   +#7PqlM74?EIDMTY^acdeedghlnprqqrsuxz|yurqqrsvodWLGGIQUYYXXZ]aikgba^\YRJFEA:2-*)(&!  8]xtxwuuuvxyz{|}|yy{xuvylF !#&+35+!8vR8Js_E)>w粙z}|~zqjec`^afhkoruxzzvxyp\C,""#$%'&$#" $(+/+(+07CPZeg_^isxsZC3,7A=9;?B@:;@HLIDEKMILLNPQPLIA<1&&.(#$+7DI=EE6!$'# 0HL?=80*''&'//049;84($$#)?MTJB=:4861++6GUgmrxvqzzmd[TI;-*7FUXWO=17Bdp|{mW?*(&  % :hނKHA;=:731-)" 'KcǼR*$$#! "%&#'%#! xqj`XSQPPSQPNPUZ\]WRKFB@>CADHIJT_kpvo[JIQ_elpru{~Ƶ½{vyrQ=9669;5./7LgnP7&"&(-CMSUUVVW[`hs~}pcQDBIPKEB=:=CMRZ`dffi~f= /@IJA7.3;DHIFEDDA;51028BO]jswy}wwwxwvspppopmliia_`f^RKMa}N5%$"$+0025762(   + + !,A^wxaI99@CAAIQV[adedcbdeiknooopqsvwzxvsqpoormfZPJFDLRVWUUX[cjnjda][[WPMKH@7.*'%# +  +  4Yvv{usrsruvwz{~~~}|{ywwuvvxyiE$"%(+01+#6~kH<<8:73/0;LYlqw}zqpx}ui_SI@7/.:FWTOE719Dgr~wlY?$ '*'&*,"$K{oS\ZMIC?<;751-'!&5LcuŵR.*$""  #%$(('# ztmaXSPOOSRPPSW]^YRJA;866;;=@ABJS[_daPBCK\ahnqu|̿ſ|tu|oTHIIKPQLFFK]v_C0%!&.5GPY`dhikjnsz|ukdch_TGB>;:=EJPUY]`et}w~xZ4 "4,19BEFEDEFD@9434AHOV[`dea`_abfgjlllmorsuxwvtrolklli`UKC?FLQSRRTVahmga\WSWTPMKF>5,'$!   + + 0Truzrqppprstwwz|}}{{{zxxwutsoqsutb@#!',,.-*&8xR;Kn}zfE4E|ͽٶƍ{}{zuojhfdfkjmosuxz{~|zuhS8& #&"#&'%"""$#"""%#!"'*--%##&'0BTZde^_iqqkTC@@JMD@BEIC:7:FE@99?CDBDINPOMLLOPJ>3+( "'  *-*/>C=62.+*'$$&)+*(&%&!"*10(+5GPPD=>A?<;968DS`ou}{pmputk`XKA9436BNXPHA:8=Eco}}~}}uoaH&  # %*'"4SxˬUZsrZQF@@?><@=6/'  $,@e̽S40&! "%(*)'$!ztmaXRPOOPOOOQVYZRJ@84346;H^dinrwøtns̴~~r_WYY]dfd__aqsQ8*$$,6?LS\hmnnposwz{~}}kZG?=;87:=CIPX_gp{}wvvwswmN, ,GQLC92/27;?ACCEGFD=757CMYdmtxz|wzxrnkifeaabcddeea]^_YQWc}u: )!$&%""#  + + +  + %*! +)9JFB823;B@GOUZ_cd_^]^_bdfhjjlnqrtvuutrnjhejmdTE>=AHNQQPSU\bhc\XSOQPMKHB92,'"     +Qq~svppnonpqrrsuwxxvvwwvutsrqomnpn[:!).,+,+*;lj=8cuV<6Y꾮ķۼy}|~yupkjhegjlnqtvy{{~zyvn[A-(-.,)))'""""!!"!%$"! %##&)+,+!! "$/CVZdeabltsgM>?CLPHACHKE=9;<<:9DJHDA=83/("  !*-+1=A<5/("''#(3HOPE@DFE?><=AM[grw~wnoqoj`YSF>844<@C[jy~yvtsppkU0',+06ED?80'0DYoʶT6/" "&,))'$" ytlaVQOOONNNNORTTHA83039AFJG?;=3359<@CFMPROIDA@=CDBCHJF>;5-%  + $%'3DIE9/% -BKMEBEGCA@@CKVcmuz{vsurj_WSPC>845AXoo^J<55;A]jyztld_`dgZ9"2550)*4?HORRZsyiT@7667;BCA=7/(%#" '6L`vιV7-!!$*))('$!  + zum`TNLLLONMMLLLK=82019@EIMNLIJF@90(" $1?\bhlr|źzgZXuǯyusz~eF/#!(2=KW]UPUY\dow|zy{~|t\B521.-369?FP\dnsvtpmoszwc>#4KPF<530.,,1:DKCDDC?<<@GR_hnt{~yvtpjfa_[[[\[\[]]_`\WTJJ[rk/ +0" !#   '1:>;50/0121/,+'"! #+6>=3' )AF=8:@=CHNTY]^[YYY[]^_cdgjmopqqqrqolgeaimgUC845J{ź{wqmmjffjoqtwx{||{xvvo^D0/594.,,*#"!! "#$##"#$$&&$!"(.0-)#3I\]eigkuxt\C568=EG>@DIE=;>31279880.:Fdmurj`SKMR[X< #),(.DYht~~ymV=1*&(/;=>><831,*&#""  +%/:NnñT7+ "!!&()((&$##"   + }zp`SKHFFLKJIGEC@63//3,!%(*.6EOYaijlmmnotsmW5(5HKC<8741-+.5>BAA@@=<>CMXcjlotwx{~|wtrpkgca^]]]ZZYZZ\\XTQIMep4#,/"# +8IV^_deV@?><::83/&*,'.74255) +5AA;879<@EJOSY[WVVVVYZ\_aeiknooooonlkhfdhjj`O8+6;?ABFKPZ^_XRPNONMLHB>:7.'!    + + "BfxmpkjihhijklkkkjkkklmlllkjjfdeeYB.$!&(')/3244?Ogzxr_C3>\þα|xsopmhhlprtwx{|}{zxtjV>+*150++.-$#"!""$%##$%()++*%$),-%! #8Oa`hjgltupV?5624=A?@DFA:8<84366349=ACA@@ELQTQFCHG?B?:74.*&!!! ,CW_NC7/,--..-,-/001,#-;BD@@GHDGGJR\hsz|vwtvrfZVPKA817G[n{xiWE>IUfgfbZRG=@ERXD",40&$+39>=7214CVgt|~v]B1"#148;<<:952.,,*&#""1?d¯P0%  (&!!"$%%$$$#$  +}rbSIEBBHHFD@=:630//4>GNX]\XTSK@1%#:Wnuwwwvz¾Ĺ{raTb}ļٿXH6(" !$ /Odghmsz{x|~vxpSA8434158=FPYbdcdhlnpugbM-)4EGA<;;:72--058>=><;:97-'!  + Nk½~{urrokjnqstwx{||||ztfQ8&$,0,)+/0%$""!#$&#$%'*-./3-(*+( #;TebjlhjrqjS=68108=AACD>86:=736535=:?B@@BJQIONECHC9A>9530+)#$#"&&&(*$ %:R`VK@721/-/+((+.-,1*$#->>DE@BKMJILOVbox~xtwospe\WPIC6.;Ujw|x{}tbVYb^ZWPKH?6>BP[L*&7FGDKY_cdb\ZYZ\fjqzxwiL8%!+-26:;<<975554.*$! #" $8NbyҸK) $0,#" !"!!#  + + }um`TG=:>BCB@9312//4:@CKUSSUUK<:>.3>Pi{tv~thfcd|ô{rS;*%!! #$ $<9743578<9769>EMZ_cedefffhloonlkiiijjf`[\\YVTTUVURPPP]zvD2157%! %1+( +.ixYVU=$*)!0;820+% !GMI92D[hrj_RF?:9<=@BFJOUVURQRUWX[_aegjmppomliiggfjghn^;)101211=JYaXJHFCEFHE?<<;5/(    +7]srkihffghhgdba__`bbddccdddecfjgO1(.$)*-486329Mh~ƺyuvdJ55@Y俻ү{xspkkknqsuxy{zzyxwthT9&#(*&$)01&((&&)'$&'(*,/014,&**# $>R\cgggmtnaM8/303:;>@CB>;9777789:9;;>ADGGGGIJIEB?>>==<:740.$'*+)))-.'&&$3MYUOHC?;9882*#!#" "!"*8BDOJEFJOOMRTZdnx~zwunjd`\UMH?4.=Ypwsv}uljheYLC?<985<83355/+%&$"  &=>>@>=;:97;5448?HO[_cedccb_`acccbceddffc]YYYUSQQRSQNMPVexA+.:A**>JC1( 0Uۡq8'3.,06?GF8)$&N]ghkxvi[PGA>?BDGIKOTTRRSUVVY]`cfhmnnmljhgfefhfin`A-*)*-**6EXaXHFEACCEC=:;:4,& +   5\ppjhgeegggfa`]\\]^_aaaabbcdcgidL0&+%*,/596418Kdy|vvfN6/6Qٸɦ{xtpllmnpsuwxyzxxxwshT:(#''" %-/,--++-,'()*,/0333*$&&  $>R]cggelsk^K6-203::<====<9631*,..,++02)))$2JTQKGFEEEE<5+$!$(3BNPSJFJOPPSV[cmw~{wurlhb]XPIC932@Xkqmqx|smhcWI>962139IZXB1++8Maijnu|~|z|~wdM2 (06:;<61133.*$$#"  #&.9Y–X*,+/55117*($#""   }zn]PC:7:9<==9765218HTXYWUQQYahpwȹx{{qeckyįu[<,!! $.7@HPVWK=Wp~scULEDFHKJIKPRQRTTSSVY^bdgjlljihgecccefjmeJ3"!#'$"-=WbXGBB>?=@?98983)# +   4Xlnihfeeffec][ZYXYZ[\\]^^__acdf^H."$ %),0795428H`ry{y{}{yyjR9+,Iȯֿ{yuronopqsuwwyxvxvurgR;)#$! ),-/0-,.-))*+-/1224)"! $?R]dgfdkphZI1).0497;>@?=:8744445689ACEFGFEDEEEB?><=>>>><97502320/.14,++&1GOHEDGJNRQF=2*"%+3>OX\UIFPTOQY^eq|}xtqojf`YRJB=129GXehfjnx~~xph`TF;41-,26CV[N>31=:89?MVY[^X\aoŴw|~uiaevҺgM0$ " (3?N^nxtiZSYeou~g[OKHCBBEHLPRTW[^bhkhc]]R>''7>BHF>;::@CFGFB>;74339CPZ^abcca][QNJEDFILQTWXYVRQOOLKJLMOJFFUlvN>+%)9^doxxylTRNIF;' 7WyT* ' "S^egfejneVF.&,.376;=@@>;985444579;DFEGFDCBBCCB@==>=>>?=<98677520036-,+&0BG?<>BHOUUOE:3+#"%'08>FRY\UECPTLQ_fp}~zupnmjf`WOE<7'1?MX_abcdiptri_XNA60,+,13=N[UE5-8Mfuy|~mR7!+68881)')*'$!"""" %#!5ZlYUQ@01.(%$" !q[I<2/24;?@DIIDNOPROOT]tͻw{wpnnnDzӹҿŽɵ¿zY@$## &0=Oey~pfdhnq{|`WNKHB??DHMSVY]_^bhjgaYWL7  *:CEID=;:9?@BBBBBA8768>GT]`bcedb^YMG?969=@IMQSRPMLKKIHHKLNJFFYwwB+)Bjx}]H?96- 1GVU2"/6*;Ze^Z^aV=)! 1<810'&&!.Vvmc[UQPOLMMPOQQPOLPTZ^acffddeedba_`^dhdi_D "(?ZgZ?67663764220*   8Vfiihgefecb_YXUTRRSTUUUVVWWYZYUL:(#'.31-*,3BVhrunsx}ucTLEA;51111R]cgfdilbTA*$+,044:>AB?=;;86557:>>=;:::8631/27,*+&.=A857EFGMOONA?LQLRcoy}wsommlibXLB83$3GU[\^__YX\baYQMF<4.++-./6EVXG3(0C\ovy}{|{}v_F, ,8967.$ !#! !!!! $0CZjjXK>2/-+)&#&$!"nVD9103;DGHMTSKOPRRORapμx}{yyy{}~}|neeqаʜvl{ȻʼlJ2""'5G`xymfgkov}v\TNLHA>>BGMSWZ]`]_ehe^UOC/.>FGGB=<<;=>>>?ACD<<;>CKU]bcegge^XJC91-.38EIMONJHIHHFFGILNKGI[}}O:;ZdA2" !"-/5'4FJ4'9]s^NHUhiO7!%,21,-.  Euula[XVRPNONOPOMKNSY]`bdebccddba_`Zbc\ggK#!(E_k[:.012/21-+-)"  +"Rcmqkqyzl`YUTYZ]eu~dK:1&&)+0368:=AEMZjvv^C4-<<<:778:=?DFFEDA@??ABB@?@A=>?@?><;;;9720036+*+'.<;621573-&(1=FJGCDCDH@=GLNYkzztomllmkeYL@61):P\][Z\ZRKKNOHAB=82-++,*-2=PYI4%*8Pepw}z}}|~xiV<# +4?>95+ !  )=ew_J<:52/-*(-*$"%'zgP@8348AJMKPVSIEGNYewɴ~}vvusrquvx{yz|}xphnruwsolkkdWNUqȪԽeb¶~n|u{ȿ}]8""-@ZuukihkqxsYSNLHBABEJOTWXZZYZ`dbZNH:(3CJHGC>?@??@@@ABCD?AADHOW^ceehjhaZKC8.+,05BHKLJGFGDDCCEHKMLIJ\`SLV{wx_H5% + /-=E7??9@XotTGCSkq`L+2761.*#=d{pid_XSOOMMOMLJMRY]acdd`bcdeca_aW_^TekO$)Hdo[5'+-/),+'$$  + +(@Xdhikiiihea]\ZXWUUVVTTSRQQQQRRLC9.#%,0+%#,:L\fkhmv~{i`O>1*((6:BL_wjN=76:COZdkn_VH=@?>>?@@AABA?<;;;:631157,*,(0<:6.,/6@HKD82/)"&3=FJF@==>DA?CKVes}wplkjkomfZK<3/5DXa^XWWVNFDDD<6;:72-*(+',09N[N8%%/E\ku{wpdK1,ALIB4)!##! ".FQhrZOH?8544420+'# $'*+vbK=859=CKNKMTOCJLViι|suspmkmnqsqqvysfZcgjjga\\YSF>Gm׿ýfky}{wonsϼ¾uS.  $-?Yt~tkecmurXRNMJEDEIMQTTUUTUW\_]VJD5"  7GKIICAACBBBCCCDCDBCEINTZ`efgikiaYME:2-/38CGLLIEDEBA@ABEIKKIJ[}ZJGZ~}wm^WeiWN?1+  +&'6I@6?=;:;?<9879<>ABCBB?><9;>=<<>>BBCCC@>==<:741359,*,(/:94,)*19BGA5/.'$17@DA;::M\c^VTSRKCA?<6/6542-*(*$,/7K\Q;""+@Xju{uslU:*&)9NWTK3(  + #$"!(,&9fww]TG<89;=7753/*%" !#&)-.0oeP=669:@ABEIIA8ASnĴnuprqhmqjjoqpomdZ_acb[RMMIGB0AnѺDz}}ovȼ|}~~|rov~ͩfA" + $',?\w|ndbkr}gWTMIGIMPTTTSRPNMQWXUSQI>2  !:HLJKJECGKIIGGHGDBCCGMUZ_aeffikhaXJD=7468;BFIKHFDCDCA@@ACDGFK\zqE#'HrwN6+=PRQT\[SA) +(1.5PkumaON[a[Y[T:A@:=?( + +  3Jd~yla[QILPQMMPSW\bca_bbbbbbaa``YT\hf[4' +!Pg}_)&$$!!""   .ER]gghjjigdba^]]]\[[[XWTQQQRRSZPDE?, #-*%8LW]b]\dmgO2#((&%%&$#*(+6JhƩjXOSWaq}gQFIWcrveE-)It}{xwuurqpopoprppqqpqpongc`[N9( !&-0,.*'$$!   -@MQWYZ`cXI2.,---.358:9899;<;:98999ABA?=<;:96446:>>?ACDDB@>:;;:62134/'%)--('%'-38;<940/01/-258;:;=BB@?GUfz}|{yvrjdbgjnh^UC304IT_^VPTYOHA=;83.563-*+)&%*,2ERI8"!6Qgty}}xwvo^N=8BS\c_Q5( + +   %,;SmxxkXF>AEED;>CB<621-./12211ufO>:::8==??62CZoʴwwprrjlpjloomllf^_]YTMGGKNME0Aoĵ||¦ztuxxpmoowЬ½|^9#!$(',>]w~oedks~{aUSMIIKPSWVTRPNLLTYYUQMC;1 '?KLHIFBADIGFEEFEB@ACHOX_cefecffd]UKE?;98<>DGHJGECDA@?>?ACEEFJYuvO()GWT;6:LYZY\XPA/  4?2/AW^O>HJW[OIID685:GO>&  -AZsui]RJMQROMPRU\aba_abbdccaa__ZW_idV8'(Vy`-'  + ,EQ]fegihhgdbb`a```_]\ZYVUSSSTWaWGHD0!,)%7HUZ`b^__VA,&49?EHGC@:404B_iWNLR]fov}|sgZSV`hrzmO5,Em~}|zwutsqpponnoopnnnnnnomic_^XK7&%$  (+(*&  + + *=KSX[[bf\O60-2897856455677::98889:=>=<<;::75237;=>?@@@?>;:;;;9534750'$%()&""%,169;<:778852468:;<=CECCO`p}{splgcaegicYP@539LT[[TRTXSKB<:71,110+),+)'('-?NG9&,H_lryz}zywpaTMKUdjmdT7* + +  + !!2QithZLEGKMMGIKJE?;954556678xgO?960,108B@A^Ͷunpqjlqmjkjffgd__WLD;8@JRQK9JvȽzyysvڽsprsmkjeco֯½sT3+96+1/*-@_ysiilt~tZQOLKKOSVZYWSQONOX^_YQI>6& +.CMJFEA=>AFDCABCC@>?AGOY_dfedaba_YRLHD@=<<=@BDDBAAA????ADFHGIMYp{rlW7$/24DWcebaaRC- #@J7*4GNE77.))9KQC3 + '8Pi~saVLMQRPOOQU[`ba_aabdcb``]\XW`g_P>)'Uc2% ! -DQ[dbfhhhgdccbddedc`_]\YXVVVV]lbLLL6#.+!/CT^ec]WN?529GQ`lplc]MC617PwiTKEIMMMOW\[Z[\_elr}dF3?_|{~|{yvsrqpponmlllljjjjjjkie`\[UJ8)&%   ! + + &;JU[\]ch^P:1-9GLFA53/15898887777898888::9975348<>>A@>;:887:;:843572-$ !$$!"(.48:>>=>@@<99;<>=?@EJHK[oznljhedehc\RI=78>RUWXUWY[[QF>:73.00.)(,-,)'#*=MK@-!!=Vgnuv{{sg]][hwxvjX;- +  + + + + "##  !8Vid^SMJMOQPONMKGB?<;99::<=rcOA6.)*+*0D\xȶsknrnotqiigcbb_Y[OB90.;LRXWEUyptrmq|zrfq»wsssmiifbbh֭z»jL/ -23BVUGDA88Hgxnnmt~kSLLKLNQUW\YWTRSUW\ad`UH=7 /EMICA<9:>BA@??@@=<<<;=?=<<<>>>?ACFIKJMPXkeROUL3%!&/GS`mxzZ<:Nwx||{yvsqqpnmljiiiigggggghfe_ZVRI<1'&!   +%T\TL93..5;;;765667785768899:87579=?@B?;8544467985313-'""%+157<??@?@AEMMTf}zmkkjiiii`YMA98=DVVVW[`cb`UH?963/00-((-//.)$(;MOK6%:Ugoqt{ukdbaqzlX?1 +   !" /GX``[QKJLMUQMLLJFBB@>=<>@B{k`O?/"$.6BJX~˽vmrxrosomnlgec]VPE92*&4HZbaJYʺtinnjmuoeauҽ~z{{|xtqrx~zyzwphjmia[ϣ~t|u_D-#$.>FDNacXXTJFTo}romt}aOIIKMPSUWXURPQTY^agkfXI?=<::=ENY_cddea^\YTQIHEB@=<;<>>?==?A?ABDGJLMNQSXhtN47UYA1'*;E\nohe\RJ;*""# +!+15Ljxia`TE9530+25?M`shH:Dvvzywurqnnmkihfeeeeeefffffee^YSMG=60/)    +  "7HLW^bjk\I:/,AZd^TD;20278765554566667899::9879;>??>:63211269<<83/.)##$#").248;?AA@=;???>=>@EOQ[p~wkjiijihf_WI;5;CJ[XX\ekmlbWH>851-00.)*-000*#&6GOQ?. 6PblorxxmheeuxhS=1! + !!!#&%,51' -BhsrU]ʲpifjllmokfm{}{{~|yx{~~~|slmqndZjĖrx¿iS;+$&2AGBDOSPaaYU]suokt~uZOJKNQTVWXSPLKNU]dfloj\JACG32FIE?:85779=<;===;::>FP[bcdcec`\WSOHFD@?>=A-$4Sl}vfUPSSTUQSV\``^[[]_`_\XVUSSTWYXVQ8 /hr   +!!!';KILW]efeeca_^___^]\\[[[[]^^]^i|_SL8%#"%.+##,A[kppfR;.1>GPSSOF>:9CEFFFPh{of^]__XOGHN[npR?B}vvvrqomiifgffdcccccddeeeeec`[VQJE<5:82)$#"    + 2AR\chno`L7..B[fc\RH<3////6654444588788888:868:<<;75210244;=?=82-*(" &)& "(.139<@BB@>=?>>==?AGPVcxzukhffgeca^VE54?KR^^_dlssqcWH>840,121+,010.)##,;GRI7# /EWalot{|rjlm{scO:1& %%#   $3CU]]UOSXWVUSSSSPOIIGFDEEFxr\@+!9UƳxoy}tqnzztmjje_L@73(*?ssr˿ofbabfmmjimw}~yxyz}}zxwuoifgkos}|{{}}|{zvrprrmgg鹈sw~z]F2$*5<:7=FO_c`[`tulisjUQNPTWZZZZTQMKOWailprn\HBEO;!7HHC=:87666>=<==><;?CJT_defacca[TOLHFD@?>??DHKLKKJLLMNOPPPPVUSUd{z`?)6a^?4-/IV_innmkjeb[SKFEE<>;44=GMNB;@JRW[\QXfnskYDA<62138CDDBACFLP8+:XmyziXQSTUVRSUY\]YVY[]^][VSNPTWXVVXX9 :ph  +  #%&&3IRHFSZbbb`_\ZX[ZXVUVWWWWY\^^_`khVG6,' !+)!%.FcswogVD<@CBAA<4*&')EJRUSXj~yrrtwtp`aiusZEBy}xusonlifecccbbaaabbbbccccca[ZYVOF;1773-)))$%3EUdkmkml[H5/2EZdda]TG91/01876433229987554586556874654669;=??=72,(&(!%&% #)/46<>ACA?==>=<<=?@?>=CIQ[chhh_bc`ZRMJHGDA>?ABDHLNNMLMPQRRRRQQWTQScx{|u`E49ddG@:8OY^fkgaadrqlbVRTYftwpsaaxqnpmmgYSY\bioolfd`ZVVY\]B3B\nv|~lZRSTUXQRTWYXURWY]^]YUQHNV[ZUUXQ/ #4\[   +  + !&),0?UZJCOXa`^][XVTXVSQPPSSSUXZ]^_`lmXD51*! *(#/Jk|udPFC;1+-...5AJY`hiddqymfgjknq{}u^GCk|xuqpmkhfddc`a```abbaabbbbb`Z[^^WJ<1,/.+*..* "" !$" '08CTgxvxtlhdR>4/4DVaceaYL?536;66542221896632004422221/88:<>BDEA>80($#$$ "  $*18:;?AA?<<==>>==AEKU`p~ytqsnhefeb_YP>14H[ceimruurlbWJA;50,3562132./-($$->RN=%"6QdfimszypjiwypeT?<88;82,+./) #'$!   1DT\[ROX[XSX]]ZXY[WWVUTSQQ|`G15S}šujcb_WW[fost}kfp|}}vkfktnd]Q:( :fƽwg_ambabhpuvv|{}yk_RB71#%1BPW`jssx|wloyoʝ|}yxtwjG,".57@Pbc^XV_ryois|_U[_bdeda][UTRTYaipv|sh_OA?A/%ALFEB@<968;D@?B>:;EEMV`gihg`bb]UMJICDDBBCCDEIMNOPPRRSUVWWXWYXVVaq|zxsrm_J;J^`L;5AZ\cihdcfhqoljkq|ҾvhikbUU\ht|nnnmkgcbbNAK_nsx}yn_WVXWTLPSTSRQRVZ]]YUPOMMNQUXYYS- Vs^E + +    %),3;E^fOITP\[ZYYWTQSQOMLLNNOPQSW\^bmk[J6+%%$&''"!$7Xv~tfXSN>0**,26=KVcjpnjlu~uqv}{l^PH]rxspokihhfcaa^[ZZZZY]]^^]]][\S_nmcTC=6-&)/0* ! !%,23CQZcnrouj_ZRI@=/3=JV^eja\SKEB?>896433332433/,,,+-/1158=<;<>?ADIN]ju|{wtqnmjghic[SH=>GS`jhilrvxupaWK@:52/356631221,%!#-:HRB)!3Mbhddjrxvimsxwpd\NGBBDFB>9852/*!"'(# +"6FY_^WUZ][[\]^`a`_\]\\\[[[uVGAU|ƨfXMKF?;?GMMJOZ^Y[Vaqtzxriemvsk^Q9$ +.Oźk\\`jfgintz{}~~~xdR>1(   #-6BNeo{|rjnym~ܼ{{wwsu|~a;"  .8>DJQZchihg_a`[SMJJDEDCBBCCEHKNOOQRUVWXYZZYYXWXbpvvnljjh`SHO^XB54BZafjkklkk_`fsõnda\UWY_irwuqoopomjgedSISequxyz{~zo`XWXWTMOQPNMNNUWZ[XSPNMLMPTX[\T9)!jskU&   &+-4@LchRLSPVTRRRQMKNMKIHIJLMMNQV[_bk}hXG5+%$#$''#!"(<`wqh`^YK=89?>==>?ACHOUcnw~~zurpmmjghic\PE=BO[fpmnpswxupdZM@:520456642331-(!!(5COC-!"1J_hedgmt}wimsxwpg_RNIKORNJEC?<82+&""!&))$#7GZ^^XW[]\\^_ababba`_`__^_xkYW`~Ѹo\OHKOLLQ[^YSTVM@B=HY]dkjfb]^gsupgZG0 ,IŸ\R[cjnpsvy}}yl`N9#  +  +  $0KattkfjpkwԨ{{yuwsrxuT/  ,9CO_l`ZSUbp}~|~}vlisu[Ydkjjhfb`^XXY\bipvvtg`d\KD> 5DJJB@BEGIHGKHFIIFFIT[bhkjge_`^YSMIIFFEDCBBCDGKMNOQSXZ[\]]]]YYY\fopic_]]_]ZUV]M6,1CZgijmnolkdhtɽ{zywleaenttnoooonkhfe[W_ksuvstvx{}~{qbYWXWVNONLIHHIPTWWTQMMLKLOSWXYPE3(t4 +    )--0DSgiWPTRQOLLKKIFIHEDDFGIKKKNRY`ek|xbSA1+$#!!$'%$$;a}qrqonk^PMMPTROSZht|x|yl_RIE\wnmmmlljhffeb`^[XVVWVUUUWWXYYYZTiugO6*,.*#! +",:EV]^[TLB8<2("#*/7DMVZ]^fc^[XUROEB;51/..36896410./13:FR[ekibYOF>?5)"$8LVQ@0,'" #+27==?AAA@>?@BCGNV_kt{~{wtqoklihhhb[KB>IZfmsrtsvxywrh]NB:50/358753451/*"".3-4BDHMKJIGMYejje]VC%!/HyþƵTOakpux{{{}{zvgQA, +  +1FZache^hn}ϙx|xuxuquy}}|~~~pO* +=;89::=@GQ]dmpneYNB760'#!+IckaK:4,$!(17?@BDDB@@?@BEKS\fqz}~~{xtrpnjjifgh`YG?>Nbmopsutwz{yuk_PC;5104699765600*"%2GG>1')3)'%##!4UlocOB8/& !(07ABEFEDA@?ACGNWbkv}~|{{xuspnliigefe^UD?ASfolkrtux}}xmaQC:51/4799776710*!'>DD:,'4F[bc__hv{~~~~zskeUTU\fljf^YRMHC>;==;94.'#+>N\]_```befhhihiihhgffedcczgWs̿ynmsvvqnsvb5'%*(*-)-,/56547)4QS3'34DV{ǶnT_puywvuuuvz}zm_M8$  + /OedZRP_yyu{wwytppqrpmig__]]ajt|fJ.$'*&%!&4PfdUMJJR_kppvwvvy{tljs}igrigeba`aadfjnqrssj`QTikZN?"(=BBGIJIFDDHLU_ipwwmfb\XSPOLIIIIGEBAAADFILMPTXZ[\\\\[[YWYct|sdXTLECJWahgTBBIRagkpn`Yh|¸z_PS`nspoppmjgd\gpokjjioqprqsssuvwwxz~}tg[UTTTQQNJC@>?EHKKKJJKOQVYYRICH>2:uſY4 + +$%#'16.%A_jee`[]TPMKKLJIIHFDEGIJJIKPU]eiswgO<+"'$ "/8<5+#.Jehafr~}s`H7ObxuiuweOSZbijgehecccb_]YURPQQQPQQRTUVWXSQqudU@3+*)&%%&  + %'! -;IRRRX\[]\[[[ZVTQMFA<:::;?FKMNOQTW[]]]]_dgd]UK=1 ## *=Vb]PIE5/&"$*29ACEGGECA?BEJQZenw~}{|~}zzwutrpnlghecdbZQD@FYjpkjsux~{naPB9411589;998930)!4?F@2(-9MZa]]guz{tlg[YZ`iool`[TNIFB@?@?;6/($  1CQ\\_ccadijkklllkkihffedccvcS}ɫ}sjkqy~}|x=+$%!"$$$(-)""+U`A?HQhvulfc\VPNNMJIIIGEBA??DFIKMQVX[\\]]\\[YWXdx|mXUMFBGT_iqkba`]cbdikcbuɸxaST_lttstrplhe]luqjiklpqqpooopqrsssv{|tg[TQRSOOMJC?<DFHJLQVY]]^^^]\\YVWd{s\YQG@DP[jy}z{sfe`^bggkvcVV]ipsttsolge`oytkjmprrrqnnnmlopoory~{tg[SPQRKMLID>;:;=ABBBCDB@@@@=86MKA$E[ +  ((! !%(39/"KnqgkfZ][VQPPQPPMLJHGGHJLMPV[bgjjhW?. &"#5CHA:36FVVN_jxkabfhntqfhjmtyfI3Rk~nSXjosx}~mWDK]txlffdbaa`]ZYVRQQQPOOOPRRSUUOJht\H;1,,,)%  +#  %*/783&$??;6.(&  %0@O[^\`fgdfloopppponlkkjigff{nRT~ֶ}no{a@1.!%*C=2*(1>P`efktty{wsrng^]aghgZUOLJHC?EB>94/+(#%$ + +$%(0>MY_^aeijkkiqqppppppnnlkjjij}yoRU}ټsm{`NA/-0&#0Lekjif_N=Tƙtdr|{oa`ekqwypcG0  "" !$&&#   0HT_K@Q⾘vgddjrupjqmheedbaadglptwxw{~xB ?_p|vrnmvsokmtwrkhozxrxztxplfdflrusuwwrnlka[TW]]PA108HPNIIB9/2@Wrzmfgh`\TOLJHHLLIGCB@?ADHKLOUX]]]\]\[YZ]R]c\SPLJNTg|ym^ehgdivrgfimtjcfnsx|vrfZQS]gnlhhjkji_p{uopoomrsooqpmjmonlmqwzsh^WSPOHGFC?;851257864332'#+*#%:?E.(WS) +*+&" #%/7-Mroib[^YWWUTRQOPQPNMJIHHJMPUY_dh`J7/&(0/*"%$'3DMN^emw}dP@4.-1;JVTF60;HZgc`fqzwnVAGWU>>I]_aaVJGGZxougifa^\ZWVVVTROLJHIJLQVWTPI;LcweO?0,'$$$"#'=SlxY37R^`dedfaaa`][WUUUTSSTUU]___\[[]^^_beedb`]\YN@88EQL2 ))&&0&$#$%+28?BDDB@@DDIQ[fnquyzvtuusrxxwxxtplieeig[MEFWcmxwuxmZM?87888BB<9554783,'$ '3=@9/'.:M_eefjot{zwwxxrj`\_cbaYTOKJGD?@?<83/)'$%$   !##%3FYcf_aehjjkiqpppppoonnmlkkjjyxoTV|׽utxlYD>@;)#!$').4I[koong]H7Mrhu{sbP[enuwq`P/ #%&&$',020-+&'&%#   ATiY@:85113453/.*( #%;?C,#I~7  *+'$#!"'(07-Mple^W]XXWUTRQPQSRPMJJIIJMQV[`ccV=)%# (.*#$'*2>HKY]ckxmP=1'"0=;/!,Ecsk\X\lw}xvo[G=RX:/4LNPPE<@Eayfojhea^[ZWTUUSPMKIHIILORTSPD5+%##%&!&5Qmh@ 6Sbabaahgggfd`\[XXWWVWWXcdb`][[]bdfjjhc^][ZXRHDFV]S9%&*) ')*.-$#!"#&,2>BGHGEDGINU^ipsvwwtsstsswwvwwtpkjeejg[KCJ^lszzzreQG<68:;=BB=9656884-)%"(6BA5+,6FYccabkouz~~zvtw{ync]]^\[VRLKIHD?>>=:51,))*'#!!  !"'8OahgacgjkllkponnnooommllkjiivvpUWϹvt{ºxcYVVRD<8;AEJNV^gkmlaUK>Mrvrxn`VM[huytdJ7  $)+.//.16<>=:9441/,(# + +-9Yc[O`ʤpd__htysjkifdcbbbjmoqrrqpmnruwxyz}}K- + +Irxhcaalomlqwxqliowndev{zjpvxtpmmvwwtokjj`\[cd\LA;:811211.*)%#" &9>D+#Iv, + +  *+('&#" %071&"Psmc\TZVVVTSQQPQSROMKKKLMPW^cca\G2" +31-&1402971\uZM9( " 'BCA=9677985/+'"#0>@:2/4@S^`^^jmquy{usv{}}tgb__]YSOKIHFB>=??>:51/02/*(%!(4FVaddegjmnoononnnnnoollkkjihhtvqWW޲zlmrzʤvchkea_XUY^`bd[^acgfZNKHN^w~wxrYKQV`nzyjR5'-39;=@A=?BEGHIHC@:51,(% @\g_f˟pc`ajuxrjhhfdbbdekmoppnmlkmorvzz{}S9%" + <;92120.+)&! "% %6>D-+T5 + + +  )+)*)&-":?*)Ttnc\SXTTTSRQOOOPPNLLNPRQU_hkf[Q8*! + ++7::7?=31;KVUUZahpx~bUE9.# (/6BMRe{u`PKXjy~rvvvtkXE1GS7/5;3-167:=nvgjffd_^]\ZXXWSPNMLLJKJKLNQS]W=!MzhM5% *:U`nz}m]A-"-M^YTQS[]_befea_^^\\\]]]_`bbbehlkkkjihdba][^^]]`^\O;3DJMMMLNTY`jqvwwrqooqsttsssturmjfcbc_RF@[s|yz}}n]Q@<77:>BDDB>:889:983-($ ")158856>LX]^`knpsv|}xuuvx}ulhggc]RNKHGEA>=>@?;755797/+$ .CT]``bgilmopqonmnnoopqoonnmlkk{}uztXWԿjhpv|ͧs`pwmlkfdgihhkb_]`daWMIKMOgvuqnaGATcirvlV>% +&49?EFJNRRPOOPQTWQLC;51,*'"=PSLXė~pbbelstoigggeccehlmnnnlljllnrx}~~]F'  'E^]PL[dcfljknrsplnqu}qjefpy|yzywuvy|}~yusse`agdWMJMQSJ;( 2c{fahibZVOJHGECCCBA???@ABEKQTTRRW]_\WVVPVncZTURNIG713?HJLSba]YY^gmrsnc\]`bXSSZ^\VSXz[<@D@JhnogYT\ghlpttpg`]_behijiopnknspjelsxsmihhe`\ZWTQHFC?=::83220-*('%& "4=E0'7Z8 + (((++)/#=B)+Qsnd]TYURRRQPONOPPMLMPSUUZckmcTC+%!  +'6>@CG@0,7KZSTX^cejr|~q[WPG:,')'$&,3;IUaju~{hUHOZju{ywpstrneRA6HO3+17,"*3888ozwjfac_]]]]\ZXVRPNMNNLLLJJKQTa`?B|cK8.'#":O`hnnmlhcQ> -KZUOJIQTX]cffdd^^]\\[[\Z\_acfjmihffhgfed`]`c`ada^Q?8BS[SDBD>9. $(-39>EKNOOPSX_enuxxwrpnopsttqqqrsqmifdb`WMGFe|~~~qbTJ<988;@EGDB>;9:;=:951+&#"!"%&',3978=JU[^cmopqsy~~zwtts{uomomgcTPLIIFB=;=><8679>>8/& 3N^cbdghjkmoqpponnoprrtttttrrqq|x{v|wXV԰rhpy~̪ubw~uyuqnnkghmkd`ac^UOHHJL_vobWL=E\jqtlW>* + !%-7?DKOQU[afa[VVX]c_YPH?920*&!"-FIB:H~ϲtkdglqsrnjfghfddgjllmmllmmlmnsz}qY,"" %3847L[_dkiiloqomnprx~|nfgknps|}vvy}|wspga`e`SKLKNI9':gufddb]ZUOJHGEDBA@??>@@@ADJQUTQQVZ\XTTWUUo}dZSTSNIH8'&2=K[bc^YVX`honi]XY\ZQJHOVWVWd|T96EUvxthZV_jjlpuuoha[Z\`eghhlmkkouslgoy}xrljigc`\YURLJFA>;:9431/-+)(""%& $2:C64BT}k/  + +&''+,+)"):=.$'Kmkd^W\WTTRRRQPQSQOMMPSV[]bgf[J7$ (8AFNNA.'2FTSQTZ[[_hxxttz{pbZZ[WL=65/2:DJLQWafkry|sdOMNXgpqpnolgaZI:5IJ,"&.& (0234jvvh_]\[YY[\\ZWTPNMLNOONMJIJQU]dD3kx{iVF90!1IZbb\TOLC:2$   :U^ULBEJNOQTX\biqwzxvtrooqtsspopqrplihge^QGHOk}paRG@:78:=AFHDB>;:;:<>;65;?C?3& *EKPVZ\ahoslb[Y]ciie\RJA:4)*'#!" (2GHEAKz˽vhdhmsvvsomfghgdehlmlkllnnomlmsz}m4") +$(/FW`jkihjmonmnopsyvkbglmjmx|yzzzzsnkg`_c\PJNFF>* ?fohgb[YYTOKIGFD@A?>>>@@@ADJQTTPPSYYURSU]YqeZSTTOKJ>$$5Meegd]WW^ejf^TORQMNEAGOUX[h}QId|ueXWanlmpssnhcZWX^cffhlkhglqogjq}|tnklifb^ZURQNJEB?=;531/.,*)('&'"&27A:=GKgX* ##'*,*")0474+"Fhhc_X^YUUSSSSQRTSOMMORT]^_a^SA/   ++>GMWUE/$-?JSPQVVUZdrqnnqqeXUWZ\VI?;=EUfkgcc^cglv}sZOIO\jnmmkd\UNA41FI)'" ',,-2gutd[YXWVWY[[YUQOLJKMNPOMIGJQVYhI(Xf~lYF8 )AEHDB><:;=?<;93.('%%#!"%(*-16@NWY]bgilnpuz|vttvwxutuwtkc]YSONJD?=@?;89>EE>/%8EUcilmnsuvvwyzzrqrtuwwyuvuutsrr}|zzzxx|xi\ݭhjdhwֶzn}~zywspnkgb_[ZZTVQMYoxvhR6.>XkrpmV. *7CMQU[\[^jsutngdbbcgie^UKB=:82+'" $-4/X]ZRF}œilhbqy~}zwqknkhhijiijkmmmnmmnmosy~~;!$ &BU]eg``glkjmnnopuyskhaipoiku~z{m\QZef\RPLEF;, !Hlnjb\^\[VOKJIFCCA>=<<=>>ADINQSSPTYYURUZX^}dUQLMOI;+2% +'5G[deK-#'7KNQTTRQTXid`dlk`VRW]^VLB=BQfu}zm_VWZ`jrtpVJGP\dfgea[RI?6/.NxxG&)+.0ii`\VRSSTUWXWSSRNIIMQMKIFEIOT`kF%0`}o]N4,#"2GXVH4% "2HXmniZMD8-*+07;<@FHNSTQORUYZY[ZXWVZ[\\]^^a`][\_`_]]`_XSWeovulW=+&&"#&*-38=BDGLQTW[chlosstvrrqrtusqqnmmmlgcblfUG?Mhx|raOB95357;;;=DJEB=;;<=>?<8420,++(&""$)/4GTdnpjZK546=<=>@@CFJNQSTUX[ZVUZ`iwýrWI?066,!*DX_UXUX]XZkqjYB435694/5<8:87751/,)&" "&)21;HWmraG'!$%$,9ML4%+/&C^mihd_a][XVVWSSQPOPPRTTVQH?ENT\nQ-Eit|z}y`O9'!(-% ->Tiy}mca^PA<;<=8/+,39>BBDILKHC@==?A=?@A>>?ABEGNUZ][W\`cbfntxmX?*!$($%)-06<@BDIMQUY]aehkllklklmnpqpnnmkjigdbbjbRDBUuzz{ytmihWPG=531189<<<>DHEA=;<>?@A>9531.,''&%%&)--4>KW`dfa`aejopqqw|zxusvuvvurmjilh]L?9:58BMWUI?* (7CQ[flnopsvvwxxy{||}~}|{yxvvٳporpoyαxm|~~~yqkdaaad`WNQ_hkX@0AasoaT8 !%!"#&-39=>EOYaec^akvyti[PZVLB:5324248;=EMGNocsP*Yz}zvrnmkihggggghiijlotyywtt|sJ0&-% #G^_^efinqrstqqsuwyz{zxtolklnrutpihkou~{wspnlifophYMH;,?j~zyǪz^ddZY[\ULGFGDC>>==<=?ABDGKORTUWZ]ZVW^e{ĭmXE,,41'.HY]W[YZ]WXjwq_H61216412716Kc^UOQ\gmvzrreQIWkoggimrqj_WMOPSVY[]ajmhdekmvtjgikjgfdc^[XUPMKHFB?<:8651/,+( %,5273-& !.B@%  (+-.Zv}lc]XUTRPNNMLFB@ACB@<:::;?GRY`qW2 6^ktruucJ3%'7ARcyuf_`\RGA@?<2% '08;>?A:5.)(,0336751/02897688:;<==?DGD@=<=>@AC@:632/,&&&'''(,)1:<36@OZVB2 + #1BPY`hmpqrtwxwxvvvuzz~{zzzyyyxiYetyvƩriy~{}zy{wojeb`beaXQQZadQ=8Qp{lYM2%&'+&'*-4:?B@DJMJILPXdpqi]L@>;620035?:789==<=>@BCEIMPRTUZ]^\X[dlƪyX2(.-)1IY\_a^\\TVh}ylWE=;:8:87948KbXLFFP^jswv{qnaSUekfgjmpmcYPIKNQUXZ[]fibZ\aezwkghlkgffd_\XUPMKHEB><96540-**'#,609Lh\2 ! (+2BYdW3 '/*B[ihkhcd`][YXWURNLNNNMLJG=0" + $0>LZaQ4$ .09AGHHIKQU]hkcRC;<;418HXgq}}\<&'/8;GY`ZME=9542.' '30 + (,.0Pk}|pga]WVSOMKIHB?<=>>;7458;BLW^dsZ7*Tfonp{}{~pZD2& $9Tguxjd_\YRIE=:71&+7=<96*%$)0453-*+.4:DP[bhj`_^^^`bcWI6( #%$%)-17=BGIMQVY]bdhikkjhijkkmoomlihheca`_adYIBBTpjbXRLHCA;:899:<>?>>>>ACFC@===@BCC@<9430,&''(('(+(.:MX\]`\]`cfhijhnx|}|~~~~~}yussrooonkirvtfQB<>25>LUN7$  + + + "*:LY`dinpsuwy{{}}~~}~{{yyxwuuƨ{[Tbry}ogy{~xtpnu}~yvsojgdbcea\XVY]aK>@^z}kYL9)+00/0.049?EJMMLH?3,3=K[if\O=.!#$(-48666=EYisyzpooO#-n|xrnligeba_^_`abcehossqorzl,#   +Sljgkpsrrwzzuwz}}}|{rmhhlqtusrqqsvy{xwrpv~{tia]\]]dieXNJA5 <^rwwzѳc]YVUQRMGDEEB@<==<=@ACEGJNPRUU[]][Z_itwC/.+)3ES\ad_[YPTh{j[ROLCGEDGCDRbVJEACTfjszyqqrk]X`hiikmlf[OHBFJNRVXX]cc[UV]a~{njiljfffd_]WTOMJHDA=:7531.+((&#+4.7Llb8   # ##%.4AWhfR3"(.*@Xefihcd`][XXWSPKIJKJGCA<4( "-:EKVJ1!''/7>?@BELR]hj_K;;:3,-=WlqV7#(69;GV]VKD830/0-'!!)$  %+-.E_uyqic_ZXUPLHFE?=;::98647;AHQ[aerZ= Gbjjmxzy~}viU?/%!"%(2Jh~ug\MQW\XNEC83.($3AFB93$&15850-149@KV^bgic`[XWVTPC5' !$#!#&)-17>DIMPTX]_ddhjklkikkkjlmmligggc`^^_a_QC?>J`YPF=86442467:=@@CA???ACDC@==>ACDDA=953/-)((((''*(-:NYXWZY\`bcefgflsxyy{|{|~}zurpnlklljkrvtgTD;://5@G?)  %,6DS_egknqtvw{}~~{zwvus|ҳl[^it{~¦phxy{smkjmrvuqpomkifeedca_]\]`G@Ge}}naUKB@@?<87:?FMQTU_SE6(%0CVfdXK7% %*1;DLROIECA?DK^mnqrjn{wJ)4r{wrnkifd`^][[]]__adjopons{©y6% 6^troptvrqx|}y|}~zwunidgntututsvz}vpquvptnf]XRMJ^feXNKD<,   8Yp}ԵjZQTSJLHDCEEA>==<=>@BDFHKOQTUVZ]^[[boyɝ_B6,-5@LX\_ZUSMTk~}qhd`V[ZY^ZXch[PH>9H_`_pulfmnia\_gnkmli`SGA;?CINSTVY^`^_ht|}rmkkifeed_\WTOMJHDA<:6430-*('&"!%*.*5Mn`8!  &&((+5?RmveJ1()-)>Tbbhhbc`]ZWWUSOGDEEC?950+# +)5?AMF.! '.3358:?HWeh[G694,)/?R`hlmjig`XHA:-!6AAHSVPGC;4,)+,'" & !'+,;Ulupic`]ZVPLHDB==<965789=BHNTZ``kWC!8Zccfqts{w{}{yyraH3&"%,38>Qm{p^RE7,7I\`VLI?92-&"%+1:FQSL@8'!&.4::66:?GMW^acdeb^YWTOH>6'%##%(,07=DJOSX[_cfdgiklljkjjijjjheeffb][\^a[J=;9>LH@7/)')-/36:>@BBFCA?AABCA@<<>ADEEC=:740.+*)'&%&)),;NXTQTUY^``abcflquuuxzzz}~zurnlhiikjmsvrfUC72&%(.2+  + %0:CNZdlmlmpstuxy|}}}~~~}|{zzy|{zx~ʩfakszzĨrhvvwolkkmpqqnnmnnljggcddec_^aF@Jf|zph^\WQLKFAAFLSY]__fUA2&#,?Vgg\M8%+/4@CDGIKORUVX[]^[\dr}yS>028=HVVYROOJUm}}uokfkkkqmjrobWM=4AYYM_qcW\\hfca_airmnlf[NC=7:?FKPRSSY`eqsljigffeb`\WUPMKHDA=:643/-)('&$#%&))'5Oox\8'*%  (),,2?JbfE2+)+(;S`ahibc_\XVUSRNECDB?92-&# %/8:IB+$*---136ARbfZE4.)#%.8==@9* + + 'DJGKQRKC@@7*%&)'$ "&  %''2Kfrpib_]ZWQLHC@<=<9447:>BHMRVY]ZdTF)-R[Z^jllsrw{}}{zvzxgM4%!%09=APhzjpkVB5&!=ZgaURJC<843:BDJT[[SF=,'"(,3:;9:BGSY`ddbabc_]ZVM@30!#! #',28?FLPTY]`dgcehjkkjkiihhhgebeeda\Y\^^XE::55>=5-$$*/38=@DEFGDBBACCCA@=<>BDFFD?:741..+)'&%&)+.:PXSMPSW]_^^_bglqsrswyyz~~zuqkhfehijlqrndSA4- "  !%-:DNW`gqponoqrqsttutqommmmmpqttyy{~z}|zzz}Ξ{agz{wɫqeqqwwrqqtyzxvprtvuqnlebcfd][a=6Fgwlejkgec`YLBDHOVYYXVZRJD;2/1A[u~u`A*022359<>@AFNW^``Y\fi\X][X/G{~zxtojfdbZXWVVXY[^[[ajrsryģvU5  .@^{urxyxywz||uqphaboz{zz{}}yxyqia[SLJMglhZOOPNI?1#>iڵxZQVQFAFIF@<;=;:;<[PNLJHM]nngdfc_agiihdZM;-/8@CEIORKU_sɯymihjigggda^\UNLLLID?;7531-*'%""%%#"#&9YzpM743&'-$ +#+,056Caf:+)+)1L_djiba^YUQPPNLGFDB<3+$  "),8D=$ #$#%(-)7Nag]J9,.  +  %Nlm\MKLE8//42)"%'$"%"$ %;YnpgabWTTRNJB><<:535:?INTXXWUUUYWF# + GTVU^a`fjotx{y~{iJ-#0@KOSX]SPH9( 7XbWRVPRQOMLMOORX_a[MB80%! $((%-:FV_hib[]dlgfh`L<6,+ " %-9@DEJNUZagfbddbcehiiffdcdedcddb]ZY]a\XJ<476.4+ %*569KQXbedotvtnjmqold\YXPGHEBBHPUZafpyvx{{zy|}ŝ~ces|~ʪnbpptqwwux{~|yxyxuqnkgdcd`ZWZJEK`idbhojgec^UNLLMKJGECBDGJGA>ALd||jN8??92.+**)0:BKT_gZW^b[XWOM,+S~yvrmhc`_YWVTUWXZ\[[`fmpr|k;%  +-Dbzqo{zzyy{~}volieiu~~~{yyxoeYMFKTdifXLIIHMGA=91%-JqǸ^PSQG@DGE?<<=;;;<=@ADGJMOQTX[^]]_eq˹nf]QQYRPKQZVSary}{wzuiaREM_QLEA@ETdjfehebcgnhh^LC>5435?HJFARe}Ͷphgjjihgfb`\VOMNMIE?=9642.+*'$#%%$##%7Vxx^I9/,24+*$ $,*/6?Tu^3,,+&0K]ahgaa[WQNNLLKGEB=6/'   #'2=<0 #'*,5FYd`O?7; +'./''?d}mWKC:-%-0.%"$&%&(#$!"'"1Skqi_^TRRQOIA<:;:86:@ENQUXVVVVVXUE$ + +>JJKTXX]chlpsw{~}}}~strcH/ /@FC>??873* 9W_VSZ\\\ZWUUURTY_a\OG@91.*%&*#'++-3@KW^cc]Z\cqmmocN=6)&  "%-6>GJPTWZaiiged`behhigfddeedb`_^[XX\^XTI=772',&"+29ACFHFFC>9543340(#%(*5;GVZTLHSV]a^XY^filnnoprvy}~ysndb`adffec`\\\Q5 %/;IW^ekjgkljgc_[YVTMFA@;40-((,167DHQ\it{suwxx{̽mgmt|~|ɨl_oqtm{zz|~}zupkikgdc_YUV[VSVY[`enidcca^ZSNE;4-*((0AMMFDETkt]IQMC8.'#!&/9<=BQ^\TW^\ZTGA*&=b}wupje`][WUTSRTUWZ\\^bgms}ʮS -Oqvzxvuuuxz|xohikr}~}yx}viVD>K]gkh\QLKKJKP[`WC3@]ûfOPQJ?BDC>;;==<==>ACFGKNPOR[`]ZZcscJKWJIENZVQ[hq|{wvx~zoedg]SIC@FS`ffhkiefhlbf\>4911-0=DCBEb}ȷrigkihhhgdb\XRPNMIF@=9653/,-*'%%&&&%%5RtteC.4>9571+*% (1*.8LjQ).2*#0KZ]cd``ZUPMKJIGEB=70)"  "*19;0!#$,/9N`dVHRY6  0=MX\TN]ysXG>5-))+)#"$#%&"!"*#(Iepj_[SRRQNHA;9;;<=BIMSTVVTSSTWVSE' 6@>?JPNRX]adhknrsuvxyyxwlidYF0 +<@6)"!"## !?W\VV_```\YVUUUVY^`\SLKFA?;769469<@GQW\]_][Z]amlpshTD?5+$("# $)/6=GOSUXY_hkjec`beggdffeefeca[[YWVWZ\UOE<86/#&$%$%)3:@EIIHGILNKHGGGFDA@>>@BEGHHEA<741330($'*.9@LY\UKFJS`fbXVZegjllnprvx{}}yvrgebabdcdc`]]_T8 + +  &&.=HT`eggd`ZYSPLF>8672*%%##&-9J^pztuwwy}Ǽwqow||Ȩj]ntvn{z{|~ztpkjmifc`[WT_^VLJS\`d`[Z\_ac[RD5)$""$0BQPGBCWj|zhV[YQI@93/4:>=9=HT\UW^]]VI<-3Nm{wtoic^ZXUTRQPRSUY]___clt|ںR( 6bu}{xutvy{|yohhoz}~yv|viS<8JaegaUJFILNYoykƽqRNQO?ABA><<==>>>@CFHHKMQSV[^WX^k~V;@PCC?ESQLRckw}{vqnv~~yphfZNHFIS\cflonjhjkckb:).($%.9>CWo̽ujikihihhec\YTROMIF@>:7640-/,)&%&%'('4Lm|U5ADHNQUUTQNNOQUSPD)2;87DIGKNSW[\adgiknqrrqohbXOC/"7<0  '4IZ\VX`^^]YTQPORSW[]ZURRPMMJFEJKKLOT[^ba_[[Z\_bfhoun^SR?+!#"%&,49:;@DMRVW]fjjfc`begebceefgeb`WVVUVXZ[UKA:97/%$&+--/8ABINNJHKOQOMKJIEBA@?@BDEGIIFC?:40440)&*03;DPZ\TI@BL]gbXTWdfijlmpsxy{|{ywtjhcaa`abb_]\^R5 ,8;@FMRVWSNIFDDA>7/("$'% /DWcwxyz}xux~|˯q`mszsyz|~~zuqnmnlhfda\XUUMCBMWZ\XUUX^cfc[M?6346@@ADIQVYV[aZ[ZRE8C^w}yusnhb]XVTRQPOQSUY^ccbenw|śh5 Co}lu~zy{zpjjs~}wstobO:6I`nkcWLHNU[qþŽ~[ORR@AAA?=<=>>=?ACGIKIKRZ][WQYfvɬzG/6EDC>?JJGMZcpvvqmkt}~zxna`VMHEFMTbiqspmjiphj[4#%"$5JeIJyjglkiiigeb[YVSOLHE?=97641.-,)'$$$%,)3HgjIF@7?=;;?>7/," "1:69JkN%6:%1HRT]b^^ZUPNKHDAC@7.%   + "3.  *&-A[gcZnjK==NMTQNJIP\gy{qx}cO>0('&((*(! '-+%  +6Ukod]XVVTRKC>@AADHKOQRROKIIKNQPMD* 0842=A?CGLORTW\_`behijihf^QH<*.4+ (03;DQ[[WX]]]ZWQNMNMOUY]\XUTSRTQOQW\ZZ\_bcbd`\[\_cffiqvodadR4"$'&%&.6@D@;87GNUY`hmnjgdfjkgbbcdfge`]VUTTWZ[ZVH;8:<7/)-243480*''.463,%##%)('&)&   +'5><===>?AEHIMJLS]a[RS`sǩ~P1+2BEA>FFEMPXcknmnnszyush_WPJGCDKTeowwrokinfWB((=0+Bp̽lfllihhgc`ZYWSNJFE?<86541.+,+)%"""-)1Ca|cO?7@:9;@A940'(39;@TzR'34,DNPZ_\\YUQNKFA>B>4+"  +  $ $$):O^a_os_TO]_edb][^fn|{v~gT@0&&(''+*!!'& +Gbke^YXWVSLE?BCCGJMNMMMJHEFHLPPOE++52,1428?EHKMOTVVYZ^`abb_YM@2 &# *6?CCGOUWWXXWVSMIIJLLRY`ca\ZVUSQOMR[ggghhheddb]\^bgjpquwndgp\:/86/*$*3?GJGFDFNX\dlqsokginoib^`befd_ZUTRTX[[YVE79AEA<569:9;AHEKQRPMMNPQSSRLD=DDEEEFGIKHCB?=816760-1569FSYXQB42;JX\WVX`bdghlqtz||}{yvtoomic^[\dd_WM=<=<>?AEGINMNT[^YU]kиn@(%;75430-*--,&"!!*&.@^{[A=@;::>>70-(!+17=D\S(-)&>HKV\YYWTQMID>;>:1(     " !%/?O\botjcZgmqqnjgiot~{{|hVB2+,)$$'&!/2 8Udb\YWWUSMC?ABBFJLLJIIGFDDHKPQQF)'31))''09=ACFHLNOPQTVYZ[VPF7&!%$&,5BHQVVSPNIDAAFKU[fmnib`[WRNHGNYjlnnliff``^]_cio{zzxlckz\?C]]PD548?FMQSRJQXZ`jrvmidgmme^[]`ddb]YTRQSVXXVQ?5>JOLFB??>?CHNNRUUURNLOOPPOIC=CCDEEEEHKFA>>=8369951367:GTZXQA1.1=MVWXZ]^`ceinqxyz}|{wusutpha]\bebZM<& )(%'0GFA<82'&38<@BEILLLKKOM?0  +qtzų{uplslfuzryzsprsmffgaVPFBLX`glkjgd_]\]]]\]^_abe`altwwvxscnlgc_^]]egkopoljlegg`bfa`R\z|wrkie`\XUTSQONOQSUVZagkort}~̜t`D:IYpw{xoihlqrqqzupqv~|zvqlfWF>=FWhxx~˹~UCHIFC@?>=;<==>@DGIPPRTXXZYfs˽P.&2@DBDA>GJPVZ]`dhgjow}wppi]SRJFB>:?N^kyzrnkhahK:A,=Żukmkigfc_\XYWSNHEC=:6443/.+-0.)$!!'#,>\bFBB=;;=;3,'($,/3;D_S&&  !:DFTYWUUSOMHB:696-#    + + +    +#!&1CVcixnlh_ks|zxsnou|}}kWA0*+*#""5@?' -K]^ZYWWURLB>?@AEKLKHFFFECFILTTTG( '42'$!"-59;>ACGIJJKMPSUXMKB1%**+,17:86325>LVTOOLGB?AHN\eqwwpgc^YRJCBKVchjkgdaa]_```cjp|yvkfqzbwoRNJIKORPNSWW[eouid_bgg_WY[_bda\WSQORUWWSM;5@OUPLHECBEJNSVXYYYUOKONLKJGB>BBCDDDDEJF><=>:469<75577:JVZYQA0+,4ERWY\Y[]_bglouvy}~|ywvyxukc^]_cd]QB2%"&2@E@::NHHG;$ +8MMPW^ehiljggjfUB + +ruzǽjZ^q^asxz|yvwqsnhgid\OLNVcmqolkkjhd]YX\chhiii]dmssrrsw{~ugjiggddkustvxwusrqfcc^ad\UMVq|xtpihe`[WTRNOQQQRSVZ^cgjoty{~ڼ}maepux{wohejqqnqvz}tms}yvulcYL?;@L]mIJ^E9BHHB=?@=<=<>ADIKOQWXSOVcn|ĥl9!6:=<;>BEHKOTWZ[[b`ahqwxurqnh`XQLA@><>JXerw{zskfdghUS]E8U~mmhfjieba\XSPMIEA=964332/,/1/+'&')#-GkvUDIBA?;2*'')" ',.16GhK%7ABBCDDEEEFFEFJOSYWTK0 ,4, #/017=BFFGIJILRSRID8&!0=66420.-+%%+9N\ZOJC@ABEMV_lwzwtojgaVK?79BP\ca^`a^\^`bdiotzyyvnn}ǡwaRNOQPSPUZ]\bh`[W[chb\bacge]VTPOORUWWSH<9DPVTPJGEEINQSXYXZ[YURNMOPMFBDFECCBCEHFB;9<==9988985345HWZXTG9103=KVYZX[^`aejmopty|}|{y{zwngb_[^^\RF@@6?Qci^K?=DFB2 ,F\mikt{hJ+  + + + qtyɸkPPe|˸ժ|X^wwx|}zxytuqkjkg`UPOU`ikhbcgijhda]cimnnnohow{xsoljnt}zlghlu{}~}{ywwwwna]^Z^`XJENk|yuqnhgc`ZVSRNPRRRSTW[^chkpuy|½׺xpllyuplmpsusvy{tqw~|xuskaTH==ERbqkL6?FGB>??=>>>?AFILMS[\UNWeryǭxE)46988;BEGIMQTWWW[YY^fkkhedb]WPJF@?>=BN_jz}{rjfdbeWRaglƿspifhifdd\XRNKHDB=9643320-..-*('&)#1Pz˸gPGFHD=50,(*# $+0019GfK%5:=JOLOQQOJC;2/*'  +  + + + +   !!' (;Smnjebbglnqsx{~}r^D0))(#!!"! %3?D;D7  -BNQRSTSPI@<>@@ABCDDFGHHJMRUZWTK0 +5.#",-.28>ACEGGGKPOMC>2 #5A@:2-(&"  )BDA@@?=?@@@BFIKKU]\QM[lzzvv~нX455788:>BCFHMNPQQTRSVZ][XWWURMHC@@@?@FVhuzphee_\I8Bhľ~rkegigfg\XRNKHDB=9534321-,*+**'$(#4Zȳ~^FJOI?884),&$(05329Ea}K#357CHHMOONIB91,&"  +   + + + $"!& &9Vuumd_]`cdfkt{~~{x}q[D1($$ *+04=GMK68) "3CNNPRQNG>;<>>?ABDEHKNOPRSVZXUI/*51'!!$(('+06:=@DEEGJID93&"7EB:/'%" 4O`\NLECIOTX[ZcikmpqpojdZK<68@KTWY]]^cfilpty}zw~ʲybSXgonilvnkggie^XRRW^a\XVPOOQRTRL?7:GSUQMLJHJMOPQNMKMRTSPSRQNGAFNHFDBAADFGD=;<>=;<;;:950.1GZ]ZXQI>;79@JQSTWZ\^`cfginty}~zupmljfaZQMU`iqyzn?! +  &Fbz~{wtqnjgcb^[WTQPQRTTTVY\]afjnsx}̵ziebdefjppmklrz~}{|yuqmcXE=:DVfr{¸h4;=AB@A?>@BABEFIJKRWRKOdxxrv~̥k@458?@=98?ABFHKLMSSQQSSONNNMLHEB@AAADM[o}zoheh`K1#Y½Ƹvmfghigi\XRMJHDB>:6344210-)*,,*%'"3\μkINSNA?B=0-'&,59628@WoI "000;BCJKLKF@7/)  + + + '% "% '5Rw|rf]WWXY[altxzzzvwyxvuuu|znXB3)$# )1>EGHE@3/&8GHKPPLD<;<==@ACEGKOTWWWWX[YUG.)75,%#$%%"#'-139=??@B>9,'  2>91)')*'!&@SRHNJKNNMOTV_gkmomggc_XL?9:?EKORX[_cgkosw|~ӵiadioonoomkieb\YQORZ^[WUPONOPONH;7>MVVOLMMMPSVVWVRNPUWVSUVVQF>CNJHECBBCEGD?====<@=;:71+&+E[^[ZVRIC;6:BJNQSVY[]`abdjqv{~{tmlnnjfXRPXbkzh6 !$'.Cj}[,(&!  + +uxǷwyyjgkxaeƞsVR[_E;>@CXjppnr|~}}~{xurnmoaTGHQ\][Z]`dhqywpllmtm_`emt{xvnb__[_b[NHMfz{yurolgd`_\ZVTQPQRTUVWY]_bglpuz~mb[^cegkmgacp~|zzxsoj^SC;BAA?@BCDEFGIJKLIEIZqysu{Ҵ}K*,5EJB94<<=?CHLNUTRPNLIEHGFECA@?ABDHP_q}wlgehX7!)H{ؽõ|qhijihg\XSNKHEB>96444312/*+--+(' /UsWRSLFFLE9/)(.7<7028J[jtE +.,,6<>EGIHE=5-& + + +  +  %& +"# !(/Ioxqi^VSSTW^gnqqppiihgffjpzykT?5-'#!" #4GMF?84/)  -=BGMOJC<;=??ACGILOTY]]\[Z[ZSD- '88/(&'%$!$&(/354660* + )3.*'*251+)""9MQIPPRPH@AIT^ioqodZUQONIA=AEFFIMSZ`_djnsx|Ѹumlkjhea^_`VQPVZXUTPNLLLKHA76BQWSMJNNQTY[\[c]UUY\ZWVZ[VE;@LJJHFDDDEED@=;<==A>:85-$%C\a[YYXQI>55CU[emmr|{||~~~~|zwsnosbSEEQ]a__abcelt}~rjghfjwqZQQTX[dt~wqldec[^da\TWjz}zzvuqnlida]\ZWURPNPRTUVX[^`einrv{ȯq_\_`cjpg]_q|{xyvqlfZNA;=Qhv{{}þWA=<@BA@ACDFGGIIJLF?CUntozμ_"#,AKE;7:98:?GOTWVTPLHCABA@?=<<;?BEHO[jv~zrha_bK52\ýȻvkjliec]XTQNJFB>964543231.,-,*)( ,Kwö~kVQLLPPI@4-)/9>80.0=JRdut`>  ++))39:@DFEB;3,# + +   +  +"#&*%  %,+>bonlcWQRUX\`cdca`^[XXWXal~|iN;50+#!  + 1FI=2,**% +$09?HKHA<<>?@AEJMPSX]``^^\\ZQ@* %790)')'%!"&&%%&  + + %+,*+16840,*)3FVWPPPQMD;;BPZcijgZL@>@FFCCFHECGLQY`^bioty}~ʽlilkf_WVZa\SNRVUSRNLJHHFB;35BQTNGFLMPUXZZYoe[W[^[WOVZQ>19HIIIHFCBBBB?=:;=?B>951(?]a[WXYVL@527@HILRUWZ]]^`djpvy{wtrrsrnka]]ae|ÒR  '6E_^1,($  wz§idkv~zj]VXy]=?loT\zmLPJEMKZijr{|yxzz|~}~~|zuopwgWGFTbgg^addegmsy~rbWROMO[lnXA88:DNYgt}unjieheYYbcf^^myxuurpljfd`]ZZXVSQPNPQSTUW[^adiosx}دwha`iy{n``u|{wxupjdVI?9=To}}zƷnE>;?BA@DDFGHHIHJMD=Kl~zsnŤ{*%(9EC??:856=HT\[[XUMGCB?><:8777=@CFJT`istqk`YVWVepŻznmmib^\YVTQMFB>:745532420,)''),"*Dlž^QIQVPIF:2-2:;>@@AEKNRV[_bb``_]ZO<(#680*'),*$ + + (././034211AB=73/% =^dYTUWXNA515>FFKPTWZ]]_`dhnsvxrruvurlieaaccy㿃N'PT?'$#(8IWbitttspjc_bafcTUacja_lvtpqpnjhda]YXVVTRPNMOQSUUY]adhmqtx|۽~mhywdcy~|vwtojbUG=7=Vsɸ|I?;@DBBFEHGIIIIINC@U~vm|toͷ;-(4>@@D7412:HV`__]XPKGF@?<97664;=ACGNX_monh]TONu|qnmi`Z[YXVSMF@>;755542231,'$%(.%*BgļcOGSYNEF>4.3=A<2,*12/9CA?- **)488DB>;=?@@AEJOSX\acc``_]YN;( 14.**-0.'!  + + !.5311/0022@UqydMC?DKLIG<=<;=?;4),7DKGBA?=>BEE>72." <^dYTTUXOA4.3=FEJPUWY[\^`cglptvlrwxuojggcee`k᱁GDH[w}Y/"3Kka;2*&" y}ƹ|\NWcfaZX[fJ--G`fa@9:XsCEQP\fotuwupptw|~}}yxy{}{vrijSG[ebgiec`_bdfpqv}nXK=0(%)394,*%+6GQSY_jlkijj`R\a_VQW^abgmnoolmqrokd\VRNQRQOPSVMKLU`figdnwwppyѶ[Vx}{yuvrjaWOHE7?d~x|¹ªL*IUEIFGPQKFFJKI?CSnvr~puırL8+">S>4)(167EY_dd\TOIDCA><98779;=>AELPPcf`WDNxȾvfdhg`YXWTQLGE?<977531-0.)" %-'/4DlŬrT=BMMNQJOH928830,01-4=:.  #+/1248:;95+! +   +  #)((#!)1037O^nsodVKGB=:4+,3?O[\\hy|Z=+&(*#$081,&   + '23-443212110,(%%%"!#+.&%:=?>CJPQWTard?0;:71)&"9V^\[\XSH;1.06:BGKPUYZZXZ^afktxoquxwsnkga_bag~ؼ˼h@)+=rȸþ|Z<<8- vx|ƺzXCJSWUTW]]N:37;7216GiJIVZ\dmqtwurqtx{}}|{yxxz{{vrjjUJYc`fieb__acejlpw~s\KF>4-(',,*'*>AISUTW\aefeee]S\__WSW_bhnqpmlkllokga[WTMPQQOPTVOOQV\chkgoxxru[Xy~}{yuwvm`SIC>7Df{{yŹïO1JTEJLOUOIILLGB>K`tzuy}lu̼fC0$3D>40//*+=SadaYSPJEDB?<:8669;==>?BGCTXSPKcygcggbZYWSOKFE?=:87632-//*"!$*-6>PyԷrU?ESZ`fecU?354/.*..+5>:.  #+00148:961' +  + $$$#! +1126?Oantrg\QKEB;56>UdnomvnO3#!" -980)!!  $/9@CBBBAAAACINTW\`a^[XURJ<+  +$)$"%#$##" + &.15008E[wv[NFJLC@C?B9334136BGLMF;3.1AHKMOW`\]WK8'%9X~GDRZ\dloswwusuxz|||{yyy{{zvrljWNW`_chea^_acfegjpvzzzyteQFEB:.+*./3:GKPSUOIFHQY`cdc^YacaZXZ_chookeeffhjfa^[YYTTSQNOQRPSWWW[dlmrvwx˹r[a}}|ywsuuo`NB:5:Miwx|ɷZ>>>>@AIHDHW}iacfe[ZVRMIFE@=987642.//*%!!')3@Vīz`MUfq|{cF543.+'*++6@=/"  '+-/26:84/&   "$%'$ *//-/2=Ocv~xkg_XRLJOWgryyuyubE-" !!6@;2&!  + !+5@>3<@FIA856.'"! $'()('%"! " #'! ""&7HPP^osO+#  <\a^`^TND:20248;DNQMKLPV\chkmnpnpsusnhdd``db]_hߵiQoɿ§}^@@;/!bdhlquxy~»wS=>CFFJQYW`f]I5($/DcxA>JU^dknrxzyvwyz|}}}{|}~~|yvpiZSU[]aeb^\^`bdbbeiorsromdVMKGC65578;9767;?BA@?@IE;8Im¿k__cc\ZVRNIFD@=;88642//.,($!"/B\įufnfF4343*%(*+6??AABEINTXZ]\[XUSOF7& #(" ! %!  +  "%?Uŷw[lzXIGLHD=0" ""%(-39@EJIIMYcif`]blsyzxwyuruĩhdZJIGC;-(1;A9.!"%,+)&"$!%3;:EPcg6 9Y`]_[PJB:201257CNPJFGMW^gmoonnnqssqkd`dabhhb``xƼ̠q{¾ȿyZCB<0#TVZ_djnpvytP:9>BBEINLU^^WNJKLXlsJCDN\cjmrx|{xyyz|~~|ti_YSW\_`_]]]_abaaafjmmljibUMMPRLKHD>;BPiorodUF<<;F7,5Vpb___ZYVRMJFDA?;98753/.-+*&" 4Miĸ_=,-00*$'++6<6* #$)/684.& +   %*-* + #'('$//3C\sytwqg`^cimoopqlf`^L>+ +,8><2$   '.5:>A?ABCDGLOUXY[ZYUTRMD3# #)$  + )8?DWxò^KkSHOUWM;-+)(,0103449>FLOMJKWepsprw|~|ulfwsr{ʾy\RA,2FXTG2$#!  ""&+5:=Msf0 ((2OY[]YPG@82/./02?MNGCFLY`ipsrqqqrutpib^]\]beecb[s|kdbkc˼ȾuVC?8."FGKPV]bdjpv}pN438=ACFJJNTY_cdheirqUH9EX`gkqx{{wxxy{~yjd`RS\^[\]_`````__aehhghaTKHOZbeca\QHIRnuwuoeRC?J]lnhdchddca\[\jtr_RZfjhfb][[]]WTPOQTVUPOQTX[]]bcj}һǻOMr}zzxvtqc]_\J5)3SqwxþwLJUX_UVVUPA:H^yednvx_d˾G8DNG;-.012389547*+Dp{ng`ZWVUSOJGCB?:987520.**+)$!%=Xqø|R1##'()$'+,5:2& +"'/660& + +  !##  %*-," +  #''$()*3G^jjlg^WW^ab`[Z^\UMI9/  )1698.! +  %+16<>?@BEEHLOTVXYWUSQNI?/ $)$#,&   +BR_ly~źMHyZINU[UC;;759?BAFDDFKRWYWSRVbmst|~|wneaqw̵jL2,>QilcG( !!%(++-?ZeG),"%=PXYTPF?6/+**+/:EHCBFMYahnsstuuvxvqia]ZZZ^bdfeRVZXJ7+&/&IƈŽƽǺrVA=4);8* -GlƹľƻtGQ`KIKRQEA@;8:DHEGFGKT[_``]ZX[bkpsqoligffmзmTQWu{Y1$'"/82  )%+FTRNRE>4+'&&'*2=??AFLX]elosvyyz{ysjb]WYYXXZ\\RICB:.%#%/d庀}oUD?5+"568;@FJNU[dmt{bF41147;?BCCDJSZ]^air}onleI+=MWaglsvusrrtw|lkiRP]]Z\bgigc_^]\]_aaaeVIPcqrnmjfbYNILOQR[lvo`SSZce`^b`ZY][SNQYd_C29HO[[ZYXYZ[]XROPRQPVXWPGIVaq{f}ͺǾtO[{yusqpommd_\L6-0Cd}Ǻi\^S]XYWI66XsotpbWdsE3Td@4+,30(/AHXdc\VTRNLIFB@>=<@DEC@<;:98422,''+-)%79??990-572(%("&571)&)"  !$)/58<>@DEFKNPRRRPOLJD?3#  "(" +6>?5 *:RnƹɶkHaŊjTKFJPKBA=79CHGCCDJRY\\Y[ZYYaktrnfa_beimŨ}g9!"$!% + **#?QMKRD=2)$""#%,49;?GMW]bhmrx{{||{ulc^PUTNKKKKF8/20)')#8VqbcjRJD;/&!*/577:AGLQYdjnw]>2../16?G=1,4I\fhYZ^`^YUSUOPWWRPR_c\D-&.8GQTQOUXVXXWTQPOOXYVNDIZjījbnȺɹa`t}|y{||wpnnlifca]SB3/5GjtnɻeVPQ[QH;:S~xtyudUVră^XOL=9091)./EW\]YUWWVTPJFEDBAC@BEEDGL[jȼraTUVUTPLGC@=:850./0*','#-BXqɫyN-  &*/=@3  (150   + + +    $!%*+$$&.52( +  "! !#).155651.,-((''*-("!! +2A;.&%$" + + "'-23<2  #(  !1<;7426:@^uȰſTVҔgWLGEF<5./4862249@JQVXSWX]biqvrcXXXYfvŸlE+   + + $#",1!#(4@HJJE;/&%&%&(,/15;DKUZ^eipuz{{||xqg`[UOMF>::@4% (22( &ObjYPI@5,(&&'%#$$!*,02479:GJR\bfoyy~|U=2-,.16:==BGGDCFIGHMV_cc`HIQfoS42AO^iptyzyyxxx{|xndYTSVU]bcadc`_][[^```b\S`xv_TG>68=AFHD5)'3ERXTUW[ZWSSQNNSSNMPV\ZD,$(1@JMJILOOTUVUTRQOLSXVRYlɵ}^`tǹťo^u}wvx}zvpmlke`a\SF7.4?Njso|zq[QLNKIGQnttwo_QYɛiM35/839G?DZ^]XUXYVSOJGFFEDCDFE@@LXhɽvfXZ]\XQMJC?<:761.-1-,/&"*FXn~˷qF'"! '+0@CHLMNMMLIEA=;. %% "(26=FTfxŷ¼}VeئzcOEHPIA72244414:CLQTVURS[isuqh[SUZ_nɿ{[=& + +  + #& $+.$$'0;CFG@9.(&()(-010/5@HT[cknrvyz|}}yrg`[VOMJEEFQB/$'-(*=ONH??KWawk\VPH?7433/,*++)"*)*-169<@BIRW\eoru{lI<1*'*16776>DE@?CHA?AGNSRP8>JbnW85?KYdkpvz|||{z|{wof[TONSZ_`_aa^^\[[]__``ZR\laG<4:?HUaf`fS<+(1>FNORTTURQNNNSTQPQSXR>,%+4>GKHEEGFGGHLORSTIKPZh{̳}Y<^ǼĽf_{}ystw|wtolkha\\RE6)*;N^nqnrsmnż~cPDCEO_wysqttk]Ueǿȱ[1'%//E`OA]_ZUSVWTRNJHHHHHEHIE<=Odx˿|n^^^YSNJGC@=;8720+3210&!-K[mʾg=# '+.:<0 + +20,*   +  ""$&%$'-44,$ +  !" " + +8A6*')%!"    %,2569<=?CHJJIIIFA<96( %% +#+5?L_rÿž|_zجmTGLWVNC;68>CJMLD=1;F[iW;6?Oc~}}tibXRPLHCC?=;9842-5532*(7Uarΰna`uy[3&*+68- &-.-$   +   !#%$(-34/(    + #:60" + #' $,C\sľŲqЮqYMQ\[WQJEEMRWZ_`]XQPLOXcjhZOCGTif6  + +  ! "%& (/243/)'*,,*),.+(,:ES\fkkkotrtwzyrg_]WQOKFGI^TB.##$! !)01=:9@Qaa\burhfb\TOLKLHEBAA=71*-01/.028:@HMPXaeipv|V50-&#&-20-08>?;8:=;EQ_S<78BLYafoz~~}~~th[QHFPX\\[^_]]\\^_```b]QPQD96=ES[`lz~~~vk^TJEOVZYX\][[[\_acbceZKIK>8F^t|kVLG?QKA5+,4:LQTV]ebZfhkryfg_YZYOA92:BD@?@D_x|}§`C=Rn}xwwwvrmjhggjicZQ=4.05=GNW]]YL>Kqǿ[I`qnlkjnzþƀE' 54:TYYURTSQQNKKLONOOKIJJILRu~~|y|saLDHMLFB@<<;;85582/57@Tvw{Z>+!$0\{O,!%%"-3+ +'1/'"     +!!!'(+1462-#   +  + +<7*%)* %!  +     '*-/237:>@??>:62+&  + %*##6Rs̰p\SPS\^`_\\]_hjlh`YWXY_`ZRVizôO! + +  "+.&  #'&(%%""&&!(6?GJMSYalqpoolf]RJJHHLLHEFKOH3%.'+,*2@HIO[fecelpo}ysmgdbb_[XXVSMGC7*'.6981483:M`}ut{|z}gPCE^}tsqqqnjffefge^RH8-)2>DEEIPOF;=bɿyn~İtolosz½עo8 -MX_\VUTSQNJJKNMONKJMMMOTi}~y~~yx~o[MFFC@C?==<<97870.5;DV~~jG&#2Fs_9# " (0*#"%*+#(/+$     !" !&*.3662-!(&#     +,82(&)(%"  +    !! !#(+-.149:99851-$ )( *Gh˹qaYWXYZZZZ\acc`YUWZ[_cdk~h0    #!"*+$  ! !!%%  +!09??=BJSX[^^\\XQIC><>CEDEFHKE1&-./28@JRT\hqsrw}}~yuqommifccc_YSa8"$066-1:CFEGNSX_flqvzlJ1% "$#%(/463/'&)0795/3>>@ORD>04;KU[j{~ysk`RHJQSRRVXWYZ]afiiihQ8CJB2,A˿Ǩ|upou}ƽÔL (HVaaZVWWRPLKKLMMMMNOONRZ_z||x|~y{u_OC?=C@>=<<:887-.8=DT~|`9&"(0JiµrL/   ",'').8;7/+$#"!  + +   + + +!%!!!&*.3651+"+*'   +   +6/')+)$  + $&$  %')*-/666663.*  +'.&HyľķpPPQSVY[\aa`[URU\adnǻF  +  #''##$    %% (29636=DDCCBBCDB=:9569;=?CGHA2'&-298=GQW\agnsvz}zwtsstpnlllib\`A1+092567@JJCLRY_ekqu}}^E/!! #'(+06;;50))-1552-.4;DNPB6,-3ES\iwtw}|wobTKBKRSSXXUWWX`ionkhWB@F4 .>P\]^[ZYWTPTxólüǦaOJFCABA:3@c{nfdgs{{yykTOJEHXt{xsrnlkheb`^]\VNC;1..3;B@:>6--AqɿĞtpqqqy͡]-$ 4Naa\\^[[WTPMLMONWXRLNPMX||zpu|~}~rZIABCAAAA@?=8435;ES`zZ6" 0APg|dB' $*.2530/'%! +   +   !! %*-13/,'$! $()),(    +   +*1,,32*  + + #$" %'')-33221/+'  !# &6Iy»۹Ծj[PNPNORUW[YVV]clxſd;   !#%""#"   + #"  (+)'*154/32122221*(()/6=BEC?935:?FLRW[`gmrw~}|||}{|zwtqnlgD/.6:=<9>FJHLQX^chmrx}yW>+ " !%*/27>@>81(*-1650-,2:BKL?3)(/BQZbmnrxzwodUKBJRQQVWUWVX`ioomobMGE. +  +5AJR[_]XURPPPQYÛeӴhQD;77HJLRgsg_^bjpvzzzj]PHHIKHIWs|zusonkhc`ZXVRMF>8/9@<33:D9)"7gµÝrlommuk>0 5J[\\aa^][XSPMMNPVVQOPNHRt~wlqz}}|{iWHCBBABAB@@9647% %1FXi{iI-"%))($#!!   + "  %*-110+'$" $')*,,   + )0,.44, +  +"$! $$%')//./.-(% &>]xճѸt_TOMQVY[]^^ahpĵQ'   "%" "#!   + + + +  !#" ## !(+)%('&'()))#!"#)09;>DKTX^cfkqv{~}zwsqe?26?B?98EJIJWq}yvuqokga^UQKFA=85,6>;/,3@/$*VƴĹmgkkkrϰ|UF,)7GV[_ed`_]ZURONORSRSUXRKOj³rhlv|{y}lVH??>=Lh~uO$%7Mbt}gJ/  +  ""  $(,031.*&$#&)+-.2# + +'   !).+-12)  !$! "%)****($ +">d¿þϴξulgikijijjpy­rB   "$# "#" ""  "!##"'.59FGFDCGNVbglpuz}zyƵaE8=@@=::@ELPTWZ^cgmsvx|iI2$"#"$*1:>DGF?5.((,054/)%)3989@LWZ^]ZXTONLKJMRV_РmTD:9=>;8;K\bfmlfgfddfhinx{tttg]PHC?968>BDK^t{yxvrnje^ZNIA;76431**1750+#1U˻ggkmmuܽnW3%4:IX^`dcaa_\XTROQRQPU^c\UQhIJ~qgiszyv{|zdUC@;757CFC<3-'',1550+!&/9?;6770)0?OY^afmv|}zvwuoaVLJKNOPPRPRUZbgkmmk`UI2(0>QVNMOU_[YYTPONJGIKNPSU\Б{ٺnRB:656@?:7>JRZ_cdjmjgfgjs~{yskfccSIA@EE:2477;MfyyxxuqmgbYTGB:523337*%/:5'&T¹xekptw~ϩa4%5EQ^ca`aaa`\YVTRRSQPV_c^Z\o~ųvmjqwwsppu~rfXSH<426;@;9;CVrtjK.E[rzm]UVXZWSE4&   +      $# "%*.12/-)''(,/02*$'53'#   !')**+,*$   +  ((&!"#$&%" +'BfĿƼE  #"  ""$# "   + &%"!!%*19?BNPSUX^gp{~­gA:6;AGILLNPRTY^bhmprw~~xW:*#!""#"&/78=AB<5.)%&+1661-!#-7964;<7-.;LY`aelsx|~}}zurtupbVNHHLNNNRQRTX\aeijh\SO>8CTila]^adZURKEFGFDGKORSSUxk꽛hSA;;9441688:AELZ_dkmiedfmw}mhfb\WUSLB<<@=1*0318Pm|}~zvtsrmhbZQL?;4001333///( *LĽ{yy{~|tltz}׺vJ7EV^`cb_^__^^\ZXVTTVTTXZYX[k}ŵxu}ummqsoijmty|ywupcTE=>@D;7>NavvjWD]{~rdWG?;9999/% + +     ! #" !! !$(,//-,*(&),023% 4:62)!%  !# #)((()*&" #! +  (-,$ !## 0S|¾ÿ¾Ǽ¼f3   #"!!!#"$   !'#! !'/7@EIUX\^ahpyþfP:8?FHJKLOQSW]afjnosz|nN3&#!#$%##(1:9>A>6.'$ "(/451."#*3523=?;408HU]_cjqvy}|{zyuquwsfYNHEJNNOSQRTVX\_de`TRUOMYl~~ohfb`TOMFABDBDGIMNNNNhipfjyǏb֚vaMEDHHB;817<>AFFJTY[bfecejp{~wm]XWRNHDCKD:3-(!!+24;Qmyw|{vqpmkgaZQHA631/1221,16.4Yſxpliijorsrq}îmdv}pb\]__]\\[[YWVVVWYZVQU`zyuĶrk||pikmkhkmoqv~~raVQQH<7E]q}|mi]utkaXLA72,&$''!  +    %# "" !"! !$(+--,*)((*-023% !!"5<=@9/-)('" "$&%"%*(&')(#  !%!  (01&!!7aĿȼƺʿĽS3 +"!!"!#"% +  ! "*3>GLP[_cfhov»nI=CILLJLOPSW]adilmry|{hH.%"!$%%$#)3<=617DRX]ahpux|~|~|zx|wux|xk_OGDJNMNSPRTUUX[`_WLO\\]ixvmg`[QNMHDGHFEGHJIIIHD=PBD[fɖìXG<>ISQF>;2457;A?AJMNU\_cgot{~xog^TOLIC>;7FA6(&39@Rlvty|}wtomhfa\TK@:1/..1100.37/ )Xzlca]_cimoqs̽zz_V[a_[Z[[[YXWVTW[]UOYhtf~ƿøpfyqefhhimpnlr~vjdbK<7Jh}owpxfXLD;4-+$ ""      ($!" ""!!!#')++*(+)(+.123'!"#*9>97;;DG@WЙdŖwMA=<=<=>=;@C>5,*17BJPTZcjusqojcZQKIGB;4.,A;,'388Hanmoty{wrkfba[RH@97(,011443/---3Sɿ|pbWTW[Y_lssyԵc]iqog]Y\^]ZYXZ[ZUPS]UMYlxve`vŻ˽tgom\Y^jllqpis~y|s\=;Os}|zylYG;7/)"!"  + "$"     &! ! !$##"&)++***)))**+,/' !#!"*7@LKBEIBD?73* !!! ! " !#  +  +##*5BNV[^ggilovy|{}~|zxwwxwxzzyxxԬ|[LILMLORUX[\aehksvuy}lT@/$ $'$ #*/3++)%!"%'((1,(-5=<<:759AGHFMRZenuy|xkVOHFEEHOPPQQQRTXXZZdokemy|xhULJH?>ADEFEEEDBABFIL=FKKC@ddgIAA@AEIKA;6322116CS\`^[Ze_XRKGB?AB=3)%(,,,& "#.421B\gbglt}wspleaURKC;731/004655462?fȺhYIDEIRYdaelnp}ē[BF^mywoicb_]YYY[ZZ^QS^omd_bfm~jjvl[SWejmspejqmXZ`hwhDF\w}sslaTI=1-- !%&##  %#     "## !#"!&')++*++')''&%#%,%#(,/3F_zy`Yfm]UMRfwzsM1$)-+'$'+*% "%'"  "# + +  ',.,(  + ,GnþĽþe: +  !#"!" "$!   $')0;221:FMKGNSZdlswzwiTLDCBCHNNPQRQRVXY_`ejaY_jnkZIBBD<;?BCDDDCB@ABEIKDA;?N\{іdUA=BFHGDC68;<:4*%*8IV\\XV_WNE@=:;A@:/%#)1,,$,112F_e]dkt{vrojb]QMFA<::88434679=*Aiȷ~rl`QDBIRZagefjjm̢eC@\xl^`i[[\\[YUTMOk|rd]^iiem~ʼƿsoxwfZ]jhjqnbfpnSV_m}lFPi}}zokWL?6-%"""!$&%" %#     #$"#!!#! ))*,+**+)))(%%"#,&!"'(# 7\nic^[`o}lI* $),+'$%')$ %&# "#   + +#-2/" !=]}žŻI# !"##!!   + !  "'*/6BO[chjnmllmpstpsy}}}ytsqrqpooppqǺɺnMIILPTWVUYYZahlopv|~jQ?2'"#$#!# "#%'0+(/7=:7002;>>869<=???>?ABCCBDE?4:Rj}ŜmK=:?DDB>=64)$'1?KRUSQXPE=8667<<4)""(00-""+/5Kcg\`hu{wsoja[RLD?=;98=:87<1a|k_ZXNIMW`ejjgfjjoѮrG;^uukhj^^[ZXYZ[TZ|qsw_^fql`csʼþysy|ma_kjlrl^amlYZ_jyqHYutz^T?6,(% " !$&('# '$!   '$"  $! ! +,+,+*+,,-,+(%##)% $)&&Myfabj{mX8!&(,,(&%&'$!"&'" !#  +    +43$ %#-Llüôd:  """!  !"&,15=GS_fklppnmnpsuqty|}|zyxz~~yvsrrqnlklno½nTLC?EOV[XUW^gijkrx|{{|hP?3(##&&"!  !"""#$))+/3511356>HMLJPTV]bgjlqv}vjXI<ACCA<J[vxTLA<::;;=>>BDB;4///5=DILLKPH>7210453*#%*,(%.8Ldi_]gw{wtqkc\UOGA?=:68:BHA429kŵn`VQOLOZdilomgflntв}O:T[gvsnke`^dlt{qkm`]cmtmaak¶ÿzuu{qb]ekntl[\fd`[X]h|yL^y||k}uD5+&"$%"!&+*)  )'  +    (#  #  !++**)*+./10.+'$$'$!%,, 4lohdhj`OA*! (+-/,)('&#"$)'   ! +  + (33( +  *'#6Uz¼ɸĶļ_ !   +  $+29?EOYcilnqpnmpqtvwx{{zyvttw{|wtssplhggijgZG<>GQWWSR\cedejswuty~xcL<3+%&''&$#  +  "#"  &-0-)'+47:?FMOPPSV\aehjinu{~zpaM<;BEA?AHPUVSQOXiog_PGMKIC9334-%!"%(-36;>@BB@=:9GIAAH[tvUCGB=:989:;>;9887558;>AEGHGE?62.,*,.+" #$&%!,5Hagbbm|{xussnf_[UOLMLHD>>FIB:BTƻwg_WSQS[gmnoqohhou}ɿɰ_EXUT`wvwvsnjlqw|ukc]X\clomhdftŸ¾¸}zv{vh]adjsn\Z`]`ZTT[pP`xovytia2($!!(*%#*,+ !**   + ## +  #'!!! !#++*))),/2320,($$'$ #/2#"RwaRF9/+#"#!'*-..+('&$$(*'    +     *1,# +  +$.-/D`¿¿¸ȿ|. !!"      #,5=IPYbimopppnopsvz~~{yurpprw|{vttpkecbdeĽ|lXIFINPXPOY``_aemrpotzzr^H:2+&'$%%$" ! "#$!%/1'!!&158=EMUXRTW]bgkmchnty~}~uhR<:BD>7=CNTTRNKUktmdUMQHD>4121)$ #(06:=>@BA@><;HF>?AER[hoXFIDA@@AB?=:850.29;729:=?BEED=83/-*&(,(!"$#"$#+2D]gcku|xxusssqhb`[WZ]^ZWOKKJDHaoea]Z\_iqtpoqqjir{͸~{¯qUtk\RU`ggqtxvpjfe`feb`YWa\bhimnhadǸ´z}n`bZbqn]Z`[]YVUYjUatfkqmkS-*&#&,.$%)( + + +%.." +  $(&    + (&!" $**)))*,/121/+($%+&!,3&KgL5$ &( #'*,+*'%&%&*+(   +  + + ".3."  #)276?VqĻĺF   !# "! +  !  (3>>><:75;>CEB@?@@?<99=::76;?DDC<940,*),)& #*6EWbft}}|yvuqnjiijhhde`Z`jh\MHDDH^žphhjkrz|uqruvwuux̴a^]NJ>J^r{dMKIVXcjoqng_[NRZ`aa``eeeffeeehqͼ{~~|qi^`\ccYZ_[\SOOSblkmss^mcE/ /7.  $# (70$ %!  +"!  !!$  #*)))**+,//.,*(&&+'"#,0";pƼtV?+ #!!$"%(,-,*('#%)-.)" ! +  + .40* ,*)2@Xt½¿ùj8 #"!  #! ! $/9LT]hopnkkloruxz|{|yuqnmkgimprux{}rqmjje]XX¼r\KINSVUQTYYT\_ceegjjbP=4,$   #%&'&"%&"!#)38@?<8=DKMQSUZfpngb[TI:,''%&)#%(-279:;;;<;:8678<>??=<9:;;;=>=A@@?@@@@@?@BCEDD;7469<<;=:4.+)*-)$"*7I[eh{zzyuqqlifdcca`[]YV]f`RHA>I\žysuz||{rry}{zzƳgI+56" )7FXjtȶqXTPWUW[]^\XVUQU\bdffghihhhggg`fwŷz}|sj]ZW\^VZ`^[TNORa}nxG,#+59-"!!   %-5("##!  +   !  %+***,,,,/.-,*)())'#$*, 7dgR;0,(%""" #&+-,)('$'+..)!     "(*,.(" $%% "4PnÿûI!#!" ! $"  "-8LU]fmnljklosvyyz{yvrnkihcehjlosx~wrnkke]WU¼fNGKRTTSUXVSXZ]_`acaZM<1)! +  #%'&!$%! #)4;@FPXWSUWVUSV]bhlomjlt|zuu|pbOB>@AA>>7;>@@=96::99:<=>>>=>>@DGB=878975950*&'(+%!)9Nakl}wvuokjeb^[ZYVTNNLKT\UG828Syƿss|Ƨz^<"09&'(#'4AGUyǿ̹ba^`XXXXWUTVVVZ_dgjmomnkkjkjjaaj̿¿vv~}yo^UQUWRXa_ZRMMP_wql}[))39=9,    "%'-+.=ZtqO527@OVbkidXD.% + +  + &#"!#" !&,+,,-.0000/-,,*+%&$$'' !0Qy{aB2%&+-*&! ""%+-,)'%&(+/.)        ).*'%$%$#6aÿa ""!"! ! #! + +   #0;OV^djkjhkmptwzz{xwsmhecb^_abbglqz{uokke[SP¼nSILRTVWZ[YVXZ\^___]PG;0(  + + "%$%&"!$)4=CIT[[XY]\VPPXahnsqllry}zusty}}siXF>?CC@BDGINSZ^a`ade]R?0%!"#%'*-0178:>>??>73./39=?==:30-,*&$%&)%(8Pers{utrlfd`]YVTQNKCA>?ISPG44Cj|uxļеfU3>VOF6'%#'0/1Jsdefibddba]\]^]`dhimpsqpmmklkljddqļº~soyucVOPQMT__WQKHJZv~tpnup;!8D@=5& +   %-7ARiէyĤW7+#  +!%# !!!! #!#$#!#',-,.00222200..--$$%%%# #+;P[Q@2' "('$"$#! %+.,)&%'),/.(     ":o{yx5   #!!"  "! +    &4?QX^cfgefkmquxyzzwtnhb_\\[[[[[_eju}vojhbXOJ¼vZNQSSUY]]\[Z\\^_^[YJF=2'   "# '($#$*3ACDDDBDHOV\\ZY]`YL<.$!!##$%(*-.8:=@ABA@82,*,3;@GIJLPUZ^`dgihfc`]ZTLFCBAA?=>=93-""###$$%% %3Lfxxssqjdb_\XUROJGA=77@MRQIK_{vzȼŽ_A6 ";eoA/.&%,)"+@scbbjgijigda^^dehijlnponlmkllkof`fw¼żxrju}j^SPMHP\[TOHDDSlnI'0?A<6+  + -I`ƨw\+   !!##"! $##&&"%)-,-/012322221011##%&$ "&)+.43.0+%$! '&')& !%*,+(&%(*,.-&     +  @DDB@ADKRZYUTWZQE9-%""  $%%%')-/9;=>>?=<652018BIZ\_ckt~zqiaYRA>:985/* !"$$&% !+Cb}|tpqpjdb`]ZWTPLHD>75:GS[afxuyȽ̸sC)$3\}K04+%5C>:.JwĿÍl`Zcejllkfa^]ggijhhikkklmllmkld]]iȾwsfp~qi[RLFNZYSNF??Kat_E)#1BE?3*     +Juši7!!#"!!  %$$&%#%)-+-.011222222222%$%'$ %*+$!#'(.+)'""*)*,(! #&*,+)''*+-/,%      +?z{lcd¹ƿÿM%  "!!  +   + #/:DOV[]\]_cgkpuwxwxqnf_YUTTVWWWWZ^cmu~wl`[WNDA¼pa^^YX\_[[_^]]_`^XRRTM<*   +$*)$"#'/8=@GNSU^fmokjlpuw{~}ytpmjltxvuwt}x_F<=.80)Jr{sF:Hx÷ȟ}fU^bhjkieb``cehhfeefgilopomlmf`[_tǾyrckzvraUMFOZYTOG>=HZive=%-ELE@+!    -KyֹB& ""!$"#&%#%)++,-./1223333223*&%(&!$((# "##'$$((#!%%%&+(#!$'(++*))*+,./,$   + +  C{{i^]½ÿ¾d/" !#!!!     (1;CNTXYYY\beintvwuvnjc[USRRSTWWWX[`jr|uiZTPIA=xieg`]aa^^bbaabca[UWZS?*  +$)(# !&/69:>ELNZcmssrsuz|~|skkhlvyvtuudI>;:A@?=>CJPXYUPRQH<5)"##! %$%%'*.00001/-)(6BR[^bkt{xzykXG<4.*-)$!&*#  3Z}}|yqkilmidcb`][YUPL<:5/,3CRoѶºġc8%=ҡk2'7/*Yh>.Y¸̽ɬmV]ccdcb`^_``cfgedcdehmprpnlsnf^ZkȾô{rahuywdWMFNZZURI>;FWdvnc_^bD0:OH=:& + &Alr7 +) """!"&%"%)++,-//0012111111-(&)(""#$#"#&" '-+&$ $)(%%()*++*)+,+-./,$ +  +   &Fyľzh][ÿǿs9-"% "# +    +"(2:AKQVXWW[adimruvttmhaYTRQRQSVWWXY\hpyueVPLE>;{vkpgchf^[^ce__e^V[YelE%    ")($ !&1235<@BAK^ekstrxxz{}zunigjmooqtuyxxoY>356BEU\aoqoupqqqpnkiijkllotwxwvoZ@/*-5;::?EJLMLIGC?9-(# $&(+-00.+)'&)-50S½רcV[Z]adfgd_YTY_ccdehllmmnnmmkjlldbq¼µtjlfs|p[JFIOSTWM:8IY]ilg\USPIMKMRN=-%   ! -RڻkK+#%$#!$%&(..-.045410.+)()+/01-,-+'$"###%%$##$&(,.0/-,++++,+**,/40/1,     +    />HGV¾žĽyrq¾ǽnG- $$!   +",5S[^\ahZEAEINQSTVX^aehijkknklqq_< $/78NX\YRND:7<@>:10.-,)&%(,,,+***1693'!%*%$&')-023320,++,.///-.023/.0+ + + + +  + + + + + -[s}mküĽſǾ½üļýwK1 "%##0EatW8 " !*16:=ADFHMSX`cgijkmoolfc_]YVTRSWX[aimquy}}xtsmc^XQHD>;743332¿}u]MG[jqtsgdo|D    +  +!'**$$(-)(*//.>RY]\cgT<9>FMRRSTVZ^cgiihhjiksxlJ**20255321/,*('(,04762..6DO[ac`]`kvwwskbVD4  'B?6*" )En{wsojea^\YWUTROJG;722.#6aοɽɲe`o۾t>, IƊM0B}ת|SRTU[`]X`o`^[[^acdcccdehklnmlnmjfdeŸŵnn{qld\QG?;DHE@@JW^c]RE606>SVVI;1)#!')' + +"&&"%KⰢྎZ5*+--+"!+1[j}qaTF6+420/,(&$%()))+.1>EH<)")$#$&),03441/*()+/010//133/.0+  +      9n~usºþǾǾſ¾ĿǺ¼V6 '--2/%8Ysc.!  "*16986511011iULV_dipjhqC     + !&))##(,)&&--,8LSVV]_K56AHPSSSUXY\`cdegghhkt|uU5!$%&),1341,***,-03&(+2=L[cca_]]dksoogZK:'   %--)'!  +&"0T{|vrnid`^\\[ZYWRLH?:22.&Br½ľȾ¹êХd:)+9d{E(8uệVT[SU\\WXb`^ZZ]`a`bbbbdhjlnkijklgba˿ǽǻvmsumbXQIA?@BFLQ[^accfhkjfda^ZVSQONSVY`imotuuttvtpljjf_YRLFCBA=8000//./0|eXMQQ[knmu}B    + + !&)($$(-+%#**(3FPSQVVB04FLRTSTW[[]_abdhjghkt~x[; &/664(&'((())(*09DOVZ]ZZ_ionmbaWG4# +  +  **%"+'6_{urmiea^]_^^^[VOJ=5.1/,J}½¾ƽžĹ̷X8*8Y֨k=&4n˔_]_RNX]XTX`]Z[^`_^ccabceiikifgijc\bº|moy{o`UOIC>>BB?>FQYQPNI>59CEHC9343-..)  &-- JҨԥjC $4K^mòu^B;3.)))(!##&+5?CIOX[^abdhkhfb`]YUROLLOSV^gimstrnjhfa][\XPJA>:::83-+,-,,-.1»}[OHAJ\cnq<   +   &'" $*+-& #'+4?OLHGA5.0ANY[ZZ[[_accdfijekmnx}fE*   )/22*&$%()'$"+;LSPKHMR`lqmkobT<(  +     + +/Fn|urkgb`^^^^_a_XPJA:3/84KĸŽſտaC15{ŀH*0DeգpZbTPXa`XSZ\^^]]_a`a`bcdffdfgilng_]}¹˱rkpypaWSSMD>A?<=GMMNIHIE?=@JC9/-049:1!  /,6TٵX4QRqxaXWXh}įgI223-&% $(1:=><5,&'*,))(*,,,-.,-,./0564211123/./+   + + + + 5wztjj¾·ɿźýʼ¾ĿV0! "*+/2')t~ǧQ' + !)2;:9;98;<>CKSW\`abcdedc^ZVUUNMKKMRZ`gorpmic]VSQPQME<44333210--,,,-,-tRE=BMRfm:     &'#!&,-.&!&+4>JHA<3*).@N\____^acfggilmjnooxkM/ #(+***-//0,!-ASZVOIPXcijhddQC+  "   *4Pu{upjfb``a_`aa^YPKB;51<>WǸþ̱O90">}Ź\:!*Pv޳cZWUZab[S[]^^^^_`_`aacdeedefilmha^zż̵xmmwocXVVOF?A@=?HMOJGEHFAAEG?4-+08=9/  " %6Yn^OB/!2DLP`˷gI=;7+# !#*25640+*,..+('(*++*+**,.14775322113/./*    + +Gyobc}Ŀſ¸ĴĘg=#! %*&0˯ָG" #+3;<9;:7:;[i9   + + + +  "'(#"(.//' #(,4=DC;1% '1CQ_defedefhiklpqruts{rZ6 %13653232(2CQXXTRR]da]\QI9- + ! !"!"#   "!  (=_}~zupjeaabdaaab^YPKA:61YħkMA<1$!$#!&-1/.--.01.*''(+-.**((*.149986543440/0*    + 1^~qb_w÷{|ÿ¾ý̾żҫ}M%! ! !4²ѣ}:  %-5>>;;95679?ELRW\]^]_^^`^]\]_]\ZZZ_glqvxuqmg^UOFA>;620000//..--,+*)((zy{~|~u_^x]MG64[f8    + + + !$(($#(/1/' $*.4;@B9, !/>LWadfhihgiklmosttxxyyd< +  + ):<=91,//:?CGIPWZU^]URO;&& + +$#"!!""#$&'(((%$&" 4'  !  $En~~}|ytpjeabdfbcba^XOKA;:/5Lyͼº½l4"8T^fcZRG;8!")[ץsDVb^^edY\\^^]]]_^`abddedcefhlpld^lɽzoqlcYWVPI>>?CIORRQROMLLNQI?1*-6?E;,)"$8oξ~S97/26=A9+'&%)+CldC7/% %*)&(-/,++.132.+''),.1,,)))-048:9875443110)     'Jpzkfx׳xowĻ}sppŻ̸ŷٸ\"# !,bɰY. !)19??<:73455>ha6    + + +   $))%")01/& $+.17I4   %Nx|{{{xrojeccefdda`\WNJ?;<-.RľĿ¿лY&(0.+-67+,EQap庀EVa^_hh^\\^][[\^_`aceedcbcdfkpmf_ftðźuolbYTTPJ>=/!%3fǑs`<$(6Xa[D/)-(!;A0.AgĹR8.("+-++./,+,/121-+'').0110+((,/3:;:;96564120) "!    + >ayvs{˭|_FCNY^`s»žzrmgxȮôٿj$$ +@UUm̭|M-! +#,44&)) '08@D@:50,-/2:DDJTZ][[[`envzfO98??;3* !**+7:4484/-'!!)$!/'04'  &Tq|zvuttqnnohaahddb][UI=@45?aùžžȹmC&+Tҵs7v澑^FT`abc_]\[ZYZZ^`bdddcba^^afiihg[Y|¼Ϳ̵yeUQTUXI>69<;9B:575. ('(154;;5-("!%!./# + +,Xu~|xutssrppoha_edc`ZXTK@8,3P~Ÿ¾àZ;.=dɚV)/˞hIR]^__\\\\[ZZY]^_`aaa`b``dhkjhf]_|ǼͼzdUQSUWPE==B@@AJRUQU_b]RI=:>A:0*(%""$$$/+?ٽcq'%I=76;;342$**++! &(% "#$"   )ax}f[dy͜^A5539=71[ͥ}N66Qļƶ|~Ǻ½þȱפb3(  ""ED;42,$''',07HF>0% !&10% 4^y}}yusrrttrpnga_adb\VTSME6&3bƸ¿ƿ˛@+.Fiשl3 %J̥۱vOPVZZYXZ[\\[[Z\\\]^_``aacgkkkhb\_uózdUPRUW[QGFHIJJRY[Y[ejf\TH@BD;01.*'$$$&*"0gİthilkhhdacqόSޖZ$(@GhݮcFAbѻ>"4?A@9@5'"#&# 46652-("&0:<;7<<444(#)-* $')&! !$!#    + + + 9tmXWqǞf9*)/9NYO26kӟ`>5Ck̽~üæ·ҬwE)   .`͡k+$!%  +'06=A>:61.014:AFKPUW[]_ciup`O>42-/122100..-,*)((eKGSUZ]ZXY`g`ZG11EX`trk_SPV[VP@( +    +   (,++&!#).029AB?;;=?EJPUUUUVY\_cehlonotzz_OI:/.,*.39;;@GVOH@3%&0FJIA:5/()% &)*,,:SXM:)  "!"#)10) ! 9b|~}{~|wrppqtsrolgb`_a`WQPROH=.>užҶɼźƏ6")FlԽ~G&0ImקuQPGNZƒSLPSUSUWY\]]\[^^]]]_`a``ehkjhfa]`puhqÿ̿xdVRUWZe]RNQTTTY_a`ahmme_VPPNB46.)''"!IˬfVF3)*--*0+(+5JaqU|M,&*L弸^MDLqЍA# 4?B@9D:0*++%"68631-)&%$,9LTE<=;36:5+./*&)*&"     +&F~u\TiƝd5-(0AB@>>AGLQTTSSTWZ^beilomnrw~w`UP@69957<;1&'/BFMSLA?ENOMHA<5.(&"!"""!! $)-,(8Yg^I2&&('%! ! """&--)"! 9b~~{x|zvrpoqtoomjfec`^\UNNQNHCAWԪ˛j^k{Ͷ¿ĸſֶ9#FsŏR.*JoT22;DLrΎYLIMQPRUWZ\^^^baa`abde_aehhggdeaalmXVl}·˺xfYWZ\_leZTV]][^cfefjqrqonljcQ@1% $("'##^—iF9::5/++,-+.5@EGC?>AQrzV?2WӜeG;0Tݟ\8/;A?:177661-)(7641/.*)-8PtOA>>8:>843/("! '*)&#!  + +  + +/PygZeyƩp:""$7SxE(BpJ20Xǥ˾ľɿľÿƿ{ȿh,  ! +1`jE#   &/5@DDBBFJNQTTRSRVY]adhknlnqu}s`ZUD;@BBBDA1 (6=HSSLJMWUQNG@71)'$!"   %*.,$6\sn\@..113.'(.2110/+*.22/%" 6\y~zv{yyvsqpqrnolgfgc_ZYSNNPMFCPs̭rXHO`өi7/>FX|ȡ¿¼ſĚg4!Iл_, 3\xE*1ZnqxךcOFINLQSUXZ^`afffffghhaehjihhhfdaggRDJOwİʹzk_^__bkg\VY`a\aeihgipuz~s^I, &.)(##kԿxV8$!('+/112101:ELJD;547E_ęܶC61fͤݝ_K?$DݫjA08<=930:CE?62244410-*'$,4YaLDD=<9020)""#"$')(&"!%   + +   <[~wnot{ļS*)),GrA,MoL1.YxaüéǻĿƷŹͷv0   %A\g]B+  '/7=C@;51-/016>GKPSVWZ[]ftraO>31/0233321..-,*)((bB9ACDEFHIHHECCC7!  .AMQPI?- +    '***)%&)+05>>@EEDFKKOQRRPOPTXZ^aeiklnqs}sc^XE<:89=CFFE?98;<:6+'" 0Rs~xrwwxwtrqprpplgegc\WWSOOPKB?X|֦v:-,6;K{M,7NEG]غ˾ÿԬwH/,^ص='Mpt@,9{tpUFFJJQRSUY^bdhijkkkkjiknnmlmnilgghVC=>Wɿpgec_`ecZRW_`Y^`ddcckqx~rYC*! *.'$)&"y fG..65,(+.38:;97;=@CDILOQKGGL\y}>)%*6ALPJA8703774-$%#-^dMD<:90793' #'*+(# + + +  &Kkz|xtƫpC$1::\حo@4\`A/2c|SUǿĿȪgSKP^ƭƿ7    +56,   )17?DA<41,../5?@DFFEA?@A@>6% $7CI>3!    %*+*)&'*,15A@?DFDGMKMPQONMNSUY\_cfiloqr{whc\GXv‚D+/BRKDḛx?,Ed\PNlȿtǾʚ^0/&@v֡j+;mߴr=.A˝izvWDAGHRSTUX_dgjjlmnmkjnqssppsuu{vqqePEFFdƼtkhe`_`_WOT]]VX\``\[cjqw{|vfM7& %#!-+"(Ĩ{T;'!(*,3446<>A=:>BEGHHJLJGC9-/FavלV66aŕ[8%,GϮT1/3:CC9ALQLD:6.49<8."".kˬXE:>A=MSO<*#!(-0-&"    + /Vwt{|vnœ`=#4:9bd?:f׏K6/;p];RǿԮWB822>UľƧzú̈́;#   +   !  +!)17?C@<40,-./4?<>JQC.! +!-+ !*-0,+((*-39;@@ADHLOOIILLJKNQTX\^aegnosvzfhUJO<;0+)0BLKA=Iaqt^WRQQOIC<500007AACGJLLKJNFED:6NnjPEEIROKIHJNRSNFB?>:40' Fg{wrtttstttuspmkifb_]]ZTQMD:0NkޢW!>vg>wĦVC?myOX׽xP23Iwſú˽wG('4X|6+Xܼ}>,C߭`xpXC8>HRUVVW\afjiijijjkprutruz~{zyqeob9Ivʲ{rjb\YXSMMQSRNNSXVTT]dlkie[K9,!  &J߻N**0)!)2668:?BFIKLJIIOSLABEC>4//23Ccӈ:-DڮrL%3]lC8<=>D<5GTD?C;-36321'):nУoTOUam{|T7$!%,/-$ "    + Gk}u{ywuspnoqI6/&$9rߣZ@;772--/038BHORVZZW]jzvdRB:84433322200/.,+**Y6,.26@JRTQMJLMNW\P=,  "*.0,+)(+/5;@BHMNLIHKLJJNRUY]^aegnpsux|qiQNS=BD?NWHELK983./30'(#9i˥c>)"/(('*+( "('     +&Qrty}ume_ZXY^`{I81-*2\֡X55<>AJS[^[WQUYZ_cYK@4" "+.0-,*)+/6=>A>?BHLNKHGKKJJNSVZ]_aeglorvxz~}eFMU<AR_`XTRRTSOKC>;\wˣ`-2.0:OfpqkcQ?9:2),[\EgueTE?AA@JNDAJK:7.().0,,26ABh¹\5%",3-'$&%  %'&   +  2^ysv{~wnd[RNMNONkV;.15/DvŚS4=rα}MEDP{fRIXݰՍbSܺt?D\}ɽIAݭhKCKUuúž~ǽ¿׸I + +   +'18>A<772--/048>FLOT[]Z_iwzfTC9855544333110/-,++eKFOOPU\``]YNTY\]]WOMJ@1 #+/0--++,09@BA=>BGLNKHGKLJKOUX[^_begjnquwz}`7CM=@EJC=9/-;FKC31BPSXVSTSSPMEA?@CGLPRQRUW\`b]^THGWglziWKGNRYbhmorsod\VOF=-% + +  +Mmz|{yurrrrrtuutqnmnnmkje[PJG<1)/:=Cfԧ`"'TݡO[zÀQ2krQߵK!E`6'b£o;!"(-7c㿊G (5LmբU/B}{זaQ?/09AGKMOQTVWWZ^aegilrwywvx{|m9kѻ}rfZNINLIMU[[XZXVW[ahmdVA.$ "##)$3̦yV)$,,& &9EDBCJPV\bgnt~zsmgc][VNA85,%!"*33=Nc~S454,#(7AAA8139@DHg_86Zq]H>=<;@B><<:.00-*+./>G\kZoȧtG)'5+$"',*'  ! >h|rux~zsc]XWUQH@VnC+062CoL5Bp|Q8Ia}˟K?DhȐoJYբe?A]Ѥ\Iڼ~TADiοº̸̣U    +)3:AD>972-./049=DJNT[^[_fsueRC9755554433110/.-,+q[Ya^]]__\VQLRXXXXURPUUL9$ $,.1./-,,0:DEC=<@GKMKHILMKMQWZ]_`bdgilqux|Y-4?EROI<>G@6=>C9'(=PS[XSRPQONKHEEIOQQTW]cimpqfeXII\jluq^PIPU\cimnqqmd\VOD;-#    +&FetwzxrqqprrssturqpqrpnhbWMJE9,")997]԰m0%Lܩ_gy˙d,]}Vդb50hT7lpԦP-"&()2kբj=(11#&Eax߰`0;΁xՙbM<001:@EHJLOPPRUY]behjpuxwxz}Dd̾{qfZNJPONRZaa^`^\\`flpiXA, #&&  Hʤp=++11)#*>ID959=@CKXiuujebaa\RI9300.*),!.Oxo>265/',>LONIJV_ixb>2LkwgM=89;;=@:-$'14/+09UfԭăH0""1-$#1?EG:/$ $#   Jn{yvvx~oha^[TJCL|L!'1?bÍ@/?_sqaQAG_ٛG-DFA;82./00494#)F[^[YTPMNPQRPMNRY[W`emtxyyxnlaSR_jktxdVNUX\`ceegd`XSOI?6+    !@^mswvrqqqqrsstttttutqne`WOKD5%"9:7gۼz<'EnpԦq1Wۅ[ѼʔC6OW@tmrВe8*,+%&7{ňN58-&&''(-9KZjpy~xrpnjb\MGA=6)##! -?Nyh;..6BO`sȦc7)>o|~rS><6@ADMD/%).11)'3Cnϋvګ_+'&%1;+ (C_qxdU?-$#%%! +  ,Wqwt|yx}{oe`]ZX[]&*DdΊ5+9EB72:Hr֒J"7ɼٷ{ٲ\^ۡjXHEuOWتrDChƶs@Cè~Ƚp%!    +   (23( + + " :XgovxutttttuttuvwxxvqmfbZSNE1 79<{ȂE*C߶qnآr:Yӏhʑ5@mQI}fc͑[.)1*$+O̱w<3N`.7py@7dѼqusG4<;+17:=?BFIJLORWZ\^ejnrsw}T`ƹzncXMKSTSV_ca^bdec_`fkj]K:.)&&#*Ljsc6$2::;941330230*$&.6FP[fp|wqkgb^WMC<4)" $%$ @}Y18aƘF Ew\EIF^gl{wecfW@0%)=Tt̪fQfⷂM6@GQVJ0"1VuZC2)#" + 93./0159KLE;9>FKKNKLPQPRV[]acbcehoqrssxcB 4ȯzL_x^CH<,5Ra[XTMGHMTYWXXW`kkekkkjd]UQUUXZ[]bgzob[db]XTRPQOMJHHF>4& !#$!6Scmwzxvwwwwwvwvwyzzvqlhd]WQF.68Bʝ̃E2Dزokۘk@ZϜw{KTԟ=BzљMQR=26/7:09D9EGINRUXY^aehjpxneƺwlYNF=DHIOTURNRSUUUVX[``V?(&`r[A&!',..369:=DMTcb]SE7-'37@MZfotyri`VJ<3.)((#!!$%#0=TaNc۩_?&,`}t}c]iKDVy8R˳dHS|rcroJ-Q˺rG,!  + .Vsytt|ywx~ummqXXlx,((AUwaC3By͞q͜y<+:}Ep̕f>HeݴgOçĿ¹䵜i_TQPSuʎC   +    + + +  +!6?HMOOH@:5/01249:>CHLQVXUV[afgecea[YY\_adffaZWPJEB>952224210/////..-,+**}dTQWXWXYYVQNFGJPX[][[WPNLNPQXZH$   +  $(-27>5,*'3ayUMJEIDKKKLLKMQUY]befhjmw{zww}~{f9)|Vg|OT\YKKTPUUVWPJKP[`cdhqutha[^gkje_YW[`cglzi__ejntvqjfcYNHE;-# + '$+=3&%)>Tckoptxzzwutux||{{|vnhe^UMA,2Wu美>`g9;xУ[nz3@q{[|_"%IٲdWjƪRl^6Nyʱ^2+2JwػX3)Oסb"&qտr9Ht`z֕N49:50(1939B;CEIMQTWW[`dgiow}~vȻ~uhRF@9=BDJOQOLEEFJNRTTb`S:% + Rna_]R;!"*14568'5iz0Q|>5mǘWsΈ31ZjQ~f;x^Ry]rqA@c|srҦrJ-/dҎL:}??^|ZߢY549=/%-988?>BEHLPSUVY]adgmu~ͺ}raG:627A?@CJSZ_`aa\UK@:6;9=Las|~saPC90*+%$''#!#"DTOTfijnc[\aj~Цb3*?xiͯl\\fviU]lj~۱ãϗebp{M(  %?^oqrvz{}vqsxrkl}}*";}r<<-4QaRFN`rT58c̚aTq֩ZBIrƑNTˏwzyxƽxLNeppTBH~̦V$ + +    $-=DLOQOG@951343479=BGKPUY\]^__[UQFC@@BHKMPPME@=83///0111110/-,,,,,,+**))(x[IIRIHJNRSQOQQPRUYZXWYZXSONQDJPI1 + +  &+/3672-.0@hwTMJGKGLKMQSSVZ]`cgjjjlnrxzwvyV(WβhkvXR\je^]YNSXZQGGNW[\\_hjiiknrqokigeec_]dmt}te\YXYWZbjiea\QGED>4*% ):5)&8E0$&!!/BTainuy|}zxwxy|{yyxtmjhcZN=$5qk-Q•M8fQw֔7(I~YNz.2mʩmA^ydeowL7O¾ܷTB5Avs<-YψL?Leb`d8/9G9.,576;BCEHLPSUTVZ^cfmu}ƺ}p\=0/-49>CHLMMTPPU[]YS[R@*bwcgbI"!.8BJNMJIJNPNLQPKD:2,*13;J`vy`I:5204,)/4532" =PSZezZ@;8FI^ճwG),Sk_ЈPVM=CSwƶp_˛ӮiZmC56@E\~F(++   + 'B[ghmt~~{wxz~vr|z%+Ic49'*?I<6?MU輥ߠU;6MzƯrG]ÔI6NխrI`z|nþÿ̦yTRmhA:aկ["&  +     *3>FLMMKC<842443358;AFJOUX^_`aa`YVKIFHLPUVVVQGA=:4112210.-/.-,++++***))(((x\FCHIILQUURP[YWVZ_aaaa_YQJIKQW_^H!  !(-02653/14CfmMHHHMJOLOSVWZ]adgjmmnnptuuuuylE;tŭWH]cUMIMQWYQIHNTXYY[bfeow~|qfaa[WSNFCKVafhbXQRV\YQNR]`]WRJCBE?4)$2BB94=C/"%!):M]hnuy}~|zxyxzyvvuqjcec\Q?# @җ\.TѲ`>YuJ{ؚ=&=dgIQƺA ([ÐIKVGZ_D,<Ⱦݫh=:CbҫdB3UwЕ[A:GXvq>,9QL@1.216ABEHKORTTSW\adlt|»Ⱥ~nX8+,,28PPGTrloܾzrwXպкrA2>aûĻz/"249301100349?EIOUZ`abdc`[VMMOS\dikmmfYNG>7000////..-,+****))))))))tZD865:G\t~pg`\XPNNPRSRQHFEMSI*  "+0236:6.+2GiZ?BJNUPTQTX[\^acgjnpqrsuwrpuwux}hC,5vxSdqs]Waa`dcTTSWXTSUSWXY]dgfqssngdehkbVI<3388;===I[ilh]OEGHIJIGDED9,$$#8?GFCIK9! )>Rbjotxzxwuuxzxtrsni]_]WL;! 0Zͣa(JԂH56LPTӝK),.:W˹{@#:oƛY>(&2lvZK8.9,7ڤY.3JѺ~8*3sǮ\mw5 7uБS/7TlhE',217>ADGILMNKOTY]fowŲgO5,..6=@BCEHJKLOQOKE@0'(q}wlY=#):HRW]`[TH:0++-4678:?DHRW[`h~tR=665&'.8<;:<@:3)%?Xb[jS=8C=Qm±P-$Z}Ut͍J@KrQ{gkaWAV_`1J}D!%IP:)";bO)%#  =Zkmmptx{|}~l]lk)#FʰŽԼJ?FoaK69Ӝlgƻٞe;"2VpygYh|V@\಄SZӻ½¼Ž½{jϸvIJYȗaOTbĂA' +  + +  &.5HORQPOG@:3-..-/348?DJOUZ`cceea\XQRV^iu|xvpbTJ?510/-./01/.-+****)))*****r]J?;+/:Mh|yvgdbcc`YRJC=CSW>#   +#.3546761/5FayN7?JQYSVVY]_abdhgknqstvwzsqwysprQ,KS8J`ZeYRZfdX[gfYTRW[ZWXQUWW\dffnidbdiorxnaSD612/39;BPevzyn[KECDEFFCDC7*&'$"'$(;BGC@HJ6%qκI&TV@*)&NG8719N@EۿhoԞk34@ѵS]{3!?כ[25PoqK'-735{w[E0$+1*,?NUZ]`\WLA89?FCEGJMT\bbbcfrz[H@==A91.)*1:=<6.#!4Ulfi~pI>=F:H|Ɯd:"SuwƺʐPBQΡ_sjioƻJLQIh|K->ujE-%9{n?+  $BaqtssuvvwzfP\d)@ζĽʰw<8HʙoO7@āV_ɾΆW@$'AOX\sq=/bɊeSwƦµƻĿ»ud}ƾͿ|NJIԲ~`OUE*    #$(),17=HMPOOMF?:3,,,,.348>CJOUY_acggfa]TV\huwg[MB641/./11/.-,++++********s[MJM4.+2Fax~ucQNNLKT\TD + +%.3567:3541Df|R%?OXU\VV[_dfhikkmpsvwxxs{xnqzo\7%(7?FRUSXZQQ_f^SNHRRPWYXZQPSZ_cca`ZVW_jsxvvjZSRI:;9>>?@BDFHMS\gnv~Ⱦ{^@,%*35=DHKNRTTTQJC=4,! # 6{vXNA+!2>6$,CS[\^^aa[QLORSMQUXX\chokjt~dRJKQWN<+ #(/:?8+"$:T_`oa99++-Nî@1F_ŮüՕNESzέln~𿔆LdŀPlɅSJ_`8.^on6  +,Tmu||xyvvx~t^NX{]("G˓a@4ZmFJYs>lbNL,)/8KpܱO%2ahYԶ̻Ʒ±nbx¿–bKVӿʬ_BUŠU,    $&),27=BDFHILMMJC?74/+,.0149@EKQV[^adfec`]X^fsylXG>5,++*+.0.,*)))))))(((((t\MGH3/-5EVaevrfUXXRU[WN0 &/3579;2244HfvI!?PZV^XX^bgjlmnoqsuwwwxvztjlshT1!  'Jmrc`UEAIMLMRWZVNPOQV^`_\WUQU\gos~|rikndSEFM[kzsdRIOILP@30,.---/14833.+..""5L^gijlkkmoqtwxvvvqjfcZN@- 8?446+!QƑH+1op6#7kخx?':@,./KlsaC*>Wpxszͯ\>>_Unǭe8:U׵V=31XlU677089;====?ACEHLR[elszŴz\?,')/61+CT\`bddjmh`WOGMMOQVamtwwyl]URTSNB6/,+-/8=;5, 1HXdt\97,*=q\0!)CpıæܞZMW{εwqÄu㿒fSUwYqӄYfǎWNk`18QD +9`y|p\OWuS-,NLjU:8dfFRkl:l٩TAH8;DUt콇@"*Wo^mŬƺü÷g`wɨnuپtJKpk1 + ""  $(,/0026;BHLOQKKJKLHA>64.--/0159@GLQW[^`cfgfba]cn}{fSC8.+,+,./.,*)())(((''''&s]NGG=618ERY\Z_hs~pxyma[WQG2 +'/2579=436:Nhu>&1GhµƤۤcPTvɹs~˒qyږoE.,Mܥ\s]g˔TNrؒM*=P, +Ns~xm^TYmO39ZŸƁK9F|փT?Uza5pНN6?CUdZ;-)LfdZlĵ¶Ⱦ`^w˻ٸqIBrʭx7 !&)('&+28;;:8:?ELRVYZSRONLG@=74.,,/127;AGLRX\^`cfggdddjwr^J>3.-+,.0/-,****)(((''&&p\PLMH<4;Og}td]ZWE$  )25567;69FJfzopYOWbggieachmopvz|~~~{əM/;oƸuT4.,*9jΦrUNNC9@;JR@1.%*.4:?CGKFGKNSZafmryѻuQ:1-)(*-023544564-*& +Gnpb\L>62!%AC3(7L[bgimrz}{{~~tl`TOH@<<;62*/9CE9 !4OmfM24@MB>`{xQ690A}ʻʕѥhJHqȷ|o~Ԟwluהj<%'=yܦXnyZ}ʂISxޱzE9z~]C +"Eh~wlb]]fW1:a͹{C9XqF9WתW5vѺM06OqڄBF>(?OYlĊcgĸsZ^wƼƛdMHȶ; +%,25545;AGKLJJFKRX_cfgc_[VPJB=63.,-0137jÞYpxs~žkXSNQX_bca`bgmtww{wwxxx|ǿӤ`;?mic`?5>?32Sâ^]pylZRANYB44++.4;?CGIIKMQTY`djouz~־sN6-)# "%$"#%%! 5kyoh[KE1)"&1962.=;;@GMG7! 2Op^L:>Wpãg2)]_N(,nί֐ͬsG63/-.1449=CHMSX]^`befgeejq}ĵzeSF:42//133210/--+**)('&&jVJCBB?=>BPqĻt_WH5!  !-6874312;BLf{~80HXZd_^_afnqqnmnpsvwwxvuspaG/!##!!!  !+,)0JۄZJPLMVTSW[[WSNOX\cmy|sle`^[WVZSGBKV_lxnVJC4-13, +&,,% 7N[`glljhffkoqttog^VL@+?şk?#VD.,9l͜e>($7Z۽hjïtbSJVa]OHLTm|zrhbdoǶ׳S:F^vlFH{MEZr`K3:`{aW]~yb_aK;8-038<>ACDLNQSUY_chlrw{ƱrL2'"Dssn[JE#);@4)+/=P^fow~{vyxpndVNKMOPZ[^[M6# 3NmeO?HhE30?{ϣrS'+m˺ٕӺK8fˡalЎw{Å<$/5WձcsRO]4uҬf&:`_ +2kxojj`Zlo&+\ҵk/6oӨcHBe‹SNgI8:+7v׼b24;:853466664310.-,+*)((kVF;7?@E@34Puþȳvmp{hUI7   $-3565685;EWtz6 (AV\g_`_aempoklnprstsuyxvp[;$ !!""/2$IoJIPNNUTXYVPPU^cdddfnw{xtmgaTJ@92,,0),,/CeyzjUIE5---" *)%!-FTZdikhecejnpqqkcZRH;# LɞnA3LƄRKDJTWWPIM\krmaRGACGD91168852(  '1B?3Hv{gQIF7,+(/4)'AOW`gifdadimnnng]YPF8 RęnV\jHJQewvfPFP[cK9K\j_Jkĵ_T[[QJCFKVdt~}|}ytiUD@IRShνȞiNIG3;8DUnì~UJMUdzQ1+06=AEIJQSUWY[^abgkquzeC*   + !" &X|ni_XM;8>GI>/*.6DS_gpx·yp~{wxxxqlgX@+ !1AUyDznKOěQ&7VyϐX=2Sɿ{ܳ˹W:Z{WِfbQeөjNI/=}ˆoPMK|ۢm?<_<"&Le 6z~ymjk]OaǢ_+=bͺʪX2MTLKmiOdêpMTA>=Q֫L7!W͏D:>:Qģ|\MMMHHaŻý|TN_v}ȩ~xf]}ȷX/$%"%  !!#'-4;BIMQU[`hls{{p_NB840.04679=BIMSWZ]]__^^\\dirvcXPGGFB>><===<9763210/-,,s`RG?<@KL<5EH44BUdnv{¾{s~sgxtnn^>'#) #6@JjpwʹyJ)7hܲo?0>oزخÿ^;GpSؘiMOf߼Ϊ}_I1[ѮзR1VߥoSHNc̋PGse\d_9)7EV`:8>rسr=.FEfҲbD51AC:<;[ļqOTas~_Q]ɸvK""+ #$%(-5;AAFJOU\chry}r_J?;7313689:=AEINPSXXXYY[[\\`grzkcWSMJJJIH@@??<;885521.-**viYI931,*NcJYO" 1VeZ`_`cfjmmkoqsqmklr{|r`E+% -9DGMSURRZcji]G755* ".+'!+90!*CHLQTYZZ[\]]^cegmqvy|ڻuR' *}vsmghgZIBFE;=UZC3BUgry}ur}ni{voo]=$!'%-<@EcӰcA/@tēW0)G˞ҥʟU/Al|bӛfDXݱʳ_G;AUsg+=pθf:Gxd:(33-')AgnV Fy{}sgejr߭cD;8[̵ˬK6^ܨsRELcdEIlsgt}T=>@LDZbA:DXǐV9-=Pӫ{T4&/DWZQK7BŹѹoHTdq~rVXƌ\ '%& !$(,29@FJLOSX`irw~{saMB=953589:;PܬxgWH+ +4>E>39>4Aix;*OfZYU_fccjmkoppmiils{ykU9#  $&.9@Uz;-.CGLQW\]^^^^_^^adgloruw{ضnK! #0relkc`bXIA=93=Z]D0AWkw~xnkjovʶ}enzsp];#$+8HECY||H45QrE13cąoʥɥT-@\eryΣo;aۯĵR<:>E_]2i_;9[ŠnA'%+2:S{nR .Q}qjo|}rd]]_n}A7Mr޽vHG2;_нM1$'IsxK8qؾk>SgnxٿҼZNjϩs#/' $&+2@BEFHGHHIJKKLJLOTX^beijhfa\WSKHFDDDB@AAA@><:976531/.-w^NGFA:IgwwE%/DeưjTBNjəgQK_꽁gPT@ !-6AH?5::3Hvl5 + FbXUL\fa^fllnnlgdejszubI/  .3=c֦a8.7D?>FUYRQW^^XJDJU\]VSUY_irouzyof_^T\_WXjwtfP8$.A@8;=-(;Sab_]_edb`^[YVO>2 0y¼ϾeD0@kݔ[=DDl˫u.Z۾ʱwB037>WOFp}rL,+TԼnPBBP_Y6!9U|~xqov}zrfXPLLW_akX9=CaĽשyO^V=jϸϹe7Shks|o{bco՟ZH[,3(#*)07@LWageegmwvuqfTIC?;::=?@??>>>@ABBCCDEEGGEFHIJLMNRRRQPNMKFECDDC@?@@?><:8755320.-,rPJKGPM4 +!$07@H?6=<7Rg?:YTTJXb_]cjkmlic`birwpZ?&! /,(@bH.+7@<@KPOQY_`]SNS]be`]\Z[dmnqrj^SOPVekfdhqymT5+:><>>,!1GW]^^`eb^\\ZVSM9* 6ٽeF9AOVPTl²y]U^k´CCFILTZaacabaa```cfillklz⺞dC" %"  8rhmmdZVNDHGHCAOJ2.@Wkw}slyrUIDUtwdegcbhxxmW9%!$,=QSLO\ڗVD[~I3?WqSʼĮa447B|ǫnOΠ_7.*,:AOVK9*)6JJC*<{ͺA!>VsuvzqlaVKD@?A8-<<*($H]}úشrɢmbfR`eYC)"1Hz㿞tJ-(+)577>OZL57Hqõ_@489QߨWB,,K{־t@f˞ypưa4PfjslOtq]YVfӽ߫^L[|ŚA#3##(/14:BO^lvsrrvxknpiYMGC?=>@BDDCA?>?@@@@A@BBCCABCCCDCCEEEEEEEFBA?@A@=<==<;:8653210.-,+cRI@46?>:.0N|[GBNND[הXF?LʼnY=KQI. +48>D=6>D?]kY% ,JLTNS[^`afjkifa]_eoriS7 ! +$,%-FsP2(3B?>@ENW_eiib]`efcbb`ZUW^noj^OEEIZkrrqko~nR.$-6<@?,!  %7GS\`cd_[XXVROH4 + =ճiJ;?KQTZožu_ND^´ƯCDEHMSZ_bcbbbbab_adgijikx~ΰY9%)%! 6wtnjidZQLJMSQLSM73BWit{~wz~ZG9D^ryyi[HBQeg\q~sdN5&$)0?SYSSYeoϯyƳnB0CmӼkYӶ`(*=a§gMҲ|F9@4+53& /QSK2&))0g˿c.#DYnow{l_YPID@=:/12EB*'#,3Ki˿kJGbĤeTJG>I[vj61:^jhY?11,'1\ґ>4*5eͬhCmܱxLDaּ`6K`lz`<^n[NaޮjW]oªb;1"'-369=ERct~}{re\epmaUKIDBCFHJIGEA@@AB?????????@AA@?>>????>?@@@>;;;;98:;;:8643210/.,++`G9246+-6T|mL?EBKW[ųvQMMfʝu`\^W<$-58=C<5=F?a; :ASUOS_d`bhhhd_\^cnjaJ0"#!!## #;WpE2)8CFB8=O^eouxtppnkbbbb]]guvdYZbcorwto~hH" .:DB,# +%5IW`c_[UTTSNIA+ E̮iSICMYX`tƿ{X:=[ƺ˶BBEIMRX]`bcbbccc_`bdfghkrxxIJX6")*&"!0W{oeml]QRMQXYV[V@;IYhqy}vSA15BNQSJG95Lmvhlv{lYC0&'-8IZ^[\cRWfr¹׵_E;WȚ_`ִf+,LҴm-Oҷ}V;OndIB9(&#M~L6?RfvoJ+$L_nuxk^VRONNMHDCSavkPSY91>Nhvx¦̼ô˺~;0-FY^km\AEA33:2%4e{?0.GӪSNբf=9Orлc9FZp^3Mi|șpNG`թx_T_~Y/ $+16:>BKXiy~ZNL[otj_QNIHILNONLIFCCDEDDBBA@@?@AAAB@>=>>>>>???A>:989779;::7633110/--+,fD87<6#$AvzB35KEJ`w־cEF\ӷztdJ3*!-68=A:3:C<`J09R[LM^f_^fgfe`]^clf\E) $%  ""'&  !OJ/+%7BKE68Pchu~{yvpie`]]f|neiqwyyju_> )8CA,% + +AVac\XSRSQJF=& J«sLLQQXdcoþȼg@+Ca½ѽBDFJNRX]_aabbccc`_`bdhjlm||ruƬ~^8  $)*&"! *@fugstaTTZY^aag`JAM\gpxy|cTC3//.049933NszghwxfR=,&)2>Q^^\cn[^`YZhڬmOEChŵ~Q^ѽȧn94X˔u7IuͬRABpw]E=JJyĩelN@J]br}pm`\G )Thtsljc[[ZZ^bb\WWhty`htVBEEHMOg̫ݫn@2:8-9G<>BEBDE6'Dqɕk<(*Pӷ]@XϘ\88L\~­eCIR^mz}|{J?AVoxpfUQNLMOPRPNJGEDEFIHFEDCBACDDEDB?>??AAAAAADA=99999:;::76331100--,,zVJE.$6fW?;?N[bsڡ^80Gzپ˶h@/# + !&' -/5B?AO^ix{woikknx~uuz}pkJ( +"-<>)$'" "5HTX]QMSSI@@. J˱ĺX?KZ[Zru¾Ǿ\6-9dĹӵQFGNOV\X]`aba`aa`bcccehlqfqzw˪Q- !$##%$#!!"" #&#$Uwsm_TQWYWXdmcPDQ_jov}~z~|n_USF3((,//0-4HZj}wWj~reL/&*,:GS_bciphfe^KGhְvT8GnʢgZme9-cǓ}ʯv=4P\<:86465420.-,_L>)!1ZX@BNVapȣk>@XtʹNJfD5' !!**"/.18?A:66?IcknkmvwpYJAAG]׽ܡkjpsvzI.5JkdK8-3Mcglu`WWlahw[==8QȰgCJTif=47Lcvҭ_PXl|`LERn{7"!+3;@ELPYgsx|yxw{h:&(Ghqb^XUTUVVRPNMLLNPQQQPNNLKNNMNMMKLKJIJLMLKKKKIHIIKKHDB@?<:=<;97532iO9'0MU43HSw׺mG9^檄tZD:- + "+*#2.,4BD\ylhn}ok`A$%/,>Pahdaemimnmhea^axՀXFHFPO:3@ZiU65L]XUA4,)RѴQ#!+$8yˤnPNxrS8('#!&+-/-($ ,Y{mbSU]cgjt~~usuurjn^: JWaa_dgd]RJ@.+LvοŻ¼ľ΢Y9A-;AHUP=2/-/598:?JUoÍpXE0={ڶa@HSaw~gL84HZfuԭvURVQ_bT?9B]|<&&09@EJQV`ox{{|uwwyz~za;" ?cuhea]XY[_[YWUSTUVXXYZYZWWXXXXWXVWWUTVXZWVYXWWVVUVTQMKJHFDFECB?><;rQ6*Co~XMP\oaAJfŀUp_K@:, "**#4-*/8<7449Lg|T* +9HTWY^_[`cdbdd^XH1&*( .)  .% $/5/5GQMNYbp~\: +  $'(&/5'!'***& -9GMMFB?2" "#IͮѶƴZSh^[pzqN-(?dӿ¿ݻl[PNP[\PUY[^^_ac`bcccegjm{pqôyG '%!!%&"$$!$ (Jsn_WQV^hrscRHSbp{tllouzyuqif_YVUSSNOSTPPVaZjt{zwml]=!%1+AUhld`chqurlmsqbMQaw緊i[PMI;+.7?84JhO=??:/'IٳkN:0)"&@kưpF475CNG1 %&%#$)1670' +2_ymaVNKOT\_^ao~}l][fospgO1>Rb_WV[_`\`_E'(ELPV[es|zxwyyzxvw|{tsy^A'#?axmkhc\\aeba^\[[]]_`_bbcab`a``aaaaa```cdcbddcccaa`]ZVTSROMMMKIGEDCyS4.Px}|}jTJI?sød^ĵUF>:+ +!''#3,(,47529( ()$"+& *0$   +';35EOKLUaniJ/   '($)/$ (-00,%  +>GJD>9+&'MѬSSkaa}¿_9+9X|ν̾մubRIJX]RUW[]]^`a`aabacehlwlvw> $#"%('"'%""-T}|`IJMU`jk^PKXjywkb`cnyyl_HKNQSUVXhqpgceZHRhty~trniZ=#(3-EZkla^adlttmp{{jL=@SuݼyiZB4*8OioKP_W@0K|л[TfhW>3Jz_QZgngWD711/"(%  $$$'.3*# +"4\zueTD>>CRW^_ZW_lsl_ST_ilw]D7' -IcfYPRXSPXdX8#"*OĹŵުtPH@>9>LOD7418Uʿ`jݝS)9V⹞`6DVek]4*Pis}~nT:.;GIP]vؼoce`e|ʿR4# !".:ELRWZ`iv|{xvxyzxuw{~zqmms~|[C,+Ec}~rqme_`ejgfdaaabcbcdfhiijgghhhijjihgilmmkmmmmmkihda^\[ZXVSRQOMKIIzO1/VxUKD=DWȷZ^ŒeVH@<+ "$$&%0,)+.1119:AINXVE@/*;JNPVZZ[^_``]PC0 %)&"%# +#,,  ):57BJKLRYcoziH/  %)&'+  )2661( + +5BE@3  + *.Vհÿƽɱ~`_lde|lI9@UqǹȮm[LHW_TVY[\[[\]_``a``cffjlۦh5',.) &"" 2Wzu^LHEIOOF?P`svke`[_aU>+1;GNLF?KZ]H" ;QWgsn]E2159BLTcѷ¿^7 "!'2@JRVZadkw}|zyssuwz}zustw~sV8+2I`vzvqjeeimjifeeghjfgilmnoommmoppqrpqpruwwuvuvvusqpkheccb`^[ZXWTSQPnG/3ZºY44AQpijɱjKwȭoOQD><- %(&#&),+*,,,.165;>;=?9<5 %1?HLOTXY\^__XI:% **$"(' #+%  &/47>EJLNQX^cgny{qO-  ")'&(!,8<=7-  !" %5B?.#*/Z۹ľտ̹|rljigl{xYIL[mzɴzjWMY^SX[[[YXXY]^__^_acdayȟn=& %+,)#! !"3Yz{[N=65788Nbxvkng^VL:%%2@GA7-)%*BU\\\^uyx|siQA:16CERblf`deefnuywobP@318F]}{;ֿ`@85@GJc¼~iTB71,*#  !!#$&)-.1+"  2kw[KFKVc_[Z\\WVXZdow|}siI6/=E9%7N^efibXNJKG9,!5`õٷfK0)9[lLivGA=c跜qI?=HL@0'+4DML]uznaRGFJMOQXnƾpB$# %-9ENTX\bchrxyz{qpqu|}z||{}~lV73BXet~unlmpqkjhhhjlmkknprsttttuvwxyyxyxz}~}}~~}{xwrplkjjggdda`]\ZZ|b>-6^{mlbUXQOYuƬ|b\cIH=:<0 + *-($&+()++**+086;>549:;9 +#*7DIJPWX[^^^WF5#*+"&+)#)! $/6@;0"  "% +<<- "!!$'+X¼½ιպrZhiemyÿdWWbnwŹѷtaSZ^PZ\\[XVVV\]^^]^_bkdüЫrH0 /1.' ;Xhs{q\B1,29@H^ysknke\OB841>MUSONOF)&4:FW[Xy|}nbE676;JPWdkfbilhsruwrdTB74887BZs¹̴ͷhXGP`jŦs_J;4/( %"  !&*,(%  !&ahNCDN\kdWIFILPT\bggaWF5712DVVA*(=KOPOOJDDC8(%Hkü͠{P2%)A]sxqhbZK>[ͅR8*Y߼}`I:AHFJUVV[XRduqz÷T)(&!+4?IRVY[``clrsvxroot|~xx{|xw{wl[EG[ns{ysrsutlkihilnonoqsuwwxxyyz|}}}}|}{xurppomlkjigecba~~}{yriU>5B_v|fJ841,)Lut`_fͭzeGCB=. &,' &0**+*(()-3655668<=5  #.;DHNWZ\][YQ@/ $)'! (-! &"$ #,5=ADEGFIMS\chjlrqknyztvvxpcTH1   #"!/9;><3# + +!#  %/30& *'*)7cлñֲmX]dlvývcV`psɺΰ~n_ZZY[[YXYYXV[U]edff[loź۰yN46:2 "&.?ZqwbF2-278AUqtlllkid^YWYSJFJUYW?/$%(+:LR[wvgUG64>MUW\djgcgosuyyr[D602022/2Mev~uq~~ytrpnwd+.(& .=KQTXYYVUXcmprtpmms{}yoruxwussy~xld`dm{~{yvtrolmopqqqrsvy{{|}}}}{ywvttqpnmjigf~{{|{xuh[C/*9SiqR*-?CKT\^^W[`bejgaihjottnj[M?7&  ! +58<;4& + #  %)*&"*(-)>oԿ͹̧jTZdn|}m]bpqqֶ̼~sd\]d`]ZZ[\ZXZW^fcb`Y_wƾǾӧuO6,#$$  $",G^kdS?1--03355.*+0.*2BPZyvfQG>@L[a_^dihipwyywpcH- ),130/4=GYfkrstrSGQQLI@60-*$ + !%''$##&)++%!  IwmXMG:/,-4AR`fgTF;??835210,)+17ESbhnpeV=-&-./12-$-5KǾҦxQ9/0?JLB8KxǎcA-Zܵw_ax~omyth_[w|ulhhihcp`*))& '2?JRX^`_XTS]glnolijs}|vhjmnnmkkqw}zsmvy{yuroopssrsuvz|~~|zyxutsqomlk{yutsqokZI3%)>[qwePKWfno|fWG-NrkeɶyUC5&*'#%()*+*(('+1420./1683$4=BHORUTQMD3#%)$ (,+ '$% + +#,58999667@JQQOGIR^b\VQUUVWYUOJ@6-& + +  #$'049:4' #!  !##&'+&IļŽfU[dqyddnl^ۼm[^lf`[Z^_\ZWW^gf`^`oƼǵ̔bA+%+  !)#+>T__N8(""5Gb{|tidhst[F>>?3;LVPA?HXa|~qcPKIO]gjg`cfhox}{si^L2 $,3456;=?CCCJ]n~jRIMyujȲ~U@9<;>@872+% #'*,(%#$%(((" + ;Sgl^K>;5$ 6M]`^H=7;9-"!$*8JXfotonokdYI6( 1sȾþиt]TTgz~}ͭɿwU=3bׯr}ujjkhcjhc[UOLK`fnu|zvpiillf`p~i1#%$$+5?IQ[dgeZQLUagihgeht|rababccbcinu|~|~ywsrtvwvwy{~}zzxvtrqp~wsoliea\F9*"*CgqdQ/jjU|gRC  !$'('%#)**+*((+140-+,-352 0:>CKMPOKE<+ %( %.-' '%$ (/3311.-.6?EC@??HWZPFEDCB@=70+-+' !%& "*/462(#"  #TͷŮe\`ht}gckhNŵӿֽx[Yikc\\`a_[UZaiiaaqܽۤk@3  + XrveZY`j{qnlYbpyqaXYgmsg\QOOV`ijh`bfjs{zr^SD5!&18=@CE>73+&.>E@93+#!'CUVZz{cSZNHB;?C;;5,$$(,-(%$$&'&%! +  #-=>GPRM>%!8JPO?5..,$!)3vΩyo]@0+.4:ALV^OT[ckqsruuuurnhd}{A%!# #%)5=CKWcfdZNFN[ccda`ds{nZYYY\_`afjpw|zvvxzzz{|~}|zxvtt}zxtpje`[UO8/$/SsfK?90:C9E95v~rnY'%"!#)+&(),,+)),12/,)(+141 ,5:?GHKJE?5& !#%*0,$ '##  ")+*)*+)(.4774749EG;34540-&  &)%'"$(.2.& !   \ışzi`bis~gcheJɹʷaWcke_^ab`\Z_agi^dĿʿ޶JK:! +  +.DVUG:+(8Oj~~x||~s^RSZq}vpmgcbksl]QKJKQYaefafjmtvobF:-$ "/9AFIH=3.$!/# 7M_xrdWOINFE?7>D<=8.&#')*&%#$%%$"   ;IekJ, %39:7-!"$2>N[bhnrz}|uooqprmbTC1  + !;n´ˎG+?auv`>&U|uupoabzȴx]MA>:77;BFPRT\bhnrnrslbagm~R1#%""$'+6>AGQZ^[XKCLYaba]]aqzlXWUU[`cddfkqw~|yxz||}}~}{ywutsxwvtsrqqmhc^WQKF7-$ /L]aggaYTPKA=:13>FeT*3qnF0Pm0(# */)(),-,*),02.*(')/4/)14:ACGFA8/  + ""!$-0) %#!  !""#%%$%&'('/,,01,'%%$ !%"'"!$*.,%"    cλnlcdkukgkdPξȹƿqbbgfccdcb`afbcgZjʨ`WKB3 +    *=KLIF:,*8Ogx|xsy{uvyhTNPXiz~bSW`gjisfUHHGIMS[bfhlnonj^O6) + +)5=BCA941+#!, 0MewraWROLKE>?<48;585,$"%&(%$""##!  %XvK-" '((-$#.6DN^lrsqooqtusttunoj`QB2& # %TöÿĿqE:AHHA-1sq`XPFGUs|raPD<73XTTWZajsmppdZ^s~ienqZ;('#",5;BFHLSTQRJFNZ``_[[`o~wm[XUX^dffabdhmsx{{{}}|yxuv_^]]]___]ZUQLGB<0$4IIJKIC<554-),/A^rFOhO/N z6 *#*3+(*-/-+),01-*'%(-61 %*-4<=BA;3)  "!!(..&%# +   "$"! +  !'$#),+$$"  + + gּbmjioytoodVöмvjfhiigeeeglbai`zɌVFg_   ,:B?AGA60?Shuyvsx}zy}iTFAAIPZfszzxeNHThstu{s[QIPQSVX^eilnkd\TG9& $/6986764573.$1KfwzcMILNLII==>521,.,&!  "$$""!!#"  + +7sT-  &$ '4?DMRZgqvtsklmrttrpjomcVK=1&  #HɾýǾեtM3% '--M|siUE;1,?Xs¾ɵzuld\TONPT`lz|uzbSYh^?(&!".:DNPNMNNLMIIT]`__Y[_kw|vn_[XY`efca``cekor~~}{zyCBBCEGJKPNIFC?:6  -@70032-&*+"%7>8/& +  "%,/,#&#   +  +     !""'"$('"##  hƽкӶzZlsrv|xse[ø¼peinojggjhnbbnj̾pV97#"   )4702<>63CXjtwttv{~~yjWD:2214=HHDQIEMbv|{`OOO]`a``afgfe_RF>2( +,35315637>9/"%&#/2Hbq}uY@>HNNLE89?7.,(%$  + "$$""""#! + @z|[5   #'*/8BJLJJMWeqvvtqpuwuqnglj^RI>4/% + + #H¿ˠoH-&.IXvíudYO;-&(Feyûof^[Z]kzmZ]ma<3& #251*.72#/CF+>QQjZbíXc|p2)'.*$"*.23240.120,)*+072 (/43310-& +!'.,"#%!     + + + + +  + "(# '&&%&% ! #"   2ļż˭mTrrzuikgǼʿkehosokijqjfiqƺ׻rF*  #+-&$-22?KZfnqpqxyy{yw}kL6-#')%$0=Nar{xpwxtgWPSYjihfecd`^SJ=3)$  &,15348:9:<< %("$.8HF@N^\WRKB;9:=?>@>:5/'"'# !&" "&#  +(ILF8-)$ !,2:?@BJORRTVW\cnwtuussrokijjf[M>5/+# &K¿¾׿~ȥoUC75,#5PiskP>C\~½V8&-2;GT\][WTOLMNQTY\^]^\]gtytmic^_bc_Z\]]_aeikz~} !#&*./0489875, +#043,)+*%/;A:FZsPi|bL|ȳU+"%(+# */234630341.++,070"'+//0/,$ + '+&  $%! "  + + +-%))))'%" !    Gοźʼ˯sWmx{kikżͿŽcdiqpjjpwrgdrĿཐlO1 +(-+!"(*=JYdjmnt||{zvsv}vbP9, %6Lfx|tkrofYMIMSedba___ZKB91)$! &,1479:8775)&%'$ "':JD9AIC?D@:31059ACB<5.$   !&#!$&#  ( !$ )3>FJHGLOOTWZ\^dmursqpqpmjkjg`WJ?730+&!!DĽ¿ƼƧbV8-(,%"@XdYB(%U}yн÷Z8&29>DKSUWXUQMHJLPU[^`_^_fpwvroolieb][\Z[\_bfiu|~~!!!#&)**-0110," $*042+)-4//4CHaa;vm~LGşg=&##&,&(.224641342.,+,071  %+.)+,-*# !()  !"$$!!#  +   $01'&))(&$!    *gݽ̿Ĵ˱~cnx{}|idrͻrijtumjpyrc`|ŻɥpH# #./+ %)7EU^aeiqttuwvuw}ukYM=2.1?KOiwoog[NEEHLPNNNNNPL>83-(%$#%,79<=:8768.(()&"">OJ>?C<9<<93-+05=>=80'  !&%#$%"   !" "%1BFOWZVSJGFGLTZ]]]_dlsuuuxwsic^]ZZZZ^afhsz~%&%$!#(,++++*# "*,13,&)4.*,EIqlTTk}`PjεP5% %%+-"'-114763452/-,,050   $(+*,+)& $*) ##"! #&   + + + + +  (//'!))'&$#"  + +  G߻Ƚ˵ƨnst{yzwd_uſʿѿ~hcr|umnncqſ۬h2!. +&-.," %+2DV^_aenqqpturtyz~yusmg[PD?AL\jpxpcZMB==?@:899:<=<830,*)))"   (46:;;987:1,,*(')>NMCEFB@=<92)'.6::96.% + ! "&%%%$ +  &  !%)5ACKQRQRSQZ_deedfjokkpssqqhfb\VOJG<;961) 0`y~ƹĸhG.#'1%$(,$(>PE$";QyƫʵôzA*#1WwbfCbȖY<4#%)(-- &,0048864420-,-040   #32,%#'% $! %'  +  + + +   '()%))(&%$"! + jڼѻϻymjlt|}ticc_`ddgwv^Xm~~~}}r`]sƼʼɾĽgZj~vpml²p"/)  &*++& !$*5H\ggffmvvstpjfedec^[WRLKC>DP]js~obQI?732/,-,,.024530/,*))*$"  $*.379988841-(#(/6GHCFFBB?<6-""+5::<;3)%()  "  #&&&&#  "' +$)6AGPWWUUVS\`ddcabdcaelplkmgfc^YQJE=;973+!+=Xd\S\ŷ½ǸĶr\@-%&,11020( %0:KB,*:KZi}tʻ«p>-!,;BG82/=OZ_ebYJ?;=BEHQZcgknoonlnokc\SUZ^bfhjjq{~|{)--'$,!  +!/--./0./+27Muv6cOFʩq8,1%-+(,,!$)//39975520/--043! $*/94*  !#$'  +    +  +   '&&$  ))((&%#  + + +  +  ~ŻƯʬmcRX]bb\OA76Mk{~~rdmr]Zm»ƺŽ~ghzypsi|Ӽy3 )*)*& ")9J^hjgdgrqpqmc[XXURNJC=6=78ES]ekwzeSHC<61-($%#$&),.//.,*(&&'%#!  +  '+38;=>=775."#/7DFBHF@?=7/%&/44791$!&)  #" !$''('#  **  $(4?QY]ZUTQNVXYWUSUXY[dnlc`e]]\YTKD>:8630*$ &*@G=2:h¯ǹkR@4'%*-14=;::427AHX\W`fglryϫİķa1!!,=EJ:2+6FQYbhaTIB?=M\ehe`aiiilj^SMLGB?<60,)'*2;BJRenvvqhZMIE?91+'# #')*,+)(&%%%%%##" %*29;=>>751**7BBAIF=;50(!#**+/2) + ""!"!!"%&(*)# + &.( +!$(4?QWYSLIFBEFEA==@DKQ`jaPLRGHIHFB=:951.-+(&(.,$!(NɳjSB,+-5;=AFPNMOPRX_fsz}zrjccp|ezԿȼX0#!&6FIG:1)3=DLWa`]YSLC<9?IV_eghhgfggd^YQQPRXcnt|}}zwsrqhkosv}~~! #%"   ',66+'..(7@Ni_Wauh5[mXC<27E?.&#$-+$(-/3:;8432110/048+ + &&  "#!  !    '-/*%  &(**($ # + + +  + )˻¸ys`577754/*&NãihةaFCMWZ\i~|wVH]|·ľpWYpkȿM%!*6IS^fihcckjjjdTC;<60-,)%"&&).15@LQX[WQOMJFC=5,'#"!$'*+,+*(''&'&%%%$!"+1466651,%(0::GLNHA=:7552-)).3:CU_R;4<1358;<=<83.+**)(  (";cõ~Űq`L=EKRXWTXbcbcfjmtw~}}|еʷgE)#+>OKB80(18;BMX\beaXJ@8:CN[cgghijib^ZZRNJJR_oy{zulc\YWV[bip{! +  &-45,&%9LU`iibTJA@AFNWaghlkf`^[WTNECKXfnrlaVNLJJHMWes    '/00./0-+3@ͥlkvS4*S|^:+,&(,,"$'+03798400122/.650%   +  $'" !  #%$ +  *./,,+ "(+(%" #   SåƯwM62BK;1) 3QY^nrkilK$-NZU=*!&&&7@560*.8@A?5436;>:7GWUbfXTLVxǻɺuZ]bn½ĴC "#(@=94.)" $*,,+*)(((()((((&#!  $09@DEC;2% (015A=0/-142+# #'%$##$%(+,*%   -:7$ #.259;:9@GMMKGFB=6,'(,16LWRB* *?@@DP`q)  + (3-+04437/9{qxɷn``1 "++-)!&),036873001220-464)   + $'(%    #./,*++ !()'#    ,pǸIJmPKV^J5$&11/130,/&3$%&   (;@LMFSUR~˾ȸscXc~¾Żɺ_, ,4)%'&*;Q^fmpnlijijca]F)!#  #  %+/12.))+19<;951,'#  "'*..,*))))(*+,+*(%$!'07?HMKC8( ".101--9><72.)&$   $(''&&'(*,,)$  +5A8" '49=@B?:AKSUTRQOI@5-+.19Sb[H+"1DO]gcPF;10122/'%Yĩ}yrjfgdqX?;@A@Rd}vRǧg<1*+&#&0DQNIA9.-13227?LX_dcbZSG>=CLSVLG>633699?K[m~YSGFC)  +   )7.*/0++71%QubHTkûW,,./)'(*,13575300232/-155* +  + +  $!   "')'$ '/.((**" ')&"    + >ĺij~omrtbE+%*) .0)) ".0$!'-&//738V^MµnYf˻ȵϊcjM( $?F:/3FZehbjprqnkljlda^F)"#! ! !&(+(%"#)1;>841.*&#  #'*//,++*+**+,,++('%# %,026=AB?:-*0+(*;W_VD92356(  !&)*))'(*+,,'!   =F8 )8@EGHCADJLLKKKNH@5+()*7UidP2$+'(8HMW_ZJB8213676+ 9soeYQLNVai>-044=Kfկ~^ln;1+-""&2FUUPG>/,/34417>GOYaee[MA:=BGQX^`a^WMA>::?CGID?71/1578=JXiyyN +  +6/.0+#%14"6MVfga[B:CKYhlvu}iE&)-/, ()+-134531//1330-.23+ + + )11+ +  $'(( !  +'.*#$(+$ ')&! + + + + Pſƿúɿ~x}uX9+ #%" "!  $" EWN7"$"&)+*,2A40-*'$!"&+./.,+,,,+,,,+*(&$#!&*,0696782 !$':NdhO>423'"   #'*+)*))*,+*$  %AE5 +=>@CJF@80,,,7WlhS7+410;DCGKE94/-05;>=2" #Imuh`XXY`n|}y|pA&*478?Txxѵv[qp8)#$"*6JYZUK?/'*378468>?:4.-0366:1 +   $(*$$! +  +(.'!&+& &)%!  +   +eúƾzrt~kK<$%&" '" + &,)9i~i:$343216=C;,)\cSʺÿ|̷˹̶ӿeUI58>YiouvsokkiibaaO94'! &/6?>3,*'$"#%*-..-....--,,+)''$#"*29;B>=5'#!.Y{nL4('',+$ !  + $'****()+,)'"  'A@/ "1BKMLE>32/-.28>FFDB=::9>\ojV;1:528:213,)('*06=BC:) + + + '7Rl}vyrnmnnmtyoC()7>:;Ii~~y}}qnзPG{~o2%&1;6;@DILF=64446887750-,.133COLKG8&$,)),+%&-./12220+*-05530+-/.(   + +  "%.4>IPNE;&!  ""(,($ '-$%+'!&)%    + + +0}ƽƺto}bP,3::1)(+')" !DT>+04.,82-,./2%!-ek]ν߾þʻīxjkylrwxtpmmhiccfWEC3*!!! &-4:=91+(%!!$),-////...---,*('%$!*?TdifXH8&&))9]wY?7;Q^aO7) + "&)*+**))*,(%  + &>8) + ,;JQOJ?5(&#!!$*..$'/1-.4;;<=AEMPRRPIC>4789>B>632225764320112458AO]kxժ{g< + -20*+5<0/&""-=*(.*(-/&'9:8>AJ>8;:/*+*)))$ &-./12220*)+/3531,-.0+ +  + (,-06;CLXcgbWK2-% &" &,*!"  ).$#+'"')&  +  + + + #Fѿüxo{s`/=NXTG7,-783+FlWD00[΀&!+59<>AC=4(  $.hneѿ÷ȿ»Ρylnswyvsookkdej_ON=5)! !"#!"#$&''$).6:<<43+'$"%')+.......-.,+*('%$$#@frT:%!4=?HOb{dSYgV7$#"#" !#&())(()+,($ +  +$;2$ + 2AOUOG9.&% /5=BDEEDQjytfQISTLJ@-$#"'-17;99:EHMQPKEA77449=9221014553444689;;>GVakv˸0  .4/.1/)+1'#"$*+'"$02+&(/-($%-6:BHJJHGB=621358:95315:>47<9=HV`fku}}~~~ئW   -4112/)*/*&%(,,(##-.)%&+-)%(/6:;B?=<5+$"'&&(##-+,.02332-+-/1221,(,45% + +   .>]k|zsnciqvvspldWG7/,*& '-+  !#%'%"!!$&%"  +1-$-' +#+0,$ +     3yϾºƢʽ}h]]eox|}}~UJEQ^ceihXG+#)+H}L+'DÅC>?NZZ[UH4*   *Bipqȹ͹zssstwxyxvvplkkh`ZNHB@@ABA=<866665?EIG?85340*!%&$$$&'*--,,*,-+*'&%###"#4nлnQE9--;:<:@Yq^ZpN+)+* !#!""&),,+(" +  20!&3;DHDABEMLF:33444% +2tyzywqjjouxyyxurppnomptx|xaF<=@@?DB=>IW\Z[[\]_dkpstssux|~~}}yxyz|~}|~~}zxtrqkgfhkiaZWY[[YSNKDJNPNLKR\cfkpuwxxxtsstuwxwsrrspppswywuvwxz|~}|ņC  *4232/++.,*)*--*& &,.+('(.-*.5;<=B@?<2'#%**('"%.-..00110,,.04667-*,46)  .Phsvxuvyyusx}|tlfcmg_RC820-**//)$!#%'#!&&!&%$&&#,+& $4&%+$%,1.&  !   +EûѺñxaglrw{k]JDLYejeXE'+COkL#8eTC@JY\ZO;&  9Yolqǻƾysvy{{yy{||wpmlh_YNJFDEGFFDCAA@?=9IsƭhVOnS3"% !!!"$""$&*+,+'  + &1) +"7?EEABLU\ZPC<=>>DNVWUUUTap}zl[LBPRUSLGCDFFJMJC@B@:5-*)($"#-773321,-.06;@DC@94359<99864468EKS\cghhdgimooooqrpmhdddabba^]^`_^^adfgfjkjlnqtuxz|~|zyҥ^ '44540-,-,*))++)'&)+-,*'&.-/28<<<>>>;1'&)--+% '..//0000.--.14778+(+26. %4Hbqttsmmqsrrstqke`[chnm_MA<@82220+%&(*)! &(",-++*)-)  "  &2 $(" + +%.3.'!  + +%Yƿǿƴyzywwz}s`MKTWQHA6!/P]rb7VŻg>7DZb^K1  +JlnftǾóǾvtz~zy~yqmlg_WLHDBCCB>CCA?>>>?NSSJ;5680+%"$" $(*,---,.)(('&%&& %$",-&BolHB9,/CKFF_r_RVxwQ6!  $$####!#&)**(% 38,"9@FFAETaa_WLGHHGLSYXUV]cp|ymYFTY]_\[[\[[]_WLEED<+ ,FYKVadbcjpvrg__ff``]XSRVZ]`\WW_lzxrjfgikkggffda][\billkij\G2-4>=*7c|O)Gi~qd_hoZ917679=DQ^]T?91-++)&)-12135621012479=;86344658<@CGLNgkt~~yrnkkgfc`]\\]\[Z\^a`_fdaa`cfgjlnqsvvwwyz}}~||{{yyvvttѸu' %35640..-.-,+++*),-,-,,)(-/259<<;==;8.%%*.0,% '-///0///-.//13544)&(.73" 1J\bba\fq||vne]JIJOVYVPV\jrl^SPPG<5561(*),+$ + + $' +"/30/-*%  +"&&" $- +!% &.4/)"  + ?qĿҳȵ}xy~|md`R@4/(%CJZ‹`wr53HkzqU5  Wvig~ývtz|z{spokb\RMGDC@<9==:879>BPSRK>89:+&$"!#$"&)+,,,,-(''&&&%%"('&./jĪkC:4+0CFN^}|scQQlzR5'  + "')'$""!"%()'&# +6GE0&)7?GGDHWdjkgb`a^Y\^_^[`kwz~xfR`dghfegjdcdcYKB@E>1*-:JQ:@IMMMSZVPGGSbc\TMD<8:?BCHOX`hlniaZX[__^Y]^ZSOMPS[die^WVZH2)*07>DD<-&0CNJLOPOQQSRW[ZY[bjolhccdeidc_`aaaa^_][YVTRTPKHHGDBB@>;99899&+Fm~F>GnrehjW91528 + +%1574111/210.--,,...-,,+,.047:<<-'&&" #$#$')+++,-'('&%%%$$)+$->ëd=2106C@Vvoa]RBJ{fH3!$%)*'$!! "$''%# /BH=/,..7>EGEJWbpstsuvqjfb^[X[fswz}|{vj^cegfcdgkifgeZLB@B@:9>B>5&(/5313792-1:@?;60*&'-5<:8655666+)2HqtK7_riaO61427>GVafaXLF?<;941,'%),/376421//-..6@HLPVZbiu}vplmopsstuuuuuwwwxyz{|ԠX$ $.484242/5430...../1/-,.00368;<=>@:4/*#!%,2.% &'-,-./0///1123331-+),68( "8Pnqk]U\lsxqf[TTQLPWcq{yncP?6=FIMPNI@88?@94221-$ "&"-33.# + ()& "#  %-41)# +   8ŻдxyĻ|uqsx~}}rnc]NOPGXjzA/3JRH2  + +7ku]~ǽµyƾ}wy}~}vtwvpl`XME?;639<>?AFNT]WOGCCFE80,,%## !%)*)*++(('&%%%$$'--" ;]ʸ~]9.16:>BcvcZQKBOtiQ=2$ $()'%#"  $&%#! + +".6::8519=@BBIU^nqstxzund[RMGDIQ[\aff^WVPRTUUZbhiggdYLCB@?;=6/.362( #3AHDEFDCCCEFGHIMQUX\YTPMOQRRNJHIJJILMLMKJHGEEA@@?>=98877799<91/9P{jH[ygXE33:65?MY``ZVNIB@?<731++25423,,+,06<@CN]ky¹۬i3!$+48425404531-,-/-021--/4368:;<>?<4-,)%%(+2/% %%,,,..////12456532/+.77(9Ukprm\T[krg`UMMMD88F\nvqf[XB39EHIKGF?9:DIC:7872) "'",23+ "#'(% #" %.30)# +  O¶ƿиwǽ}wrnpuz~~teuw}eA,--(  + + ,EtsX¹Ⱦx}糁zw{ytrvwsnh_SID@;8;@EILQY^e[NDDGLKB831+! !#!  $()))*,))''&%$$!$/4*)MzʮsY;.3;;7Mmp^^QOQ^uliXC/ **)'#### #%$!   ")8EE?9;==>@GT\knopuxslaUJC:1.288@JI>:@7;>BHR_gdaa^TG??B=55=A4 $11(!*71#(8??AEINSWXZ]_^YTQVUSQMIEC@=:;?EIMYZUF3!+6FMF:474.#$4@BAAA?==>@CB@BHMPSURLIFGIJMIDBBCBCGGIHHGEFEECBA@??<<;;<<=>=D?>FDZ\[n}eO?15>?===2)&$"$(00*%$).--.,-./.1556667388356,!7S_b[]chif_XM=@VZE431@Q[ab\UUNHHIHILGEAAGOOHA@@<80% %"$),+# +#)$$$! %& + $27/('   + ;oȺ¾ɽxtty~ó{_:!#;[nflȽü~t}sis}}{{{zyvsrsutsjd[RLHEEGIKPZefae\QJFHRZYW<$++!' !"%')*,.(('''''($$+0*3eؿbT?02:80Rkd^UWizujS9("  #&&%$" "#(*!   &8FH@859>ABENSaknjjmeXQJ?5,&!!#!"+7?DJQUWVM?2" !1HUPD>>=2!"1::<<;;;:998:;=BEGJKIC?=>ABABA@@AAACDEEEFFGGHGGEB@?=>>@ABCCIJSVJ>J]UOdC587* $"$*,'  &' $%! *58/&$   +\ʿyx{~ývfYSME>A<1  +&5Ibleoſͽz}Ǒseoxzxxzyyvssstutmh_WPLJJOQTX`ihb_YROKMW`orQ-,4-+,(#!!! #&()*,-**)))))*%'-0*8q˴y]O=33765^~jZQHUz|zwiL/! )'''&$"#" "#$()!   %3CH@8636<@ADIMU`db``VHA?<841.,-*)*&#)2#'/6:@@AC@<978;=<<=?ABBBCDDFFGGIHHGECB@@AABDEFFGJKT[TEBIpfN}_@35:@ENTZ\XRIB8>;;8.%%'((+//+$$)-,--,--.1488776657747:6208@PYYQMNNPTUTOLDBGPRKC>IVcgfgfedglmdRC<:?CJS]\URQOID>4'"!%*+$   &#$$!&"-78.%!    3Żվƺzwy|ûzsk`M7&"?O_ki`t¿̼žr͓q_isvsvyxxvsrstutsng^XTRQVZ]agliaXVUTRS\f|k@5;5,0.,'" """$'))*,.++***+++')//':|Ǽ~jUH;6216>nqkN>DIKJIIDCDC=;BL@?AB@<=C@CEA::DEFIPVYVTWVVZbihggktp]QIGDDFIKOTTUVUQJF:0&&/;A=8C@995348?N]ry0%*/)!)/210320330/,-+,,./1356679:==<:95,$%)*+.0/+$ %*-,,,,,,.2689877678646;88?CJ[hfR@29DOSND;DYg`NBEJGJMNVeqwvrngYG<939BLWa`XVURLGC:/ $))!  ! %$%) '14/'   +I̽жƹvsuz}yzlb^[ZVgssg^xºպtДoZeorqtxyxvtrstutvsld]XWXY^bejmg`WWWXVU\dviQC5((,/.)$$'#$(*)*+,+,+,,.-.+,/-$9ƴrcPD;81-9K~shjH-BlvbK4'&,I`szseM7%#! #%&()&&%   $0:HPF2.725:ACC@=?INMKH@7?IU_aa`a\]acbacg_\XUK?77;>?804;CEAA@8=EB899AJRPPRPMPTSQNMOWaiuw{yqcUMFFEFJNQRUTRQLF=91*! &.:@<68??5$)/-----++,465443110.--.023148<==@BDEGOMMPPJB>MZȥ|nbL6/27AKYWTQMLHE@;7544329=DMU`t΋A/,/,!'-10/21/10/,+**++-/2467789:=<;874)#&+--//.*% $),,,,++,.378988869865699HNNJHVhp`HAISIF?>L^konkjeYG<8521889;ADC=7:@CB@@>4+2;CHFKOEEGC:AFA6/16<@<;977;CHPSXZXSMIEEFJNPNMNKFB=9312+$ %,9CA9455+%*(*)***)()1333441/...01134358;<<::;;<===>>><97668:78:=>@BDHJKIEB>;C?utTS@1/4:@HORPJC@AB><:5.-3;DPcu֜T9-2,#'-10/21.1/-+*)))+,/157:9::;<<;874*"&-0/./.*% %*,++,*+,.269:999986788:;AIW\WPMMMNIEEKV^dgf]PIKQTYUNJOZ_^Z]ckgWE,%"!"#! !!&'((*++,,,../00,,-,Buo^IB9.,;^}nicQHCxynpfI/5Wz~^WxQ)'(('&&'*-,%!  0:?;78;=A><>B@93479879<@R]gh`ZY]^WPNU]_[\[\a^O>55>>2)1;CMINVNOTRRX[R>," #%+21-*+))*)),/368<@ACAAFGHKOPLHD@841.,,/)# "'2@D=3.-&$.-&*****)(*/2344310-.0235555567765344444454321002345679;=>?;DF@961+21^kHF6-19>@DFKLG>;<>?<;70/:Jdr߮gC/3.#&-10/21./-+*((()*+.1589:::;<;:754)!&.0/...*% %*,++,*++.159:;;:<658:<=@IP[XJ@AJP\YUVZ_cfbZSQRQPOYZVOMSZ]\XY`d^UN\_```[OCPNKFFHD>1" " #%%%   $%$#! $%"*#*1'-0/& +  &'$!]ʻдų|z}zdoprv}yrjemsqnpuĸϭ|亃eT_hklqvx|zwvxyxxz{woc][\_ellklicWQS_komkkm|`E3"$%'')+*++,-./0/((2;Rȼy[EA6(+Jy~|kkc=6.0344249@QY_YLDFKSQNIILG>DFMY\O=3.:<1)1;AJFOZUU[Z]dg^H/ ')&&'$$%&&(-.-/38;<<=@?=@DEA=63-)(&$#% %5@?5.+*'%+1/)+,+,,+*+034543/.,./1231233220/...--,,,*****,-///123466793:6,(-+%&,Kqd8;-(3@D?>AFHFB>:8867=CK_qqG,1,"&,00.10/0.,+*))*+,/258:::;<=<:765*"'/1/-.-*$ &+-,,,++,.15789::;46:ADFIQa`RCBKRQV\fmmfZPMPX_YMFHFKJAF454.$ + + $)(%   hջºĻ~{usv}xok^K_hqutyzxwwwmplmvIJ˻͠޳~bR]fijpux}{xwyzyy{}xpd][\ahljiheaTMP`qxvssqãrU5%%,-) #&'(*+)**+,-/0.&)9Ha˺[AA5%-Woylnb-G{zhL3@jya@Qt}ZG3-)'&(-0+.,$  0NWF?O[VLC:8<;5-0245339@FMQG7/29V^e`YPB4/282-11--11.-.....--034431-,*,.0100/01.-,,,,*))(''&&&')+../.-...001423&)/+%*8Y`&3&%6FJA;ACEGGD<5.,4H_yV$)'  &.43122010.,**)*+.3668<@=<=>>93.+(&+361,*)'%"#'*.,,,---06887652238@HLOOSZXI>GWZQYftxsdP>=GUWPC?@@?96=NXX]RC=AJRW_ZVZaaXQQRRNIGGE9- %#$) ( $,)#" 5)-,%$,6<1(:W`=0,,!    $&$   0vм׿žzfjuntmYUI7Tl}y{tpruqqru}ý³ȻüʹzԬ|ZSYciknu|}{xx{|~xnbXX]djopljigcQOSdx~|vvӱpP316- #()((,/.-'!%/217384Mȶ}`;??2=qvp_P%MweV435AEFCB3.**/0.*)(%#!! ',/.,+(((+-/100121002354200111//.--,,,+,*++*+-.,)'%%+((-/-*+,,+**,036, $%$"-Xb!%&-3;B?99?FGC>?A>K`uȘ[(%$ (0431232220/-,,+04799;>A>>?@?<61,)(-462,*)&#"$(+.----.-1597642015;CIKMMQRPF?I[`Y\fmni_PB;DNMB:@@;O|nPC9a|mYJJixPCNioR:-'&'*+,+(&%"   +  +#5DNUYWRC<53673-+-0/26:9=<87@Uhq^A;548963-54--693:BINRSJ>20-.15770/.0478863003677569=ACB?93-+--+(%$#$$%((&" %'%"!""$&),../0////.0133101322111000..-,+*))-.0/,)((*(*/2-((*))(').25," $/O|S#$-2:@=7;====@GNgwΟ^+%#  '/4423322210.--,369;<=?A???@@<73+)).462-)(&#"$(+.----..1576542117=CFFDEHJKHEQ_c[XXRIFHJG@EIB729AA<3+,5<>8=?9009D83/5@HHFVWUMFA@==3(&!(,./#+27752*"&-*+'/7^}K?^qo@3/.! + "&&" +EӾرütsupxx[RNJe|~xogefhs}οƵɶȽŻɒf]UZbikqx|~zvromke[ROS]frtrlihd`VUXg{_ZΰxfF#!%+/0.**-.+(('&/594ckO:65;]|g:4]}dOVcv}e><[p[H:0(#&*..,($!   +  (:HTZVN=6/.142-,/1/05634/%!*=JOHY[S^mX1)'%'.5;80+%"#'+,/15:>?=;82+(()'&%&&)+.012/+&##$&(+)%"""#%')*+,-..--,,-/2221232222345610/.,+))./0/,****')//+%#'&$##%*.0+$ #19H`_A""$,3;@@>>?:;AP`jΞ[&$#  &/4534422221/.--358;=>?@A@@@@=84+*+/451-((%$"$(+.----..146543213:?BB?<F?85-#,.(-&.R`]Rgrs@30-  + #&&"-Sžüҫupu~jdehu}vngdgkq{{ųùijȿͶ|zȽLJUUZ]`fkrx|~}yuqleaa\UQR[emrrnhed`\XX]k|_SҼrC>=;5/*&).21,(%'+5:6oƩvcL7-+=jn[+1}_LczRHO]qrYH@;2)!#+//-)$   !/>MUPG:3++.1/,,/00132-3)  +   #-6;>2334661,59@IMK?5.)"#,7>OV_b]QF?3+"".027;=:7/*#!#%'(+-.024654320.+)(+,.0331000//.,*)--..-,+**,////010//014563210/.-,./0.,**++'(,,)%"$"" #(,))(%#%'+3BFEHB1("+38>BFACCHXr̙U"#" &/67454212221//-3580$%5FNCD@<=CD@HJI@3-3/ "(, !/2"(3FNG=:2(),-*)#6azoigg>1/, + + + +  $'&"  8_ǾΩúĻoksztkko{|umgfjoryp˻±¶;ļź{zyɿɄLQa`_ciry}zwtqnia\ZWTTZdntpogb_b^XWZcsi\˦nR<10235771)%'-7ACɤr_L6(.L{~aP,=xbYiyB=^us_J<872( #)..-*$ +   + #->JJC60)),/-),-..13.(5) +  (156654574/)&),18;82.369@IU`fhjnpnfZQHA6.**)*/0156853'#"%'-.13689965555310122357:<:88641.,0//.-+*((*,-,+,-++++-034332110///00/,+,-,'%(*(%&! %*)*,+)+05DFEDA@?>><85-.0342.)''$#!$(-..--...003333347?CE@7239DO[caVG<36879?B@8FPPJKMPNC;7:FOSKB=BIORPSURNJHGC4%!)/3 -5(25CLJD?837/%%+(!#.DWzh\Y;/-* + + + + !%('" + +  + ! Al¿Ϊfdqyó~sszz}ulfhkppwi~ŽѾµƳwɆNYic^_fqy|xtpnlia\XWY^fosvmkc^]a_ZV]h{tlfN=430020+*-5EHGEA?>=<:74/13541+''&$"!$(-..--.//0/2233468@GGA824;CMX^WG8/*5@FIG?5-:BCGPURKILTTLECC>4)$+;GSKA<>DIMNRTSOKHGC:/&!'08(2+77>GMJD>?CC+&'##"K˺YOH6,+(  + "&('" +   #HxΫbdsy±y}xoiglplwe{´κǿƺʸxÃTirg][box|xtoopoid_`dlsxxvmjb]_ed_Z`j|İjN=2...+,08;Oh̹|^=*$ErM>PxzmoypB+EnqbULC80*(%$$'*+-)     +#)(#!$+/,'%'*-23.%3* + +4755/.0+%.>FIORLBBJRY_egknryxrnijlokid`ZSID;821/0.-**+,-1479:7* !/: "/)87:AMMFBGJP."$0*&c‚k=>73()' +  + #&('" $M~Ǿͫcgtyľuz}skjmqftcx߾ķ˷żȿȺ~xŸ}Wuvj\Yamx{zvqqstokgiox~{wnjb_ahhc^bkzͦ\L>83,(+:9Ssì]3,*VjE:b~ncdlB0EowdSGC?6-(##$&'(),'   #+/-("%'+14/%3( + "073,2+).++>VZ_gh^RRZ]acdbcdhlsuriefjqqpni_TMD@931100*,048=AFFHHHGFDAA@?>>>?@>AEGGHKNMMJIIKNOMLJFB>:82421+)&'## "&)+)($!).+$ !" " #% "%'*-5KbĀO!" $.7:;<843334530,,*/83:EMMKLOMATT<1BQOFCFSa`O=18;6.3FX^XMC=>EJEGLQOF@>@?<2$ '0  +*865;JQLHMF>6* )9wwqW6*#"#  #%'%   !Qǽͫ¹feouua{ɻljxsxz|volkmikoȺ½˺wz˝rxzmaadjs}zwvy~yuvw{}wmjfgknnmjdfvrͱX@/#*58.),-2IeqvxwncYSa_YSNPU\ckrrjfdgonnmh`XSNHA<950,,17=BIPUYUPNNNKIKIGEDCCCHKPUY\]]]\[\^```_]YUPJD?><850.++*&"#&*)()&   $,/.&!)&&.7AQhwL"# "-6;=<94444553/,*(,7>??A>=<97532.28960+(((%!!(.0//.--,-/01358=BCDA:57@HMSVSMGECLOKDCLVYFNI72>JJFFLU^ZL@7?C=33CRXPE<8>ED@7+$$$ +'8A;9CKICB=3+-/,$$&NzXpzoW8#/,(   + +  #%'%  !Sýȫjekp}|~lVw˵sWQY\envunjjjouzž·ɼzq}{Ϳ͜~ufcfmv{yy|~zz|ylkijnqstrln|}zѹiL:9:'Fǻg[hspZPf~keXB0+7VzfMMHE?1$"-)&$&%%$  #()(#%&'.54.61/! +"& (,$ +3>DB9<2+-/6Nhuwtj]USUWVUQNNQT^dihc`cgloprnjc_ZUMF?91,15;CKT]cc`[XWVTQPPNMMNOPUX]chkkmkmnqsrolgfb_[VNJCA<941.-,(%&*.-++&""(/0-&$#!"*1@Qcw߱lF$"  *5:==:6555553/,*()179BC@823:FNW\a^WOLNPLC:;GSWDA:318@BEJQVVPHA>EHA53>KQG;549>?=@GKG><>EF?3,*@HIG>=4*+0FNYdlljfca^ZWXXWVVXXYehlrw{}~xy}ytrpmkhc]YPMIC>96442-/131.+%!#'.23.'$#"%$)9205BLS^^``YNFCBB><>DFC5.,1316>HNSQICBDKOPF:8BMUL?;>DGF?BGIC;=AEFGEA=4'*(" +"6@=AID34@AJKNPPMD<'+>NIC?990'(2E^oqqlbWOLMNPQRPOKKINRUTX\bimqusqkiba]ZTOIGCEGMS\fnutrokgb`cb`__`abnqu{{zyvusojga^YRLHCBA>99873/*#$)1771&!" $*)%*BZtߧ[;%"!&3:=?;67777741-+*(%',25444444557:<;5/)')*'" '-1//.,,+*.0247:=A9412;GPSZSQTQF93<@A@@A;2'$,:;24>LPRLA=BIX[WL@@KX_VLIMQRQFFEE?9:566678630*+'!%+-223456679;=;5/*(**'"!&-10/.++**-02589<@5535=FKNKB>BA80/BFGC@?;5.-9JKA=DPSTOHGMT\]XMBBNZ_ZSQRTSRLF=;87=FCC@AKYXJ-+/0.)$!-,4BHBCG@87&"&+7Kv뼒~|zzyƷ¹˾}O% F}zeN?<4.*$#&'&(,01-$   '**$&)-*&$(1PsqVR`eipm^Y]]WNWkkO942/..4IdrrrfZUY_^[URPNNLJGDHNRTUVX[^bfiklkmnoonoqsutrnlmps}~yusmmmnortvz|}{vqkgcb[XTRPLD=0' $'#)4<<3&"" $6NhٟQ4%$" &3:==8356689752.0+"#()113457899;=;60+)**'" &-10/-+*)),1359:BDA823.(,8LRUSPRSPJJQ^aXOLSVY[[]`d^_[PFEMV]\ZXVTQQK?1-.3=GJA6:Tpr`@3-2>GE=9)(8C>ESOA]x}_W`G$%'*4*%43/& +  %'()&  !%$(hĺʼʱuy¾aR[^iuunryq˽zogflszɺòþȿæn{??LJLLG?<<.%(647^ś~}}~ô̼i:-Bkw^G<352.%!#%#-/11*    + %(*$"%**%#'-Ls{mnuqp{yicmpihisnS=84+03?<979;>A81,"*@S`jlkoqpf`bkpj\QTW]dkopnegd[OLQZdfec^[VWH:)%*2?IP@.7_wR:,6Vu^=+5927HWQxεb( %,() +),1+  + + $&))&   !$#*lú˻Թz|_OXZao|~tmr|~zzxv|ƿyskfgq|ïIJļϺƿ۸l~Ѯk:?CDF?0'*3"$&A?]͡οU-?kzoP?=/...&"$'%0230'   "')&"#)+&&+/BavlestgcptnqjmdL:3-)05?Wqrebbcdfgc`\Z\^``[VTSRQQTWZffeegikmloruy{rkaUF<.&!" !%(.3644884,""1?Zhʢ̼ͼºߴʑK4)#"!%29:746579987551.-/.**-136765456:=;4/-..)!"(-420.-,,,*./05;=<9;;810:FNF;1%!1Hit|zvtx{vi\W`n{}rutmaXVXgnrqjd`c]G,#(2?GE=*(Rc6@b|ȩuH%%28CQnħzP/ ( &*.$  +"%'))%!#(pñļxx¿scVYb]ivzwux}~|vw|{vƼxtopnihr̿ɵµϿȦ|ɂZJ:;=6ISHWc=$).ApϦú\Aazi\K810('&%"#',5;<2"    %$#&'$&+.,-6Kg~tz}wrsuvzn]OE?61)+4F]kmj_diljfb_\]_abb`_\ZVUTVY]ceilnnmlpppsxzm[I=41+'" "'05<>>@<=;1# '.;RjζŬĻвϴƎI3'#"!&1:9655579987653//10--0478986456:<;4/...)"!'-421.-,++(,.15;;:32/./4BQ`SF<45Iaw}sjkswmkmpuxwrlimlX<:--2CXhkidhnolfa][\_adbca_][XXXZ\bejosttsvuuuy}q`NC851,(&%%&*08?DGGEEE>-!/BSeؿεŬIJ׾ʲĴ‰E0%#" $08966768999764401331158:;;98567;=;4.---(!!'-310.,,++),/15:98-($&-:L[hWF?=E]u}}}~yvvzwbH91+&#"#1Vvd`޸ydUUdxԶZHV3 &))  "$%(($#-qŰŲwx|~tjdbdh^dlrvwz|}˿yjdhong^_t¯нʽ⽇iQ05<%!Cѫ|? >L=_ӱҿŻshg^N=4+$%%&&%',2461(   +!'*''()&*-4>PhsaVG=9:<=3/0>Rcjijostoga\\]_bedcdba_]\\\\bfnuz}~|yxxz{~wfUJ>;730///27>FMRUTQTRD+ + +8PkϴδëϿӺIJƼB0$$""-6887778::9764301442379;<<97557;=;4.--,' !'-21/-++***-/04;=<1+&)5AP[aQA?CNd{~}~wbI;5-&$!#$%-@[lnyɷ~ʢ{K "$%# ''%  "$%('$#1qϼ̽xz}|wpjhikacgmswyz{̿rfcgkg_^jIJҾǽ۠tٕH').2HÑC !+..EB/Lղøž}h\`XE51+"'''('(-462)  + +  +'+)'&'$*--07Mjo_RK@86789721;Pajkqtxwqha]_`bdeggggfedba`^cfox{wusqtyziYOEB?<99::AEMU\add_c]E%  %3N`yɭͳưиʺɵõ|?0%$! *3898889;;97642/03423779::86338<=;4.,,+&  (-10.,**)),-..3;?A;628@FLRUH@EMWi|t`F940--**),.5AJ_ouB$(*+"!&%#  ##%'&# $6qǸɽ{|}}tljlfeeintuwzvnjfeb\ZfƷӾľĽЗU3(#99kɡ\%!$IedH/.IwׯϾƿ}i[[P;-,*$'()))+.37."  + + &,)&%%"+./,*5J[lruqi_QE?=;:8643832>Rdmntwywqjb_cdeghiijijkjifcbbfmv|wsklpuy~{l^TNLIFEEEFPU]ekoqqnqcA  $C[~ɮ˲ֽ˳Ͷðs;1(#!'17:999:<;97642/033136579975338<>;4-,,*& (-1/.+*)(),..-2:>><<=CGFCDC=?JU]l|zeH941/0/.+*-01,5D]bOM[ffưtLA>%-.-#"&$! $#$'&"!""! %;qõ}||||{ojjhfcdgjmox~øzolkd\USZuƽ¾ٹ΢pUG70,-29=>:51313AXjqrtuwupkfeijjjkllklmopomhfaciq}{ooooqtwy~~sg_]ZWTSSTU_dlty|}}z{h> =eƴ̲̱ӺȲ˲ϺԸѼk6/'#!%07:99:;<;:76440144226468976449=>;4-++*% (-0.-+))((+.//267537=DF?9755=NZcrlN=61.-,,($)0, "*.1579K`y_F1%**'$'% %#$&%!"$$#!'@qùĽ˻~{z{w{ysmijgb_^_bfowǾyohdXMGN`ӫдϞ`>!""^ĸsEEFLײ˿ȻŻӾƽz}uh[J:1-)'()+,,+*,10"   + + +  #)'##&&010/*%" &*%&/9AA:2-+,3F^pusrrsqnkiknonnnmmnmpsuuqli`aelw|ytpnoqsuz}uoljgdbbccmqyl? )@cηͱѷͿƮƯβѸe3-'# $/7<;::;<<:75452255236368987569=>;4-++)% (-0.-+)(')(.01340,(/7@@93225AVbkzrSA81,+&*% %1."-)! /=JQE8'6" !$(& %#$&%!"%%##'BpöϾ~yxztitywuurkjgb[WVZ`enï{pe]M??KfŹນ~ 3* >ɐaQCIյĿ·ξλƽxlWA0..)&)*,,-**,0,   + + + ")&"#')210/-)!*2=DA9/)$'2Iasvtoppnljlnpqpoonnnmquxwtnk`_ahrzsnmoqou|{wuromlmmtyoB !2Gdֿйβеĵª¼ɭϹ^2%-# #.7;:889;;:8766786422368::9989??=93.-,)&!%-.--+'&&)+++165.'%,32--026DU`iwz_E8432.&!*.-!-*'1.!'"#%+#(*% +"$$$"+,#!,GvøļϾxzvrw_QDGJ`xstqk`XZa^X\jƽ|}q`VQIBAJ^{̸зȾʯt;%&,,$"=x۝lZJL²Ѻ̽Ͼͽ{lbH=2,*+-.+*+++)'% +  +  !! %*,,.2673.((*-/2338:=>;5.*!(6Piz|ypqqppnopwrnknoooqqtz}{wvjecfktytqnkqqsw~|yz}n;,Puֺоʹʹ׽ĪѷZ3(+#"-6;:899;;:9866786322468::9989>?=93.-,*'!%-.--*&&&)+*+/44/+ #('%)/47BP\fvt^J=:;;2((//  ''$,,  #+,# ()$  +#$$$!++"!*Jvóžȵw}{ybI0 &1Rrrtrmc[[a`[YeútvqdWOOLFHKRc|ƽƿƾԺxI) ""!5dѡsXDMǶһ¿þʿtcRB8/*)*-..---+&  +    "',()+/6;=>=<>ACDDEA?<73/,*,-6Mfvzvqttttssustrpnoprtux}~||tmhfgly|xspqqruzm9%EtĽֻ¯ѷγ{vΰԻҵT5+)! -5:979:<<;9977886323468::9989>><93.--,(!&-.-,)%%&)+**.1310$##%%&+379@KUbuzrdSD;;>8+"-45# +!(,,&!&*-(!*("  $$$# **"(N{ϾôsyyziG/ +Iqpqsph`\^``ZcºsjhaTJHKLHIIIK[~ǷοºɿʾŤr=" LΒdYPWҽ̴¼xmZC;4-+*+--,,,-)#    +  $($%)-4<82.---(!%+-,+(%$%(**+.1346/-+*)*/6<>AIScu}xn^G5/20$$264+#*)('*% ((*,,"&,'"   %%$# ''!&SǴÿuvy{tS3#Rvqowtlc\Z\_cjúvicYRICBEEDBEDBIcǻľƿƻΫJ#FzxBQflƦ¯ȺqiX?4.,+*+-.&'))'   +  "!#'*,07AHMKLKLKKKF?4(##'+4..=Ujuvvy}|ywuvuusrqtw{vla^gs}{rpmklptx_) 3TtȯκϱαnfixtnkvԾnv{l}׸P6-)" *3888::===<;:::96313568::9989<=;82.--,'!$(+++)%$$&')+-.26;8400/-.3ABDIVgy~vfJ/#$ +75/4.#(6(%&&(%$"  *.'! + !%%$" %%" 'Q~ÿȻyx}x]?#4`}rlytne\WX\hs|laZNHDA>>>?ABA>?Qo¾ÿú˴K&S˷k4=b˧Żž˼lbS<.**)**-/*))($ + +    "&&!%),.28=@?@?>=<;:5-'$%*-61-6I]hlnt{}zxyz{tnou{|zuh`ck|zwqlkloqx}}T!'LyǬäҾͰsuͰg`crngdsѹoyufzֽؽT4*+# *2999:;=>>=<;<;:6213568::9989;<:72.--)%  !"()+*'$"#$),-,.3;=:554114DFIMZm}~xlQ2"" *>H@432* +% # + +   --$ + !%%$! "#$$+Gv¤~}x~~zo\F0 @i~pmyrke]VW[k}seXPECAA=9.Q̩žĿŽȿkZH6)''(().040,&     +   $!$**%  %)+.13433310//,+'&'*.09526@LV[kt~|tos}|sgcdkxyrnmoqqv~mE:bǭ¦¢ζ~kjv̯jjp}wnhtͳz~m}ѵ•Z1&-%! *39:::;=>>>=<=<:6213668::9989:;:72.--&#  %(,,($ %)*'(/7;6211013CGKP_r}yrZ;)(*&(;PZN;.-)  +" !-+    +!$&$!  !%)0=nԿ{~~ujXF8+ +!Gk{oqwogd_YZ^oŻzmaSI<>?@:7ALL=33=HMO}¾úʳͼT6&Hx˹QI<9aЯûȺſnT?0&$&&&'.25.&    + + +   +#*---,+*&# "%(++)))))('%%""#%)-246789??>>==<:6224778::9889::971...$! #(+.*&!#''$$+32+%%'(+0BGMSau~{vbB/-.(,?V^P<11/(" +  +$!!+(    + #&%  $*18k̰ym]H92+ %Kkypvxmffc]]buumaSG7:>>76EUF6+2@ID;fμŻνɺc(##! -@Rao~~i<-1TԶʽʷ¹sR:.&$%&&(/40*   + $/5?;4.(# %! $&$""#""!!$(-2516:;;?EKWamqnlnosw~|x}vpot{zwwxns{oZUjǾϺÿ}ȦŞjlɭu{{íœa/*)(#'2;>><<<==<<<;:855678889::::9:;972/.-% ! $(+*&"'('&%(' ((*905BNXg|{tjO504)0CHLMF<72*! $('   "%'%! "&$#0`Ǯx\N>40* 'Wmsutvsohdaei{{qi\MD;768?FJG9/*0:BB>Qm̿Ƚدn/$)(#$0>>8;?DOTL:(GJMA-"$# $),.-/16:=@CGIPV[ZZ[WQYptqzz|x~{ur{zhhntpkwz|sw|x~~{møѽypǦĤvyδx˽ɲÞc0+*)$ %19==<==>=<<;::75567888::::99:;9720..%  #(+*&  #$$$'+01<9)/:42BQ_nxw}~wtoV;10+5CHKE40-("   (&  #%'%! "'$")ZֹlKB80.& + 1_ppstvvtmfcgn¿wmdWIA721;JPK@-)*19==>=QѻŽԟU)!!%/724>C@?DHIGEKIZǴyaI8/--256785+"!!  /FIIK@-#%#$'++-/049=@EILRWYWUSMH9Wttbeu~ywgaccZQRSZa]Waq|x|vy|vgĹֿle{ɨǨ|ζƶɶĭğd2-+)$!"/7;<;<>?>=;::964467898::::99;;:72/--$!"'+*&  #&,@KZT<7=;2BVhuue[Z`iv~z~|uw{eC3,0?JLO? #$("   !$%'$ $'$"!SüǦs\>:72-#@ispqqrvwqhelu·rf]PE?602BV\M8!#+5<>>>/3xю:(&!0_wi^`hcWTSG?JWyeӿùlTB0-.4;<:70&  ""!!  !,&$;NLHK@0&'%  "%(,,--.26;@EKNUZ[XVUQK6]{t_ZiwzeL@AGHFJKQTNEGRav||sr~}{yy|whǼĥ~zgatʫˬͶ̹šf4.,*%"+4::;<>?>=;:8753356799:::::9;;:71/,-%! &*)%  !$)MbrjQB@A6D[q|}{wrv~vmg`ZXZ`fp{~v~qI5,8ISVX>   + )#  (&  #%%'$  &*&#NȲv]I58;7/" Msunpqmuztifpz¶n`WLEA:8?N^[H2(6@B>;' hϰø|.'/h³hZTDAVp@iɷõyaP9214::3.'    06'#@SKJJA2+)&! !!!#&*,,---15:=CJMW]`abfc_S~s[Xckr|yoq^K5-6EOSSSTQE613=Phqmy|z|~Ȧz|ogt̯β̶ǻ̷̿©Ƣg5.-+%!)28::<>@?=;97642356799::::::;;:72.,,$!  $))& !"! #Lfvp^MDC    $.!&*#  +#%$$&# !$),(#L¯taL<49=<2%)Vvtmprjtzvkisk]UMHHDISZYO=-%6DE;1T|ַƺǿϥh4-0"%^dzz~v<^ǿp`OE<996.' (22.)%    "%''35 ;QJMMB6.,'!!! ! #%(*-.-,/259;AGKV\bejpqndhNWS\jx_XR[TE3.8GPU[XTL=-" $/Gskty{ƾ̪zw||rwеҵͶȻͿʵֿŢh5.,+&"&18::<>@?=;96532246799:;::::;;:71-,*$ !#()&!"%" C\hhfWFDAEZ{yj^VT\ekvtaLB=5)#'5GXb}xqI40;MY_\;   #*,++ +$&%$&" "%+/+$LþȽvaTG959=:4(1\xrkoqjt{wolvý}h[TNOPPYa^O>3+" (6BA2%@fkt{}Թ̾†T;67=Sˏg 1S{۽¾rd[SKGB:5$!"+4>KTXRJ?5*" +  + %)*))(0-8PMTPD92,%"#" " !$'(,-.-,13689AMUZ^[TJ>2)$4|ypuvu{͸;ѱ}uy~{ӻԶ͵ʼ­ȴ˶Ţh5.,,'# %07:9;?A@>:85421246799:;::::<<;61-++$! !#((&!"#! $9PV]meNIEASytZJ:1/2@BGMTZ]xzznI99;IW^Y8 +   )-$0* + !#%%$&" + #&-0+%JĿyzcRLD:25642+!;bwpjnplu|ysqyzfZSQTYYaeXB1,,,-08<4%3CLV[s{ӼĶºΤb??35Zʾ޿X%)Biٺywuuspnjaaeow{yjWC1& + + + + '240)$#"&&;TU[UG=4,""##"$"!"&'),-..-257;@GNTX^bdhnnl}чJPLLKVwQMxW$2D_aRB;BOZ`]ZRIB<62&$9vywquĪ׸y}ն͵ʽ¯ij¯ġg4-+,'# $07:9;?A@>:8431114589::;;;::<<;61,+*#! !"((&"  #(5ILVroVMH?Mt}cK1#$0;N]r~qkiilqvwwvpg]Wuz|kK=?=GW]W6 !)!"+- "4)   !#%%%&! + #'.1,%JĿ}rrrhSFEB9/10/0,!)Adwoinopx}|vt|¿wdXRRW^\baR8))-45:;6)00:DBY^at·̿ͽǛ{A1@07uڽПcڙN,.6jٺùy^D1   ')')3==2&  ""@Z]^WI?6+!!$$"%"!#''*,.---369=CLU[[adgjqqov׌LUHMLKa{~lIKf2@QmbR=38FS[YVMD?=:664Iz}xpryҾ۽~Ĩշ̳ïѿƞf9)+.)$!$1648;?BA>:722///23699789:;<<<;71+('$! !"!(,)"(2:@OaltgLJIXuvld]ZNVXRNU]`rw~ssy{{{{rnou~n[VVX\ej\8 + %'%*- $)! + +## #'& + $%*,*%!LĿ{mbc_XNGC<2')+,./("0Jerrlkoow|{vu~ub\ZVUWWZWG3)*.<>B?0 !-354:@CCUyƾĿ÷Ŵ˯[H3170S׷Ưu€B%)+!h{Xjپż¶eF/  &.01/,2;=1  !&L^d^WH<4/+'#$$#! !$%**+,.../36:811...025787889:;==<72,*($! !"  &*&"(6C\mpnaJESg{ymfegk~{}}}{xyqefmjhjm_<  + (,1. '( + +!%%""%)'!  !$&),)$"Nr`RZXTLD@;4'*,-00*$6Mdpokkoszxw|o`ZZYWX\VL?5/,*7@G@+#.3448>41Aavz{}ĸξʩ\93*%3L{Ʊֹ]-"%)%^}aSpvԺ½mN5 +#,4661.,08>8)##$5Pcj\WKB90&! !"#!"! #&'**+,-..07:?FNX^bjloty؁@JMKGA[gLG=XtT4A^\=@ABMX`VL@1+'+iŸusupv~Ӿǭ˵˰ӹˮ~Ⱦ}ëíϿěc8(,,($""/439;>@?=:811.-.0247778899:>?=81,*)#! !" $'$0Hk{obYKB]t{x{}~~lioxqmk]?" "+36*(*&    #&'##&*'  +  "%&(+($%P~hQ@PRRLC>:6)-.033-';Ocmkjlov}}y{xj]Y[]\^_O>654.'4CL>#'/5458>;4:KVWapyqwݸJ-"(&.kĶյ}=(%(.)#YrmԹtV< #*0.26971(%"'3?D;,!!#"$6Pbh[VKB:2)"! !%(''!!""$')***+-.023>ADIPY`dgkow}~ˀM[]VM=HP71C[mP3@aS1;>4?SaZN?1(%$6yuwdglpwŊɯѾͲӽ}yȭƽƲŲ™a7)-+'$! -34:;=>=<:9320//125789:;;;;==;6/*)(#!!" !%%*Iq{dSQOL_s}}~|~xgfo|{vlbR<(#   "&,20 +!.-" + +!$&&$#%(# +  #$(+)&%S¹u^H9JPSKA<86-033771*=M^ghjlpu}|{}vj^XZ_df[G4156/)9FJ8!%*13549CG.(KbjO7?\{{D)562?TXVJ;1'&/C}hhggjtȚDzŪѶǨ|~ŪȻƿ̻Ͼ`6*/)&$" *34;;<=<;::652113469:;<>>==;;82,('&#  "! %&#!(FlsVFOX^_j~ljqw{xjS@1&'$!"&*)!#1+  !"#$#"#%  !&,**'Vôtlp}~kWH>JPRKA;851567992,9GWbhknqs{}}|~yoaXY`ijP?1143//AGB- (*.15468;<99>=Ta_B586?OZMN@3."!3RŽ|sjfgmqy¿Dzŷ˳սѻ{zūʺ»п_7+1(%$"(24<;;;:::;87432457:;>>@?>>:960*'&&" "!#$#" "%?clSFTbqgj~qpv~}fI2' !&),"$/' + !!"""!!"%*+*+\d\]kr_RJEKPQKB>;76899;;3-5CSajmoppx}{z||tdWV^dfE9256206FF:&#+-/124568:768;<;AIFMPKC@ELVWUQIB=AFJQUY^]QA, )9BIOOKGB;2+%$%(,,+*)+.14454533347:=EJNS[afipruy}~c\VK3";QRH8=bn_O@@QRMD@<:GVUOR@45&!7`wqprtz̾ƻ}˸ų˲˳Ͻ¿—`8-3'%$# '04<<;:9:;;87422346:;>>@?>=<:60)'&'!"! !"#:_n\R]i}yx~{tx}aC/$%((()*# """""!!!"('(2er^WYdviXOJHLNMIEC@;:=<;;;3-4BScmpolrx~zxwz}ytgXSXYW@64=>74;CC6'#,205555679;;99;:8:?DGGC>=BGLLID>978CEJNMLSap~ګuK5!"+Pѿ৊vcOrѲ֐F%!%*.*&%6/;{ALȤnm{p_j˼xk`\YYXVM?2&.=BCEJKH?:9KUPSVC8>.%>d׿ƺ~̼ͿIJŸǻ`8/5'%$" &04=<:99:;=764222458:<>?>=<<;70*''(" "! 5]qf\dl~~~|yyuX?/$'&%'($ +%.(  $#!"#"!  $#$7kyl^TS^pwbRJFFJKJHHJF@=?>;<:3,6BSdnpkgrx||xssv~~wthYRRPJ=35@C;7;;@6(&/5299989:<>:98;<=?ACCBA?@ADFFB>::;=@CJPOIGL[ju~ǢtP6EQxƶč[aSEqໍ~f$-)#/-"8/5xq޲~\Sacg}ú}o^QKJIFB8,$" 9GE?:FMKFJZjky|psvdJ:)%+/4@A;9962.)*,.12/-/159::766432247:AFNW`gjlsrsuy}dRF79KZP&=_T=3HzwM?@HcZUFADEOVPPS?7B1%?aĿ¿¾õſ˿×a;/.)%#! %-4;>>;:=<:9631366599<===<;:83.*'%$! #"(Ljkgnv|zvrxuT9-)&&%$"!"#)-141% +-3+ "# """!!! $8roaVPS]m}nZLFFH>@BDGMSWRLD>;8666@M\fid`hvvmru|qeZPIC5528DA8==5*$)19<<>?A@AA@<==>?@BBHEAACHHHJD>98>;:==:9732466589:<==;::83.*&$#"!#" ?anv|zv~}}vqwhK6/+&" $+143.(#37(##!!!"!!! ";un`VQQYhwweVKC?>KORTTPMKDAABCB=<3:FWgmhdgqy|~xpoq~ynbUIA?AAIPKDGE9)#(179=@ACBCBA>=?@AACCGDBCFHIHGC><;=AEADILNNNNOJSb{жӤx}ubLJx嶉fa}M.(#$-0+%!&Ap۲mi}Ĵ~h]RF>72./*#+4753515CdĿsdZUQ>3' '/=@;4-**-36974223/.-0134402246:AFPSX_eknorrsttqkcB>=JO53YT*8J6 =y6/?J[[JL?,+1&+LoԺĽȶ]8-.($"!%-3:==:;>>;9732466588:;==;::92-)%$#! #"! 0Pkvy}vqsx|xjT?30.)$!#'.253+  ,66 #$" !!"!! # !>vxbWRPU`r{o`UMD91AEGJLLKJLLKLKIFC44:Ncpld`iquz|xqikx|o^M?CBFIG?:?@AACCCCDEHIHGA@A@>?@@>ADGIKKLMFM^r߰z[uPOuܧ~jt% )&/' %3:Hv͡vx̽~lTI<0(# #!!(0686344=Sxxlsxo]TUYRF9.*),1>DDB91*'+28831472.,-0332259=BHNTbdfhloqquuuwsj`UFGDHE-.WU,:I1:y4*8Uh~wS;;J\^NA5%!%$6Y{}º¾Ѷ÷Ŵ\6+.($"! %,3:==:;>>;96324665779;==<;<81,'$#"  "! " %:Z}|||xpjdaXM=/()--(%$"!!""$&(-120,"  !24/ !"! !"!! !&"!;ouaVSTZg{sf\UPC1# %0?LT]ZVSOLKJ;32B[khaXaju~}vndfrkRBFBC<))'(+048:=@ABAA@???@AABCCABEHIIGE=>ADB@>=ABCDDDCDOJQ^fyʈdf{S[ʹE'.&**'?gx~ijòmVD81,)((&% "31/15766?Lb{zl\MC;87>DGGC;400574//5<72..25536:AIOX_eprrstuvuxvspj`UL^WF>5,`\1=N8!9{6+7VoW8;J\_R;1'""*Ff{yǿȵĦî[5+/(%#" ! $,39==:;>?<96324665668:====<82*&#"! ! "  )Ez|uy|xm]KA4/'%-(''(((*,00134." '61( ! ""! $)$$:fqaYZ]dr~h^USN>&'8BJLNORSUUG92;RddaW]j|vj`akz^LQIH8 +&267:>;>@A@@A?@@AAABCC@CHJJHEC<@CGEB>;AA@@@@@AMNW_`bgikNjȺT$"#&%$*+Gsȹ}fSD5)"!$(,+'# ")9559?<0'4H`s|ysnv~yne^YVXVPKFECDAA<4,.4;85014555:@IS\fmt{||||}|{ztlf^WPKfU=6/+ib3=SC.':{:/9VqU6=82)$!!!  1f|urvyteO6% #$$')+-./-,,,(  + +-5-   !##! %*&&8]rf_`gmvt\TPOH8  $3BNV\^L?7>Qagg_al~wl`]dvq\TMUC&5;::;:<>@@AA@A@ABBBCCADJKIFCC@CFHFB>;;<;=?BEHHOT[^[p|X|SN~ۡ3' "%# &(7KUkȹʾeH82/+##&*+' %*26@HI?/!$;ViwxhYRQRURNF=73488877689:?FOZcmsz~~|vncZTQOOR=.6;SjzO7ALUYV=6;93Ecr|sr{ʽ׻Ų{{•Z4,1+(&%###$!!$,2:>=;;??=96313564357:<=>>>91)#  "K|~|}|suun\D)   "!   #.1#  +! "#$#  %+& )3Olud^_jwkTNLLG6,8DI?:9BSbjogbfuun`]_op[]un7)5;:647:<>@AABBAAABBCCCGKKHDABDFHHGC?<668:?EJNJNKQ^\eǓ`]ҫpHd¾ؓH"" &$)37,)Qƺ~jG2+.0..+)'$!!*03:AB>=@FKZhszph_YRPOMKF?;:?BA>=?CDLT^ekot{|}~}ytri`TLHIKP:%#KX-)b^/9PG:;Pnq?9;L\vmG9GMOUW@8@?7Jgomnqtx±{z–Z3+2,*'&$%%$!! %,1:==;;?@=96212454357:<=>>?:1)"  ! 6d~|qiqp_dvutqgU=#  )0+   "!#$%$  &+&!",-A[u~j_^etwcOLLMH:$ +#008DTakql`]gtvpm`[[i}~pylOP@3-.5<;4-78;>@BBCAAAAABCCDHLKGB@AGIIIGCA>668:>ELNOOCG\__vկwUiݜTJ~кb#  $#/3Eνa^²zz~~v[F-!#(+*0,$(29>B>2+9\z~fUHKR[^XKA>FKJECFKHNV^cgkmpruutoie[SIB@CGN4!Xk7+a].:QE;C^ek>;:FQhbB;KOLRVD9A?6Khiaipmmt˼~|`7'/-*'%###$%"""!!*4:?B?=??<763213554468:<>?>8/'$"!!#" !.DWX_YRezpqw~r`PZx~vsm`L5 + .2&  !!!"#$&%! " $+5)2Jl}vjg^k|yfXNMMKE;/+  + (6638J]\Y[hx}rh]YZgwüwxiN8/5:76;8:>ADFFFDBCCBACCFHJGC??AGIFB;88:;=AEGHIIGNNKQ`gejˢ_XDŽKh޲tx: !!%$(##$&Iְ{}l|ʸ|tqptux}cSQ<0(&#%  + !.6;>;9BUmtk[ORVUPQUXXTNJJLKSZ]_deceejmf[TU?D?:<>=K898MS64_X9764212455568:<>@@91)%" ""#0<>GDCY~|vnlortti_Zgwvsl\E/ #-.   ""!"##$%$  "$#&+0%*?]mkddmxraTKJKKHA96 +#%!'5>DThy{qgc\V_qbF45>CDG:<>ACEFGDBBA@@BCGHIFA??AHHE@9789@BEGIIHHGLMKO\a_Y–[ewPіocV  !$&'!$0[nӺ~˘νsjcbm|βO092)#$! &/36:@K`xraTKJR^gea]YVSRPW\[\]_[ZSQUXSJC==8=JH;9LK@FE,0]Y9=ZqaSD@CFHIJBFLKNRJI2("6LHK_njelv{μ´_8)2-*'%#"#%%##$""*28=?><>>;975322446579<=?@A<2*&"!!#&/15Lr~wsrqrrruyospgS;& (.(   #$##"#$%%$!$&)**$'7O`ddi{|kZNEDGHHFBB*+066/!   "'/;JWaipiafy|z{^F?CFB>?BCHGFB@>?ACB?;88:=EFHIJJIIGLMINVXVU۾ZreT߷t]eԁ0 !!%#$ :rݹ{geæê̹fPNWs۪N02'  +(/379OYi~|fOGSbnha^^\VQUY[YXYYVWMDEJG7(+6OmrM3DKA?=+6f\;:H<=_xaSJC=FLDB?=:<;9;96322336679;=>@C=4,&"  '+0CdzyxyxoljaL1 + $.-  #$&&%#$$%%%" "&)*))*6J\envveUK?>?CEEEF8.1;=>=41(.FY_ccgt~Ũ{gWNJ@3CA@ACEHIC@?=<>BDHFC@?>@A::889=ADFGHIJJJJHLMJMRRO^Ția^đ]cܥT##'!"!=̛nWVԩwqԸvWHYuŪgQ[td"67*  '18>FNpygVSWa^\[\YTNSWXURTTPDB=><=:8432336578:<=?A<3,&!%).=581% +)5FVfmruxy۶pXQMEGFDDEFHIC@><=?BDFDA?>>>@8757;@DFDEFGIJKLKLLKLONMYrշƯksϟjIkx-# !" !!!$9ǃ`_ڳѱmR8*-Eģ662)  $-6@N^j|m\NMOUYWSOMKOMHDEEBAGB4/:BCpǝoRB/@B@:(6db:2;12Qf[QE718BBG40<95322344589:<>?;2+% $*3G_q}wfcYC)" +  -0#  !)**)&&'''&$   $-45;FVgx~m]PF@>?ACEEF:27?<<>9:6, 0D^kd\^iͭ~SJMNIGFFGHIHB@?>>@CEEB@>>?>=;:9:=BCCCDEGHIKLMMKKKMLLR^иʛksʀOACB@=964223324678:<<80)$  &-:Sjztg`Q9"%   +"-,  + #$)**)''()'&# "-8?IUbszj[LC?>?@CEEE;27>::@?<;5+'#  ,EUM;?RªċRCGGKIHHIIHGA@@@ABDEC@??@@=;<;;>BDCCFFGFGHILQOKKLLLORPzβώWidB>ݖ1 + +'#! #$ !:~Ӯv[A5+5ux2$*'#! .+/6DVnuU-*/12/+)+.,&$(+++;D_qYGA?8;7&={j9+721CMlkH8F=AlqO:99D^p^RM>&)71*%(;Vlx½ſ~zxƿ϶Y4(4*(%####$###%# %,7:532222134679;:6/)$ $'1Ia}|wuttuxqkoy|unf[H/)&!  # "$,)"$&()('%&())&#  %1>LYeqvgWI@<;=@BCCBA7:?:;BB@A<520% +$/4HYO9?XmϹЙaNOJKJIJIIHFBABCDEEFC@>?A@=9:9;@FHGFJIIHGIHKQNJJKLMPTEgǮΈPYzR?Li-$! >ɱeH. +!#OΔ9$*,% %327@Qg}~tkea^\\XX[agkluvw{xU.%#$&% #$!#+15>Xit˕jXCHC;B>&9xo<,:65CHpqG6K=>x]G>6>[scWYL),=0(/Kg|ÿurwŽϷ[8+1+(&%%%%%(#"$!!.9@HG?9;?<>>;64574322334562,(&#!$ #7Rm{}mdVPOOLJ?JYemvukcaVE+&$(+& + + + %)$(-!   $####%&&('$   %%%+5DXiz{n_QG===@DCDA@=>@??@ADBA@><5.( #%'$ 1=FDO`e\Zdi~þsf`SLIFEDCCBA@ACFHGFDB<;;<<<9=AEGGFEFFFFFFFGJLKJJOQSKGYƶΒJSZ~VSnp.!! #!>׾|Y8! + (yY.+,% #*/1DYiwzheS8"$&''(9Tozg;1&$+( $)-003@Uk̮ynffKCMME9=>+?{x=3>;:6=pj;-H;9qlXC.3PgWV]R3/<7/%#7TturwɾǾж[9-2+('%%%%%(""$!!-8>EFA==?>><954451101223561,(&#!!2Hbrysmnu{}||uru|yqjcbXD( ##',)  "')$ ),!"!!#"""##$&((%   %')2?Oeuwj\OD<;=@CCB@?>@AA@ACEFEDC@;4/,.1431-*"(7?>8?BEFGFFFFFFFFFFJLKKLOQSOMWyŲȹΚ\KMjfNb@"#& =٬x{gM5! +   NٸvF.)  "*03>,>wyB7=84,1kb6+H>8asp]>,2EZPSUF/-:@@2$!+Dd½üuorȾyzz{|}}ȿз\:.4+('%%%%%(""#!"+59?CCBAA@=864432..//123572-(&# #/=Re||vqlhdg[E&  &-.'#$'(&%"" %%%&&&&&&''"#)(   $$#$##""#$$&'&$#'-:M^tsfXNB<:>@AA@ACEFEEEDA<8469<<<;952.,0897--4CMR[h_gpllkeYUWSJLIGEEB@?>?@DGJJHC@;9:=>ABCDEFFGGFFFFFFFFKJKLLNORTXXeο˧x]UTNCso(&&!! <թhTHGB/     )\̵͜g/#$&.45Lc|v]C8:AMNPTW\][VWVUVZbifbXI>>JVovyefϭuU[J7KO:79CXN>=>+:psE<=94&)i^7.JF8L]tb9/6?PKSH5'&7OV@+!3Yzÿ¹xmn}phdc_ZSSSTVWXYȿз\:/4,)'&%&%%'#"#!")-/5=DGHG@;41121/,,-.124683-(&#$*2BWq}zwpkgfgenaH% + !,-)&)+,*)&&%%()*+*)&&%%#  &*% +$&'&&$$"""$#&%%""'1E\p{naTI@:9;>AA@>=?ABA@ACECBBBCB?<89;<<>>>>=;>@;-"1Majlq{tfTcоto_RMOSSRLIHGFC@><=?BFJIHB>98:?ACGFEDEFGHGGGGGGGGJHIKKJJNT^ZX~ȱvSB9w5$%""" :ڲwJL<    A߾2 )&08>:)+g\?9LL<:Cn`53>?KIQ=% #;bmN--Pt{mk¼ȿ{rf\RLIGD?;<<<>?ABȿ϶\:/5,)(&&&&&&#""! #'$%*4?GKK@:2/00.,--./135783,'%" !#&(6Je}zvtohc`bffsgM'  ',(%(+,))('''&&'(('&%$!!%(*!  &'(('$$"""$#&$# "%,;Towi\PF=788;???=;@BCBAACEBA@@BCA@??>>?@@??>?ED6 AkiGQԵtlg[W\_]ZZMKJJHC@<::<@DHHFA=::JA"   8ҕ@&+""1?Ks|tG:4Ec}||ukcbit{{~~ysptz~rcZOJKZn}|~{p|r)&CA41HhV:5<.3[]KF>A?*,^ZMCFLA02^W38EDKFK5$@l~T. "+Ffȶynoƿ{}Ƽwj_TG?;9862/../01344ȿ͵[9.4-*(&&&&&&$"!""$% $,6?EH>:510/----.0134672*%#! !!"#.@Yp}{qppoooruqlfa_bgjukO(  #(%$&,-++)('(%$$%&%$%##((&  +$'('&'$$#""#"%##"'.:MftfYMB;567:>>>;:ACDCAACEDBAACDDC@@@@??>=@=>EC0 KwuWdʟoSKNR`npcZWNLMLID?;::;=BEDDA?=>@CEFGFEDEFGHHHHHHHHHGCCHHBAFPYZYpÿį~SEjM"  "7|̙eRC110'  !  #gު^9,$$"4L`~jRE=BQh~}vidXOS^mz~yy~wg<>0/IqX51?44SXQK==;72///-.../12471($" ! " +9NevztommkjhgimrurngbbgmqvmP)  '%%(+-++))()&%#"! !"#$)$  "&((&%%%#"""#"$"!#-ERRW^lϹ_QZrb! #6{ÚhDA32*'' #"! +$NVL.BtR,#' &;[urWF?Wew|tfZPSct~wtz~yٛ[#'>803JyZ2/C=8OVXQ=CD)*3IbO.=N;67429BCB5+(&6GW;/;<01EsĮru}|ru|snh^VMHB=;9768;=AEHKMPW]beoz{kbXNFA=98632332022110000ƽ˲Y8,3-*('''''%$# "$%"('%##(/5>??;4003--,--/126/'" !  *5H]ozysnnnnlklptuuuqjefjquumR* &&'++-+*(((''$!%&)"  "$&('%$#$$#"!""$!!%4Iax{qbTF=61358<==:9CEEDBBDFGD@?@AB@ACDFFFCCC:687.'(Jp{úɩzz{}pz}pe^TSSROIB<:88:>??=AAADFGFDCCDEEFGGHHHHHHHHIBBKJ@>DUOS`iwζaPD;vf"!#(&#7zśkLCA%)$ #'%" _ԣg-"*"$,Ceq[PUguxv_F94041-))+/25+$!  !08Eg~}{z{xyzqfafp{~nR0&-031.+((*$%%!!!$"  (&%$$$$$#! !##%""0D`ysaZSA74-36:=<;;65;8,*3]Ĵsnz{rkaXSUTKB@7:>?>=@CCDCCCEFFBBCEFHIJKIGDB@??>:9;:9>FQKN^ghȽ}d>+\l$!"$" %*.q׷lOD=4,' "%%!"##%&Hs+)#!""!5NV?16L~a78A?GDOkVCFA<1"=^S-/ILI=/,2;?A85/$ ,.57/(1@c»wʵ{kc_aeglqxξwnWPHB?=:4-*)'%$$$'()*+-/1789;>CHL[eyɻvh\TB=85221241.+*+-/0/,*)+-.ɳY9.1+))()*))&$" !"%%*-1/)%$&+.49<;9742.++-036,#   +0?c}{sjfkt~tW4 (.220,*'('&%!#%!!#(&&$$$%%#!!"$$%!)@Rm}m[UP?62,158;:;;>DDCBBABBBBBBBCDDA@DKKD@?=649737El|~vwf]WXTIA=8:>@??@ADDEEEFFFGHIJJKKKIGC>:642-*+./08@IFIX_`¬yT>=CRv¾nm{ne^[TJ@<9;>AA?@@EFHIIIHFGGFEB?<:640+'#!"&/9@@DQVUzô~c~#  !$):~ɫZL>86630.+(+-/-(! $'% 0}H" !".98>av]WWbwlF&/9_}{xxm}ձU@TbTC=Pf?>B8DSbXJ>1),4HiĽϻgJ³ypnrzʷjXH:/)'')+,+'$"!  "#$%&+,/0233358@Ob{mWKE?:51-,+**+,*(&&'*+****))))ɿŰV7.2,*))****'%# "$$',240)! #',0355544334569-! #!.Uvywuuy~bC& +%-320.+/)&$$#&*& !')*((&&&&%""!#%%##  .D[luXLLJ9/-)-/2579=B@BAAABBCFFEEEFFFBADIF>6588=EGEITpxbWZnxqjaWMD>;:=@AA@?CEHJKKJHEDA<6/(%"! '08ABAAABFJKJJHDA>82+%!"!! !"""! !%,3;CLLJiA !#'*#!CƧgPLHD?9411012452/*'$$(-,#7yſФP" + -;KkyhPCZzfC"#7Jvhh˧|[HOX\QARyeAEKA" AQ;"%,.+&&(,4CS^a^YJNTWQD1"(Kólz»оyaF632,%!##"  !!  $(*++*)'(.8Jc{˳z`H@?;4/+('('(()&'%%%&(*.00/-)%"ɿ¬}S6.3-****+++(&# !#$+06:95.*%$#$&),/147::9878," !"Gk~~~|yvronrv|qY?& !'*-.++(('$!&*(!$&)*(&&%%%#$#%&&#" !.KixygG?DD4)'"#(-25:=C?AABCDFGHHGFFFFFD?>?>;;=E?66!####&&)6;4*#.=IOJ<,"?vùmȲ[G2(),("   !! $&&& !'0?=>CF>8:EONLBEDMWN??A;=EKLMS|xh_YPD>:9=BCDCCBB@?><5310/0233321111285683-+.2;DNNJ_˂8 + #&)--%Iŝzg_]YSPLHA:3/-.----..-+'# "$##2Pv1! 1kqhϼjH9*%(+("!!!""#!!"(.9Laϸ|[D6892,++((()('(,.0113342334320/zQ5.4-++***+,)&$! !"$')-145310-($""$&.27<><865+# %>az~wqnkigb^]^bgpxkM+  +"$)++'##&&)'  "" "'(&$$###%%&')'#"0Eds^?8@A0$!#,38;>BABCDEGIJHGFEEEEE=:<@BAAE@>>HY`XN942CP@/2<>B@:9H^gslg]JB=<@DFFGEA><976:743358;887778::98:;92/23;BKMHZսʽ߫P #%),+" Jήka^^[SONKE>71--+*)+.041,$#%$,Pq{vuz~~~|vqmvH4 + +%4~عnaK?KmlNVf^FEHCB08_ZPG7AP6" G@!)*  #/>FKMOQLC4>b}lrͿįmRE8,%$#!""!"##!#$%"!%*3F[w˲qT>133-*,,+*))*),2468:;>><;:96431źwR9.0+))**+,-.($$# "&''*+-.//-+('&''+.2688773+""* #-<\}}xsnjgb_\ZZajr}eA'  &(*)%!'1* !  #$$$$&'***)($  !5Rqq[=<=9-# "*3;?ABDFFHHJIJIIFECDDD<=@ACA>;73Djvf^F--CH>72>@@915CWlv{{vo]PEADILLHEA>;:9::;;<=>=>;;98764579:996424:<@BAWɶѾw+ "  "$%&&$ FʩɹtljcYTRRRLE=81/,''*06=80(!" "%$7Tx}ui`^fm{<  +":=;\wlL=Mf]B 'ܷjPMAD[e[RaPSKLUA+1QWX;$BQU2.0 "$#'E^looteE7HWYCGYvŻι{[F:4-($!'(&&()*('%(((''$"" %&##&,=PjǬfM@41.**,..,(%&-498;EOTTRPJC?><;:ĹvQ9.0+()**+,--)$%$!!%$%&')+,./-+((((((*/256663,"!)"%-9Ww}|xtokif^]\]aju|pU?$    $*1) ! !$&&&&')+,+*'# '>\z}iT:8:5+#$-7<@??DFGHIIIHIHFEDDDDCA@DGD<563GpoaN43FG=85:=>9329G`r~zmaUOOPNKIFDB@???BBBBBBA@@?>==<;<==<;:8968;:=>>UM !!##$%$Hɴ yr}ϳzxm_ZVTPIB=8861-,,15971+%!#! ##*B_ymbZVUqöҤR'%" +-=2,ZqR:=\{dI&شhUPEJ^eWKRR`QEMA3,BU_=*[zwK )=,  "%1IarxsmbbYI==EKOXar{ɻƼǯnM851-(!#'(((),-.--&'()(&#"$! ##! "'9Kc¨~^H=2.+)(*-,)%$&/7@BIUclnoe`VNHB=:ĺtP9.1+()**+,-,)%'%"#(%%$&'*+-/.,*)**)'(,/13434-" %!(/8Rt{yurnljg``bejs~~n`C* +$*.$   !"%')(()*,-,)%  1Khp[H7463*"&0:?@>>DFFGGGFFHGFEDDDCC?>BGG>63/CluhU<9GC:77;>@>;::AWnui`YURLGCB@BBCBBGGFFEDCCEDCCBBBBBA>;;;<;9;9;>?WĽn + !!!"'MРqkktܻwlteayh_ZSME@<:;962.-/011.*'"",?`~i_Xmظq93'  $1<*#V|Y82KtÿoT+! ,Աj\VPU`eXGBOeRBNG929[qE4yϾA+?1" + +cwwV?+(.3-!"-Ved\ajzüľbC-.-+&$&())*-0234+,,,+'$#'$!!!#" # %4C\yѽxWC;1/*&'(+)($"'08CJTdtznbVL@;ĺrN7.1,)*++,-.,*'(&#%+)(')*./121/---.-**,-.0115-" *28Rv}yuqnmkfgkns{|_F' + + + %((! "%()((()***)% '=DEEFFEDCFFEDDDCB?=>?CECB5/<\zjRJM@458AABCEFCDSg{{tle]VME==?ACDDDFFFEDCCBEEEDCCBBDA=:;<@A;;7:>AZǼ׷U   # R˹klh_^qҠsdtbrxibXNE@=;9962-)))**(&#)>Xv}y~oZT\bs|Q2",,2&#T~iC0?hƿy`>08Ѳm_]_a`aYK8LePBTN=<4a~J9Ѩ^&",*% ,GVkouq`G0  *%@TWP_z±Ľѽ_@+)()#!$())+.26;?A?=:3.)%#%# "%%#!%3AXuϻuS?71.+%%'**'$$(3=GUevyiVF=ĺpL7.1,)*++,-.+*()&#%,.../1457642111110//...006.")27Or~ysponknrw}xgM4"  #))! + !#&('%%%%&''# + + .G`umN7+,.20)"%1=CB?=BCDDDCBBDDDDDCCB?@A>:;BJD88Kgse\D58=DBACJONNR^mzqfZMD><>ABDDFDEDDDDDDGGFECBA@DA=;,YwI9ke3+,0SsbO3 #*+! 6ALqϺ_C/%$&! #%)+.18>FNSVXSH>5/+(&"  $%# #(4BXtλtR;50.*$$(**(&&-8CTh|zdOCŻnJ6-1,*+,,-./++))%!$,134689::76422344421/./127/" + '06MnzuqoonszvZ>+ -.("&'&$###$%%#  + 6Pixa<& $(//&&1ABBCBBABCCDDCB@@DF>42=IJ=5@]}~lJ68?C@?BJPSSRU_uyjYK@><;<>?@BEFEEEEEEFEEECBABEC@=?CIKID869;Tڰ{7  !WU]xXwʏcnͧ|yxiYH;3:985/*&'-+'$!!!#!,Gez~yqkny~`F@X_m9# ),/Fw\@*;hƾüz\<SѱodalfMNYR6Z^36DPA)NgPGXqvy]111-H\d]?+ + &--# )4Gr˷|_E2$!"#(*.8>IS`jpsoh[NA93/*'" !! $)5AVqμtR940-)#%)++)()0=I[vƾqXJŻmI6-1,*+,,-./+,*)$"*2369::::75322234410/.1468/"  $1:Tt|wttuw}|bL8'%! '2, !&'%##"$%&%!   &B[myyV/",+"#*3;?=97=>?@AAA@@ABCCBA@?BD=539CH;6Hm|U==AA??CKQSQONYosdUKFC@?>?ACGFFEDCBB@@AAABBDDC><?@AAA?@ABCBA@;=><87:@F=>[dIFH@@CFLPPNIIVmvkbWSOLJKLLHFEDA>=;889<=@ACA@;889<DIPJ1:DZd=)3GXny\CL?-(,%$/1,$4OE+1Ad̵|`G5& &+16R^n}hTD7+(%" #'""&.8Kg̻uR94/-&"&.)*((+3AOjɷfU¹hH6./*)+-,,++&(&&&%$%+/49:7300.-./0230/0158::>0" "%# + -Ns~}iZUPG9)$0/" +$#%%&&%%$'''$  @\ft|f?  ,/ !/27::8549=@@??@ABBBBBBBA=:878:>CG?>lĶxVCA<@EJKMKIGGMZmxf`YSNMMMIGDB?=;:42259<<>?9332,+,)(&,06YȻ̀3  #[«~\fϡ_s͘}saTC<7420-+))&'&"$5Laqy{}niksuz}rx|^:M^lp`O=;1 #-1*"5VN+2BSwϹ`D/% %)0;RkhM8'"!%$ !%%!&.6GbͷuW?1((%!%/-+()+/=Or̼lSºfG6-0*)+-,,++)*((&%$#*.378620..-.0134211369;:=0" #$#$ + /Orujb\RG;0,&'+/)  + ##$$$$#$&'%$  Eblzo\< *- "/36998549=?@??@ABBBBBBB@:99::;CFHHGEBBHUh{rjaXQNLIHGGGEB=:532356683.%!""!)2:_̺v- "[}Wdϛ]uғ~ug\LF?:62.+))'%!,?Xkw|{v}nI9EbӹӼb71/'21'"!(*  "Ky÷g5!`lVC3.119AA@EQcfL?LMZI=apL5-6F]mqj`UI6! &+*;\Q &/?NpϺbF0$!&*2=ZvpV@-%#$" %%" %-4F`̶vX?1'&$ &/-*'()/=Nr;nUĺdF6.0+*,--,,,,-*)'$"!'+15640---..023554457:<;=0"#)$" +6Usxg^XPKGFFEA?:-  !$($###$$$##%&#!  + + Kjup[J5 ')#037:97448<>?>>?@AAAAAAA@88;==;9:DQh¹kK:6;>ACDEDA>?DO`rwl`UOJHGHKLKFA<75112214/-#'2>gϿ̭d# ! +]}QaϓYyЈx~xng[SJA;50,*)'!#*;Ndsy{|}|~|oofF49lüʻnD6,!//*%#'&+Ozl>,xԳ~`M<54-.1,36NrvM7GSgVFZdTG),;UeikpgP2  >^P! ,=Ig¿ϽcG1$#'+3@d{^G2*&%!$%" %,2D_̷uX>1&'$%.,)'()/>>=>@@@@@@@@?89:;;:9:?WxźdH70<>ACCCBA<=@JXjzvj^VPLIKMNMIEA;621111356/#  *5Boǽ˜P! ^|L]ȉX~Åw~{yvqh`TKA91,++(  -;O]jqpnoqsy~~^`w]@2VźL5)&"($#&&)BakD;թվʬjVE=<33640.HuzK1FZq^HGNVV.)2HTXctqV2  + + ;VJ$  *:B^ĿļѿeH1$%(+5Ck˸dL7.'%%%# $+0B]ͷvX>/&&"#,+'$&(-;Ln®pWĹ\A4.0-,.0//..+,)'# $(,/10.,,--/0133422369;:;.! "$"#:Xs{fRJGILPSWY]\]_WJ?;99:<>><93.(&'('&%%%&%&%&$#  +   %Uy|wfK1%% #!%146776448;=>==>?@@@@@@@?::9988:>;X÷^E5-@@BCDECB;;?GSbsvkc\XRQOOMKJG?:543557:>:1&!#%)*(/8EsĽ巁<! ]|L[ڼ^ɰ|yzzzxqi_TI?5.++("&9K^difa_`bjr{[^orroZ:AhǗN2.-4'##"$'#5Un|nit·q[V\epwfMTẼ̘uư{ʹpPB=<47BD7/@hpI3G`yfM;=]d9/0=FM^v}fD% +  4F?( )6:ShI2&!')+5ElҽhO:1*&$$# #)/A[͸xZ>/%%!"+(&"$&,9KlïqXźW=2-0,+-...--)*'%#!$'*/0/.,,--.//00/-.03788:.! + "')7Qpu_PGJJNQSTTT[XY]]\]`YXVWVTPLC?8/(%%%&%&&&'&'#!   + &X{|wohU=# #&235765447;=>==>?????????;9766896677:?FE>74203415;Gvh-! +Z{NYʨ|dñ~zwxzzyune\PE91+)'" +?Q`a_[WY\^ajzb_~yedl}rF0@`N\أT68;@+ "  7[ofF,)@^tT6,4EYjd]vˊ͍`mŹ~͚yyqJ@@>46FM@6:TbK:H`~nZ=7bh8/,3=J^sxiP5!.61% *53Iн¹ĬkK3&!$()*5EkӿhQ<2,(!#%#"(/?Y͹wYLfs]OKJMMORQQNNTQTY[\]b^\Z[[ZVRJF@81+)'%%&&&'&&"   'Y}tndZF1"$&334655446:===<=????????>976568=B;]aE940@ACDEDED>>@DL[lzyrmfc]XTSRQJC<86758CIGB@A?97868>K{۞P!! XzPVxj|wtvwvutphaVJ=3*'# +>MWVTUZ_ef`dnyeYwvpioL*2_}~Ѥ[=757#!%'&;^mzvi^UZtż|d_bjwkrrjՊVfDžІ_rgLGKF30?HA;6BUQDEZ~thC1XU*&#&1CT`_WK<- +%/,#%+2,CĻ¹ŭlL4&  !%)(*4DgiQ:3-*#"$##(.>X~ιxZ=.$# )%"!"(7Gi¯qYʾzN8/+.&&()*)('''&%%%$%$&*.00/.,../.-+*%%&(-1238,! !*7DO]wnYKGJONNQSRRPPNNS[[UPOSQQRSRQNHE?<:50+#$$%&%%$"   'Y}znf[N;*&%!'2344554469;<:;<=>>>????>76678:=B>^wQ8243@BCCBBBA<=?BIWhvyuolgb\XUROF>86656@EB=>BB;796:?M~֖AVzRTun}|zvstutqtqle\OB8,)# *;IMNNU_jooedchr|tp~_Nntyor~I'0Xĸ]@4.0#*16;9. Ffnzrsp}ld׏WfЋuNmVNMSJ0&2;?>59PWJARzvoC&F:&8FKGEA>:.  '3* " '+0(=ƱoM4'"!  "%(&(3DfªkS92.+$"$"#'.;U{ιyZ<,$# '# ")8Ij®pXvM731(()+/00/--*)))'$!"%'*-/01--,/0/*%""#'-2457+ !,9FRbq{jXOQUTOKIHGILPQRUYZXVUSTVXVSSUXUPKHFA;5+&! ##$  +   .[}{h[N=3! +#5")-4201244367787999;<>??=:767758<=;7^~gG515:DGIF@=;<:<>?CM_nxxvod[TPLJG@9668?=;>CEC?==99@NͻԿ- U|Sdsp||~xyxwsponokie^QC70!%*%5JIPMNXfqsqb`]^am~ɫyvkaydHEYd\bpmT<4AKu<6<:Qh{xat{w˿dqӶaU׋VVðrWk@FjVC9&..;;94@]`FIZdV5 + +"*+('*3:6( + +0<'%&)*(">o˷qL3)$  !$&#%3EeȲpQ;1)(%"!##!"(,6Owλ{]@- ! '"&.BK[iz}|wmcXOKIGC@=>=><:WOF>044:873:PS>*"   %4=;8(03,"%9,!,(#8dԱu}ϻtN4'"  ""$3DcηtR:/('%!!##!!'+5Nuм|\>0'$ )% $-5.& '0+.41///00/233434447789:9885646:><6?HMOYky{qaJ8.09B>ACB@;7458;?CIR\jt~|zrf\QHBDHHIJKGA@BEHG>DEDESzDVn_]ceq}}yvtrqnmjjfd_\XRKB<71+0BNRQQPRUZ^]WRY[blkgnzzɭ}c^OuxkN4*.323^|WQ]tDBg{ppü̾~p~ȷxjxiJ0>LOME93/87:87BA. %0577/&+.+)&(?1'1,)6VϝaGWκмuM2%   !$2BaηsS;/'&$!!"$""',6Nvн|\<1)% !)%!#*9KnŴtYūhC119==<>?@><940--.,)& "$(*-./--,*'&%%''(,/220-& + %09@FLLLNOMHFpteZUTMNNLGC@@CBBDFGIKJLMNMMNOTSPONLKJHIIIJLOQPMHC;1'! +   9l}~qh\C52+! +.+.30.-///.233333447899::9::8337=;5><75=M]c]RC5-19A;>>><95358:>BGMTan||{zytm\NCBDEILFC=;<@DEAFFGJYi0Zïp]\eis||~{wsrpoljkifd^ZULC=757:?HRTOPNQVZZXSPRU`liagsqkɭzxdXLu0781-4:=55GZ\[eqԡnWy~ƿùǿ|ļ̱xz{hD3/EFSYSG5)35>?86. $&"$! $.3598),73(##!'90*2125HեgDPƲϻtK0# %1B^̶sS<0('$""%$"!&+6Otν|^;1)$ "'" !")7Joȶw^|\A117:77:;=;970.*+,*(% !#'),...0/.*'&''(*-021/,& ! "(.8@DGHIUSPNOONNdxgYQLNTRPMFA>??BBCDGHHIGILLKJKLOLJIIHFDHIJJIKNQOOOME:-# + +  + +  +7i}yvysjS:32&%,-+.1/,,.///2333344466788::;;9438=81/&#/>INH>6/17>:;:99854689@EJNGIEIQc٭Q  dϻhW[kpv|{~|yuqolkhhkkhc]ZRI>867BTTNQRORPSXYWVTTSWcplcgv}gd|γ{n|se}WPs!(09=>;5:ANhĀTz}Ǿ½|cLPv}nXUYC5IWVO2!,0?E90%%'  " %18@6+&"!%-38+&1<+%*-753)&#$&& "$%*8Inʴxa|gXE8/,././3689872/+++)%#!$'*,-..010,(&&)*+.120.,&"!  "'-//28=MPSSPKGESTRLJLT]no\PMKILORMHCABDFEFFFFFEFCCCBBCFIGDA@AB@>CGJKHFFIEINQLA3(  +  +  1a~xrosvnP663(-,+//-*,.//0354343344556789::976;>4*.:C@=83259<;888986888:>AEIO_q||yz}}m]TI?AJDB@BDINQIGBK]pʖ:jÌgYbtwx|~~}|{xtplkifcehjgc\YQG>98;QpnUPRPUTWZXUTVYWZfuqgm~q`Zo‡otjrYV{.-2@E>51&0;XمJvýocd~sP.:u|u< 6KRQ1%*=G<0(,,+'!  !!"$(!(05J7)-7:3-4KA *9?*!!%5/.eĴڼнtK0$ $0>[|̸wX>2*(%$&)%#!&+7Ot̹dC7,(*,,& !%)+-:LoɰubRVWRQOJAB91-*&##&(-2588752.-,)%"!$'),--+/10+&##)*+/120.,'" +(4=?FJKLNTZQTVVSNKJQUUMDGWhvZKFJNLJJHC>=?CEGIIIHFDCBEEB@?BGKEB??AC@?1#!-9=><:5248?<768:;9:978;?BFIYkvy{~}|z}{lbQB@JB@??@BFJFA>Le~. kōncm}|y|~}~~{zxvrmjgec_bgjgc[WPG>:<@[YOQQZX\\YTTW\VYetpfliZScГwwrTMr)%,>D910?=:TQz{˽þÿĻuXJSwU&7x}wpn_H8-EQV7! %:G=3.)*'!#'''(*(*&"$%[{̺zZ?4*('%'*%#!&+7PtʹgI;.*/30)!$)./1>NoȬqb"(%%')%"'.379:6201/+)!!"%)++*,-+(" "%&(,023221"!!  .=IOR\]`ehjgdTPJFJRTQUQRSJIb{dQIHJJNPKC<649CIIGGGFEEDCCDCA@@ADED?88=AB@@?AED>;<=CGHNO@,    %Nwwty}}vld`dzuN.)! )* %*-,+)**-/2343311000365568:<9679820! .8;><:732355459<=;8899:;=?BAQeqw|~}|v}~qdVLGBD;6;>Niɹ{%^đ|yxwx|}}}}~~|zwtrngdb_`ff^WWTPI@89J\y~xdQMQVSVWVTU[aa\_klgr_SGVϰxSLf*'09301/3>@Srpu_jǿ¿iSMTt`59hz|`D0+$%'0P^@' "+:B=0('"0220,,04+)),.*!2K_R5)8LfpX-%.6*#/Ej̶æU6# '" ,:Vxϼ{\A4*(&$&*&#"&*5NsξkO?0,1772+,.125CXy§hV"&.43+&.35;85330,)"!"%),,*,,*& !%'*./0///% +><:8631135457;=;9::::::;>?K[gqx~~{t{~p^NDFF>9?BFQRJ?C]Ūl_ռ~~}||}~{{~~||zxtqnjdaa^^c`XSTTQJ?7;PeyugTIILNSW[\Z\`fhbcnplw{WK=ElԬ{sWZ`-(.60,.(19:Jꯄuwu{ȾmWOSm¼c8;fsf?((55.1N]C-&3:4(!  ".01/+,3:FC>97=FM6.1;96E_cR0#&+&!(7P}ħX6'#)% #/===>?<6-.45=WqpZIGLPNUY\[WVX]^[_lrr~e\OPk᷍odemxU0)+2..-&,54AuƔoeĻ~n{t]SSjļa8%*FF5/FTH5 *.( $.495.,2:ILH<02AP7-(2@IT_M9&+$#'$%3EaŨY:,!&*'$$$&1@^~ϻz[@3+)'$'+*%!$'0Iműz\L=8:?@=:8789?Pfȴz[J%%$" &,,$!(.05556751-'&%'+.//++*(%#""&'(*+,+)(# /DR]aegbXLDCINMFA@BHKJJOVXTKXanuiYRKFB?<;@HHC>=<:@CEDA>@CGHGGFDCB@?=<;;;=80)(/8<>:7564002:???GNJ>   2Xx}yvsnhcachmh\I3 +3 "'+***+-.022210/-,,-....27;:621244413326=?<321346535568:<<;<<;:875687<<@KNMCBh‚>  Wkz~~~{wv{~|yvtqlhea\XXY[YUQOQTPH<5@^{v]NNUWWY[ZUOLNQPQYkuy~xwضyhuxjI1()..12()33@s՝_U{y]QRkƼX2;bizh@.5IQ7)4CJA%"$ !''%##13)('&(++&!$'-EkɶbSC=>BECB?<<=EXnоlRA&%%% %)-)!#$#!#&)--//047640**'(,001++++++*)'()*+,++("/?P\cmlf`XQKFFJOMGBBFJKLNYcfbUZeywi\RKECCC@<42=LWYURJCEIKJEBACHIHGFECC??=<;:;;4,$%-6;=83010-.3<>>;7...3898545789;;<=<<9864577-&%)*15+&47Ev`LuUHNlčT,8agpcB49FX:$%2LM.% -9:2' 2AQP?* ')&$&,4IOHLTF+"]pG"/.6BJR^n{ѼʮdE0&!#%##&&&%&&(6HlűqR:0(('%'*+' !$'-Dhνj[KCCFHHFDA@BJ`vïy^D7++--("!"*066-&$&**+---.,**+/3331+*'(+/10+*+-./.-(()*+,,,*  0I^ikhlf]VONMMOPPMHEFHHIMYm|j`dwvfbcdaXOGCFB=851--@WlxyqaRDGLLJGGHHIHGFEDB@?==;::90)"#+4895/,,--06?A=8=IJE*  + +  )Eh|ytpjgcb_]YVL6 %-)  %((*+-.//1221/-,++*+--.27:6532001216:<>?:2,,.3:<:7346788:;<<:97544558BP^iquz}{vsrrstwy|~}{zxy{~~u[?KI?5755>HJCFi]"  Hw}xy}}yutx{|}|ytqplfc_^ZXTWWVXZVQJGCACQl}fVNKNQMORSTYbixx~~|z{}u}}pfggcjypucD9.''%#,1(&6:GwVt¾įmJ?Lm̓T+8dlpfB27Ha>$(NR4* 2AE=/&,9GG8((3@ISQF?GI=+!=|O!(AWuzn^`sѶmO5)#%(&&)''()'->QulO7-&&&$&(*& !%'-EhȰxjXMIILJIGDCEOezeM9.99:93+().2882,''-047752.)((*-..-)(%&(,..*)),./-*((()*,,-.#-Ibpqicb^VPKJKJKIGEDEFJBENeyjh|½t|ûzsiZMIHIJJGD@A:1,+/18Rls\EGKMMJHHIJHHFECB@?>><;:9.("$+2662,)*+-4;BC=69FJF3! +  +   "<`||yslfeee_UG>2(&(! +#'()+-0001110.,+**()-/037954331///07=@A@7/.-05<>:51356669;;;:97554459@KXbksvx|~zvsrppprux{|}~~}|yvuwy|}cE@A:3767?ILKNe٬G Pwztv{~~|yvuyz{zyvrplhd`^]ZXVWVUZ]WKB@AEN_v~eYVUW[U[aehnty|wxsoqrszxldjldYU[d`dhij[?:72/(&,$)7:Drxpr˲lF=OrɒU,=kuqtB*6PkA$$LK6* !-9>:/'!%*)%$'+3//5<@>@SGAIG::Em~A,LaxtdS?AYƽyY<.$$'(+-,,,-,4G]~˸cF4+#$%#$')%  "%'.DgӾ|hZQNMMJGEFGQg}ƽjR@1)FEDB:0,-0131-)&'04:?@=83,('(**)(&$""%),,+)'),,)'''&')*,,1&-Catwmc[^ZWQMIFF@=99<@EH=BPm|pp¼rp¯iN@?DE@I?658;;82,&&+5>Jh|_HHKLMIECHHGFFEDCAA@><;:8-'"$,2540+')+/6>EE>57CIF9& +   4Xy{zzzqhddfe_N:+ && + #'(),.0111120/-++*'*.0247934551/-.-5=@@?5,1106<=820265558;<;:97655359?HR[gptux|~{wtspooortwx{}}|xutvyy~jK7852787?MSTW\cdbh`TLD<8:eҠ8   /Xs{vx~}~~|ywvwxxwvtqpjfb_\[YXXYUV\_UF<!!H?3' !!$).,% 3?FGIJB03HTQKTlk.BjE68;:==UƨdB2&$'*.312234;PfĮ|[?/&"#$"!$&# $&(1GhʵvfZTQOKIHJLUh|sYD4)$SPKF@:501010.+(')0;CD@:6-+('%&&'$"!!#'*,(" $%$#&'&%%&(**++( !9M`nogd`[VTPLGECA<>BEEFIL:ATsķv{vWEB:42-*++$).0:AFY~|gPNMJFCBCEDEFGGD@CC?<=?<60" '+25-((()*06?=<<>ACF5 +  +!!;\twqqka\XPC0"  -& #'*,-/1121220/-,*),-./24675321111247:;;730112334556789:::;;<;:8632/37:>EMYemooqty|{{zwtstrrqsstrvy~||{{{yyv{|{t\)4F1+1'/IWbQ,$Fע^' !#!  6L\iz}yyzzzyzzxpmkklmlkgd`][Z\]]`_ZXWNC;;DRbn}vor~||{xtrttpnnmlkkjc`^]^__`X`da\\\ZX\WVa\H@KH@94.'!#/.CiܺſǿhORqvW,D{xPVgy@4<=@<6, %1342(!',..06<9;<=>>>>I9#  + + $+Iewyqlke_XN=&   %0' #'*,,/0111110.-,)),./13567410//13578::851.11233455899:;;<=;<;97422/158<@FPdjllot{~|zyyxvuuvstrsrtquy~}|{{{yxty{xzzo^#8M>31%*@TgO &( SܕJ!#!  +BPU^qxw|}zvuvwwwwwwoljjiigfa`\[Z[\^]a`[VQJB@DMZdmx}tmouxtpmic_^_`ikotx|vtqpqpnkkputstoiqvokpjVNJHE@<6.) +)?a{tŵ~cKPufX*:pseltwB6;MXRB6)43, $%(&  +  ..7::BLIA.-@0)14*"!&**' .&2sͼpYKC??@DDEHJOZlİwbN<,%'# #'*.;Qp¶rcTHDB><=CKRVdlhdc[SI@5,('%%uspke^WQB:0*))*+///1355420,(%$$&+*)'()))%!!'-.13221113238(-AXgpkcWNMQTGGIIHFCAGJLKFA=>EUkw`grwp\eu{X0 + &2?GSZVNKCAVm^NKJHFEDFFECDFGEDAA>;=@<6+$230.'"(.0.07?9:;;;::9B7&  + +% ':Qdqx~~zy{{uojd^WI;& )2& + "&)+,/0111221/.-+*,.02456530.-/258999862.,011245569999:;;=;<:7520/0157;>BG\beimqw{xyxvuvvuwwuutuuuvy|}|{{{{yxvxwtstnc) 3JG>5'(7LgO "83 #a׃5!""! *6DJKRdu}{trsvvtrssttttsoljhgfc`\[ZZY[\^`_]XTOE?;FUainv{{tlghihfeb`\ZYYZ^afkpsuvkigedb^[\_bdgjf^jne_b]NI@CEFFD?;06/A6)$!+$7˼sbVKFEGEFHJMZhtaOA5, !$$"%*-2AIOU\djmouvvtrstvxyvwuwww}|{{{||{zywsonpoj6$$7B?4(!+AcN + /* /ub!"! ##(=>AACJYfquuqmlospqqrppopnlhfdb_]WWXXY[\]d]WTRJA:5EZjruxwumijlllkhhffec`aRSQNJEA>2/.-,)%"!""$*0/),3-(14015:AHNPPQNQAEX҅UQ`ymõlf{ü}uuafJFh}\xc?@`d\u_N@6::DL;! (10) ',6<6)  +2M;8KXZcuklzzfbbQ6970-.,# %$9ƶ|jXKFGDEIKOXdwj`QD81+&%""  '-15>VvŻv`J8.-++,/49<@B@=:623.'#!!! vwtrnga[QH?;;>><6435760,#!"(+,,+*+*)(#!&))*-333347:;3%+EXacZTRTSLFEABBCCBAAFKMOLJIJMdytrnY_gkh]n~pP/%.!226:@EHJKDPQJ>7Hs~bRKHHHFGGIDA@@BCDC?@<:?<==CIS]ehksutrppsvxxwwwyy{~z{|}yronomhD+)=?3)(=cR !$$(GΕL!"! $$  "7JD?;=CNXdlqpjhlqpqpomllmkhfca^[YUUVWY[]^c[SPKD=<>Pfu}{tja[\[XVUMLJIIFA?873,$  +  (/7=CGMQDJX~]DIn~}vK@j˼ȼzûdYb[rWOdr\qL=IGSxmQ[YSUXD' -3, %6:2'$8# 0A-2Uhhvud\Q@;<:5,% + #9yŵyaOHFCDHKMS\emuxvqkgKC:1)'%$%"  (.28E]}ƼnV@.$$&&&(+.0010.-+**&#""#""rssqohc]UMEEHIHE>:66882-%! %*010.-+)()# #%##&-/357887.""6Qab^WOLPOHBAA@@@AAABBGJKJJKNUkyporl[`_]\SewjbVE@>2/9?;=?EJMOPHPOH>8Jvx_RIGGGGGIJECAABDDC>><:<@>7($63($")+/5::6432.++-/2662) + + "$%),$ "&+048@@BE=*  '%!#(*+./00033210/.../2566643234579:9852/-,+//12457797644579;:52/-++/039==9769=GS_gmqttqopsuwwvxy{|}~}|}~}uttpg_N5'>A3/(+8\N &(0`ܶt; !   .@ID=87:CIXaimmmnnqqpokjiigda]]ZVTTTVWZ[]^^ZUOC::BS_ovxvk^J@863+''  + +    +  !&)42=JinUG@Trv_ZJ\c>/OueS_|iWmdgsdXmQOGItz}rf^H*")1, +(75-(\I(;gyolxpbaVA34211,&! 5qfRJC@BEFEIOSVWXTNIE:5.($#%'"! )/49Ofz_I6' !"""#$'#!!!"!!!!###oppomhb]TMHILOMGE>87883.)&" !$(-4540.+)&)"!!&*169952) $=Xfc[UKEIJFAA@A?>>?@ADHKKKKNR_t~widci\_WU\\pve^ZWSF;FNCDBABEGHJLOIB>>Us_SFEFGGHIKGDBBCEEE=>;:<@>9'';7)# (*09@>4---+*+-/2==8-  "#"&,/" ")$  &# #(*+./0001110/---./2576544346789:9741.-,,./024678:865468:;952.+++,-28<<75//09GVbipttqnnquwvvxz|~~~}}xyyqbVN9"(=>101,/MC'"7tҥO#  " &6DA?;6227?QXajpronqqqnkjghc`][ZWTQTUVXZ[]^XXYO<19I_gmlh_O>)  + +  + +"/5IϑQ/):T}dR7Jƻȶ{bVgɾzbj}z]YunkZS³xtnlnhtl\P=&#++# #;>62la8  +=cnaRN[bQ?EA8@=4,($ -fƲgTK?<<@@==@EDA@<50.0+&"!$!)06;XnжiO>/$! !"!!oppqpld]PKGGIMNMGB=;;;:835640-.19:62.)%" "!!+259;2'-J`d_ZQPLGBABFAA@?=<>BCGKKKMSYkyypjbY^kaYMMgtsvcWPNLSTIGB<=FNNKFFD@>CE=5' #%(++)'& %(  #)*+.//////..-...12357877113689:::73/,++,//01345576557766630,**,-1/06::41'$%/;6.('-4CO^kpolijkllkgfecec]UQPQRTWZ[[ZYYVRG5,=XsjSDF;&  + +   +  +   @eQ*0+*X~c>CvƺƳƾ¿~n^{d[aj~mg^MM5FO+#1%#+(&( MZ3>o\,5TW@' "7?;;3-)&! (MDZdMA86434455542/+&"!"%*7F^|©tT=0& uttsrme^MHCBBDDC?965576558:9768;<;60*%!&/266.# (9OYXWYSRME<;BH@AA?==>ACGKKKLRZpz~xqkcYcpdYKMn~odVSQT[\TIA?>CILIDCCAAAMkxeWLGGIHEDHJGEBABCA@?>=>CD;.&1-"!*35774/($#'+-+,05=>>7+ + "$(*,,,- + +$'! #)++../////..-../1245787722479:::962.,+++//0124557556787552/+)*,-0/15:92-#! )6CR`hmnmmmpqnoruvy|uqpj[OR=8C39<522*! L۳\#! "-?EB862-'$',;GUbhjjkklkifdaaaa_ZSOPRRTWZ[YWVPMIE:4E]j`G61$    +    + + + +  #:BeV'0."?_{bM_ǽº¾ƷweWVekZ=*4!81# :N8Hj^= %??*%8?<@5+  >xνtYE9/-,**+--.-,)'$!!&+2AQjƵ`C1'zyxwtng_PHB=;<;841/.133258:<==?B><5.'"$-244-%(5ISOHKRSUQD63>I?@A@?>?ACGKKKKSYt|~|wsndYkvj]MRxoXZiffxsZLGDDFGFCA=>=@GYxtcTLGFHGEEGIGDB@BBA?==<8?B:-$""+^ˋ@ +"$ '8GF@210,%!!$/9DOY`fknomkhdb`]\XTONOQRTXYYVSPJDAB?>KZh`J80  +  +  +  + + +  +$Jp6(%#'1T`Ngľżºn\Jd|`C2Ahxf:!(B@) *<, 66M^]M:)  $#),.663;,  + +6uzbJ8/&%#"#$$&'%$#"""!"(.7J^{ʷhH1% |zxwtpiaWPF>;9640....0113479:;<=75.'! ",342.*1@PRF<>FPTSF62:E?@BA@@@ADGKLJLRZx{xvqg^pugX^sczqUSKHGCA?B::;@Leq`SJFEFFEEGIEB@@AB?><<;JZahkklllkloqruy}~vk`ZXE*';>FH>)%&=se/%!!0AJE:../,'"$*08AN\ehkmolhc`ZWSOLNPSTWXYWSNKIB?ACGMSecXPI6$##%!   +     # (>Vq؟X+ 1_vVMʿ¿ʺykcZoO5ch="4gze?%&5IE8( @dN )CSWQD/ ,5>810)$+ +  "IĬycO<-&" !! !! !##%,4AWlͿmT5$ "#%(()xwvtroic]TH?96300/0//01222455411('" ",10-+,:EOLA88:HNRK>57<>ACDBABBCGJKJLRZz~{xskev|orw}ǸiSJGJF?<@9:;BTqsaTKFDDDFGIID@>??A>=;;:;@?4& %'#!'19@3# ',,+(&)17:=25661'  +  "%$$$$(*-,! !#!!! #&+,,....-,,,-/01234566766579;;9761/,)(()*../0133444479964,*(')+/1579<82'#$+5?PXbgjkklikmoprvyz|}pb_b<  8BKK>''-S;͑A!"#(9EH>1+,.-("!)8ITU\eklib_XTOMMPRSVVXWTOJGG@;@IOQTcgdedP<=<6*"''&&&$  + +   + ""!6sx#%!1PtzfOõ¿|iho~U2=RwK6qG"0c{kK0*67;?79." Mk" +5FIB6%  ('+6?@6185.0& " + :mǶ}bN?1&!!!#)*/7BRiȷ_D)!#%&((*++wurrqnhc[QD;4/,),./0//0244220-(& &-0*#$+=FKF?:75AGLMF?85>ADEDCCBBEIJKLS[~|tpn{ĨӹQFGNK@78:<>G^~wdULFDBCFGIHB@=<>?>=::::>=2##)*%%-458+&/20-'#'09=@02240)   +!#  "%(+.3-%))  "$! "%(+,,...--,,,-/0233456676667:;;853/-*('')*-./0123433468730*(&&(+/269::4,##'.6ENXagiknhkmmmoruxz~wgac25DKG8""+8pڲm!#!"#3>C@6*%'**'!$1NZ]\lmjon\GKJ@0!(1886876,,,+*)&% + +  +  %*Gp׌5-ObdaǺpq[nrQPba1Kqq=4iY6;e~t`JBFA5-%/,)& +Jo.'-."1CF<496.;[cWL7# +"))$  )[κ~dK;2)#  !#'+/7CP`xtO7! #%'()))**xvsqplgaUK>4,($!$&*++-.1530/-(  %&',053('?GJFA?=:>@DLNG;0=@EFEDDC@CHIKMU\}tswȽ׸hTKMI=45:>AMh{gXNEBABFGIGA><<>>=;899:=<0!$+,')33,)$!%/540*$!'2<>>11131+# +  #$ !#&(*-30('/2.!  '($!!! $'*+--...-,,+,-/1233456675557:;:730-+(&&&()--.012333345640,('%%(,136785/&"$'-4>JU\afjilmlklnpuy|{i[T( 1CH:,(&0$GʋH "# $.>C>7,$ #%$"1:FQXZZXQOKLOQRPSQOKGC@@>86?RafdxrhhhXIOQK<+#19@?==<<67631.+*$"  + + !" +/0:f=)5QlønIV\US>`}`AAa^1[h@CchSPbk_RE?@>635ACEE2@{`0!"  + /BL>'-'&ItX4$!*,*'$ GiP8,($ "  # ""%+139EScsɷ~bC-  "&(*-02456zxtqnic]OE8-'" "&&(+/2/-,*$",2458:;7(&>HLFAAB@;;>IQN?/>AEFECCC@BGIJNU]tu}¹։iTLE;7;?BGUqjZPFCBCFHGE?=:;<=<;8889=;.#+-(,52% &/5740)#")6>>;22001-%    $%&$$%&&%&,,) !.682" + +++%##""%(+,,-...-++*,,/12334566755579;961/,*(&%&()--./1233333553.)'&%%(,145651*! !"&&0:9ASdig~p^Y\OFOXVI6#'.7>:5321;;952-*(%! + ),)-=> +  =kúW,7=O[LyhKGkW4LwiSdqpifaWRI7% !,6>:@B<,$BLMA;AGF;43>LQF9??@AABBAFDEIHGP\x|ǽƥŰmWQH97@IKShýlZNECCCHLHA:;::;:;:4::69<0&((*15*!1:92+("$)3<@<8**,153)!  + #&#'%#%&&$#)./* )5:5-# + $.*!"##"%(+,..--,,++*+,-/011134333688:;;9620*(&$$&(**+,.0234444420-,#"""&).0554/'!$$8KTX\cilidchmpty|~vnogL/ 1L@0#(&,;5#$Qۧ=#"!6GI;.! #$$$  !&+044?ADJE>CADB<8;:869EV[X`msUX\STJVWL8" &0:@=8654<:641-($   ! (32):\r0 =X}ƼNHMDpRIIgdWaqziQRYPBBFMH>;@=EJLVenr~}Q1;@7<=-.0 $,,+7Y{bB%/320-&-GjξmC1" !#&$#%)+*)('(-5>EHUat_D(  + $')-049BLV^gqxwusrni_WI>3,)**'-,-.0234::862.+)((((''%$'),-2:>;?BF@/$$,GNN@8?EF>605@HE?CCA@?>>>BBEHGGOZ|{þþo}hXSL?9;UW`vǿl]SGFDCFIG?<;:9987738969;0$)+..$'5<90'$$&,5>@94)(*/42*#  + $'$'%$%%%#")-1-% (5<;2%   +%-)"## "$(+,..-,,,+++,,./012234434689:;;951/)'%$$')+++-.01333321/,*("!!#&*/1332,%".?LS[_aabcegghmuz|qhh^> 6TA&&/-3?1%1aҿ0""!&;D@0& %''%  *335?>:@;<=;854509IXVOTaw[`c[ZOUUL9% '320259?JYecIE2)3:)#,-! + -");=F]ngG( #-6985/:Wȵx^8+""$'%%(-/00/13:AMW^myҽ{V;$ + + $(-2:>BKUcp{wvtrng^UJC>767:::9899:::==<;730-,+)))((')-..1786?CGFHQ^þ{rf^_cmƻxg[TJGD@CGE>==;97433155478. #,-*& (1:=6,"&)08?>60(&).32+% + + &(%'$#$%%##)-11+" + + (5AB8% (+'#$" "$(+-..-,,,++,-./0122245444799::9740.'&%$%(+-+,-.0123210.+(%$ !#'+0222/*" #);N^id\\dkmkotzzxx|yia_O. :[?+348A3/J}ʕS"!"!  1@A7'!!')'%   -0.342586+)1:FXd_V\j}t_elfeXRSM<'(2;CA=;;9430-(#  "##   +460.387@Xs0XM)5B^{waZ`cink`XW[IHRTX_^mrnfi}ladc_SD5+39$$ -=MVRB1"/%.KTajhR3 ###/556:NpªfL/& $')***.47:;@EKR[gtθrL2"   $*3>LTYdp~wutqng\RKFC@==@D>>=<;:9;::972/*(!!!#$&'''+,+,/.-3;B?3()0KNJ?8;?AC:-&'2@IFDA><<=>A@BEFJWgùrm´vzöm_UOLGB?AEC<>=:841/-,02144+ &-*# #'7:<80&%*2;@>4.)'(,10*$  +")*''%##%%$$'*/.*#$(!(6FK<%  $)*%%'! "$'+-/.----,,../012233455457:9:9852.,%%$%'),.,,-.012221/,)%#! !$(,1321/( " + +'D]oh`^clqruz~}xuywnd\R?#  :[8#.67/#""'('&!  + !-&'/,#&4FNYa_\ernj[grno`RRN?)'-8??;998430-)# + "&)*%!  +   -874576Jjҁ(4;V¿T ,3@GQduwwmbZSHA?:9K^gwy_?137HM;8331%+*)8Ss|V*%0'1K`v|jK-!&"),,5Hkμ~Y?,'""',/026=>@@FBBCEM]oʼh_ݿ~gXPKJGB>ADA;=;951.+*,.1144,$%((#)6C@:1)"$*4=A>4/+('*..(# + !%+-))&##$%$$'*-,)" "%#(7JP@% + + (+)%&(" !!"$'+-..---,++001123334566568::9863/,*%%%&(+-/,--.011232/+($"! "%)-1331.(  2I]bdefgjkkry|~{tlh`UC- 7R2$,38>FKDNQ"   $6>8*$&! %&'&" + $$%"0EIFCDFKXbef\isrscTSO@(#*5>=9865662/,'   "(-/0)!   '499:6531.,++**()''$#"##"&(-38;;<;:5-('%"/8AC8..5DCB?;877=:2,*/5<@@?>?@ABFB@ADM^rĻî}nӹ{eXOJHFA>@D@;:8640,)(-.2575/*'$ -=E>4*# "%,6=@<4/*&%(-.)$ +  +#%)-.*+(%##$#"'+,+&! ""(8NS?%  )-)$&)"""""%(,.//..--,,222333445677679;:9851-*)%%&')+-.--.//01131.*'$"" !#&*-0132.%*AReqpjghmqw}}qkf_UF/ $5C2&1:>AHRWLZŌ8 # '451'$)""&''%" + +  &:POF:35>KSch`jsrr`URN@&",8@?;8668630.+'$!  !*042+" +#,37ANXbg|`.6+ '/Fie8'$19C>6AJE?EVq^sF*!'+3:',ORI=;B]ܽi( )Ab_8#'(.1,.O}DZnM6#)4?EOU^hr}ða=' +  1@Sh|oqqrog]SLE>:861,%$$$$$$&%$"#%*.1369657972/./03>??@@@A@?==?CKZkź~uow~xdXOJDC@?AE@96642/,*),-05630-%!&2>>8/'"!!#)/8>>:1.&#"&,/,(  !&(,0/+-)&"#""!%'('# !"(;RS>% *-*#%(#$#""%(,///..--,,33334445578777:<;9740,)'%&'()+,---.//0111/,(%#""!"$'+-/020+# ,AXinmmowxy~vic]P>/ 03554CMLKS[^Ufߡd#" ,4.*##)"$))(&# + + +    + 4GQMA86>KS^e]fooo[SOK>#$.8AA;864752/..,+('" +%-492,")$  %-5>IXdhX[hfZI13+ !#%1BZyhM@699614<@@9@Utf<$%$ ;VX6)Kbt~~¾o*!:XtpO/ !$,+",0.;iÿªgH1!(6FS]mt~ξ_:(  $6Lgnnqqoi_ULB;885/($#$#$%%&('&(,4??@A@@?98:?CHVexxu}u~sbVNIA@@>AD@94421.-**))-130-+%$,07>83,&#""#-3:>=7/,# $,0/,  $)+.1/+/*&###"!!#$#"+=TT>% (,*$$("%#""%(,//...--,,34444455678878:<;973/+('&''(*+,,-..//0010.*'$""!"#%(+-//2/*! + /BR_gqwxxx}~~qc]U@* 94/9BS]XTX]]\pνڇH& "/6(% "'"(,-+($  +     '5HJE<7#"&0.+,25Lѿ`C-"#1BWhs̼]9)  (6QrppoppkaXNC8554,%)(*+-/1298678998>>@AA=60%#!&!3TLC><:6446873.'#9?A=:::988;AENavugr|~yxzo`UMHFB??><84320-*)((..0472' .<:72432/,)(*&")/7>B=:2$ ,  '-2>NY``^Q@577,%$  &"(-9\xnfUD60++.37:9=AFMYgr˿ÿżs@('#8N4 /vzP"5kg &39/" %$&-,.+Bxѿ]>(".AXoͽ`<' + +*=]~tsqrpkaXK@3.-+$ #%')++*+.-,*))*+*("  1YPIB?=:647874-'#6;>:89:9866>GQ_mûwqo|tqrrxzl_TMHFA>>=:64210.+*((,/2781%%5BC:0$!"%'%'+49>>:2($ #),-,  ''(*,-/0.,+(&&&&'%!3JUM9% ),*$ "%%$$'+.000/.../045566777888899:;973/,)('()+,..//../1331.,+)'$#! #%),/0//1,#    ?Zkr{~|wlb^ZPD-=D>CGKMKHHJIk`&$"  -67  "#%&'&#!!!  +EF3*,08?CKWbkmlZNF>**/:ACAB@=<=<:73.,,'"!!"%',18@FJFD;.! # !+1=JQQKF<1.1."!!&!$)1SyoeSC1,)(+/256:>BFNW^ƾm9##'@U4 +,nh==7.%!!$(+,, $&''')+-.0-,+*('(((&"  8OWK8& ()(# !%%%%(+.000//./0145566777888999::862.+)(()*,-.////./1330.+*(&$#"!$&*-/0...)  + (C]o|~zyrmcZSI:. !FD>AINKNYʡF *#""051 !##$"! "#!!"%''%#$$!!5:0*$#.15*+.:CGIKLJLLLID=85/-*)-034469=CIORONH<-"   %)-7AD?5,+)-.' %!"$!%(HyzocQA,**)()-25:L\UOIEA?<:;;95.($.36669:797:DKKJLoþuuvv||qdcflnkhecinv~~upg^VNIEB>:8763201/.,,,,,17960)$#(1;@=4,  $&,29;=:3+# "$(*,,   '*''')+,-/,,+*)***+)# %?WZJ8) !'(&#! &&&')+/010///012455667778999:999640-*)))*+-.///////1220-*)'%###"%'+.//-,+& + +*Farz{tnkfb\UI8# ';=BDDDEE?+./;EKOTVWWXYWRLFC=;;<@FGIHHHIKNQSQQMB5(  + &,4:76:??:3,*,1- "#)! !##+,.,(&(-77:;Vs®gD."&6TyvsqruuplbZQLNTYZZZXWVUSTONKIEA9530,+,-,,-,0:<88:@@>;>=;93-(%-2669=:6325@HQ]j~¸rp{vhX\aceffgorwyxsmhliaZSLFB@;654310/0/-,,--.26640+)),0452.*%"&.69::60)"! #%')+,""(*'&'(*+,-+,+**+++-)% +*I`]I7,#  $(&$$#%&'(+-/0110001244556677789:::98853/+)()*,-./000/0//122/-)(%#"###'(-00/,*(# + +   +F^gsyumeacZOC3 /ADFSVHLdk`e{M"$   !  )$ #% !"#! '5110/)-71)/*,-00101:AF@,"22=HOS[__^_``]ZVTQQRUXZZYZXVSPOPQPPMD9+ '0-08@EJMJFA=;:75/33,'&%--  #6[wj[H;111.)%(+54247;@CEGF?7:HZ¾tbbjf7 ) ,Fhn0+#3) # ''B¨eG/ %6IeŲkH3%)<_urpruxvuje`_cltxwvsoljgfa`_^^\XVOKIGIJJIJFKTVNKMSTRMMTXXSPMJEBBA@<:50,)(+279=?93--0>Qh|yzqs|}|wsomotz}zridifaZRKD?=94210..//..,-..01353/($$',.,)'&(" $(09;;93,&! !$&&(*-& $'(&&'(*++,,,+*))**,)%  /Qh`G7/(')%$&$%&()+.00110112354556677789:;;98641-)(()+-./00000000122/,('$""#$$(*.10/*)&"    (=JZhookhZJ8( ,=OV[in_`qqfnҋ.!  !"!#  ;NI #993''20')(*+,,+-/8DLG0!%34?JPT]aa`abbcba`dcfgge`\`]YUQPNOMMKF<620/.--./..-.//00353,!&,*% '#"&*-3:>=91)"!%&&'*-*&#"%'''&''(**++,++)((((*'!  1Ul_E6/*$**&$(%  %&)*,.00111123464556677789;;;97630,('(*+./001100100121/,(&#!!"%%)+021/)(%! +  )8IUYWS=0  $7ESY]ila_kkfwԷڴi" !!""  + + +  +   +?[Z0 !/45*#++$&&(+++*,1>LVO5$&36AKOT\`abaabceefiijkh`UNUSOLKJKKMNMJB7,#!@PLID@=8784+$  +263,$)+41").6WwrhVC850,+*,/031127::9B<:?FKIE38CUlxEAT^qe&" )-..* !-JĿŬgI1"" #*G`ȶpM9*! 1Hmwuqrwz{zutpqv~|yxzwuuwxwunlijlmllskjrqjiosrh][``ZLKKHFCDF@=70.-/1)07<@?5+,2Hlĺ~z{{x|wpkpnhaXPF@<61-.-+*,--,-./0/0354) +#-,$#!$+/1540*().488=:8;<<84.06:<>?@DFDDJ\quC&[y~f+!-')--%"";jƫgH1"#!!$-KdʸrO;+! 0Ijquxwwzywumiptw~~}}}zxqonmnnppqqrqqommvuog_[YYQLHDA@@CEB>:65553.7A<62,*4Yznq{ôxtuyx~rkivtnh_TF;>80,,,' +$(42&&171/2/ '-'"#&*/6FLQTX\cb_^`dgjha\WK;24,(0* '+*94CKLIB=AN[r:0jb4 '$+.)$"!'#OǿƩhH,  %4NmʷyV:##2D`ptxxy}|zphdjorz}zwrponnoprpqqrqolmrsng`\ZXQMGC@>?AEDCA>;635/6<9:7-.:du[N]fyľoszzusnos{~qkjprrnf]SL43310/*'"#*42(#'4890# +,""$'*06GLORW[^]\\]`cebZRLB613N[gmkhfemypXC:92,'.ANIC:77942/....//-05;<92-023/$ $)%0FptbQB3)&)-16:<=?@><74485501<@=AGIHD>?DLWj{> 0s`4!',.'! #! "+eŴĩiH, &5Rqʶ{W;#"/?Yzouyz}{mc_glpx}{xusrrqsstppoonnlmoplhc^[XQMIDA>>@DFHHE?6231587@>..DnVAHWhǿ}||qjpw~~rkhwvpg]RJD==>;4-(((*-0/-+*+9@5#%*-)%%(+17<@;4)"%,+*'&%##++)(&'),,-+'(,,'  *\h]G.+$%*)$#&'%&('*-../13445677775555679999987532/-+)()*,/..../010121/-*)$#"#&(((*,.02.)$   +   )61/8FNRW^fox}7%'% "#!!!  ! )31"   +&+%065202,&!$(*##" '--Mr4$-098?GLNQUYWWYYZ[\\YRIB;536EP^gie``m|w^H>IC<3)%1AMHD<9:<8.+)(&'')+/12037;83..'*.)*5[vo\I:-&"(3?MZbibd_P=204C=<<9>GGACCCB@>@DTkE*r`8#$*+$ "" ",>~ѵŪjJ.'6Sp˷|X<$#-;Okqvz|}~{mb^fnqy~}{xxvuututuqolihhimnpmje_ZUNKHEB@ABEGJJHC;713657CA,.TymOI\cx|wz}|pgb{tj`XOE=FB?;4,*,51)$)5:9'0;?1*+*&!&&')-39;=6/$  "))(&&&%$+)'$$')-**(%'+*% + 'Yf^H/+# %*)$#&'%%&(*-///23456688776556689:99986432.-+***,-/////0110110/,*)%$#$')*)*,.01-(#  +     .611>MUX[cinsv{ʁ2 $&$"" !"! *1-      (**.3/'&*-&!%*(# #%&)07Si0#+/@<=?;-*'$##%&')*+,17>>601* ".14:Qf}fRA2&"17DVkxXB>@A?:8DNayyL *l}b?+#&$"#&&#1YϮy}¿ǫlK/'5Ni͸}Z>% ! $+5EYkvsy||||yka]dnry~~~|{yyxwwwvuutoicbehmsrokf`XQJGFFDCEFFGIJJGB?03:88DA,4nnWNMWnzphckfcgli^RA9432-0630(%,8<94).>:$#()&$ !#&&'*/6:981+  !  ''&&'())*'$##'*,()%#&*'! + +&Yg`I0+! + '**%#&'%$&(+.//024456788876666789:99976420-,,++,-.00//0122010/-,*)&%$%(*+*,-/00,&!     + +426DQXZ\ceehjmsxzڪf("$" ! !#! ")+$ + + + + +  + !*')0,#&3/(#&(%#$(-)(6Icv]5+)-DBGLNMKMPPRTWWVSQJJHGIHDC72./15AMX\add\PHKMKE96>GHDA;9;=;840.*+++&&&(-/033;J_f]TQVH944533CSi{_K;89;:73:CQbw|iG,!4m{{dF2 ''%&&$$% >ЭqddxȮmL1%2Haκ~[?' ""##(.9FQY`innje_[Y[]`tyzyy|{xi]Xbkqx~||||{|{{yyxwxvuusojfeimqwupkf`XOGFFFEEFGGHIJJIGE35;=:BD7?bT]TJqyxwvtrnk^]coz{rfOHFC8,+3-6@EB:0+C/(32" ,)'$! !"%&+29:62,&  %&''(*,-(&##&(*,+)%#&)%  + + "WfaJ0*  !),*%#%'$$%(+.//03455679988666678:::9975310,,,,-./011001123110.,+*)(&%'),,,./00/*$   + )23:HRUVX]^]\]afll~ԊG#!#! !#"! '+'   +  +  "' )"%10%(70)%'%!")'-*)A^zjO;/)1CFJNONLKOPRTUVTPOFIKNQTNH4' .=CKSSL?5GMQJ>:>BCA=54698;:62/-+++((),.-.3KisXB73-(0@\~sVG;0*,'/:BB9/(.Km{_UNLJCA=3>95566334:CO[rsK.%(:89;WvkD-(A=7-##-)&  !""%+4;;2,%  $&'(*,/0*'$%)-,,.-(&),% +  + Se`K2," $+,+%#%'$#%)+.0003456779988766779:;:997520/,,,-./002111123411/-,+*))'&'*,-,0110/)! +   #,39BNSSSW`^][Y\aecxݿe4)%"$" "#"!#,.$  + +  "  *!49+'1.)%' !.(!#))1Qv\B6*.=?EJOPONNQPQSSSQNLHLOSZ^ZRH9,(# *;FQTMA61=GMJ?9:7>C>CRZtW[r_Juji˯y~wumqvmd_biprtl`TQ^uO;<9EDHvYRvq]|khs۵jp}}{qe`bfgghaZX_ly{l`F5?C4'+$"##'4:94-*  ''(+/131-**-01.,-/,*+)!   B_aO:* !*,.)&&))$#%+-////246789:::988888888;:9752/.--/012214333345621/,+*****+,./00121.*#!!  +   #/7BJU_`]^btz~|zɻ~/:6$$$$#"! !!  !!!0-     %7>0)2/!&'&(00*(7ZxmH>ELOMLPTUPONMLMLMLPV\^\UOKMJF=3)#$&'&%$#$3;A@:67:ADF?987662.-/12362134Af|S434$ .0+$#*-/+;OcsĽ`L>;:4/0.146:;=?A/.FSJCIi[?;<;9766643724:<>Ohc0&6Nq{rfL.&(,00++ /hо~bX`kʷwR5"$+4?KTY\WWSRPOONGFCA>;99999:?HT\pԾcE-%! nrsrtz|ylc^iw}zvvutttrrqpqqrqstsoonoqtvw{{}}pha_^_\WMIGGGIJJIGGEC@><837;GFNxPUwumlqwtՖU`y~zrhcbcb_lg_\aly_:359.(+&"$%&-7:7/'# !!"'(),122/,*),//-++-*'&% +>Z^N;,  ),-)&&))%#&+-///0356789:::988888888::8641/.//1233334333445621/,+**+*++-./00121-)"!"!  +   + + %1:FKU]`^_cs|ž]&40%$%%&%$"!""!  ! .*  + +     &1A5#(#%)""$!%%$/Nr{Y:!#2:=ABIMLKQUVONMLLMNPWXZ^`_[YTTSMD7,%#!$%5:>;5246ACD=8675&,4:;:771558E_|WA.)'"!"-0.($'),,:K]o~ý{SB53312513566678:5;LOB8:ZR3AF=;878764822:<=I]tXLYs~zoV6$*/-'($<{йkcbs̹zS7""+3:=?97533211/,,+)('')('(,2:AUlԿcG-%!lqttv{|zofdoz|wtqqpponnnnnoonnmmllmnptvx}vg]WY^a^WRKFEIKLIGFDB@<984-3Ek~{xsgrs\pNZvx}|{}xrlhfed`]khc`eq}ϧd\S3'32(*)%" "%)-2883+! !!#%')-110,+**,-.,*..,'&" :SXK;.$ "*-,(%&)($$&,-/000357789::::88888888997520.-123455543444555622/-+*++++,-.001120,("!#"" +  + + + (9ENOSXZYX\qyz9".*.$&')('%##"!  !!!!!!"+&  +    "+<3"%)$#++$!+*+=fd=+'4<@D?FKJJPTVNMLLLORT[ZXY[]^]\][WNC:4#'/29;950.14?@@:66769<>>:7681/6Xw=41,"!##!),("!#'0;HZmſiC4**,/4:;;;<:9784;DKIA?B6JTAG@?<:::975832:==CNs~{dC )10*$'Mn_fqλ}V9" "$%&"! $(:QrdG/&!kquuv{|zqlku{{vrnnnmmlmlllmllllkllloquxz{~~uj\SMT]c`YQJCDIMNIIFDA>:766+1?<:866;AB<7:CI-,ok^IA@=;::;879229>==B[zsT1  +,)".]ĩnonr¾ν}W:#  + ,B`ӿfI/'  gntvvz{ysppx|ytqnmmmmmmmkklmnnoonmmprux{y}~{wtl^QIHP]d`XNF@AINOMLHEA=:765*0:F>Nm=Fyznd_FWҾ}zi_ZYZ\_aa^^^cgkpyvrݜSIKAWr`."!'+-*%%*06541,% !!""%)-,)&,,--,*))-.+#   +$3DMD4*$ +&-,+(%%*)&&(-/121257789:;;;:99999999975310//2345554434567665320-,++,,-./012311.*%!#""  + +  +   6M]cZPMLKIJZj{~yph`Z\n׹D(!'/),)*+,,*('&%$###%%'&$###$$$"!# +  + +  +  " $=E>5)6-%/-&/*>VgsoT8().7>>??BGJGEHKKJKKNRVXZXVRPNLIG==;:7533;@B>636<<70*).36798559;:9769<<97EifGK^9-+-&(11)"!(19F[uþfD,),,-03587875301@A8,&-36(2`{xFJA<:;;<:87327<<::Jc~iK7% +"#&=qåqfqÿϽ~W9&  $6QrgK0& cmtvvxxxtqryzurpnnmmmnmnmmnopqqqpopprtwyw}{tnldWFCFQ^c_XIC@@GLOONJFA<9761*-5C@OĢi1A}sh`ZWKPnвvxjb_[[YYYXY[^elqsu{ukuMRcZUQcx`9#%$),,))-2;83.(" !  "&*,*(./0.+*(*/2.%  #$.AA?=DIJFBDFEFHKOSVWXSPKFB<623432/*&%*3:<99>C;5,(*28:79968::8;859FVems}~X68J>.(,&%*./(".5BZwʾzO3(+11/023667531/0651+*-./*5AKOUxj_ZVUb\Ywݰymyy~sjeca]YTSSV[^hqvtqprrfguߝ^xn;9YQ; !#"'*,+-03;60*'"  "&*,,+/020,))+-0-#  + !&"(4?<0'% *.,*'%&**('+.023336889::<<;;::::::::;96321236677776534688765431.,,,,../0133400,'# "$&$"   +  +  4JYZJ8268::]iL2(_jtutuvtrprusonpmmlmmnnmtsssqppotrponnoqqxvg^^WI:=HT^_ZUHEB@@CHLLID?:755943.::@txi^\\YLOI[๊ܩrk}pnvlfbac_WQOQW]YeovtonnoprtvrVSEEB5# #"%),-/1362,(&$! !!&*..-.221-)),$'$ + "!#%".:9/)'+0.+'%&**'(*/133336889:;;<;:::::::::;96322348899987734689865431.-,,-../0234410,(" #$&#"     + 4KZUC.&'++*4BVhwؽԸ׮U*,0/2$30-*('(()((''(**.+('%%&'&%#!   +  #-431-'  Fod7"&"5>KGNVD*$149;?DGFBBGIDABDC=AHMRRQPOKGEDDDBJOW[XNA94*!"*48791''-8@B?AB??>93Ukyjcc]XH62:;27=7## !%%"")*+3IjøtJ/('/50,0574542/,)*0.-.*#%1,6#Pw\B:99:;:7120.16:>@;Hm}^7 ,gͺ|j`_m~ĩ]@-$  + + +  *>]~ëlN3)jkmqtutrspmlloppponnmoprstuurpljupiffjmpwzrcYWM<+-HcaVSPGGD@<:3BIGHNMGkyT:..1466534:74.&!!$&%#$).*')9/),-.---.=)9b|gK+ )tiWYav¾˳jL2'"!   + +   .B\dzwZ>(  rsrsqqommlkkmoprqpomnnpprrrrpomlmlhhkpuywuk\WVJ6)+F_]SPNGHFC=::=BA@A@@>>50)'-4;EOjtmlep|oXNՒUZ̘]{oeXd`deYVXTVa_Z^[WY\_fjlmmnmpsttv{jqַnM0#&&(,/00/.+)''((((#" #*..,*('('$  + $*.'&2:6+#141/.-,+++++,/35668999999999<<<;;:::9876678988888888:::98765554210000001257863,$!#&$"     :NNK7!=[m}ŻK/"#'..(&)2.*'&'''())))('&&''%#!!#$''$!+#   #).,# +   %DUʤ:*% #0,)).6<<9:CFGHDC3-*,5;=ADTlrhghdJԏWdˏYҷrWQTUNPSNO\\V[\Z^^afhihhhkmpruuwwtκJ/$%*-/21/+('&$$&(+.+&#!"%('$! $),'&174)&2521/.-,,,---046678999999999;;;;::::98777789888888889:::9866665321112111245663,$"$&$"   +  7HE;)(D[lw}ɹ˃2 #).-*+/2-'%&('&())))('&&''%#!!#%&&$" 0+    +   +&DRʲ`;"'&05=EF?BCEFFFDC?>>@BEFFCEGJKLKLPQSUUUTRIFFHOW]aefcV?.-35)+7<;<>CN\m}_<+.660221/..159850+%!")-.-*(,,.5AXy¿cC.%'.451/2872-)%%*--.1/.153*"*/798p99==<<6.--.-,*,,%8B=U}cT[мl_RX`n}˳iJ.#   !#$%)7JbϼhG1" ! !mjea][]_gjnqqqrssroljikkmljjjlnotsqpponmkh`WTOC1+1Ma[SPKIJKKE@;86==?BEGEEGHJJKJJOQRTVVVVE?9438=@ELQM?3133!!0:<<9AQn}U>AC=4.,.000/-.047751,'$!"*153,&(,024BbpJ0%%*3661/3:71*&$%*.-./-,176*".7<1&h@;4-10/-++,+#;@4Gx|տnYSRWbs¿ʴjK.! + + !$'')/>RkªrP:(!  !"$%'YWSNLOW^nqtvtqopronkihjjlkihilnqzyurnidacfd]TJ>0/6Qd\TQKKKMMID=;8=CIJIC@CB?969COf{|d[f|Ӧe@~U}ТSy˱eVRW_op_U\RL]nolnnomhdbbdehloonjt_=- )(1221-("!" !"(0651*#"#  +  !%'"%03.$)3422/..-..///2577789::::::::9:::::::99::::99999999999::::988776544455555543331*$ "#$%#"  +   /7-  0;F_ʵw3'033/+*+--)&%'((&())))('&&''%#!!#%''&"(=>+      ,HKxҮd)29&=@BFGGIHIKJKKKLNOSVWXYOI>3(" *08;;72),#3:::DNib?*-11/.14*,/00/025541-*&$!(0860'&*//).D^nT8)'*.466105:6/)&$'+..,,+,275+".9;+"_NE@@=:3/321/++--'695Chҽn^QNR\m|˶rR1! + + +  #%')+4D[sDzaK5($  "#$%'&'()*--/JHFABJXbswywsomnmlkihijkmljjkmnqxwtqmidaaee^QC8-1:Ve[SSMNMLKIFA>;>AEFECABB>629K_u^Wf͟_>ұuNvǐlUzNHMZi{|iT`]Zjxskwvuqjea`bdhkmmmlmpqdB5,  +.)//-+&"$,320-& $" +  !# %/3,!*2312..---./0/2677778;;;;;;;;9999::::9:;;;;:9::::::::99::::99887666667777765430*$ "#$$%#! + +  )0$  %3YǿM.672,)++)())))(((())))('&&''%#!!"%((&#*>B3   +       1JHtz89>/.3@F@=HSXRRQQNKHFBA@BEHIHJJJJJJJJHJLOSVXXYTJ<, "+693$$(2998EZTAN=( 4A<0)+0110014531.+('! #-794,%(,+$!.AirN<0-01014654694-)'%(-/-+)+.353+$)83((UcRB>=:41531/+,.0.007FOk ϼr[PKKU`jv¿λ`=)#%')-2=Pg˼q\D3,'# !"#"#$&')*,/12334467:;=GEC>@K\ivz{xrmkmjigghjklnmlkmnoqqqpomkiicc^VK=2'0@?@ACDEA?96:KcxvlZVd}˜]@ƣrQrxNOgy]EEMQViqeZnofoywr}{yskd`^`ejkllnphchu|qU=0+# !2+*)'#&,-..)" %"  +  +!!'12+ *1102--,,-.//03687778;;;;;;;;88899:::9:;<<;:9::::::::99:;;::989877778889:987620*$ "#%%%%#!  $)  (Zѽ+143,%'--'$)..*((*())))('&&''%#!!"%'('$!)=B7&  + +  +   +    5LFrݐJ>><@=:9=FMPPNNNOMJHGFEDEHKKKJJIIIIIIIIKLORTVZXSG6& )4;5%"*-1884Fgh@:F@/#*:B8*/13432233331/,*)#(4;91)'('!$1HbpR4-,473-,0798784.*((*/0,*),023.+'+9,(1Fpx_D;;;64652/,-02-+)7E>My÷¥èl[MCBIRZiz®oK2"&)+-3:BNb{ƷqXE<82,..13466:>@CGJC=969HR`tp]SOIBCDGIKNOQWY\`cfijqqrtuwy{QLD>BN^jstspifffgggghiklknomnstrrrqrrnhd[TMIB7.%0J[ZXQHJMKIGFGHJ@<8328AI<@HUh}vl_WW_zϞ`Fa}fNL_oj[KF=:Fayyfbsnpwvrrpmhc_^bfkopprqqjrs`]cXE, +(12$ &(+,+& ! "#! !%!!$!'11*!!+13/,,,,---..13677789::::::::88899:::;;;;;;;;;;;;;;;;:;;;;:989:988899;::;<;861.(# !!"$&''&'#   +"  ~A("-+'$&,00.&.0,(()'(())(('$%&&%#" &&'&%"$>?@0  +  +   +8HN|F69;?62;CB??EEGIJJJIGJJHKPMEFEDDEIJKMPSTRPPOTVWSKA:8<458230!*<509:/TtGG@1)4CF:285)*06875675431.,++( *6:6,&! "#'3E]ykN=5+,/241-+/58951-++010/1/*)*/3/()/,2..C70puJ:;<85363+,53((23027@LZenponjghiggggijlmlnmkmsutwvqnibZUQMJJE<5-6N]ZWQILNMKKKLIF=73/06@G?J\n}rfYMMY{ҟ[3?fnaL?NfkaaVIG^±|wsllmkjfb_]aflqpomkxsspebe`Q1 3:5,&"'*($!#&$  + &&(21*",23/-,,--....1367778:::::::::88899:::;;;;;;;;;;;;;;;;:;;;;:989998899:;;;<=;850,'"  !#$&'''&&#     " + -źW'-*.),*(+030-$+-*()+(())((''%%&&%#"!%&&'%# )EGH8   +  :JQעc82:G>6459?ECBAABCDFFHHHJOKDDCBBEGJKMPSUTSTTQSVSNJGFC<=<412&-?70790Tp>94/-19:55;6-/26889996421.,++*#'176,&#'-6BUnlL6,).,-./.,,.36840,*,13200-(*-//-,--+0-,>1)exL>>;65385./42&&00-.27lƷȴʯ}W>875778:CP[nwþƩgJ7+"!%')+-23468;<>ADEDEFILTX[\_iuǾGE>;>JWaklmkiiijhhhhiknooomjkqtsvtld\RJEFFHKHA=6@T_ZWPJMPMMOQOG@:50,/4;>?Snzn_TJKXzǝ_33Ojtso_Uh{nif^Wdffedb`_ciosqmifzzoikidgc>"66.)% !')&"!! "(&   %%)22* %.341.--...///1467778:::::::::9999::::;;;;;;;;;;;;;;;;:;;;;:98999889::<<<==<85-*&" "#&'()('%%#  + !#! + G6(44(,,,/33/+#(*((*-(((''&&%$$%$#"!!$&&&%# /PWV@      $0-1+2@91563Yr800280/.28:745657:<;96421.-,,-("!)16/*&"),)*2IhlN3%$(0-+**+-..2561-('.353.-*'+/-)+22+*/.+6*#]yMBB:22399314/$%.-**-2^͹϶\?52440,+/7?PXfvţmXH:20//////01357<;@KXblllkkiiihhhiklopqqolmomhhd]UNF@=CFJNJCA=HY_XSOJMNMLORNB8-+*/5<@CJa}wmbVGCT{ƢnJIb}κ~v`UMQY\XY^abcccdcgkorpmjjrvhbolbjmR3'-74..+'()(%""()%!!  !'' + + )23+ '04410..//00002478789:;;;;;;;;9:::::::::;;;;<<;;;;;;;;:;;;;:98898889:;<<<=>;73*(%#"#$&**+*)'%#! +  $$!  'g˄0'++--,-//,)#%()((+-))('&&&&%%$$#"!!$$%%$" 5_keE  + + + (:I]uJ=@ILA8455:9888;<@@CEFGHGD?@ACFJPT[]_`_`bcabcb^YUQGCC;(&/-!1>81464]m1-2591-+47449:745:<<:65420..-/,(! +23/)#*+)&+:O_h`N9("%*-+*)),./0343.*%$/693-*(%+0,$)75)'-1*,!$_zLCF:76665542-*" $%#   ! !&%  + + + '11+"*24411000011222578889;;;;;;;;;;::::::::::;;<<<;;;;;;;;:;;;;:98788889:;<<<==:50('%$$&(),--,+(&$  +  #$" + +8ýźߤe/"*-+)((((()***))*,))'&&&&'%%$#""!!"$$%$" :l}uL +  +  +  *4GcթqFADC;667801245789=?@DDDDE?@BDFKRX\^___^^_`aba^VMGD?@7$#/0&.540366Yc(*31.30/64,/9:7338::966431////0,#$,62,%! $&(,16:<=:950)%&'(()*-./04430+&$$2::2)&&&+.)")86)&,6-$*f|PCF>.%27<:61)##*,)'*.1GsվδX9,'"$)-./011.08AJYev{űyulmkllmmpvy}887@7%&67,*-//223Wc*.93)22361+-68643568766542000.1/'$10-)$!#%"(07<8/)%+030,)&%&*,.00/43/,'&(*4<<0&"&)**&#*43+)*6.$#0e\GA<0&05;;6/'%*.-'%*05AcŸϴ~S4($ %*-,+*+'&,28AKV]dmt{897;CRdprolkkjfcedfgjlnoonlhhcSF>>;857?EOQPK@;EIMYYQNJCEIJLLJD=8BFHGGP_l{lb]zs}}j`[XSNMO9>A?=<;69=>;9;:735568CKU\bdfgiiinqssnmlnoiikhlojpsshR9$"+37:99894*%$$'$!"%#  +  "% ',*%+2310122223344358999:;<<<<<<<<<<<;;:::99:;;<==;;;;;;;;:;;;;:9877789:;<::;<;60*&&'(*-/0////-+)'! #$"! "%#e̴Ѻк\ !&-%-)+*)(''())*+,+*)'%$#$&(*%$#! !!!!###! >uuD& +  +  +  + (00K|۳_H>LUI4)+****++,-.3;<:=BBCA=89?EUY^a`^[[\ZWWWTPK@00,*()*,''.6969ADD@81/49FKRXXVUSWRLIIIGD=9;7)->=6&$,-**Sj,+55.***,164/0343//0577554332+/1,"%.2-'!,13/)%',*+,,--,--,++,-...+'#$*3:5=<- )1*$#(+*+.1%./044O~~U5476,0782*'(/0*"!)28?QŲݿ{L-#!"##"!%,.*'',06;AHPVYeosw~¿7985;==964422122355332101----147@T_de`_bfjklmkhgfghghhiiihkhcdf]MIJNOI?3+*043+%'./20)!%" "    +"--)%  ,22024444445455779:;<<;;:;:;:;;<;<;<;<:;:<;=<=;<;<;<;<:;:;:;:;999::;;;9::962.,#%&*+/0221///.+(%" !!!!"$##" + !"! M©޾u. #&'**+,--+*)+*('(*,.-)%$'+,+*(%"!!"""! "#" ;{eB    + + +  3:2LY1)N_A@>94.*()*,.-,.39DB>952//6;@DDDGIPI@=?A>;532.*/8>4*(484Wc%+201/+,/0..12222221256544444-274* (./,(',,+**+++,+,.10-)*&#'-32/,+)'&(/499:-$+&&"#*-*+/**,0..:OtP7;16.0230,)(/0+$$+02:Nx̽ɨ}N, "%'&#$$'*/37:;GNHEF?6<@C@;9?FIA8557523201122243210///++*,-13:P\ac`_adhijkiiffggiiijjihhfdfkiaXYWQF;1,10,)''(,131($   % + + + +  +  #-/*&!,33124444444445689;;<<;;:::::;;<<<<<<<;;;<<===<<<<<<<<;;;;;;;;999::;;;:::851-+$%'),.1221///.+(%# !!!" "####"  $" %cɽŲּ?% %%%')*+,,,+*+*('(*,-/+'&(****)%"!!"##! !#";wrO( +   + + + +   %<>5SǍT7J\PGE?6-'''&'(&%(-3<=;950,)*/35679AD=50-=U[[\TMKKKXSLEA>;=HUfyynfbXI?>:?>52796CCA;57?EG?500133322222332210/...*+*++-.5LV^a`_adegiiiihgggiijkjimhegghkngbXH:236:2'"!$%'./,$  "(   "-/*&! -3313455555555678:;;<;;;:::::;;<<<<<<<;;;;<<<<<<<<<<<<;;;;;;;;999::;;;;;:840,)%&(*,/12320//.+(%$! !!!!"""!"#$$$%$  %#"!6ҹɼn%'$"#()*+,,,,**((()+,/,(&'(((*(%#"""#"" !## 8pb= +  + + +  + +  5@>>dRFLTLKF=1(%%%$"!'-.25750*'!#$%%&(*-)%$')(%%(*($&.5+%(5=<]c$/26/+)++*,1111211123322111013564,"$-11/+*)(()+,/.-..-*''&',353/*%$%+034/14*"*%##$**)),+)).26:GaV55/631.+)))),-+&'.225GlϬS0"! !"###"#$',39=DEHIKLLLF@@HZr9;95:JZehdcfgdabdgjlkhdacdgklg\ULD6.((14-,-?W`^^XQMGBIIB6-/9Gcqrg^YPD=>??91--0223323332211/.--,-+,+,+++/DOW\]^bdbeghihhhghhiijkjqhfifadlmfWB1-5><4*$! "#   !%+ + + !-.+&!!-4423566666666779:;;;;::99999::;;;;;;;;;;;;;;<;;;;;;;;;;;;;;;;999::;;;<;:73.+('()+-/234210/.+(&%# !""""""####$$%%%&&  $#""! DʹѽۚO!&&#"#'()*+,,,*))(()*+.,)'&&%&)(%#"""""! !##!3fvX  + + + + + + + + + +#?98L{ܹW?HGJLG=1)%'$#'"'.564-)! ! ')$$*0'%##)39:_e .360+())(+/0111011222110///334783(*242,*)''(*,..--,+)'&(*0563/(#!%.564-/3*"*%!$'*))(*+)(.489ATZ11-551+'&()+*,+'(.235EfЯV1"" !!"!!! #',/.124678850.6F`:<:5:KZeidcfgeceegikjgdadefjkf]VNF:2+*1:<8,&).A[c`^VK@3)+21)",Fa~wndZRJA:8>?>95566:@HJE?8653/-./001233321000..,+*+,.-/-+*,=EMTY\`dbdeghhggfgghiiijlfehf]]dki`O;0.//0.*%   !  %+ !,.*&"!.553466666666688:;;<;;::99999::;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;999::;;;<;851-*())+-/03453100.*(&%#"!!"######"""%%%%%&((" "!!"##Rӹ±;ҾY. !#"!#%&&'')*++*))((()),,*'%$$$)(&$#""!! !##!,Zs-   +  '0@-2a˄K<@FMPK?2)($ (0551/&%! $($ "&#')()/66_h.371,))(')./00101122110/.--4226:7.%$.34.,*('()*,-,,+))))+.3551-&!!'0675.03)"*%!'*+()((++*.3757IZ-.+570(##'*+)*)')0445A^ұW2#" !!!"!#"##&'')))# '5Os9;95:JZdidbegedfefhiigedgffggc[UPI@92-0773&#*0C\c[OA3' +!#(;[xzqkbXNE>946898420/26:;74220/.-,-./012321/./.-,*))*-./0/+)*5;BIQX^aacdeefggeefgghhhcabeea`aglphT<'"%))'$!"  !#%!$*    ,.*&""/654577777777799:;<<;;998888899:::::::;;;;::::::::::::;;;;;;;;999::;;;;9740-*)*+,.013464210.*('&%$$$$$%$$$$###&%%%%&()$  !# "$%)hűδҽ-"! "%%%%%%&'()))))((((***(%##$((&%#"!!! !#$" (NñA    + +  8;8)=xqFBEKQQK=2+% (-001*'$! %,%',-+-23_i-371-*+*'(,///000122210/.-,2004881+'/30/.+*(''(***))+,.13552/+$"$)0565003' *%#+.-(('&-...02..@Y)+*35-$!"(+,&))(*0456?W~ѰX2!!(Ad58627HXbgb`cfddfeeffgggffc`__[TPPMGB:2132.&'05DZXH3  '6G^x|ulg`VKC>71235641141233133532/+(*-//01220.,.--,*))(+./0/+((-27?JRZ`bccddeffeddeffggbcbaehfaajwxiQ6$  %(((   #$!#(   + +   ,-+'##/66467888888889:;<<<;;998888899:::::::;;;::999::::::::;;;;;;;;999::;;;9852/-+*,,-/024575210.*'(''&&&&&&&%%$$$#&%$$$%()&! !!# $'' A̹IJʾƻa "$%#%$###$%&))))(('&')*($##%('&%$"!  !#$" 'DŸb5   +   $GE04TڭpSKFINOG>1+#"&*-+)(((%! +/4*#/1.,01^l-362-,-+((+../000123320/.-,0//15630%  *0211/,)&$$'())*-046763/,)$$(,0244101$($%/3/((&$-12.--'&;X'**13*" ")+-$(('*2566=PvЯV18[x253/5FVae`^bdccfeeeeeghhc_ZXVSMHQNKH@511-+%*48CVJ5 %/?Vozsjc_TJB=810//0/03835788::;85/)%&+/./121/-+--,+))((*,.0.+&&)+07BMW^`bbccefeeddeeeffehe_dmk`]fsztcO@(#+-*   !" "$" &   + *-*'##07646888888888::;<<<;;998888899:::::::;;;::999::::::::;;;;;;;;999::;;;8741/-,+,-./124575310.*'(((''''''&&%%$$$%%$#$%')'" !"$!!$)*%Rñҽйοv8!"!&% %$"!!"#$))))('&&&()($"#%''&%$#!  !#$" )=Q +  +  + +  +OJ+AjaRDBINKE70("$',,+-/.)#   "8=/  02.+/2\l-351.-.-('*-.///0124321/.--...02443)$&.3331.)%""%'((*/389972-*'#&+./02410/!%#&150(('#-34/+*$"8U%+*01( $*,-$'('*2557>=<;::99999:899::;;;<;:999::999::;;;;;;;;;;;779:::::8630-,++-/2454435442/,(&'(())(('&&''''''(''&&'()%" #$!&&'%"(&tǾ¤ԿA "%&$"$&###$$$$%'&&(**'##&((%$%'$%$%$#!  !!"%$*9xŷo6  + + + >WK3_םfDEHGJJ:2,*&$&)/230+(';C5%%(-34]g006/000/+(&(*,/00016531/.--0-,.25541+!"'/4994-)''&%',144<;73/,)&'+121136243 "!*/20)%&(01/.*% $;~S")4-,$&++(#%&(*-27:9HbϰP)   +.Rt55437DVfga`egedggcabfgd`YRIDB@;8BLUTJ=4,-'*49879 /Rqy|wqf]_XQHA=;843320137=:669:74,*(()-./221/.-,,**)))((())***)''#%'*1>=;;::99999:899::;;;=<;::::;999:::;;;;;;;;;;7899:::97630-,,,./2454434432/,)''())))('(((((((('(''''))&#"!$%"'' )'%, 8˱ʵk( "#"!##$$%%%%%$$&)+*%!"%))'%$$$$$%$#! !!"$%%2uȷZ*   + + + -IQC?pʓbK=;EJ@4+*(! !$(,./*)!"''$&+7A;' "'/67]`)+20011/+(&)+-/011265310..-/-,.25543-$ +08:72.,)((+0589>;61,)'%(,131025331(-/.(%&).000+%"7U&4+)#!(/.+!#&)-4997E^˭P) + +   -Op44329HYfhddgigdeecbdgfb]SKB;8632?KWXP@3),*.451,, ,Fgztlc[]WNF>;:9656532357645662.,+,,,,.02210.-,,)*)(((''''(''&%$"##%+5COSX\^`baa^^``aa``bba``aabca_]]bin]T=  $!  "&! +   + +*,)$ &397469889:::::;<=>>=;:::99999:89::::;;=<;::::;9999:::;::::::::7889:999652/----.02344434321.,)((()**)(())))))))()((((**)&$#$& %))"+)'/?Ϻ̽ϼƾz/  !#$%'''&%"#&)*($ !%(*(&#"#$$%$#"! !!!"$% +oʵG  + +  CRH@S켇[=;KQ@5++*#%()&$.453/-2=>2&09:`~Y*.60111/+(&*+-/011254320/.-.-,.144461) $*49:854.--06:==>:3-(&%$*-33101332.'+,+''(+./0/+& 7T&4)%" $,10-!%).4966BZɫO(  +    -Ol3321;M\fhggikiedfeeffb\WOH>731009DQUOB3)+,-/,&##E\w}wqjb\\ULB;99845663001334463.*+/231/1200/.-,+*))((''&&%%&%##"" !$)1=FNU[_a``a^]^_^_^^`_]]\]]^aceb]Z[]`eU2  !%$!$"! "%'  + +  ++-'# '38746989::;;::;<=>=<;:998888899:::::::;;:9889988999:::9999999978899988531/.../00233343321/.,*)))****))+++++***)))(()*++(&%!%("(,*#)&$,RŸʾū٠N"!!"$&()('&##$%&%$"$%''&%###$$%%$"!!  !"$%%gǶl%   + + + ,QREOlرYMOL93//-%  -6;83.+,6;6&!.69SiJ+082121/,(&)*+--/0144321/.-,,,-023473.' #-6;<:944359<=<:6/)%%&',/441/022/,(++*(),/0/-+'$ $:p}M%*0'"!"'-0.*#&*/4945?TĨ~M'  +   /Rq1200=R`fhhiikkgdiihgc\TNJD<40../4=HMIA6.***%1h}~zupkfa\WPH?97652243/,,-024563.*-0442123/.,+*)(())((''&&$$$"!!! #&)/7=JR[`b`bc___^^]^^]][[Z[Z[W\``\Z[]]hbI3("$$!"  "! !$%(  + + +  + ,,&! (28757889:;;;;:<<=>=<:9998888899:::::::98766666888999::9999999978899877320/./0011223333210.-,++*)****)),,++**)*)))(()*+.*('" %)$!+-+!#&!&Lǻ̺ȸ̽۠h5",&!#$"$%'((('&%#! "%')'$""#$%"#$%%$#" !! !"#%!"]O"   + + $QSC2.*$!"$(--'" "(*,/3756>O¥}K( +  + + + + +  3Z{02/0?Wcfgiigiliekjie^UMHD@93.,,-28@DC?92*+) >{|trmhc^[XQME=64320//-+)),/246540.-.121//0.-+*('&&((('&&%%$##!  !%),05DOY`aacdaa`__]^_\[YYWXXXZZYXVX[_ZddZOC) +! !"&(   +    -,% ")27767899:;<<;;<=>>=<:988777778:;::::997654444578889999888888887888876610/..0122222223310.-,,,,)*++++*)-,,+**)*()((((**/,*(# $)% #,.+!"$#gȾöů÷j2$ +1+###%'('%##$%&'())'# &+-(" #$&"##$%$#"!! !"#$"!R|> +  +  +5HJC[ʤ|YB>;8/'%' 1BG@1&"%+/6:5- '.(+!).//111.,*&&&'(*,.223320.-)+,--.146530*# *4:==>=;;;:750-($$'*,-0552013,**#..+*+.2460(  $+<95:90%! #&+-*##&*,./2588=K}L' +  +  + + +  9f/1./@ZffgiheglkgjjgbZQJF@=94/--.16<@@>91+-* +?~zrmjd^YUUMIB<521..-,*(&)+/15544210..0120..-+*)'%&'''&%%$$$#!  "$&+0>KV_`abebb`_^]^^ZYWWVWWW^ZVSTVXZ\``_\O3  "#%#      !.-$$)2777789:;;<<;;==>>=;9888777778:;;::999765544557788899977777777888887650/../023322212330/.,+,,-**+,,+**-,,+*)()'(''''))0,*(# #)%!$-.+ "#$cǾĮکO!,-.**,01/)$##""#&(*('$  &,,'"!###!"#$%$##!! !""%I¿U +   + + <<<;85/,(%%'*+,/452124+)+"0.))*.145/' $+63046.##).0+#"%),./15;;>Iå}M'    + Al/1..A\hffhgcellhhhf`XPJG?>;7300126<@@>8/,0.   >zspkd]XTSKFA:51/,-,+)%&*--134333330.04620//,+)(&'''''%%$$%#!  "(/:GT]_`bdcc`_]\]]ZYWWUUVVTSRUY\\Y`^]^_Q6 +  "$%#    !/-$$*1687789:;<<<<;==>>=;9888777778:;;::99987655556777889997777777788888655//../134332111330/-,+,--*++,,++*,,+*))(('''&&'()0,*(# "(%"%-.+"#&_üİ̞K )&./13783)"$" !$(+''&# !&+*&"!#$" !"#$%$$#!" !""$C£` + +  + + + +  ;OAKtдx^B4/,($1AF>2)"#"(3=5' +$/2#!+1,-/121/.''''(+-0013431/-(*--,-046640*#%/8<=?>==>=:7/-)&%&(),/453135+)+ 0.('(-023.'! #)/773/+##+21-% #(+,/04==?Hæ}L' + + +  %Gpͽ澓z}ŰԽý{nvyhPA?@@@;852,'" !" "3Xy}siXG5,"#& !#(29?NOONNKMLJD?@FLMMIFB@ABBBCEFFM[gjcdhlsvxxy{yvrt}{xuvyz|ɾ}Y2#%+06Pip]dspY<,(+39M^zƮW6$*Ihu}|wsqprwxywo^URVdz¹ytngc^^]^_\__ckqqvyxvy|}}|{{¼T:+3IflR=&! D_wZ: 7LY]aabceefhjjihjhgejjihfeeb^TLC5-*.37?GNTXZVVVVWXYZWWTQMIFDBBAA@?@@?>?>=;;:855>NZa_\Z[WVVVXVVTUUXZZXPOMKJOV^^][VPJFA@:12:>@DBMdgN. 0HXq{|ynf^UOPS\hsrkaUKD??9-"#/;CE?5-"ǻ㼔{Ͽϵworv~dN?>>>>:730+&" ! #5[}}tkZJ8-""%! "*2:@LNOQPPPNID?@FKMLJGCABCCCCEGFMZehlmprutrpnmlggkt}~{vtsvx|þżwZ:--/04K`zpbW\fu|nZI3(%'-2EUqeG33Jeu}~}zvrpprvwvrjZRPUcyÿ|vohda^]_^]]]aimmsusrux||}}zxzrK8/??==><;::9855=NYa_[YZVUUUXVVUVVYZZYSONLJNU\\\ZUOHEAA=9;@?>AESlveQHH=% *E\l||{of^VQRV_jtqh^RH@;;6+"#0/#" !(1;CIMORSSSRIE@@EJLLKHDCCEEEDFHGNZdgstxwtokh_\ZVX`ku|zvroqu}ýhVB85302AQersgWLJRVasmYNADKT]_RD7.""';Kf}cJBObu}~{|ywsrqqsuusmdTOPUcy~xskea^]^\[ZY\dgilomnqtx{~}y|~zvsy{Z<46JhzgM91/-* )Gfv`F3' + ==>>;:;:9887855=MY`^ZXYUTTTVVVUVVYZYYTPOLIKRX[[YUNHD@@>?BD=8>I^ynE$ $%16Hd{~~pf^XUVZbmurh]QG?883+#(5AIJC8.#ֶеŨsigjnty}~|~~~{iUE<::9:760,)'%!  +Ek}vodUG3' ! (1730-#'Hh~wbK>92.,)APZ`^]_abbcbcdccdb`]ddcba`__YRH=2()-02359>DGIKOSTRPNMKGDBABC>>==<;=<88987776955=MX_]XWXSSRSUVVUWVXYZYTSQNGIMUVWVRKDB<9:;>=5/7Mh[8-07:JRhre]ZYZ^fqzvmbWLC:84-&! $.9INQJ>3&ԸԵϼzlbagkorv|~}}}{xvxxyxwtrj^PD<;766640,*'&#  $4Qxÿ~wsh[N8*! ! %0==<;:<;77987676955=LW_\WUVRQQQSTUTVVWWWWRRPMEEIPSUTPIB@<74463-,JTdprc[[^^aiu}ul^SJ?;6/*$$$&'+5@OUWO@4(űԵϸ{ve_^bfjmns}~~|xtrsrpmhec^WMC=951011/+(&&$!'<\¿|wumaU@1&"" !.@EIJIGEBA@>>?@@===<;:<;8899888795482,*-/-*%#$"  ,Ff¿zvuodYG6*%$ -=GNNNNOOQRRPKEA@BDHEBACEFFDHJKR]egdc`\]fvvrjghoy}{|xwɾqX>'$''*-*$&5AFFBA>@;ACCA@>>>>>???>==<;;<<99;::::9954=<;<=>????>>=<<;<<::<;;;<;954>@DB?>?@@@>>@GPWYYQPPVf|{hcgku}xposmZH@@?=;9:998:::;==<75===<:88:@GLMLFJQ\owgciltyspospR@/$-:L`yvbO>0( #'+,+&#%-8CKF:.$#5M]ef`XVSNHEA?<8=DLVg{}zvx}|{yy{wvtrpmmkjhhhjkjjc_VH=@AAA@???=<:99999;;;<>=;650&"&-11,&!!  )4;7.# +?Zimle_c`ZTPJGCCDHMVfv}vty{{yxytvtqnjigkjhhjihf_YPEAEZn~Ǿxsnljfd^[ZVTSSQOPTVXWYW[YUSSSUTKGHO_p}|z{zskgmoL$ 9^ovözT4 *7AGDFQ^_XOKNRSVV\[]]]]\\VTSQNNOOVWYZZYYYPF:1+).4<=;:641.../13589>?ABCBA@?>=;:899::<<==?>844;84./2456528G]tzhgtxzzqu~oUB.$!!'.AK]s~||yvtnifn~mG$0Giw|}Z8%+9B?>KZ]TKGLPQTV\\\\^\ZZTSRQOMNNVWWY[ZYXQE80,*06>><<851/./02479:?@BCDCBA??>=;:;:;;>>??@?633:IRXTPOQPPOKHKIJKJIGFDDDDBA?@EFGF@8.)"*,()NixppmifQ;23Ldtuonozq\U`n||zxxx{|~}ulgc_]`ku}qbUNɽ¶xrnmkiifdeiov{}zyxuoje^VQROJE@:522,&" 6[ǿľzrmmopbVF5*&&'%#   #/>OZVVSMIEGFHIKMNNMLHFDCA=73)+-000//:Ic}njvzzxp}r[B0!!%$" #*7GSWOG>1()2?IW``ZTOLKMJ=.*07?HIA:::?K^u}{xsojggm{þkE(&?UtrouqW=.!0965DTZMEBFMOSVZZZ\][XWTQQOMLMMVVWX\]\XQC6/-/5:>?==:842223469;<@ABDDDCBA@@?><>=<<@AAAA@5118GPVSONPOPNJGJIIIHFFEDDDCB@?>CEFB<3*%")*&*TivpqrldJ5/6Oiwxpllxp\U_n{}}{xyyyz}yulc^VTS\jvwi[UùǿǼ~yronljdefiotvuuxvplg`WQTQLF?9411+%%?eþ|spoqtg\K:*$$%$"   + (6ES[XYVPLHIIGGHLPRSRLKHFA;3-$&),-/14?Pjtkvzz{uq`J4%#())& $+6?B;83(!*9Uar}~zupvwwrfVNN_iuvpd]YUfx}xulg`[Z_flyusxxxzzvtutsprnidccfghggghfb_ZNDCO]qupljjkjheb]ZTPNLKIKMPPRSPNIEBAB>;9>Kby~}|zunighkriD),H^|pmpy}eO:,! (300@QVH>=CJMSVXZ[\\YVUSRPOMLMMWTTX]_^YOB4.116;>?>><:7655678:<=?ABCDCBABAA@?>??=>ACCCCA60/5DNUSOMOMNMJGJIIIGEDCAAA@?=<=ABA?90'!"&$ 'TkzrtvphL6/8Smz|sonx}}o]Wan{~{wwwxvvoi`YTIJNYeuwk`[ɼwqnljdedgkmppqsqmkf`YTRPLF=731-(#0Orźþ~uqqsvmcS>,#   (3=GNU[ZZXSOKLLHGHLRWYYXURME;0)#&*-/5:@L[qujv~n_RB/%!!#)152-&$-39>:3251-7Fcq|wl]WVclxzsh`\`jxztkdabfhq{zuustx{uqpsrqmmljhfdeecbcdeca^UH=>LZkv~qlihhjiggd_\WRPOLLLKLMLMLJFC?>=887?Nf}~}{yxyvohfgovÿmF+0Ofz}pifmwgS=*!  &0954AMOD;:@GJPSXYZ[[XUTRRPOMNMNURTW]a_ZK=1-1159=>@?==:988889:<??=?CDEDDA60-2ALUTPMNKLKJHKIIHGDCB>>??><:9<=>:4+"+[wwvxphM<4;Un}wssx{yl^[dp|}ytwyvrnd\TNJEGNW`ku||vkbZWλĻ{sqokfgdfhjlnnpmlifb[WNMJC=733*'  + $;]}ĸþxrsvxtj[D/$""!"+:BMUXWWVXXVTNKIKJIIMTZ]\a^YRIC>:CKGE;9>EIKPWX[\[XTSTTRPPQRRUSSV]`\YG:/,/125:;=?>><;99889:;;>?ABCBA@@??>>=?>>?DEFEDC70-2?MUUQPMLJKLKKLKKIFEC==?>=;:99:<93* 5f{tpibGB8=Wqxwtvwth]\fp|~}xsqv|snf[PJEAEKQW[`hmrplf]TPNϺIJƸ}|wtpifeffgjkkigc`\WUPLHB>:63*(" (Ej­|qsv}xw~|udL6*!! #,;EU^gfcbZTWWTOJFFIKJIMRWYWYZWTI<.&!"#%(/;CTcyx}rdUKE?5-,024431039DQ]hoq]QLPLCFQfz{rg[SX]a_[UTURYdnx}}qkhjknw~usrojfabed`Zaabcfec``_`beb[UK?77BO`m{mlkmoppoljheb]XTOMKIHJKKKECDC>8404CXrzwwvuvsspmgcgsºtL88=@BFLQUYZZWVWVUTW[\YUY[YUVYVTG<1.023589;<;:98:9999:;??BBEFFDDB60-2>KRSQPOMJJLNMLKKLID@??=:8789;:73) DmynibQC77=Qk~wurxuoeVOWbiqvvutqnhcXMFEHMJQY]][\\[UNHDB=;˰Ƕʽ}|wkeeedefgieeb^ZXTOKF@>:64-($2Osðؾv^USTn|{|lS=0$ " !&+4?O[ksupi`WOSRPJEDDHMMMLPRTSVTTRI?3*",9BN]qvi^PHC?713454347:FP_n{qfdZMJRh|~vk_WRY^_ZTPMKPZcinstx~uomlmq{zsnhhb_`efc^^^_aedca``ace_UMF<7:EScnqompstvromkgc_ZVROLJIJJKJFBDC>8404G]t{xtrsrrrqplidbkzſySENnynmpxkVJFPZ`]\VU\ho~oYB+ + .BJNKFGGC:36:?@DIQUXZWVTTXWY\__[X^`[WUWQMB7,+.03578:;;;:9::99:;;<@ABBBAA@A@@?>>??ABEEEDCB5/,0=JTTQPOLJILNONMMMID@>=;87667862," )Ps|ypf`YK=23=Qj{xvvsmcTKPXbiqqqpli^ZQGCFLR[[]^`]WSIE>86641ȩǷͿ|ibaa```ad`a^[XVTNKGC?;84-)$ '>[ŸwpoqʜqN<3-Ddu]F6' !"%)3:DQco{odXOONMIEDGJOQQPPPRSSPOKG@60"!$.:CKWiywkYPGA?<72;;:637AJbp~o[NPj~zpd[SY`ed\SKIMQUZ]`adkxzsmkkpyvkbd_]]aa`^YY\_aaa__`cee\NC@:8>KYhr}qopquvwsonkhda^[VRPMJIHIHD@BA<6208Mdz}yurnlnmmlkjheabp­~YO[xsc_^ro\PKQWVTVX[frzu`K1#+=MSYUOJD=3/06:;@EPSUVUTSQXY[^`^ZX`a\WUTMH=2((-148:;=>?>=<;::::;<=@ABBBBAA@@@?>=?>@ADDDCBA4.*.;HQTQPOLIIKKPNMLKGC?86520/111/)"  :`xtle^[SD7-1?QgzyvwtndUIHP]ckmmmieYUNFDGOVfba`_YOE:61/1357ƨ͸icb__^^]_]\[YWUSMIGC@;84.)% !$$$$#" "!'0Id̷ʹ{bWTTi޾jF1&!.D`hQ=- ! "!!#$'-8BM[mw}qg\QPNJHEFGJQSUROMPRQLHFD@71$#""'/8>HP\ix~wk_RLD@?=95<@?:9BSazlVRk|sh`^clvzrbVRRQQRSTSSYdmx}unifkqw~{mab_][\__`[[]^```^]_cfdYH<97:GUan{þ{pnprvywupomjgca_XUROMIHGIBAAA;521;Sk~xtoljjjjjjgfb``fvȵc[g~o^URhwzjb_`cZ^diqxvdO6&!&8FQ[caZPD7-),379>CMQSUTTTTXZ]``^[Xa_[VVTKB8.%'-259;<>?@?@=;;;;;<==@ABBCCBBA@@?>=?>?@CDCBA@3+&)6FNQPPOJHHHKONMLJFB>631.,*+*+)"  )Kmzpf_[[UE8*1ASev~xtxtphYIFIW_ghiigbYVNGCFPVdceebZOG=989=DKMν̿վ´lfda_^]\[ZYXVVSRMJFC@;73.*&#%&(*)'$%%" "-:QoƱ|w~à|bSLH[qǼvW<+$"-B`¾t]G4%'%&$#" %'+2>:4. !%+3:=ILS]mzrcVOKEBBA>;=@CDHVk{{`Xl{ticiozsf][VSSQNLMOV\eq}yogcejr{oa^\ZYX[_d_]]\_^^\[]acaUE834?M]hvĽzomoqvxvsonliheda]YWTQLIGHBADB>:56B\t~ysokhhfhiiheb`^aj~ѻicmxhVLGWizvsqrjpxvgT:'%+?@BBBC@<<;;<=>>@ABCCCCCAA@@?>@??@CDCBA?2)#%2ALPPNLJGGGJLKIIIF@<72/+)'$#$#  !9^vyj^X]a[J<+3CTdtzy{~|tnpmjdWHDGU\defhgd_[QGBAGLX`gig_XRKHFKQZaeϽ~{~µpjgc`^]\YYXWVSQOLIFC@;73.-)$  %*.00/*'##! "!!&,9F_yǼyacsϸnf_W\e~|sdP<.# "2NsÿlT@00-,**&#"&)/6AKXdqzwpg`XSKECDCCFHGEC@DD>83365/*%.8?CJKPZk{tl]RECAACDDCGMSZbqzd_p~|ytkgpwxlb_YVURNILLOQWamuypgbadlxtfYXVRNQW^^^\\\][[Z[]][N>2.2@Qan}ļ{pnptvwvsnlkhhffd_][VSQLIJEEGFB?;?@ABCDDDDCBBA@@AA@ADDDCB@2' "-?BGKPSVdhov}{rnljhtxdZ\u{yvtnkqysjb`[YYXTOOOQQUZaemptvtme_\]er{qfd_VLJNV\ZWYYZ[[[YYVQD5*,2?Qbo~ú}zrssvwwvrkiihhfgeb`^[XSQMKGGJJGEACPi|{uohfddbabdegd`_bdhv̶dUP[hd`ZUOH;407Hd~|}|zo`J1 '/?LP]kpn`K7,'').27?CGORTWX[_bffghkmjg`\\XI8%(3699=>ACDDCA@====>?@@ABCDDDDDDCCBABBABEEEDCA4' *9EIONLIFFFHIIHIIFC?;4+%$  !>b|zcTTdqjVF/5@Pcu}|yuuvwvy{zxtsmcYUUVUPHGJRV\[]cddd`WMB>940-+'$ "(2896/+$$#$%&$% !'07@P_yĵr_L?FWn|rkv|fPGJG>2)%"!!(5MslUC7433630,%"#"&)/03;FR\gs{og[SMLHGMHA>>=96645=HNLG>9218DNSMQZhz|vqqk`VPIADGMU\ekn~xm`UNJGABMYVKJWxzwutpnsz}mfa`\\^]YTRSUTUVYZ\`glmh`[WX_ltx||seTNOUVVUTXYYZZYVQJ=/#)/>Sbn~¹¹|zuuuxyywtkiiggghgeca][WTQNIINOKIEGTl~{tmhdbaab``defc_^fhlz`J@FOMKEA@;3.*.>[x|xy}|}zocQ8" (3@MS_mrqcL:-'%(-/8>CINSTUXY_cfffhlqjf_[XR@/'2779:=ABDCB@@>===>?@@ABCDEEEEEDDCBCCBBEFFDDA3('8CHONLIGFHJHGHHJGCB;3+%! !FnybUThwoZL15=Mau|{vrpomkmkjighaXNQNQSQLLNOTYXZ_ccec[RG@@BLJDFINMLIEA?@@??Ͼ{wrsvy{ytpkfb][WVRMIGHHDDEDC>;831.*)&! $$+8<921*)')**'%!'3@GO`pɿrWA:6:CTj|~wlhegoshYJKWmrR9/,+&!))""-9Z{cM@726;:51-))&*,348;DO[hu{}xskc[WTTNLGEEDA>;AHR_gd]YI@=;FPNMR^q|wqjee]TLD=>CDR^go~}rcYK>6322''/63/AYx}zzz}zh]Z]^`ca^[\ZYVTQNJJNUZ]]YVPRW^fnuy|`QKLTSPRX[WTUUPG>5+&*3DRbr¾~{}~~yuqnjihjihfecb`[WWVRMMPOLJIOXm}~~~{xtifb``___]^``aa]]ejrY@646:984/,-013CYtxx{~|xspnVB.'-==>?@AABBCDDEFFEEDCBBCCDDGGGFFD8'&2=FGLLFDHHDFEGGKJEB<2*% + +  +"V{v_W]isuhN7;ANav~ysmidba`_XTT\\VNIMSQNMOPUTUTVVY[]^ZWRPSW]SECJPSPPMF?:533´ӿͿ|vsnid`^VTPMIFHGCDDCB>;:630,+($# '29723330/0/,**0ABDCB?=>?@AABBBCDEEFFFFEDCCDDDEGGGFFD4&'0=EFLMHFGFAEGGIKIFB:2("  +,Z}~l_X^hmqfR>COYiy{smfb_\ZY[VRSWWSNLNRPOKNRRRRRQTUWY[ZXVZ]dmg[W[``^]YUOJDA@źƱ»µ¸ywqkgb`WUPLGDEDCCEDC?=;742/.+)'#",458<@?<7632118EQ[duhPE4)&%%&.5<<9)'),01(+GfbA2./.0,' ).)$"'Bg¾v`OD=AGD?;76537:?BCFLSXblpv~}yttmjecdfffozwdTEFLGNWfz{pf^XTQJC<:7:DNevykaRNJGGGGGKIE>34Li}xtw~nbXZ\_aa`^]]\ZYUROJGFDEDEFDFC><@JSemuy|~z_RQYUONQUVVRNH=7/-*7?M[jy~wpmllnolkfbaa`^^^]UPMONMMNQXiv{}|xwvrnhb^ZYZZ[[XZ\]`^[[djvýsW8'+6979;BINOQXemw||yztqrw|~}xromcN7.7KfzlP;;=:614??@AABBBCCDEFFFGGFFEDFEEEHHGGGE4%#-:BFJNKIFDAFGHIJHDA91& /Ywze^X`ghlfXGN]hs}|wsib]YUSSTWUSSTRPNOPQNMJMPONNMMPQSWYYYZ_djqpjggiihfea]ZTOMǾɾľ}ztnic_XURLHECEDBDCB?=;85311.-*$ (15=EHHD=84466>KXcm}ӿ]@5*$"!&++(" "&'/QndD4.--/+&'+)'(<]nVLDFJIDB:9969=BDHINSX`imox{xuruwz}nZKJSOMUi|xmbXQKH=858>?ABBB@@AABBCCCCDDEFGGIHHGFFGGFFIIHGGF5)*:DHIKIGFFFEHJKJHFC:0& + !% 2Tn}wbYU]a_ef^NUbr}tkc[WRNMNPQVTWTRQRPPNNLIIKNJLLLMMPPTWWWWY^cijkkjhhighhed_\X¼¼~xokd_\XVOJECECCBAA>=;9765641.'!"*09:=>FVdmwҾzP2+'))$#$"!"#;\vkP?50-*)&'4798Hax_SIJLLJHB@@=?AEGJMOTYagkktnWGFRPR[pysh]TKC>203JR]cfhjkuz`QLPOOPOONOOI@41/35DKXco{ƿɿupqrttvohaZVUUZ^_^^WSQPJIIMYly|{~zwtqlic\XTTUUTWUWY\\]YYblujM::BLLNS[`bbjg`YQORY_cgm|~zvuo[B6=Qp{`LFLNF:6=DFKGC@I\xؽoN<646:98678<>?@@BBBBBBBCCCCCCDEFFGGJIIHGFHGGGIIIHHG;1#(;FHFGEEEHLDGJJHECB3*! + !)7EQKRbozs`USZ]ZbheYZezui\TQNKHIKPRQPTQNMNNMMKGEEGIIJJKNNNNORSRRSX\chljheeedfiigdb^³Ź{tle_^ZWPJEEDBBA@?==><9989862*%%+8EUZYQG@BFJRcqyϾqG+$'2<993(#Kf{s]M@95-.,%7GLPPVhk[OLPOORNLIGFIMNMNRTY`fghrlSAAOObk}zpj_ULC;5/08FUdt|liv|wsw}skb`\[[^]][VX[YUTUZVMHFA97:962,%&.8@GQY_bhhl~}hXNIKMLMLKKKE;1007;GOZdo|þǻwrtvxzxqf^QMLOW_b_^WTSRKHHNZp~{wzwqnjgaXSNLNMLNRTVY[\XXbjq~pWEABLNV]`dhlqkaSE?GSjs|yvtubJ>CWuhPHMNRK=8@EDIC;5Be׻nL<8@A@<9;==?@@ABBBDDDDDDDDDDDDEFGGHJIIHGFHHGHJJJIIG=5'$8DD@AAA?CH>CEED@><+#'@a}{y~u^VRX[Wajhdajwl^SJKFFFGIMNJKLLJHIJJHGFEEDDHIJKNNNNKLPQQSV[_eggeb^^[]`aa_^]±Ŀzpic`\XPJDDCBABA?==>?==<>>;7.)"#(6DV]_WLDFLS[jxμsJ/*1ARUUNA5*&&)(,,*.9BDVas{j^WPOHHG?60/1;NZ]a^_j}ÿtbSORUUYVUPNNNQRPQTWX^cdjs}iSDI[`t~xsjcVKC;4047CTcq~{ndiyzwutw~qkic^[ZZ\\][TVXUQQW\\OFC;45;=84/++/5:@HNV]fiq|}lXKFHIGGGIKKE<446>COV`it¿ĸ|xy{|~{rf[NHGJRZ]YYTTUTNJIQ]r|x}xtpnjg`VNLHIHFHNPSVZXTT_flw{dODCIP[aacgnuoh[KDL[t|xvtdQFK[wsS?=ELRNA=DD@;;;8EmʬcG=<76:6;>>;644)" 2Pz}e\VZZYbjghfowqh^TMFDBBBBBDFGIHIGGGEFFEEEEDCFHIKLLKKGIMNNPRWZ_aeffda\]_a`^^]ʹ}ź÷wnic`XQKECBDCB@>>?>B@>?@??;2-%! #'4BQY]XKEGLV_m{͸W<7EP^cmuzrmjhefe]TMLNPafdg`\dqziWRVX[^YVSPOQTTUTVWZ]caluxfVLXpw~wqkbSF>853;@M_nz{n^XcwyxvsswshgifYWVXZ[ZYSUVRNOV\ZK?;2-/9@=941014<>@GOZdj}r]KFFFDBDHLNKA=7:BFDDCCCCDEEDCECEEEEDDEFFGHHIGHEGFEGHIIKKJIH54,-6438=:1,.15:95000.& +>X{n`Z]\ZcjeggrvjdZTPLJECAAA@@AGGFGIHFEEEDFGGDBCDHHKIJHHIKKJJLOWY^elmnkeghgggeeƸ¸z~˿zrhf`XMGCBCBA??>@A@@@A@?@=74/+(%#!  #&0=PUWRMKNQ_jw­yaJ@J`q|wuuqnhc_\ZZ[dqy{|unjgfmprohddgn{¿rc[[\^`b`]XWWZ]^ZXYXW]`fstaYbs}yxvrkgaXND837=@M_mu~~iUMSbu}zurqsuusyrlhffd]XVWWWXXXXVQNNQUZOMA4.%+DMMC>>4-3.29DRalo|o\PH>@B?JTU\VOJGLUZbku}ſǽzqcZSOLMRURNNUVQOPOKTcr{~~ytqnkkkig`TMIHIKKMNRSWUTPNV^fmsw{z_MCFR\\_filprqmhipwwjXNQ]mwq^L9(,:LRVURQME86>JTgƶgSIFCBHFB@>?BECDDEFGGHGFFCCCCC@ABCDDDDEEFEFEDEEEEGGGGG671$#().+.43*$$1+$!$!  %,9N_fxrv~pd]XY^ehlgipy~p_XWWWUOKJHECA@ABBCEEFDBADDEFFFEEFFFDEEGFGGHIJJKKNRZajouwtqkilmlkȳŻ~}vxsv}~~z}ƽwkicZQHFFDCB@@?AABBBBCBA@=73/-(&#  #%-9IPVSOLSXgr}ʶyeRKUfv}|xstvy{zyyz{tjbbdkvyib_`cgdba\[Z^`a]^[ZY\_eqthgu}zvsrpkf_YPE;55;COYhsyxw~taNIQcx}ywsoqnmlkf_]__]ZXVVWXXYWWUQNNORTLI=1)!,F^cYD9/*0028CRcqw~}wl]SH?BBAL[^b_XSRX`els|ýĺ~te\SQMMRSPKMQTOLPRNXet|}{wqljigifd_RKHFIILMPSTSTQLLQYbhmqx{gQEDM[]aeiikmnnnqx}yiXLMSY]\M@80(0>KSXWWYWSL89O[fٹwf[MEFFGGHGFDCBCBBBCDEFFGFGFDCCDEBCCDDDDCDDEEDCCCEEEEGGGE?=6'$#)-*#"(&+ %-/2:EHLJXj{td]XY`glqnhhlqpt||weYQSTRRNKGFCA@?A@@ABCDDCBCCDEEDDCDCCBBCCDEEFFGHHIGLV`krz||xtquutrʰſxtuyxuuz~ztp~ĺxlhbZSMKHEBA@AAAACCCDEEDC@=952-+(&#"#"$+4?KTSPOZbr{ϿugZV_mx}}z}~z~vjecfpuqhcdhnihgb`^abebb^[XZ^dp}wtz}wtpnmjc]ULC9446BLY`jruz~xv{|iWGEQf|}wvrmlfb_ZXSSWZ[WWUVWXWWXUTQOMMNOFG=/%-Hm|qN6+),559BRdu||wtqmf\UJ@CBCQcilid__emqw}ſwg]USPOQRNHJLPMLQVU^iv|{yupjfddfca[OJFDGGKLPRPOOKHHMS\bilsw|mUFAIUZ_cgggikosw{}~|yvsplnt~}n\PMKG@4)!$).:FOW[[`debWTOOd޹rg`VFA?BEHHGCDEDCA@??A@BCEEGHFECDDEFCDEFEEDCDDDDDCCBCCEEEEGEEB9*%=[aI* + !( )330032**>Zrr`ZTU[fovuj`[\ahp}{{ywxʺkTOQPMKGFB@?==<==>=?@BBBB@AABBAA@@?>>>>?@AABCDDEECHS^lv}}{ẕ|rrvvtsw}}}ru½wlhb\VRMKGDCABBBBCDEFFEGFC@=861/,*(&$#"'/7BMPMQ^h{˶xre\Y`lw~{ofdgknmden|shfglvz¾wmffkqnmlhebcdgeea[VX[cp~|uonlig]ULB<5567)   + +@BCDEAABBBA@@>>====>>@AABCDDEADKUcq~|ӻywxwtsw{~~{y|}}v}»wngc\YUQLGECBAAAAABCDEEGFCA?;:53/*+*&""#(/;EIJQalɱsph_Z^jxyhZSRTVVRUcz~zrihkq{¿}phfkrppplieeehfhc\UW[eryunkiebXPG;75:=@DJPOSXalu|{|~reXPTar|zrrpid\TQSSTSXY[ZXXYYZYXVSSQPMIJIDF>/!$@m`A3-(*.5@NX_aYSRRWY[[WMMIHWoz{ywuuzŸwh_]^^][WQJFCCDHO[cjp{zvslhfb`^`^YVQMKIIKNOPOMKKIHGPT[`ekqv~p]LGHMW`iomnopme\UMJHGIKLJGLYiysfZVVL8'%4@JTU^eipx}z}ac۾^NLSQNJHFEB>:0'  +Qe@2KvrK$ -AOPK=4;RgwveUPJKTcq~{dI99I[bSHOazڭcSQJIE@:8775869999;<=?ACEEBBBBBA@?==<<<<==@@AABCDDBABGTbu~}|Ư~zywxzzzz|}}y{wnhc][WSLJECBAAAAABCEFFFFDBA>=:52.00(###$*29?GSdpǰsskc]_jxyfVKGFFJGM`y}tmkpu~¿vkgkrqqspmhgghhkf^WY^it|vqjfc`\TKB847<<@KYisyz{}}ti`\co{}xvpqnh_VOOSSTUVVXYY[[ZZYXVSQOLIHGGCG<-0^~jTE5+$*3>FIJDB>AGPZ`cbWUOJXp{~}}}uia`ccb`[SOGA?@CLYcmrzxspiec`^\[YWSQNJKJLNPPQPPPOLKQV[`chpt|t[OIKS\ekmprpfWH?6:@GPY`bafo{xmc^\R?.!&0:ELTYckov~vgqdOEBDD@<;999:CEHIIIJIHGFDEEFEDDEEGGGGGGKE@<3$YzVHhg1&@VYRD47MaqqdSNJLTdvyX@BCAAAA@?>=<<;::;<<>>??@ABBB?<^qoj[C0"(1:>;7..-5AO^hlk`]TMXny~ü|ujeehkjga[UKC==@HWdkpwtojfb`]\YXVSPNLIGHJKMOQTVVWURSW\`dior|k\PQTX]bkqvscP@73=KYeq|vkc_T@2!&,/38A=:9@JY`mquuuqpp͹~}zu~}uw|{vo{Ʒskda_[WNLHGDEBCABCEGGHHHGFCCC@;7486-(('##%(2FZp|­wmjibbgrz}|{{~zoigffjgkz~}vpqu|unpvsuxvsomlikple^bhoy|xpha\WROH@9?<7/-8L_krrrtwz}~tmimyzuqpqqndXLFEMOTTWVX[\^[ZWUSOMJGDBCBEEF:,#C^mwkN8#(07:5,$#%/?SbmrqfbXNWlw}ÿȿ{ulhjnqqmhb^OD=J\lxxlaYJ8*#&$" ""370)*,/06:BHKIC=:77687654345885448<@DFJKKKLKFGGGGFGFDDEEEEGGJEEG@/! 3^m}Q*&"&7GNLC/1GYdcTIFEIR`q}kF'9tعdJCED8+$$+-)!$%*,/02133224689::::9865654444566667899:?<:9?FRWaekklhgg̸yrnvzx{}Ĺ~{yuqoqrtvxyxjb_]XVSKGFCCCFGGIJLKJIJEEEDB@?><>:2.-)%$+E]vͿsligosvuxwwww}|z{||vqrux{xssvru{{ztqnlotqibdjs{~wpje\VOHFB@>ABCHFEINGGGEKU`enpruux{}~xrgehs{uqoqqtqcSE@ALKLMSUWYXZWWTQPMKIHB::=EE>3( +(D[jgUB2,,44( %5FWeotqnka\^htyĽwmjotxywod]TK@:9=OYdkuqid_\XXXVRNJIJICADFGHNQU]ehfa_``afkpt|{n^ZXXYZiqwvj[NHO`svcPD6' "%(,25MJQ\cm}\LI=5522148@DGGHD;6678720.+,-.022///37;CDHILKLJGEEDFEEDEEEEGHIKHFBC@*#48SB"  %Ov{o[;2-39;CML<4>KPNE<=DGMYn}j>!MͮaK@=8%#%" &(**,-./11//02125776544432233413565689::;;=@IMVVXX[[ZZǶ~rstv~ϼ}umg`YSJHHIMRW\krô{ne_]XUUMIHFECFHJJMMLLLLIGFFDB@?=?=631,'#+D_w·uolouz|{vwwvvyztpsx{|vuwtx}}{vrpnourlehmt|zqicVQKD@=>=??@CDDLT\bfgipttqqpqrvz|{{}|ysmg`[\hy|vxywrnmoxxsdSEADKJJLPRSUXZWWTRPNKJHC<:>CB9.$ +2HY^VJ91.0.# $+:JZclnlmohdcir}ypnsx|}{sldZNB<9>OYdlspjca\ZYVSRNJIGF@=>?BDPUZdkolgbbachlqs||pf`\Z`gvwytkd``fr~mQ8) ####2XsWG<873,.27=>=<>>>??<3-20,**))*..+++047>BFILLLJGEEDFFEEFFFFGHILIIDCB49QrzQ' + "Jyx`;.%)/18BH:/2>@<847?DIVeu~^;CjаY>0*'" !  $&'(*,,-.,**+-./2455433333222202443457CHGGHKNPOTTTSQONLIHFA=;?E>5*  +  /=HLIA711.'$(,4@N\bjjhlsqolmq}ÿŽ{uuz~zsk^TH?:>NX`gnlga_ZYWTRNKGIEB>;;BEGJǴ~sbSJF?94,)##!*3BP[ewȼƻ|k_VNOPLKKKIHGFNOQRRQUUQOOLKHHGCFEBA<3+*Gd}ĺ}|}zxwvvutuz}}wrtmkou~~yx|}yvppusplpux|vpid^VNF<8:DKKFHNYco|yunoruropnopsuxwvsmbWPOMOMP[irokijlmlotz}p\G<:>EDEDHIKJKKMKIJIIIHEA>=@B?5) #1;=B;86500448BNYcjljmvwwtsuz½|xxwqeZKB;>LW\agea\[VXVSPMHFHEB@<:<>@DKWfqsohbdehlrxzyohefegmvtx}~{z~~~~qO53BPi_1&0<@A?;:;;::99887521)))())**'&$$$(-04:AFKNMJFDFFFEGGEDFEFFGHQVPHCAX|M4&Hm}rynH2#(.7A5("#$%!$0;FQ_hx}Ի˩xE#  !$'$$"#$')+,,,,-/0/-+)+,--,+-04:?AA>@?><;9>AEGij~vjZF50*#$6HWguz{ŶȽq`TJJLJJMNKKIIQRRQRSWXTRRQPLMLFHGDC@6+.Jhľ{{xtvwxwvvy{wrnrljmr{zw~}{qpssqnrvz}tlhca^UM@64:GPLHLUer}wrsuvpjmkiimnmmnjbWOJHHGLS[aefgggffgoxqXB66;BABAEFHGFEGFFFFGHEEA?>@A>6* +"+1A?A><789;ABA?<976541..00**++,,+)&"!"$'+/27>DJKNKFDDDFGGGDDCCDEEGLSOJFDXyuP-'Dasnp}{kM5"#)09D?5+&%$+8DQaix~Ѱa6 !#"  !#%&())(*,-.,*(*,-,*)*.07>BB??=:9::?BEHʺ}¾̿|l`SE4(%#2@P[ot}ӻµwcRGEHGHMOOMKJPQQQRRVXXVVSRPONJJHDE@5)5Ro}zxwwwwvwy{yqnnojjls|»|x~sqtsrptx|zqidb_^QG;36=HMHELYjy~wwyzrjljhgjige`ZRLIHGF?GRXZ]_dedccenyqV?449??>?BCEECDDEEFGHFEDA@@@@;5,#" '.ADHFB<97??CJU`lrnowz~º~~xpeXLDAKQZZ^ZYYVTSRPNKFBA<<=<;;;<9BSetxuommopvztpqwttrusx}~\A a~K *-6@GF?93/142.+**0///,+(%!!$'*/2:?EHLKFDEEGHHHFEDCEEFGDMLHKJUloE#&?<53/016:BEHIİtfUF7.% %6C^lvyź|hRDACDEMOPNNMNOQPPSWX[WWVUSRQMJFAB?3&&=[vú~xvxxxwxz|yspoosprvvmffhiehlvĻ~y~wtvutsvz}{}wpib]YTLC<:AGIHGEOatxuz|vnlkihgdb_UMEBEGDA@BBAABCDEFGGCBAAA@?960+,+   '1AFNKHC?$ ^|r; ".7:8530142.*(&100/-+(# !$',.59?CHHGEEFFFIIFEFFGGGICIIINLO\shD0&3Md}{uoUA.%&&1=MWZQF>7+%#)/:IU^iq~ɗnUME8) !"#"#$&()*+-..-*))+59<92'""'1;FJLMżz~ɲ|aTB-  !4H]kfh~ƾiTECDFIPSSQRQPPPPPQVX[YWWUTRSNLFAB>3&$",Ed}ǿxxxxxxy{}|vne_\\\\ZYbny{z{{ulb_`dedgp{ƻ{}zvuvusxy|~}xsxtng`XPIJCDFA:=>@?ABCDBAAAA?@;:7486( &1>GNNJKJIEGLQW^finou}~¾{ul_VKEILQRSPPRSOPPSQNG?:9;>@@=;:3=Mcs|zw~|z{}ujcgmbbfnv|zQ% Nr8   $)048740*(*--./.-,)%"%*,/4:@EGIGGHHIKLJJIJIIIKGKIIPMHNTa@(/Kewtv\H4,&&0>KZeaZSMA/*(-7COWbgp̘_8542,% +   ##!!! !"!""$&),-/00/,**-5885*"/>JOQQŴ|{ɻ~gfqy~rdL?- +  ;KZ]cqyy{uejoWHCFMQW[YWTTSRTTTUXYYY[\ZWTQOMJC>93,$*:Sox{z{|zyz|urjd^YVUTRU[dloornhc``adjhiqƾ|{wuuqov|~zwusqnkgc_VNG?>8;GD<@:DWlµ~|~|wtuvomje^VMECB><<4)#'6IXhqqmcSA50.2;CFQXdku}sdʩI /1>=-% &(('&&%$"! !!&(+,/.,+,/785/# +2EPTRPū{|ȵlTXez|paR9.!    -9;>ACGMWZclpoZHdzY,76@@3+&  &*+**)(&$#"!! !%'+,,,-/420)! "5EQUTQ{|δbKTg|xm_K9   ! "##!  ';Ufid_QL@IzſxbSQTWZ_^\VUTXX\[[Z[[\Z][XTROFC>:50,(*6Kc|}zwtqqnje_\[[ZYYW[\aemowý~yurqqv||ywtuqokhfb^XPIB>=65;63;@Qj¶yvtng_SGCA??ACJS\afjlnt{iK/#,14467666552324347995328BP\^L5 *4@FMNNLMPLORUX[`cfksuvwy~{rnr½yph_XUSNIHGHIHJGOLIEA>==BDC@><3,(3F[q~ǿvX?0(8AR`ilmjuy}wsronjiea]XSI2 -S~qS-   +'19@;2)'&&&'() $(*/5>DJLNONNOPONNMLKKKDMTQIDJR`ejp~]B?OomT@/"#-FYnysaVPIGFFDBEIJQZ\]E2dzH<5;=51.  +#(*+*)(&$"!!!$(**,++)#$7GRXWT͵д_JTkxzvkZI3  + ! #"$$#&'$  + +'F^a]\SM@Guž}iZX[\_cb\VRRUX[^_^__`^]ZVPKH>9741+()/=Tmÿut{}yvsvvtoe]ZYTTWX_agkkr}ž~|tsrtz~yustsvqnjd`]XSKD?9823<;;DL]xø|rh\PDABDHLMS[bfkpsqw~mM/ )/244544321000112241.+*1?O_dS@()2:@GKNPPMNPMNRTVZ_bcgnrstx}wmkr{þzrjc]YTQKIGFHGGEHD@<;;>@EFD?<:1)&0CXo~ľy\>(*5GWbgignrw|{woif`^[ZWWVSQMG@1 4^vhM-  .9;520/-*'&' #&&*0:BJLOONMNONNNMLKJJCLTPDCThz}{tvsRDOk}kSB3++2CWjx|la\XSOKGABC@EKPQ:'Pn>105124(! "&'''&$" "%&'%$ !,;JUXVSĪV@J^ijeXI8$  ""()).34.$  1KUZ^ZVGJsƿoa_bbeif`WOMPTY^aacaa^\VPJD@91//.('+5E]vnnx{tolilorrkc^\TUZ\cfkokt~trru|{srqrsvroj_]ZTNF?9143;IOS]dqùvhTI??EKSZZ_eknrwzx}sT6 ").1223423211010/000-*'#(6H]fXH6,)2>FKPQSTTQPONMORSUX^abeklmoty|qkntĿzslea[VRNLKIJHHGD@=:;?DEIIE?;5.%"-AWo}cD*%)7FVaefhgffc`ZUSOJHHHIHGJJE?4  +$*):f}paI0###"'" + )13=<:7/(%#"!"!"$#&,7@JLNNMLMNMMMMMKJIELQMBD^{|q|lWYl~yqtlaNA8116BVlxwlg`ZSLF@@?<>DGG0!BƖI7/1/280( !   !" ! +4AOVYWTɵoH38HUUPE8, #&,.-3;<3&  5ES[]ZLNtvihlknsog\QLKNSWZ\``]YVOIC=:3,),/()/83*"*>WpĺlL2 #"*6GV]bb]WRQMHCB>:9<=@@AFIGD<&(/667RxrbL6.111.+$  $*=?B<3*&"%%&%!!!!!'39:98:>?@,$6/%(=WpȽtW=,# (7FRWWQKEEA=874348;??BHJJKH7& #1?CXnz|oi_XMC<14658<:9/-6]G1-/)$+*"&.," + + %,+*2;GR[]ZXĺ}cD'&,-+%#! +$'),*$'.+  '9@@C>Jtüxvz{vfYQEFHKLOQRNKGD?:752'%.1+.9K^uôfaiqwzzzzxxxxwuplhfeckgfilmjgfglmqpqqn~ÿvqtywspomhghhjhgdYVPIB80(8>Lo{sibdls|}~jR>41,.11../15676776795/*(&%$!$0Daz~wzwy~~yywsle_WROPRRRRV]_baeedgnuz{z~~zvsmhb\[[[YZ[ZWZZ[^adeaVPG<5-#(=Wqƽ|_G6#".>IKQJDA@=8531259>BBELMKQSE4) (7DMO^}lQ>:=>;94,(((&! &,9=:30.+,-)%!!#+5FIKJIHHIKLMNMKHFIEFHCBSj|jny{h]VSLB:8:<:;?BEF?Tkwvjb\TMD=-15699860..C\qw\2 ("##  '02*     + (--*3:GS\_]\fG/#%! +"')-(&"   "**211DpĽzwscSQG@CFGIJKGCA>;954,+/2/29Pd|ʼh`fmt|~}tswupoqlmnpppolligikllkolmmrpnlnz¼vos|xommnmdbcdgd^XVZOE@5+,3C[}~n[KA?750/.0//05746<;7>72.+*%" %2Hc{}ukaXTRSUSOQW^_baeffilpu{¿}zupjeb^_`acba^ghknpqmgWJ=3-%'?\vɼkL5("!$(1<2+.7==:2-&&,-(!  "%/6+% + #%  "'++)((3ET^`_\þ~cC* !  + )396.#  '&(>mƿ~}n^PGBBCDDDDA><<;<:A=;9857:<>@CFPNOSZ]^^YJ3 .>JQSSslUD?AAADB<62,' + ++7?=5/,)&###!!'5@HLIGHIHJJIHHGFFLFCDEFKSithgwxn_NNQB214;;>CJMMLPWfvqg^RLLF>92-/79653,$ + %*#!! + "$  +$(*,*2?N[]^Zº}`<" + ##  + /=FC5! +   7hº{kXNEEEA?=<<;<>CGIUUWXTOQXm~ıtc\aenv{|}pjkpstux~~~|usrtttommlonnni|{vw}~|xutvxz{~}tleccdcca__a_XS@JF;5+'.Qn¾zxz}~rh^XTB5%%,148<>==?=721.(##)/@Og}vh\TOMNNQWZ^[\[^__`dfmy¾»¿}zvqnkifgdhhjjllorrrngVH;2,$!3LhqT9)*BIKD?===68;<>@DGNPSW\afltlW81BPZ]bz~o^ODBCCHE@;81+&  ,:9<@EOY`jlqog_^bv˺o`_bhmsuz{lijpty}xtrsttmkjghefgfz¾xx~~yttssux|{xpib``b``][Z\YSN=FB71*-;_}utv{|~~}zrrstshZG70013=:52/351/4BK_mymbZVLHGKRW]`c`_^]_dhmwľúÿ|xusokigfgjmlmnpsurogUG;1+##4Pl½ȾfH1&>HNKD??<68:;@ESd}winlgdglhbWGEF8-6?EEDGLQQSW]gry{{te\VQMG@91134532354.( +   %+-,.:H[djgĻqR.#.43-&! + +):L[caQ8# ,P¶|ncXTPGB>=<=AIYiv{qliwIJsjiffhmstkikou}xtrrqpmjha`\^_av{zyutsux|yumga``a_^ZWUWTNI@G@1-/;Oqyssuwz}wu~zeRG?=EEB?>:555;CFHQam|rg^ZOHDFKQ[bfb^ZZ\diovǾ~zwvtnjjhilmlllortrlgTF;1+$ 5Ro¿xP5%:GSQJA=86789:?BN^w~urmkpqgYL=>D:2:CHFEGJOPRW\ahnssi^UTSOF=4-0455335132/%    +  ! $(7G]hqqǿeG%#,9AA:1*&7K\jqk\D, +  +  #>kƻvi^XRIEB==<=I\u}u{wndacjnighjpz{}~yusrpmjifc[XTWZ^t¾~}zxxx|wqjd____^[WSQROIBDG;:887778;@CLRY^adhmy~~{ubC* &;LV^bdqhYWYZXWRLDB><:81& *16/)'$"! *6BJOMJJJHHGGFEDDC9@ECAAA@FVo~y{~n\D45?;6=DHGFHKOPPX\adlrpbWMOPMB71./2566555797.#  +   +   +  %8M_kvxĿrX;+6EOPJB;.(#! "$%(/;I]kx~tgO8&  ,R}pbZTNJI?=:;G_}Ǻvd[[bfbaaafqvutvy|}|zvpononkea^[YQMJOT]t}rle`[[[\ZYURONKF?CD9,0:Mdǽž}yvttwz{{|½f]TQQQX^tzug[UPPUZQCBJPPTVUW\_jnuŶx{Ŀ~|zywqnpprsrojjmoomjcSF9/+#%:Xr[<% ->QSMFA=::888;@DKQYafjjnv|~|fO7% +(>MU[^fpnYRVZ^a]WQLE=:;4+&%$"$0.**$!!"#"$.9FMQMJJKJGGFEEDCC;?B@@CB==Lczz|t_D01<=;BGIIHKNQONT\fnw~{mTHIIG<310.11443055685.&" +    + +   +'?Ufq{|z||}|~iP42>OZ]XQJD=8359>AGLS_m{r^G6+%" $#  >wƺuf]WOMND><:F`ɹ|eWU\_Z[[Y^inloosutpkgggklmf_YTROIDCHN\tøymha]XXXYWXTNKJGB=>A5+2=QeǸǾ{qmjnv~©~vssvwj^XPUcg[C9;DHRYYZ\]fgn|˼~uz}zxywssssvvtpigjlljgbSE91+#(=Zs½eE.&*;MPKGEE;<999=I^uwnq|p^L50GR^{Ƽyrjg`[TRUXYSPLHGC<785568@TcǺý~|spidhr|˼ynh[S^pt];+.:OW`cchYabfp~ǿ¿¾}{zzxyvssuutqcfiijjf[QC7/( )=ZsžlUC8)1=KNNNKF?>><9;?BMMT[adjqpnorwwtrbXM=,&=FINVgzu_UVO[dlldXKA==7-/3+ &,,%%$$#%4EILMMKIGGFGFFFFGCFHHLOJC?EVnrfZ[ekf^FA@BDBEHNIIMPLJKW`slL::BB@AG@;8:<;9975578:<850/*& #(*    +  + +    "Gdoy~±{voosvx{~}|ywvtsqjjlorvyzz^?'%*.AN`jnllkorqnotvuqopt|xpaSKKB?71-*((+)-2.  + *eþvf[TPKG@;;FZvȳ~aPIKLJHHLT\`aacc`ZTRQXZ^b_VIB=>?:6;HRb{¾ƾtmca[VONPTRPNIHFB:5247>BHR\Ÿſƻ}{rlfbgr};~rlg\T_oqX4%'BZ`iljm]^^ahu~}{zxyvsrtsrmdehhhid[PB6-(-@^vĽjYN;)$,9DPRQOMGAA@>;=@CIKOX[^eloomnonkhlidVD/*:BCIP`zyj[JXajpnf]VLNE957/"+.-('''% (7FILMLKIHHGHGFFFFEHHHLOMGAFUhsuttbTGBJPUROLLMLGGJLHJMNJJKZgл{YA>CDAALHC@BBDC>9537:?B@<82.'!  9LWG) +    + +  + + 7\v~°zpe_^bhkpvutttsrrpmmopsvyzpT7"(/59JWhqttvxvrnloswx{vrpjc]]][UOHA95536;7( *f{j^WSQHA=;BQi}ɶgTHFEB>?BHLPQRPNJGEEELLMPOH<302445@BEIKPZ_adjpqqokhggqtunaQB8-**/339>TujIOU^hjiedaaZLFB9+!  )+*&&&'%'0=JLMMLKKJHGHGFEEEDFGFIMMICHTafffi]O@6:BNSZXYWRIHKMJMNNIJM[nӕpQFEB=>@EEE>946:@D<72*# Nt]6  +  /OrƷymd\W[acjnnmqprqqpopqrvy{}yhK1.9@EQ\krtuz|zqkb\ZZZZ```ceeginlkg`ULGECDC@1 -hmd]ZWMF@<>FXe|ʺnZNID>99<><<>@=9679;=CA??A<2+*-25;FS_pw·wj`TQKHCCEHIFFFFC?9535@QZWMGqžϼ}~wqmkoxǼ¸Ƚl[V\[NKMUWA&%4fz|}~~~g\[]cipy}{zyvrpqpnighjiiidZL?2)#$;OmƿüvjWB9=OVZWWVQKGHEDBCDGLPYcggikoqqmhdeghmqrpkaYH;-%#"(-Hmª~TKHMW]`acmoj]VRH:/" %&$!"%'+6AMNNLKKLLIHIGEEDDCEECEJLJFLWadbdih]NDDJYaa^\WOEEJLKOPNHKQe|㶔r`UJ@;:;<<;;<1,$ HwkA + +  + ">cvmd][^^dfginmonoomlmqswy|~{tcG-2>HMWamsttxz~}}zumf\TOMKJMQSW_hoqsuvtoh`[TTRMI:% 6orica]TMG@=>IRhq̿xeUOJ;5474.-041.+*,03873242,&(-4=EQ]frqqzƻtg\OJED@BDHIEFDC@=969:FV\VJAnƹ}}yvx}ĵȴse`eqo_NGGH8$-Cu{}n`^elnms~}{zyvrpppnhiiljjidZK>1'! )CYyü~xrbPFFUY\XXWRNJKIHGGIKPT`mqlkklnmjfbejkoru|zqaN6% %+Ch͹eJB@FQW[`otqgbaXL?. + $(""(4?NNNLKKMNKIIGEDCCBEDABGJJGMZfjghlplbYVWcje_YRKDGLKKPPMHNWv׼veVKCEHJLP[ahig_P?/')$'LuqJ*  +   )MsȻzofa^[[\adijigihjikmruxy||wqaE/3BOW_fqvuswxz~~zyywrkf^WROLJLQV[cmtuxx{|zuolb`]WQC. By{qlhd]UOG@?BEJIGGEA=989=ALZ]TG=ku|Dzƻ˻˸qknxsXH@?5(6R}pp}ygjv}rr|}|{yxuqpqpojkkmkkidZK>1& #/Kcɺvqooh\ROX[ZWWYUPNONNMNORTYcospnnmkigdeikrwxx~}p[@.&$+2IjȺyOA9BNTY_mvwqmleZL<) +  *59+ '3=NLMLKLNOLJJGECBBADEA@DGGFN^msnjjttojecfhaXOKGFHMKLONKISaɶyjklosypM-% "'**"!<_[;  + + +  + +   +1]ɿzog`XVVZ^cc`]_abafimpstxw|}vqaE.1EV`_ityxuxyz||yxzyuqnhda_\ZYahlrz|wz|}}|yvrkjf`ZN8#$Qyrmib[WOG@BGXf}ȿnc\XI<5667DTaa[K5&!"%'&#!"',28EPZdinpiea`alyɿvmbSE?<;1& &3Qjüлlb_`hlf]VXZZWX[XTRRTUUVX[[^fosrtvqlhggjmnu{gN;1/8BXsdTKU^``fpy}wsrlbUD1'  +=MTUA2%!%,6?JJLLLMNOLKJGECBABFHCADFFLTfyxlersrojda`UJDCGHIKKLNNKL[l¹ĠoC(,('1:<6' + &JveB+  +   +;mxof]XWW[aa^Z\]YY\`eilmvv{{tqaG. 0FZf`hswxvvw~}}|}zwutromkw}}||{zusronic^U>*"-Zǿvoje`\WLFEJ\jƻ~nb^YRB99) &FkgQ2 +  Cwÿɾ{tme^\YWWVUSOPPSUWY\^]krnieXK6%6Phssqqsy{{z}yxy||z{~~}{ytrpnsri]RB9*=lǾxoijhaTKGFO`yzphaYOKHDFUntP2 ""%,:EPRW^dknolhedgc[U[ao²{|||~~|~ve^[O=868ZzsRPWcjmkgde^ZZXVVYUTYdpwwutfds~sideovxwy~jZRPYd}~zxx{~{ytnj`M4%&2@JQKHMVX\\NHA:67;?GGHJLLLJHHHGEDCBHDCGHD?>Kd}oekmlh]P@8536>FMOMMQTNGOoZ30/4?IKICI@*  ;Wqq]K/  + Jö{skb\YVUTQOLHKNNPRTTXcgeee[M:(!:Vo}sqquz}}|}yxz|~~}~}|{}~~}yvsqonpof^XMH1!!Dtĸ}tppme[PLJO_xĿxnie^SNIEJ^{b@'#&+4?ERT\aimopmfddgcZQMP[k{þzy{ww{zyxwx}zo_XVL<436;DIJID>9:89;AECP]Q5(0i_>5Ntµoz~|ɿžwaPLNXuqbaj}v{~|{yxwtrnjjmlkjdYF;/#(8Yy¿qONTajkjgdc\Z\\YWXTV^oustlhlptuyqe^\gr~|zuoi`Q<-/9GQYOBABDEHC?=;;>CHKIJJJJIGGFGFDCCBFCDHHEDEVozqlqlf]OC6/04;DKPQOTTTPM\|᷆M=49FNOMKOF. ';M`tuhhWA& $;oƺzph`YURQNKGIIMRUUUSTYXX\aZO=*#2' &4Rp߫nLIR^gjgfdc][^`]XVQS^szoklqsz||ymilx~ysokaTD9;EOUWF4+*+03747:?GLPPLKIIHGFFEEDCBBBCEHKJHLRe}wsrqh\M>3*&,4@IPSRTXWVUZn۴{W>CQQNOUVL6'#!!*7@BGUdmdqthUG.    + .azpga]VUQLJLNSZ`aa^ZVNMRYUK:*"6Oiw]_eoy~|{{yuokgfeegjmonoommpuwxxywvsqonni_Z`gm]F09]Ĺ|ti^YTS`vvrtsrnaZOIOb|fK969>DJLNJSXaimnljidcglj_TJFFKTX_j}}uqmighhfehkoi]OIIF?66)*:txP>BaaG@Fd|ýǺºvipvbanptuoccgixywuplicYM@3'!(5KeƿݧiGEM]difeff`]ac_XTQS]r~tosu{wsvzqpy}{ysok_UIEGNUYL;+'(*.0/15:DJRSPKJHHHHFDCCBABBCDFJLJIR]oyljkcYL>1+%$-8ENRRVZ]ZX\iѩsKLXTNQ\\R?320)2;EG=6=JdsueV]jt|mP, +   + 3ļzqje^\WRPMPV^hlmkdXHBFKE@3%,=OXGMYhu~~}|zwrje_^]^`cfgfdcbbchmttvxxvssqpk`^ixv]DFgɾype^ZZdwwuuy||zung_\ao|j]\]`bc`ZVZ]elpokhfbbjrqeYKD?ADEHQdjrx¾~yqkgbcb`_`bfjcUGBCDB?@CIQQLGB<67759>MIFA/")?w_NSkú|dTNXpŸwkqd[]bfmmg__bfrľ|zsnibWN>.!(6EZ{ľڢdCCL]fheefhb_ba^ZXWX`p|{{}tmpx{tv~}|xvrlh^XPOSZ^^G8-/48:9136>HMRNLHHHIIIHCBBAABCDGIMNLNZh|k[UTJC;4-+,-5=GNOSY`^[\h~ȉWS]XTX`_UD;=;5:BLI<008Q[ifPAPk{dC$   +   =ytmfa^[YVX]hsy|yn^H:862,*!%+/3/9L`s|{zxslhcccdehjkmkieabehrtwzyxutqrla_l}{fQVpºvne``h{»ukimwvsprxzqjcegmrusnjfablvvi\JA<>@??ETZ`djowwkd_^\[YYZ_cf\L?:;@BEGJPVTLF=83567CKMPRYc^]cxיd\ca`ca^VIDHD::?EH?202CHZeN07Xmi^F* +    !#&Qź}vojfca_bep|ydL:/(# ""$)@\s}||}}{wtrrsttuvtwurolkjkuwy{{xusoofWNWhupbV`z}ulgck|ûwi\TZewxrnmnruurnihbcmxwiZH@<@DCBFMSWY[_ejs|¿~ui_YWWURRSY^`TC613:?EGLRURIA;64679>EHA82('4IiL=R|ķϼzh^SV\fzzpd[VQPSOSL??KTVX[_[XX_cfkyzzyxyvsog\M<* +2@[wſ՟eEGQenlhhjgdcdcfr{wurkhjv~wmjllqy~~|{wsnhbb``binqmUB1/4888879@KQSNEDGJLKIFCBB@ACFJOOQV[ev|fRE;20-++,17:DGNORSX_acmtdedfia^VLKOJ>9:AIH=526;L[L2/AGIE7#  #!-AmÿȻ|upnjjcegq}lR<.&!!'& :Ys{{{~}||}~~~~{zyzwuttsy{|}|xsqki]H<=LU`XUb~ķypjel{ƾscTKDP]u|wustuwuqmimggq{yhXC<:?EDDFLNPRRTW]bgnsv~}se\UUROLLNTZYN=0+-442.+*+17>GJORTUX]aes칃jgfhib_YOQUNA<:@KPI=618FSO?47-//' $3S½|xtrsnmjnv}vfSA4'#'+-0+! + 2Ql}zxz~{~~}|~~~}}zurnlb`P6$ ,:AFN`}ȷzc`bdjv·}vqhnyǼ~ugVLIPYj}xrpmopsw|zhSCA?>@AEFGHLLNMNQTX]adhnvxnc[TQKHGFDJQPF:,!(6FGNPNJA=7658><6.2'!%.IR_hnv~}z{kP,(-Iy˶ȿiM99C[lojgjk]C447453/2m̶ĸfM8:G\lka[[`XB3/,)+))1CS^^]f]MEFO`dn|ewý}|~yzzobJ9&*9DUiýӢbKMYlqkdehkdbffjz{vsuzxnmt~|ulefoswzyxvvutmjkt~ÿ|xxvuqllnib_^^\\^eg^VPORUTTPONNRTTQLKLKJFCBBCEHKNQQHHKVmxe\XPIE;60--18=IMPSTWZ\dw|^bkhdddd^TLIGHJIIJPSQOOOH:0,''$   'Cpƿvvsrvy}|}uk_VIA5..(!';Tfrusrsw}~|xvspma[L6#&6DVmqcXQHGCCCGLU\mzͿuu}wj`XRYcpwwpo|~ztx~taPCDCDEEEECDDHJNQRTWYYWWY]dhjnqstuxz}~¼|yung_ZOJJIEADIHC=/!*8@EHKG@72,*,-232-)! " (19F\o|qhkotyufXL<0L^gbUKLQOB83.).,/=AADFILONEGL\uo^Z\VI>741027<@LLKMOSY`s͒kegd`ekf\QIFIKKGBES__]ZR?0,2/+%  +   %4Zƾ~vp_R@53,$-CXiqqorv|}xtrqmj]TF6'!&1AHWiyoaTLGFAFDEEFJPV]fvŴ|zveUSX`dkusfdh~uz|m\OBDFGGFFFEEDGIKOPVVXXYYY\^`aabcdfiknpu{ſ~|yvqlc^PKIHD@?CHHE8)!*3=BFGD<51--/379;:;5238630)+.*&! !"+9ETbwslikkrplg^PDDWsª}uôxbMCFOZ[TG=?AEFJI>19:BNY\^_g\EIWdhq~}k½|wsrtttpomnljf]RC6&  *8DWtÿګjQVcwyofgllhhjjiow{xusyyplnrx|~}xwstyroha\UROOMNORXfrvomjknmhbba___djonkfec_ZUXWWWVVWSOIHC@=97;>BFHKKMGIRd~wgXVXPC932137=BEJHHKQU\eആkcc^bfbZQJDIHD?<>A@@@CEFHLOSX`q˻»}}ld_][\es{dY]c|}~sbPGAEGIHFDFIHGGHIKLQQTVXYZZ[]\YXWWYY\bdeintż~}}{xvtpg`SMKIC><>GKMB3(*+5;@A>84/.168=AFGLGEDHKKK>AFC?71.3489@IZd{|qjfdfgiliaTIGSrƶsm~nXGPPPOKF>567CUfdK39@MVWTXaofHEQ^elv|~s¾ľ|vqmnputrojbYSKB8."  &1CUnܮmTZgy|ukimlkmopmmp{ysps|{qkihflottxy{|tmd[VQMJDEJJJMZfx¸rkihmoke_`aacdhnrwtrqkbYSVVXXWVXUOIGB>8537;@DGHGHKNYn{i^UPKC=<53149?DFJILPTV^lӥu`]^^\XWVQGIC>9.($#/=BDIWgqolf`XSQNIE@;5237::;;ACFGJKLLSao|´ļyohedlq}qf`]^elwvbWY\xſ|ugUE?@CHIFECGKKLIIIIIMMNPUWVUUTTQOMLLKOVWY[^bt}}}zxvuqibTNJG@87:DKND8-(%,068733227?DEHNSUVUSUZabdddb`\YXPNMIFADBXpulb][\cmsl]M<:Tp~gcv~hUGZUOFACA===Lf{vU8;BPWRIR_upUOU]hkty~ž{ý{smnorvvrng`V?7,$ +  $6QjܰoW`ky~yqoppqsuwvuw|rigpvi_YQV^gov{~woaXVTSSHKQNIEO\sƾtifgknjd``bbbcjruw|}oaWVY\[YVWUPKFB<6328:@EHIGIMVcxn[VRKC<;><656;AEFMMRXYXez侈eX\YWQV[VKKB;9>HLLH=2-('&(30)    /Kxn\O?3("8RboryzsogZP?0#""#-;@JV`d_VPLKGHKKGC>:63333.89@DFFEEGGMY`duǹog_ZYYbit~xpf`\\drtfZUTbprhZKB?>CGEBACHMORPONKKMLMNSSQMLJLIHFDECGLNRTX\fjo|º|{}xutsoh`UMGA9215@EF>6/( &-26448:BIQUVW\acimjkr{~|{xvtmhc^XOF>>SxznbZUV`p{uk[C18KqįwfbuseZ^[QFFPTTVQWk}|gTYZ`aTGM]x{zy~~~~ÿÿyrqw}~~vh]RH<)"    /;LlݲsZkpwzwtsttvvx}zmb`frz|m]K;9FU`ny}rcZZ]`bY\aZNCIUn¾jbafjhfggd`^`fryy}}n`WTW[YWTUUQMIE?974:?DILLJKNZjzeOLKJC<B?<70((''(*220)   $&'3DXxubTD;3"3M^hltzxqk^PD4&!%'0;CReleTE?DCLVUQ[n|ɼ|phd]WVWYclllqx|ocUOUanvxxwrh[OJHUetyi_UJDB>CEDA@CHNSTUSRNMRNNORPMGFEFFFDBCADHIMRY^\Y^pŰ~vyyvrssog`VMF>5--2B4.-1;HOSHLU]]eɟkGNTNJPRMGDA@>:4/.*)+,,04234.%  + "&07;=FThtÿxi]OF>."&6M^kkorv}~vnfZPH/%!)8DSluZ@>;@HICDKLRURLHA8<>BCC?<:=AILNPT\i~øxme_\YWUZbmuwqorpo{}t^GCPXX_`djmfXLNMSdwmYMKJC=B@@@ABDHOSSTRRQQPMNNPMKHCCEDA?>@;BFGNW[X[[]l|sy~{wmjqpe_aSG?>800;DGB6-)' !*59;?HP\bmops{wjbMOVjtkd`ais{~{scK6NmƲ{{vǿp\PQXismi`_iv|s^X^zÿyw¿}q\K;,%# ++@Oqvcrtx|zz{zxz}zsupc^ccq}vY;.-5FZky{l_aff]Xcmj^QNPbn~ƴ~j`emkjmki`YURUW]gh\MIJLKOTVTQQRQOKGECAADGMPTRQQV]k~q]NGEHF@=>:4018BJNRNR]cnz]?FIIPLNIFDBA>85-++,-1588960&%+4@EIMUbl}Ľ}peVLD6)" +;Qakkmoqv|~wqjd_VIA) $2@_zmQ>CGILOT\n~|{yzuqjd^ZYUTTXdp{~yupot|}gOEEFDNRZfmi^UOOUfu|~m`QIGD@<@@AAACEIOTTRSQQQNNLNNNJHDCEB@=?A=CHIOVYWXX\j}}~w~suxxsiinnd^bSHBC?7:EKKC4+('!#+5=BISZbit{ypbXNRfxqlfdnv~|bH=Vuux¾q]RRZkuog\X`nsvx~~|sdbkvºxso]G7,# #! '0E`wdrty}|z{|z{~}|zlb^ZhxlO2.3CXhxrb[[VMN]mqg\UV]hvȹqdhpmkkkh_UNHCCJOL?67=AHLQQPPPSQRMIHGGFKMRUVWVUW^j{tcSNLNLCAA@976:BHNPMQ\jϛh@@DIOJNJHFEDA=:200/148;<<:3,$ !#$+1;CLSVY`lx{qaVLB5-*4BWfkjkkkmpsy|xha\YWPC:% *>dd@:8978GYpum`[TMGBA>:<=AFIILOYk¶}vpplprrqnjgfccbb_]ZYVQPPVeuzytnv{sbQA63;AL]knh`TTYiv{|{trtz~{pfTNFB@@>;BBAACDFJPSSSTRRRPOMONMKGCCDCA@BBBGKLPUVUUW[gystvvwrrrnghkkd`cWNJJF@COQOE4(%%$&-9EOZehmt~yfN@GareehnzpT0ASlyti\YV_k{ȾziirrmkjfaXK?3,771$ &29EHLNOPQTRPNKJJMOSUWYZYYYZ]guxl^ZZZVMJGIC@<=AHNRQT[sĆN@DJMGMKIGFFC@=731159>?@A@:60-*0+-012;ANU_edgnvte^cj¾pcWOB95DGEEHKVlzoea`_bcba_][]YYZYXYZYSOKKS`q~tvvvy~~xgN<9:?HYipmh\Z]iy|vplicYR?@?@??>?CCBCDEGIPQTRRRRRQPNONMJGBDDDBBEFFLPTUWXYXY\`luluw}yolljggmmhdg`YURLGIRUPD4(#$%(/\x˷req~|jSB@GZif^M=9=<:<>;9642>Lcy̵uqtaJ6$"#" %))(&# -Kw}hrv}}|od_dpxwy{n[TXhhD:8CXj}}hQ@95;Qk}}n\TPWbrſmkssmjfee^TE7,3.&'4=DEHJMOQUOPMJKNPSVWXY[ZZZ\`fp{{uljjhd^YTTNHB@BGLSTV^|ީcFFMODMKHGEFEC?:766;>CDFEEB@;:;=:95>Onuh[MD>CM^krpokgdddjkkhebaacacdb[VROLKNRPIA5#.HmmW@/3F\to[LB<<<::>BEBCFHKWvti^WTUUYVWWYZZ[WVVUUTSRQMIFKTbm{sljmqu}gVSMNR]ionja]^k|~n`SKD@6:>AABBDBBBCBDEINPRQQRRPQPNNOMJGABDEDFIMPTX^^^_bfgfabmou}ww~ohfhhjmliikjc]WNIINSMA4("#&/7ETfs|~u^H?Vn}mWP`lj]?44LjκudpwdJ617Na^VD0&$!!$(('$"$2@WrʻŻtnývaN=/#!!! ""!  $%'+0333/,($ "#)MvŁlpu|oZOQ]dbhrl[TQYq|gMB?J_rjP>45FVm}}mYNMT^l{qipsohbdedaVJ@92)(,4;@@>ADILNOMMJJKMPRRRRSTTVX[_birz~}zyyxtqle]VNIEDEKOSXeſpJDKMELIHHFHEC>;88:=BFFGGHGGEFGGEGJNPV^ehorrrtwu}zkV:%2`Ŀ{fWMEIQ`ltrqnifeeeffbZRKGIFKONGDCFFJOVXYVSJ@8/0D[t^H8D`z~ePA9698:;?@AAGIGL`~~zwvqj_UPKMMLMLPSX[ZYWUQQONMOMGCCFOWivzlb_^`qu}yqphfejoqlg`[]jzlXIA=<9???;9;=CEJIIGHHGIJJHHHJKNPTY\_cjt|}th]TLLJHHKR^tſzRCCKEKIHGFFFB>;8<=BDDEGFHHJKMOQPTY^_ejnouuwvwwt~|iJ0 >~n`TLNTbmtssplighfhieZMB;3028:69=AFOXckquz}xgVVgxq`WgſnUB61357899=A@@@@CDEAAABACDGJKMMNNNOPONMMKHDEHKLPTZ`fgnstt|obiv{q}l^ZZ`eeefgiieaVMIEGOF9/(%-8JUeox}rVHInĺz{d`quoqmf`TZoͽvxpj\D1-2DSNE:-%#'6GSZ]\XZ`gqôõieÿtbO@2/351--0.+,+))))+-1358>ABDBA;5.(&+'!#5Wy΋ujum]USOILSUPC;:DOTVZOEDSi|n^MIK^aeig^SMNV_ejurcelmjgggkqqmhVLDGLJC@<89;BDHEBABBCBBA@==?ADGNTWYZblxocWQSRMIMUhЍcICKHMJHGFEE@;98=?DDCADFHIKLPRWW^djkpuvv{{}{|xw~}dI$5lƻ½ueYRQWdntsuqmjijimok`PB9'"#).-4=BIV`myxv}zu[E6./266548ACEGEA:0+!#$!8VЍwkt~{{td\RJIJHG?859>?GOLBCTk}yncWTW_]\]\WQKOV`ack{raahllplkmsvqodXORVRHD?=;>DIKG>?==:8767;>DIMQRTXdr{tgYVYYSNV^txWKQORQONMLIGB>=BFGGE@DDFGJLQSXY_gklswvw|}~~~zwz}}u`=,'>kѿĿwm_WSZgpwvyxvtqomorsm]I:* +4=CJR`jsýdL6%(,11/.05;7353>_ö~xrkd[TOPRVUTPIB<8;>GLSSSQQPNKLLONGFGDA=A@>>@ACDGHFFFGHIJJKKKJHFDCFHMS[dlqxz{wwniv\KHOPLMSUQTWWTQRONOH;0+-:GZes{}{kRQg¶ʷzlPPUbs°vg]XJ?1,6CEA9=>:ARah}vnkij}e`|r_MB=??=:?AEF@725;>@GWl}mb^\ZWZRORSMIITW`ffgto]X^krrnllmooqdaZYXTLB@>>DLNKG@?B@A>=:555579=AGKOOPVduvj`[\__``s̜w^TW^]\\]]YSLIFGHJIHDEDEEDFLQPU\chkrsww{zxzz{xaXU`y͹|sg]\aov|{|{wurpnoquthUF.&")6@IPU]jryÿpW@-&*,.*('*10/0.1Kgȹyrjb]TLIJMQRONIA<98547:>;9535;>>=??BCEFGGFDFFGGIJGGIHFECBDFNV`jty}y~xnvxZE?FGEELNKLRUUVYXUQG<103BO^fqx~q[MXqİuinv~ymdqzιn^RKA6-(5CFC7BKGFMY`kkhcYLC=D_q|Ⱦc^yyhWG@A@BA>CHLIFEB@<::830..05;?DDEFFB<720-++& +/Ou֩ot}rgZ[j|zfTGA??HMNF:10268CXtvf[XXVSUMGGHFDBNUdnonvoa_cjmspommmkjeb]ZWSKEFEFGLLLIDBDA?=;986769:<@CGNOOSdtxpihhgfenÜ{b^fghjnnke]UQQOOMKGFEDB?@FILOW^chmpttx}~|{|~~xqnxȵƿ~~wofdiu{}yvsqmlnuztcT8107CLTZbiszzqp}ºeI2#%&(&!$'+-++<>?CGJMPPNNNONOMKKGB>;=CJPYciijjlpuy|}~~{tkbZX\frzqbURMJGB:2,*-059<:4237=@@?ABEFGGGEFDFFGGHHEEFEDCBBDGPYdny~rp}zY?7<>?AHIGKRWY\_]YQF:143.-13@YwsiZQPRRQSG>=><;:DRiz~}|meghgdlkmnookjigc\UOIGKKJIJIKJJFEA?=;9:797:;<=CHNPNP_o}vpnnoqrὑl`emqx}~{vo_[USPONKJGC?;DNSY^kqzpeesz|ȿsP4!  !&)))3Bb̽zqh`VOHDDEIJKHFC?===?@DFILMNOPOOMJLHD?;=BHV`mtutpossrqquy}~zsjeeirx}|wk_QNH@941.(*.37;;8226;ACDCBDGIIHFDEDFGGGGGDDEDCCCCEHR[fs{yrywu|X;268;:98887899;AGMMKLYg{vqpv|Сwghrzib]XSRRNMHC?::@CFIPV]chmqtw|~yvvtyɻľ~yyz|yvuic`hrtk`QJLQVZagrw}x~xnhkgcn{xY<'   !#$,8Txne[RLHECCDEFDBA>===>>BDHKMNOPOOLJKIFC><=AR\lx}xridejmx}~}xvsstwvspng]RNH=3./0-0488864028=BDDEDEHJJIGDEDFGGFFEDCDCCCDEGKU^ht|wuw{u[@258<=AFKQX^bfe]RE7,*7DVba_bjz~zocSHGWwȿ{{{kf`^`dfgpiPA9:92-/9CMQUTSYgs~lejn[KB88<=GQSRZ`f^N:0/%! %)E`xý{aViþm\M<8?ACCA?=@A;/'&((&&+*%$(-2c¿辔kyzz}wi^L;68?APW`a\PE@>A?;3-,-14>M`q}pcQGGJMNA:666323AWs}yqmpwxog]_flqssqkgaYNGDBCFGEEDHNQMHC@===;9:8::::AFKOPOZfy~{yz~ݲpisqld_[XVSOHC<88>?BELRY_fkqtvz|}~}usrqx}zxwib]ajokc[VX]aenu|zqsx~tj\U`p}}ƼoS8+!!"+Fuòtj^WNIFDCBADDCA?<<>>@ACFIJLMMNMMLJIHGE?;:5.35/'&0;?ELMKLSZbmuzsdbkkTB727BGS^bba^\SC,  +UjehyŽ|e]n{e[O?;?BL[cmv}}yxxwtsqpjhedb[RJDB??@AA@89@JU\XOH:96/(&&(04?FLT\bhnqsx{|}|xwxw{ȺȽ}{yyle^^fmolga_bgjqy~vuuvxxjccgq{zºrS>) %9jű}of[PJFGECACCCB@?<<<=>ADEHJLLKKJLKJFFEC>;:74334641.01249;=>@BEEFGHHIHDCGHGEDC@?@?@ADEKOYdq{x|wx|[C26::32?PY`glok\M9-',>KU[Z[`gv~{vkaVLDEPfùkUKLPW_cb`_bc]PA5//4861/5<>DKMLKNRY_dit|td^`n~fN;/.7FNZejjc]XM:  0^lXYy¹xf]mǿq[UM>940/.0453/)''1?kլly{}}qbHA:;CIKG;67@PWPF540*%$$%13FOX_ejmpv|{~Ǹ¸}{zznh`_emttmheehiow~vxzobXbqsszƹgN1#!!$&0`ðzl`UMGEFFDBDFDBB??=9:<>BDFHLLJIHJKJEDCA<;;?EKT`mzwh]WZagfisy{~zpaTOKELLLKF>9624540/3379<=>?ADEDEFFHIIDCGHGEDB>=>=>@BDJQ[htvwvU<16:8-+;PcinqqjXG8-(/BNVYZ\biu{tgYPD<7?Pjƿ¶r[DFMXchea^_]WMB949:767=BILMNPSZ]]anwo^[`p{eN:./9IQ\fjjb^ZN7 #:akXgvaWexȽnWQJ<;AETkx}shbYQNMNLJHIKNJB;8<>=:5/*+56Uׯr|{~}p`MD=@JRRNC4*2EMG??DDEFFGGGECFEDBA?=<=<=>@AHQ]kyy}lL7*.0/)+;LerywqhVD1,,4DLUZ\]`dq~zjZVLE=?DN]tyogca_]X]cb^VQPOMJHD=3.-85E}Ż߾}q^KD?DR[\XK:)&09<:++*%$$(,/6E[vlZJDDA<:;;<;9=N_xylaUKHIPWZ\hwtvxvsquwokghh`YVX\bglprqiddbba_[`\ZWXVYYaba]WQMJKQ^p}luztneYRKB:464,/:ENU\`kqzǹĹ}||~|zojcbgq|{uonpx}}}{z|xmYICIWhȿzY?5/(##!I~̼rdXRMIFDDCFIIHDA=:75325??CDEEFFGFDCEEDB@?<;<;<=?@LS`n~{}iG2&*-.)+9IapzzujUA/+.7GOUY[\agtsh\VOF?=CVhĿzbO66:DPWVSRSVXVQJFEB?>?@><;>AEHJKKKHHMUZZX\fu|dK8,/9EQcjr}ub@   /O^khtÿpYOSggQKE=>CM_s|yvrpuxysjec\ZVUQH;738-6lȾǙ~o]I@:AR^`[K:( '163-+)&$%(+09I`yrWKABGGDCBBCCAFVgui]RHBAINOR^ltx{{vrstmklopmjiinsy{somifcb_][ZZ[]^_^YPHD@ABOcwxs{~xodXRLE<87713??CCDEEEEECBDDCA?>99:99;<>MUcr~|eD* $),)+7D[lz}zmU=-*0:>N]sľ¾{gP@/039@EGGGKQVVSNKKFBBDD?;;=?ACDEEB@?CJOQQYbp|{cI4),7CM]espK! /$ +6V_hk{ƾnXOSd{bKHD<>DO`t~xtljfd_UFA:<-4hӰy}}yi[G=6?Q_b^O<( '../,+(&$',1>;7>Tl¿¾ɐux{mbVQMGA=;:7:AHR\fm{¾̶~||{ytoifitzttz}|}zrt}}vpkgc`fSEFRe{ĿhOA86,%1]ijufYOPMKJIIIIIHEB>98540/18>>BBCDDDDCBACCB@>=767779:=LVfu|y{wc@)%++,5?SfxrV<++3@PUWXW[dn~~zwutx|l[PC<8:BJVboolfa_TND<79HVk}}jUB713568:=?=AGKLKJINLJGDA><<<<=>>???=;=AFHIT]iqttstv`C.#'3>DQZlzV*-<.$>[_hqɼ{kWMSlžv^IFA:=:::=KT^hsxna_YSLLZq{ttoeTK>;AHMLOIEEHKKHB<524>BBCBBBBAA?BB@>=<6565679,,4BQVWWV\fq}naYTSVZbrfP92-04;FPTX`dhhc^TMC:6:KZl}mZH<8:;<:99;>8;>?>>@BMQRK@9:>>=<::;<=A?==?BDEOWafeddfqrsmY;&".8;FN`}^3"-:00Ha`iyȽwjYOSyžqZHE=79AQ_r}{yuo`QG::18hϚv|wqgZTD>8=KUWUNA1#$))*+,*,/2;<>BA=;;;====AABAAAA?@>A@?=<:5454568;ERcq{wrnojZ?*%04447CXo~|`D/.4APTWWX^hr~xkXH>75;AL`s|]E.*-7ALW]ea_^fjf`UMD:9AWhxq]OB<>?@@>==>?:<<:669=KQSJ;38AA?<:9:<=CBBABDFGLSZ\ZY[_fegeQ4 *37AGXsh>%"/( 1CTddoû|ui[QVÿǾmXHE=47APat~}}zteUK@<.3c÷٨}uphYQNC@;7759421358;CDEFFGEC=>@A==?DYl}wi[J?BLQOOQVakkaVQGD?<9:=?CDFFEHMOOJHFEDE?=;;;====A@AA@@?>?=@@><;:5454567;CPbox}rnlhbR9'(49855=Ri{gL304>MRVXZ`jr{~ztjYJ<1*-2=UkmYEABKSZ`dnf^X_eebYPF=?Kf{½_PIB?B<<=>?@A@?BC@:8:=HLMD83:CDA>;:;>?CDFGHIKLLRWWSSX^_]__L. *38DJXp~vO, +CTdihsmepysi^TZƾhUDB=59CQbv}|{|{vhWM@<.3aȷ༗yog[LFGBCBCCFHJHG?2#!%+18>CHQVSPT]]fjwyh^bfa]^cheZRMH?AIU\YUPNRaoxyh_do{wXKUarldfga\XQNPRTV]co}èκ~|z~~~|}|tlfglsrmaYRPZdpy{}vo{}dB)4dp^SKDBCFHNOQOLHD>;77574101367@BDEDECC;=@@@BFLcw|p^LFXnth]FAFRYSMNDC@<8788>AFIJLTXXTQNMHE@@??=?===>@@??>?=>???><:9545456:=DRdpv{olid^K4#!*7?=8576>BDJNPPJE?<99664/-./036;=AAA@>=>@BFQ]fuwjUQ^TC?>;96<@GOUY^acdaZQLFCEECA?><;<<<<<<>>@?=<:999421359<=HZlvz|tigaP=0#$+499;>B@GXpybQ>73;DJRZ_gs{{vqnrpqtvrh`L>435=Sh}oga^\][YVVXY\]QI78LiþyfQDEHGC25897:?DCKQQKFEFEED>8:BJMJFA<;:;<=<=DK[gz{uxzxvjXJ@51Ca¸ƣ}xl\PHC>CDCC?;?IWh{ʲ|xrtv򳒈w^Wciklgcgqulkowȭ|y~vu}~wm^WRSZ`a`^]`hqtrlqnjc\UX[ksqfcacozfK/%My|l]QIC??=>@CGKLNKGA?;96853..--/379<=>=<;;>BIVhswiSUgurp]@/1:=;;8;AJQVX]^iif^SICAHHGDA?=;9999;;;===<;:765111269;>I]ox~{~vkhaJ7*%-47:;AF>DTjzuaQA;6>CGOZdmx}vmkoolljbWNG>:>DLau{xqmha^\^`j]P:;Mløg[MFEGD?8;==;=AEFJNLGBCEFEC>;?HOOLFA:866237@HNNKFILKKNV\[Y]^M/(6DFLZluzR,& &5PfdZjqTLMSWZdp}z{xqc[_¾pTD::<Skҧ{wl\QKE@A@?=935=QarlU8)!!*1>GNJD?=AHSfts]]es{xtttsqmhda_XLB=98;DJRc}˼vy{xyw}¢oXTdqtwrot~|z~ȯ|wz̶xsv|yufWJGNX[\ebcgklc\YTPKGBEFRZWKJOZjy~vm^ND5$BjsbVOKE?==?@CEIJNLJFC?:574311.,,0458:;::;:>DOcx~o^Rax}L,$-05566:<:BNYafmqxvsi\MEDLIIEB?=:777799;;9:<;;741-.258:;?AA??ACGHJFA>@CECA?AFMROLF?:621,,/6>FHHADFGGKRXXZ``L-&4CHN[lv_<5,)+2FXWObpZVW]_]_dpx{x{~wg\_|½yaK>9:<;DO_k|~{z{{vrhUD2*%0>M^nga`gieek{㷒vrj\RMFA;=<94/5@XmgI5)$&09GOQJ>74>I[qxiY_n~}zwtplifcbYJ<5228BLO]}ʶ|rx}vx߾nTUhzйvw{{sv}uyȹ|zzyzwqcQCBIQVhedcb[RJD?=<>?DHN]\QLFGP^a\MA>5*+%<]{jYQMLGB>?@BCEHJONLJIB;6534310,+01135777:=BM^t~r`Q`xX/"(-16?DAEPavyeSIGMLIGD><:7555779989<<;62/-068;<;>Nbu~{{qm^?)%+048:@C>AHU__RI:89@BFQasz~se^RPJGGFECRU\glowlY:8QvžoVLMOQQNIF@ABC@@??DEFB>:;@BGKNOLIC=8410.--04:=@@BDEEHMRSYa_J,,IUdp~||yspcP?1%!/AVfb^`efa]bmprvҭvpmfYQJDA89850.9GdzuWB3/1:ER[UJ81/;Nc|~k]`j{wrpnlifa]KC=;8206EK^Ȳyy}wux~yuuvwyz~ܶpWXj~ƣjmu{rt~ztnuɰҶ}}{|}{}xuvtuk[KACNVhec^WMC<<86:=DNVfuueVC6;BC6$6SwrcTMNMHD=@DFFDFIMMLKJC;6023421.+../113568GGJWsiRHEOLIGC><9666666889<>>;50-,18===?BUiz}}}zoiZ<)$!"(049;>?DBCIONE@434=AHVhz~~te^LGA?BHOTfku}~iGAUyҽyXNMPPPOMJIBCCEEDB@>?A@<8658:@EJKJGHE?:753331..269;DDEEEGJLRZb]H+&8EKP\evx\B5/02ASYiowzxnfgmx}|wmelx¿}yqi^TRQLC=42:?CMXit~|{wok^L:,.Gaorrrtrlgjnkc\ZaqŤqnj`SKFC?;:51./>9.%&=Lfƴ~zvw{xqkha_`aemv~gdtҲsqwzpr|{utp{ϪytsvyyywnmknjdUKIT`jii_THA?B>=>DJYev^C2265*  +,Eg~yk\QJJKGD=CIIIFEHIJIJIE>8//1120--,,,--0376=K\pth_ZzƼwH#  +6=JTṉ|eRLJMJGEB?=;66666688<<><84/,.3;=?=@F[n~xh_R;.00-057;<>>FB??BC?<30/9BM]o~|ph]XSPS[dkt{]P_}ӾgKJMLHGFFFDCCDGIHEA9:<;953049AGHGCAB@;87787541137;=FEEEFGHHT\c]H, !8HLMT]gshK:477I\iw{|ummw~yxuolts{~½xpid_YOGEEEC>2/8AFP]r}}{voh\J9"5Riw{{|yupmputpjdbdgp|ȨskeZLCB@?GB;65:IVlzztk[IEFO^cUA*%+A]una^m|uiijlng\SHA<70%6KjĽ¸{z||yxpjg_ZWTW\dm|yuƨ|v{pqyzsprylfpɾ|vtvuvyvkeaeef_[X_dhik^OCADIFFGJTgxeD0/56/   +  +1RmidXNGEDCB?DKLJFEHFFFGGD>811111/--.-*+-046=>;61,),4<=>=AH_r~|p_TK;5;;==@@D=769=?@:1-8DRcu|wurpqv}o]d|Ź_HDHD@>??>>?@CGJIEA766542206;:99:<:98779=@DDDEFHHHRZ`\L4 7ILHKR[k~sZE=@AOiv|xwz~~xsprpnlutuqpppsv~{rkfb_ZVUSRSSE6.;FOWc{~xoh^L:5Wo{{utuw}}|vnlfl~վvjdVE<>?@LB86;GXdku~i^SPZ]O:# ,Fh}{hadtugcdef`WMC<5/) 5MgȾ~||{y{}yvtic]YX[ahu񺓕սs~rrwtkio~r[YbŴ|zxwuøxh_X`bfeeefd\bdWD8:ANLMMQ\snH.*575+%$!#   @\Z`ULFB@@A?EMMKGEHABDEFC>93320/-,+.-**,/48DHRbvujgo|õrQ5'&!3BNSe̷tPCEIR[LHFDC?<;86668899?==96/+',3;<<=>BD@:427=CE>3-8FUgwrbezͿx]KAC>99;=:8<;?DHHC?85200022:?ED?;=@?=;:9;;<::=?BABDFHIHMU]\Q=% +3IKEEK]lfNDEEUn~~uuzurvxxxxtnhhmlihqvtkfb_bit|~{{|~xpokfdfgfddbO;3=NW_jy}zrk_M="3Xv}}}tnghv˷zldTA:;6.*(12:??:BPl{z{um`KC<46FOVUSLD;>E@90,9KW\RD9=FUh{q\^Ǿ˽iYM755344552789;<;97//234467<;=@@>;;>>BDDCA>=>@BDFGFDCKRZ^]R:#$>KKLQepi]PLR`my|~}wuyulinstplhb``^^aeorwuk_Z`iu}}{{~~|vvsuvxuqiZ:4GW^kqxronopptwwuv|yrmbP>) 6[{}}~}psyidTB<>>:8559EVl|ϲre`]O54Rpyjbdn~se_XONOLD:6339>:6@Qc{ĺ|x}{vsrprv{|vplns{ờԨ{xuqaQUb}lYT[decba^YZ_buƽ~ʹyi\QS[dgkkh\IDA9,)6FUWVSWhsT@7AKQKGF<./," 3AJMRJA?>>>>@BGGGFFGFCA>=;952020.)$#!%+18;GUfq}~wuƿw[E9755+*:SdkrzeO<3(%-?QYTOJEB?<:86334677=>?<70-+/39?>>GUn}xurmeYG;4*->GQPONG=>B=:69J_lodUGHMXi{oX[~˺`TM:31///12112434431..358:<<=?CCA><ADB@>=>EKKNORY]WUW_jķz|zuroopsuzzxyuprv{⽞ܳ{wskYIO^~vR;8COTPOTWVWZL]~·³uf]VT[cgnok]G9+%"(7FTXZYaq{`OGHQZVTQH;<6+  + -BHRLE?=;:9:>BFIIIHFB><;9:63230,' !'08@CO^oyȼn\L@=?924CXhpxzpYE9../..9MYWQMIE@=:531157:8;<>;731003;?@CM]s~~}{wnjhb\S?4)!19ABGLI?==<;>H^tyiZXY^jypWWrǰyOJK71.+*+-,++*+,./..-.5:?ACC?@CB?=<=CCCA=;9::@BEFGFFEJR\ghZI&&9MU\`is~yphcdhnrjmlnw{td`_\]XVSLIIIMRX_lqtvvvxz}}}|uk_R;>Ufpx{zvk]RJFE=>?>>BIPLPXbjqssstrrrtx}}|}wtqklh[L7'"?a~|ȿ}tlaXQH<;@N]p~׻wbC.7Kcytgfp}tfYJ>45Mfxͽȴ||}}xtolggeeedccehqyᾞ⿙}}tpfUIQctP:5BLQJGKONLMHRiȷte_]WZ`gork^D/  +9FRV]`gwiYNKSYYXVMFH@4'  8CPQIC@=<879=BGJKIF@<986<83320*& "&.:DNR\gwǵwh`TD?C9:@JU^hvttm_PEBA74;KYYVRNIB?;521157::==?>;66437=BEKUasy~}xurmhhr~ynir{zy{vphc]WRL@7+ #(,8CJC?==BHVlsgfeflv{y_Ud{Ľe<=D43.)&&'%%&'&),01312:@DFGFCCEB>;;=@AA>:6225:>AA>:9=>ACEFGGIJNVckfZ8..:LW_eiq}ytolmmopefgn{~vgb^\WTQMHFGGLQZ^egnw||||{zxpcUJ9@ZkuyyyteVJCAA@>:4/.2658@MYdknkic_]_dkosrpkghkgecdgg_R=, +Fhƻ{vgZRPE7BXtdzrO:DXjzyphlz~xm\J=15Zµʸ}|{zulf]YUSPNLLQYemsyzqktġͦ|sodTLUdvT<5=DIA>DHGECIMZmɷxha_WY]bilfW=(!.:CPU_fpp_RSWZYYXUPNG:,",;NRLHC@A<66:>AEHFB=9653;73441*&&*1BDDDCDDEA<97:=@@>941016;??=;:<=?ACDEFNMKNXdfaH>:?KU]cgp|~xtqqmig]_cl|~zpifa[VQKJHHKOT]a_aju~|z|~}|tfYI;G`oy}y{raOB=<>HC;1*&&'')/;J[gnhcXMFEHNRVTRNMOSRQRV^c_U>-$1Ol}vsupj\OKJ>7RxȾXEN_lz}rnmu}z|}xmZE91:aʺƹ~{|th`VQOLGFCEJR^fjolb^jɥܷ{rlbUOVa~\B4464/09@CDDGHLXkƷzk_YRUTUY\VK4#%.:CRWcjutd[\]^]\[YXQK?3(  +3JROJIEF@967:=>DC@<9543855464/),3>LZgnrrxŹng`[RKHLRTSNE@HS\RE:55;>:4++5DSZ\[ZXSMFA=:8789;:ACDA?;;<:?DJRZ[WQI;0.-,+*0C`|o]Ve~{zwwxphaZOHEEIOG0  "=PTOJMS]jx{tlipplkpw{}jcdt{L/2<771)# !#$(*,16;>>99=>><;:??A>:646;>A@;621169<=;::;<=>@ABCMMJHNY``VMHEJQY_is}ztohaYVQW^l{~ysrlg_VOMKJMPV]_`bkv~~{~yn_PGRgs{zzq_L>644?;4,'$## "'4DYjsldTC5-+.353337;=>@BHU^_U@.$2Qo}xslfggd]NEBB?Eh_LWfoyvlmu~ywzzum[G>?OrĽĽ|y~|uf^WSSSMMJKMT^egff[Xf}¼Шásjd\UTY`zeG4/.%#%1:>@EDCDJVguprx}{j[QJLKFDFD:, &1=IY^glrv{vqmgbbbeed`_[UNF8/& +)CNMKKHIC<889::@@?<:8656446972.1:GXhrwyz~vcf_VRW]aaYOE:104@9327<==0+)0@P[a`__^ZTMHC@<:<<:;CDEA?;;<=@BJW^UJ<1")Dgyfaq~||yytkb\TF@??GUQ<." :OUPLV]fstkhnnjiotx}|z{z»fB,,664.% "%'*-157:<:8676532036:963136;>?:62026:=;::;;;;<=>?@EIJGIR[^\WSKJOX\fpz~}}xvpibZQHEIR\m}wm_XRPOOPV[]bdnx|y{}tfYP[ku|ywqbRD931&# "*9Lbt~xn[D. '+.015=N[^W?+,Mk¼ynnf]WXYWQC=:@M^|½ŶgM[mszrho}yvxsmj\PO_xżyvzwic^]ac^]]\Z^dihffZWew¿լǤhaZVVY]dveG2+(" %-79;@@@?BHSf|wkbciq|zhXKEGC;664.)"")2BQ`dhjhhjknga_`dffhimomgc_UOG=1'  %AMKKLJJD=99:;;?A@>=:875548;;514>L]nxz|r`eaUUcryrbNB:.&"1+).5:84,,/:HU]_cccb_YRLIFA>?><=EFDB?=;=EKIGNWZ`^YOGIQV\fruuuspnjaZTMD@KUeuyj_VTSPRU[[`cmw|z}zn^T\ksz}vupfZOC94&%#$&())"'1BYnzfJ0   $&(),8IY\XB+'Gi}}}¼ypgd]TLNSOKB:9EZoǹlOasx|}ofpzxupgcYRXrdzwuxuic`ensqosplntvtrj_[hxذͤ[ROTSPYhs{`I9/'!&)--,-7Pbhjg]UPMNJGHO\hoqsrnjg`XQNHA4& $=MSQLDGEEDB@@?>?ABDA=7589:86322=O_kry|{mfedYVqsVGB=.',0145('1;<:3:Ry~~|od[VK=:>6CPQJ@0# +0HJBFLNOORb_VJGGGCFMV_cefkmlhcZNILXetqbXQMIIMSRZclmp{~}l_TQar{{yxwpcYRICA?>?>=97.06AWt}\;#  &**'&/CTXR@0%?dvmkikqttvywomlhZLGMPPLBCFQhϽvRiyz||mft~ukaZYX_wԶxtz}|kjeemy|yvuwxz{rpqxۺ԰YKEJPPV_q~}bK9.''&++/0039>BFFGJM\oȺtd\TUbnx|z}wj\H93792,%'$.%%&+2@M_flkeYUOLIHKTanvyyupmld\WTK?1#%=JQOJFFECCDEGFFFEFEC>:78::97534>O_jrx~}¸i`\[imYTK8%'/369?CDKQ\cb__[fhgcbb]YURPJIEEFIHE>88:>AHMOYcaYWN@>FMLIGM`{teYQLC426=JXYPC4%6IOJG\vuia\^cdhot{}~|{~i:(++*)! !#*07;431010//0110.*#!"'++*(',/10.++,02469;<<;=>@AEPazfG1""$$%0DTUNA2%)BdyofYWZcmpw}zofedbYQNPOMJINT_u}{εiUkxtrnhmv{m`hw~~}|zrh_WSRWj|vu{}{khfdjt||}|}xvw㿡ֶkVD=AIKNVjvfL8/.--//11469?EIIILQT_jpt~xl[XTWdnrvsuvodYG8*-/-+&&",(,/38CNYcnsqhd^XWW[dq~yxwndb\PB3% &=IONLFFEEEGHKLHGCB@?:788:99776;DR_iqw~}Żn_V_}rnbI2(+049=>?KR]dgdebfiiffgc_ZWUPPNOQLKHB===@DHKN]lrppj_[_a]Y^dt~si[PID;,(-ES`aYK;.&%.BRXUTd}wf^\`c`dkqyz|y}~~T($++((#!$-49951,,121.//-+(% !&)('&(+,--,+*+/024579:??@?@???@@BCCDFKV[YSOLC>;?BFGD>@HJLQVW[dpwyh\PIJLNINWejlotv{ync`fpw|ofXNHIJKPSZdprWD6.*031)#!$$',:MYWMB5+/Ge~~zre\POS_n{}sjb`^[XTQOKGGU_iw|usuyʩ]Uhoe\SMTq}yjXW]cdcilqtuog^TKHKT^r{~Ǹwtux}zlmlggknox|}zyzƧʚpUMB<EJLRVZ_bbdku{}qh]ZZ[fkpqstrmcXJ:(&*,-'$#,/7;>AGNT^mw|}|yomlnt|~sghcWJ<-#  ,CQTROHKIHGHILMIGDA@=<8;:9::;;=DKXbksy~{s_XiƷx\A.+*.3469DMYaffhglmljikkf`][YZ[_cZZ[WRNHGDEHM`uzvusmhqvylcVLFB8*'.LZgg`SE977?JSYXYjzf``ce`airy||wz~~~{M,35.,)'*/2285001221-,)&#!"')'&',---,,,+,-.//2468==@@BA?<@@><<=BHSY\WQOGB@@=>?=89BBAIRZdnz~wgZLFHJJFIN]gmqvz}~x~wlhjpv~yka\]]_fjpw~ycTIA:==:534749AN]d\PB607Oj}yvnaWQPVdy|wqib_^YYXSMJIK\jx|vuuzyȥ|^XdeWKDCPs|vo`LGHLPUY\elojd]RB<=99Rqx|ƿнwrrvz{prpkggggsz~}{y}Ȫ⽅[GFB@=;:CNYfyjL946::86533409FRZcipuwx||x~zupkfa`bglqrvvrjcYJ:($(+*%#$0:FKLKNQY_lzuhjf_SD4(!  !3KX[YRIKJIGGIKKMJEBCBB>=<::;?CGRXahotz~|}v~ɻwimȳnR>3''+049BIV_dgllusokimomfdbaeipunrutndVNBAENd{}y|xsh`RID@7**2P]hf^TJCCFKNQUYYpưpllid_bjrz~}xx|~Z$ &27...+''+.8874/-14*(&# &*,)(+/10/../--+++,/02468;=@@?>@?<99=CJV\^WRNIFF?87;>;>@@AJWcq{ocTHABFKGCESanx~}wztnmqv}}|}md\VPKDACINRRW\emncU@;:CZr}wum_TMMSc{{wsnhb__[[XSNMPT^n}tlkpu{Ģh^c\MEDPd}{uaRC>AGMUVY`ee_ZTN<3/%!97?IQ^qkP=8997555:@CakyxrnkikligginprsspicXF7(#%+) #(;HY\[[ZXbhozujljdYI7+! %6LWXVNFGFGHJLKLMKGDDBA?>=;<>ELO\bipux{}z}~vqxưDzgYE2.15:AINY_einqwwtnlqrqkigglt~r]P?>DRj~upkd^NE@<3)-8T_e`VNKGNSXYX]cg|ʵ|yxoe__fnz~zy~l9 "')(%$)/3673,*+0$$#"!!!!$(-,+*,/10/0230.--,+-/13248;?@@>=<868>EN\bbYRNJHE<329<=?=?BPar}~vme_UKCBGONEAIVbhpzwyzroru~wspljbWSW`gkpttvwtfXEACOdv}~{uqj\RIJPcz{vrlgc`[[[[VMKLQValxug`cjrxʺp`]PEDK_xyq]PCCIRX_adeeaZVRG:/&.Rſ̼xlhry}{wtstomjnqtxxvtvu}ɮĽûΚcA4::?CMVgyhP?;::97;FWjvź~ungdfkkijloqroomgbXF3'%(-*!(2HXklihechlpz}wrrnfXF5(!  %1CJLKF@ADHORUWWSPNKJGB@?=<>BKRXdkqwyzyyvy{}|wqovͼϿw\E?BDGOUW\_cioqsuurrvuroljioxrYJ==FXqyoje^ZKB=91)0>U^`VIDFDNX``_isxѾud[[_hv|~z{fH2# $')+,+++*'&$% !"#$$%))*,,,**-.-1573121....011269<>??9877:BKR`gg^TOIFA8028;965:DWlz~vkc\WOG>;>JMH?DOTVYay|ywst}y|uqrty~}~{tppu{{xqdWJIMZlz~}{{zsngXLEGOcz}xuohb^ZVVYWOIEGJLU]ccelrtk`TS[djnzp_XKBJWmsgXK@CLUY]^_`[VRQPA91&%ByƿƯwminxyvyzsohkmossqptt|½ϴ¾ɿÏ\>2===<<=@?JQ`p|{fPB;;ACCMa~ͼzojjijmnppqqmnjfcXE5*&*1-%.>AENW^jpv{|zxxvvy}}zsllsŸƸ½nVOQNQWZ]``adkomrxxyzxrrollqxlSC==H\u~ulfaZVKB=81+4CY_]PA=?@DP\]_lxƴzeYWZerz|z}dG.',*(#!!#$ #%'''**')++((**+17:61641..-123479;=??4445;CLTajjbWMIC?6039:2/08E[q{|oc[UHB:0+-BNWXZam}wmkdfp{~|{wqrruy{tnaSOOU_oz}~}|{{yrlbSH@AK`wywtld_[XTVTSJCBAAA@DFCCMY^RICFQ\aer{ne]OJWf{wh\M?48BJLMMMMJFCFI=;5& 6oз{ronv{vy|smfjjmrpnkqr{¿չ¿ƼԮ|R=6:45=DBA@EJVbozveO<CN[guȽqb\[cmsz{{rw|[:-$&+'$#!&)---+*('&''&(+/3577563/+++024589:9:70,0;DKWckjge_TJB<8771)&,.?NYbkoopzrf]RHA:1'!$17;=K]fdejr{}}|rj^Xan{zvvz{}vttnms{}voe]XST[dpy}w|~zytrokg]PGCIUhxysqrh^]]ZPLLMF@=;8751)%(3@G@75?IRX^rʿwnaZXdwwj`YF<25@FB9>><844;@<;2& 5mwomlllptw~ؿsfps}z|umnjoxwqmkn{ؾýɟmH97:219CEBA?CNWbn{ygPAGUm{Ʒ~somrwumd_adfcYLC<;CJG;:ASdx{wsplmsyqc^elow}}vhZL<0( &6;@HPUdhr{~wne`TKLT\dnwy}~|zyzxxx{yupnkp{ř|ƾk_cZU\_bd``dkkjnswwvvwtsttuuvv}zjWD:=FS_p}wpf^XRPG?:5/.8GZZRF@>?:=:4'$:IQRPQQOT[hutc[RHA<5.$ #06==Nhx{yu|vm_X^it}}zyzxwwxywtsmmsy|wpe]XSU]hsz~}x||wvroke`WPMNS^o|yqlkb][^YLDHF@<8798/'#087107CIQ\tǼ{mgiw{sha[SI?@FG?5121.,.5887+$ 4iwodWLHFEFJOPWiqtx|~ŧzlps|~|wopms{ztoio{ӻºԶX:23;209CECA=?DKS`mv{kXRau|wsw|vk]Z\^bb]SJFKU^YJAAHZputrqpqvzgZOLMTdv}|ypfXI8/% ,?IQ[ekz~yocYZ`gnw|}{z{zyx{xsnijtؾt{znmbX\`deaadjkhknqrrsuvvyzyvtruxysfWH@DKU^n~{voe]VOKE>81-/;ITSNHFDD>@BKXhvŵwj_Z^gmvz|xplph`UN[ptfXWo|r~tT6!%('""!#&*+-,,,,+)'&(*,/01212-'#$%*-569;;;:974:GU^fkmkgb\SJEA>9.*NXZQC80,-1;Mg~vcTIB<72,$ -45=Qo}{tnswf\]dmu~zvqpqvytrmmsx~~~|vpe]XUV_lw|~}y||xuromha[VUW[akxsig^YY]WG;A=601278/((11..4;CO^yupv}unhfef\SPQMB8677667;>95(#""6jiZQG:2./15:?BHUUSW]abbkmqx|̲spox~{vwty}rgn|½˷̿ʥrF/*.945=BCBB@?@EKWemyyvqlvӺyjZUVX[a_VPNTbmiVE=6.+2>KQOKFGIIFHIO]kzͼteZTXbirw|zuqql_VRXRNB6BVZTMUvzx\9''"" !$'*,.//-*('()*---/,-)#! #(+36:;<<;89:BP`hmooje_XRID>:6&*Acll^H3#-He~ncRD<50+)"$+-=Wo~ttpls}mc`cipyurquztrnosw|yvw}|z{~zuoe]XQVaox~~}x{~~xtqnnlic^Z^bjpw~}ni`YVXOA562(&(,3950& %.55427=FWjȾzxxoijorsj`ZWRIABBDFHIII@:+')%):q}jTFA=61238>AGFFDCGS`ituz~§teWSPQU]]VPQYjutcM?7CP[eoy}|tme]VPL]TG<6>Re{z~kR<% '3AOcmwwposx}~}{|xvtusngai|ȩ˽w\UX`fb^`cebdffgjmquw||zuy~vla[TUX\jw~~~wommmv|}{zvqh_WMIFB7-,6BMOLFFHJMPSSWbp~­o]TNS^fpty~{vqia]VJCACHL>)+?GB@Qxwuu_7!!"!$),/22.+**)))++*,*.*%##&+.2379::99>CMXenqmlgb\VPID:3,!?Zu~}nT<( 3NltjUK@94.(! $:Wiopia_ekpt{~ujfgjp}}xttztrpqtuy~yunklnqv{xttuxvsoe]XOR_my~|zvx{zuqolnmmjddglqw|~xk`UOLC8.+' )1874/*+.6>><<<:777=AAENV^fiqνwkjnuy}cmźڼʪhVF9#"*49>ENOMIFJS_gu}|m_ROIKOUXPILWk{p[H<@IQ_nxyrfWK@956NMJFFN^k|yZ>"#5AUbu|ytw{|~{zyzvsqsqlf`i~мɸ^RQZb_ZZ_a_acdfgjmqsxzx{yrjf_]\\gqwuwyurmkhgfgecfnuw~{xtld[QLHE9//:FNNKGIHJPV[]`gq~ϿwdTLJS_fnqv~xtrlibXQLF>::;DM@&%5==9Jnjgp~R)!""!%*.10,**,**)*)((()&#!"%')238:;;::ALXbjpoigc_ZTMD?5-# 1RkvcO;/#%8Tpwl^S?83/+)!%4FRRGBDGQbmtvx{|upnoq}~vpzzvrqpqrrtyz}~~vrnmgc`]ZY[ft~{wohcchlrv|zrqme]WNS_lw{xurtwvronkononlkmpv{|{|{vptzf^SG@7/)&(19;95359AGMJCBIXs½xjceqz{tfZPKGEHIOYbd^ZQM=7925Fr^WKE<53344>ADD?830,0552,-06;CJQVY`|˾vigjow{bnѹÿȳtW-&%-9CKUXVRMPWajzȭ{h[SMFGJPQG=>Mey|hUHFIO_lql^O=2,(+1>FPYblv}]= +>Lbozwz|yyxzvqoqplf_i}ȶ[KJT^[VU[^\_bcefgjnnqsy|~~|wtppkf`]dknjlnoqrqml_ZNFK^mvy}}zwpi`UPKH=33?INKKMPLJP[abfhmzɺn\OJKVbglms}xpkf^YPIEDB=:;=GQF-->CA9>Xjnryi`ks^OTh|a6"$%"$(,-,(&)-,+*)('''(&$$%&(*3579===GU_WTMHHNX`gkqz|unnle^XTW`ksurompsspnnlqnllmortwzzvuvnfhxvb\TF;2.+$ *5;C?957=HR[SHGPdýug`dq~{qhb_^^^clvtiaQM@:815H~t^LGBCA<:=DKW]bb[TNI=::71-**15<@GJMTn|ɾygcfluy~{|~dsʸпuA0%);GNR\\WTW_jsֺ|h]XOIFHOK@52C]wsaVSPVfrqhTD2)&'0:5BTgva1Xvj>! ##&'$ $%),)%%).-,+)('&&/.-.//12468:;<;;IZinmnjga^[XOF=6)%>[v|vvumecSA1$ 3Lh~n]PB4+)! #8QdohH49<*+8M^hkpxwonoy~iadihmnonmnnllmmkjimnrlgdffc_OH<2/5AJA;614?LT[^grz}zxvoijib\X\^fmssojknqpolmmsmjjnruuxzysooh`aqpa`[PC965+& #,6<@;2-1;GTf]OMYqýľ{qe`gv~|{qrsyyi_LH>8939Ovt_I96ACECCKWbksz~{tpl_RD:41/-+.28;=@F\mu_]agrw}|^p˾ſk<(23>EGF??Nh|ӿX9+ "-E[p}|{~}yvuvqmigfedbditƼxluyRBBIMKJOX]`__bdhikjiijmrwzz|~~}zvtwyytkcaba`dq~k\PS`kuyvtty{kea\OB89EQXVSVZ_dltxtru|ɼ}mie`dne\^sz}slaWTVNDGXd^OGWeo`B?P\^L3(-;GNLJS_i{~W1 (0DqA +#&(.+'! "&(-,,)',5>?EJKQXUOMA4246@JYbjhegfa^`[OEA5+!0Yu~yrkhac_VOG@8LfnUE;0&! -OpwmF)5ES`nts{|spkmpx|}}yoh`X]kywtwqghif_[]\YY[^dhlnqibUMFC?<:414?JUXYWX^ekmmeffc^ZWU^hplioqommlmnnlkoorrqppprpligc``]_bmzvbVRSTD6% /;60*'&/BW_XKNduicgt}|vmaZMD<87>M\kaXQI@>B?:=O]gt~xrnjd]UNA91**03?DN]pbNEV\cosr[m˿¸vH"%5?KZeehiioҮhYMIFGB9,'/A\t~ukdky|seM?8=HNSP8;JbvŔ]=1&!!%.G_o~~{}{wutsqnjgfecaaeoµ}thqtQD?DHDCJUZ^^`cghjijiihkmtwxz|}~{xv|~~xqhdeeehp}{lc\_iow{wux}~yscZOEGMW\YYZ_gnuz{}Ŷxpjejnf]`x{wkbZMEBDFYr}nTDVeseB7FP[E,*9B>8>HShuoD% '-=cE!%')'# "%(**+)(+5;JNUW_hieVJ=::>EPZdhgcca^_`VJB>3)8`{ypjihjiee`VNMdxy_F8/$  1@EI]Y%(2@N[krt|~wrkhjquvyzrgaY_myyxysjefbZWVSPRU\blquy}vj^VOID?<>ALV]_^WRRX]_____]ZVTT\hnmmnroolmnnnmkoqqqqonlnjgb`]Z[ZVSXfvxia]\H:'*71*$ !+>QYSJPh¼|qhfny|vi]TH@;;BCQhzvoWK<.*)*1;CK[dnïѩ|XCJObx~~y{qdVkŽ}M (8L^lnroik~ět[FABFA5'"*>Yr|mdahtthZD94;ELQR58Hbu~ǖ`@5+##%1Kdr}|||~}yurqqrokhgeb`^`iwh_ukvsUMAEF@>ES\Z]`bffgfgfffikqruvxz|zxw}|rjfghiiikkkjdbbeikqwxmeZOOQX\[\^blu}}zzϾ~ohikhbdmzm^SL?4/;Jk^B:FVI#%:+):D<0.5CZg^:" ).8SuI"$#!"$&&))(*25>@GJUbjjcYMHFJQ[ahjhca]Z]ZOD>:/%+Kmxplnlorwvmfr{|gP7+% ,Hkſi-!"*6DRcmry}ysplprswzpd^V\ivxyysjceaXUTQMJNW`lsx|~ztle_ZWVTWZbilmi]QLNTXYWWWVUSRRXcjlnosopmooppnmoqponjhfeda]\XUUXRKL[p{ndZE5$*72*"(8KPLIRl¼wqigksz}~~zseYQE=;=?BDGF@;3+)1QguK!! "&&((*,((,0:IY`f_VRPT[bfiihc^YWWQF@;3('A^wwnloimr{q^N@0%  !=[|l4!#$.O_`a^aiosxqfcgs̽udy}yppqu{}zwh^OA529FQbv|jF/#  (;P\U8,5Od\B &0BN^xuO-##$&%$$ $4GSXXVUV[`effefa\VVNJB?8, 2Rm|vlimopt~|~pXE940" #>eǻh9%!!#*8ETalqx{tookmtyqjcdjswyvohhjg`][VRUW]clqvz}yvt|vqnnopl_OC@BGJJIHJMOOOT[eovvvvtsqqsqolmnlie`]ZVUSQPOLLNLGFLYrrZ=.,QYfnoxM%   3KYK/&1M`S4 (/?]dK4%  ! *8AIPUY`dffc`b_XRRIF?:1%!>at|vlhkrsv}vlgYG9..- /Mf{\<,%&%*7BNZfpu{wsohhm}~wpigiotvslggjha_]XTVVXX^aegoqvwxwxv~ztmhgilhaWLDBEHKHGINRQPTXcqwxvvurqpqnkhihea]YTSPMLKKJHKTPF@>Hby}^?, '8?<94.-7JZer|r^C5;Ncnof^^dmtvuplc\PF@=85761..0,,0;Lht[D9'2N[_bkxƱջiL[|wzztng|¼õ{|zrnpmNC<*2Pk~qZQHB?;84.& *2CP_kt|}yrnryy}Ϥu\[SLD:;Nf|||{}~~|xspmlkfdccca^[WU\m¿\]̷kMEJZe\LA<;KRZ_``fhijjijkllhghillmmrvzxsnmmyveVSUhnuuniruaJ3"6RTNA?FGDIGDJSauĹl_zld][^a^[ND4(#(9KR^b`kZ*%7D6$8G=#!(DO>0&  )8IU]ehgga]_[SLMHD=6)-Lnzz|vnjkqstxgYOB6.')'@_wm]\^L9/(+'+7@HS_jmrz}wqgcft{xqjhfkptqmhgjicb`\WOMJGJKOQTY`degknnlib]Z[]\^^XNJMRPLJLRWWURU`pwwttromkjhebaa^ZWQNLIIGFHHGGROG<5:QhdF5))#%3;>B>85AUjx~whV=/4Iaotne^Z^ekgc^VQF>875684-)()+4CWjp[N?) =h~˸ǭjaw~z~{toǽ{nijmvvqsңyRC:* 4Rmq_UK@=99560*'#$,4O]jty~{volqwvzѨ}d`XQI=:Lc~~~}|xsomlkbaaaa`\ZUSZl°\ZȺ|\?73ETRC;99GNVZ[^chllmlnmplhefgijjkmqvtpkkm{uifht{zrxyo`QG:,#-GIB5/553>>;CN\ożzxsQS~f\RORTSQE8'$1>EV][hT%  !"*%  2>4(&  /EU_ikhh`[]YOHIIC:2#9Yx~yv~}vplkqtwy}x^L@0(&%!8dzq_ONQB2+$.),7?ENXbejqx~zre_`kqxyqgebelqomkkllfed`[MID>?@DFNSYYXXZ]YXWSMGEFHR[ZRNRYTPMPV[[YPS^pwvrtokjhgc_^\[XVQMJGGECBEEDFHFB9/0AUtjO>22* %38AIJA?Lbw{tfZKCHYmx{vmaTRX_WTQJG?94159:7+%$$.C^uyh`Q2$D|Þʼdlr~ztþrkle]eh~îuy۸]I<*8Xo~ze[RE@:@C8) $2:=6.-+,8;;AIUbjyļuXI=KqqdSFEEA=8/#$((6PelvF  "  +  $*( $   ,H\glifec\VMIHJJA:5!,J]tzvr|yxwrnswwzydL<.**"!6_ƹyfVE?A93.%)+*3@CEP]afkpxwnd`hkowxof`_empmkjklmkhc`_OLJFGHJKUUXY[YTPNMKID=747ANUXY\`YVVZ^^YTRW`krvtrlhedc`\YUSOMKJGGAACCDCABAEA6,+6B]ulNHB>6--1AGKMOR[iĽun^_adjs}{n_QMPTJIIC?753138<:-!(:UrzroeH7RŪǢ¾}x{}{Ŀȼľurrh\TRgw~ßvYC,  9Yp{ulaWPNQR[[YVW[belt|}wsou{}ͪi]PB<68K`u}}{xurpnmgfddb_ZWMR^qjfxzoi^OPOTY^]VOCAEKQU\biloqpooliedcbceehhhjmlhent|zsnlhnqmr|nZMA5*(+47.  ,;BB90/-.7<@FKPTWhyŽucO7:[svl^K<4/-0026::74E\nwD +&%     " ! ! #8Qcknje_]XSKGDCD;60"3Q`ptpr|~zyytqvxx{sX>0''&"Dv¸~~kWB:<4.'&*,6CEDNX\cint{uiedgiq}vmb\Z`knkiijjlkjfdd_\[Y]`egomljjfa[POPMH@60*2=ISZ_b\\]]][XUPV_hlnmljfd`_\YVRNLHGDC@>>@@A?>@>@=4+&.3AWm{r`OMLIB;>FMR[^_agv¿|qichpxq_OHHKDB@:71/.25:93)(-;Jdz}vpiSE_Ʈzy~{ƾ~wrorvyx{{m\D4.*"(IGCKOU\chmtxqkghhmwuk_YV\fjhfeefhggeefkklmty{wwspmb`a^YN@5/18EUadd\^``\WSQLS]ccdeed`^\ZXTQJIFBB?=:==>=><:<9:81*""!*8GQ[b_UNQUTNJP][foqprwujaXan{weSIEE?<920,++2694,*7HWbr}}z|zwrtb\pÿ}fnƶytu}ļŷ~yqjedksxo^B3:FXkiw}|lcaab_cgrˮ}O2"%Bf~|~wmaZXXW_biotvy{}~z|~~ͭh^PA9:G^qy~~|zvttsqnkigeba`]YUTV`tùy|p[@;8=@DNV[`hmnmmie`bbbcfgkiiijihfmpv}{tmkifonT>#"#+;MWZZihicYOKI=@C@<865=AFIHA=8DTl^@98\p{bC.(-=Pivz{}~}T/  % +    ##!$#    "$$(*%!'0GVfmkh`[WTMIDBA@;." 0EX[`acfnsttrrqpmkkloysaM4 =qdz|cM,!$'& /8?IPH?EIOW_egnpx{xrkjhkt~yl_XTXafdb```a``_`bkmrw~~}yutrndWLGBAKYcb^WZ^_\ULGGPZ_]\_c_]ZVTQMIDA?<=;:8:9;::777663-)# '27AKQNNSZYSS\hir|~}ļ|qf^LR\fov|vk]SKHA<700-../11.-4I\osxxvzz{~yttssrvmnxuȰehzİvjr}п~~ysmkpuysbF.+/@VZlv}~{{zzyϵs]UH=2,)&&+2d~||siaZWT^bkrwz}}~~~ʮgYN>:@Phy}}~}|xtttspmjhfda`_]ZUVYdy¾uw|zcP?958:=FNTZafkklhc_`acfjkpmkiihebilr{~|xpJ1*5>L^q~qcYT@AEGB;65=?A@?;96;G\xƻ{W;%7MnucM=9>[qr[B." #  %&"$( ""!%(()**+*))).9EXcmnhc\WYSJDABBA9*$7HRTX\_bfhoonnmigehkseN6& #M~yxw~^D +$**?HNTUG:>BHPX^ahjsvz}zkiehpy|oeZTV^cb^]^]][ZYZ]gktz~}|}zyxwrmf^VPRZ^[TTV[_^VI>DMV[YY]`\XURPLGD?<<:;;;:99:87445741,)#)/9EKMRY_[TV`lnv|ź{wmb[QQRQQTY]ddfgbZQKE>8110002/+,3?Rdx|~zsry~zzxsu}|xxvokkmppnw}ki|z˷smogh~ȴhpu|wxww~tbA&*>GXlquvqmjjlٻwW>/+(%" "!%09XvÖ_3 =;864=QlÿmH)/Mt|mbVOU_u{bVMIA.#  !!')" #%(',0110141-*-9HTfmqme`ZWXQFB?@?>3$+;INOTV[\_`ihhigebcjr{rU>& + .Yxupoo}{^<&16PXZ\WE58>CKPW\bepsw{lifgmw|{rf[TT\b`[Y^\[WVUWZeirx}zwsqssvurnnnonnppqmg`]]\XTSW]_\RF>EKSWWWZ\WTOLIE@=:8768887666430//20-(%)4@HORV^_XQU^hkqv}ǹ~|wrkb]]XQG?;;8120/-8/),8GVcwzvokjqrspsz~xwvpnokkjknjlzykcp~sdlxtfyħfbw¼ǽyaXXh}zvsx{n\9-5GX^flkgbaszXB1 )@\tĢqB&*Fi~|umaYRW[chpw~~­xd`]_jw{|}{yz|~~||zxvrttvwvspmigedgc_[XUQLOZp½lO@ACDFFNTUPHB?>84345;AFKTZ`cgf^[\^cfiklkjjifa][`hq}g7(;Th}sk`ZRMLJG;553:BHHB;859Ib|fJ'#+Lrrf`ZZj{~yaNIKTVJB:,&$"""%(  '),*+,--/165106FYdkpph^ZWVRLC@>=84*(6AJGILMQSXZ]__`_]__hs~}q[@,! 7^|zrlhuy|wxxY5(5CJ[ba_VB25:>CJPU[bjmryrokjouy}wndZRRX`_ZWZXVRQQTXbelotrpnijnqrojfcfiebadhomib[VTSS[a]PEAAILNRTUUUROKHE@;89631211/22210-**)*)$*5@EJNTXUKHMUZfhq~ɺú|z{}vplfb^^[UJ?61/28DR[]XRG?8241.+4,&+:K]kwx||uokfjlonrz{rppkffhrtpmkly|kd_lweT[giikasjEAPpzy{zwpknpcQ3*0BHOZdgc^]džd;&'+& +:Sz̳]@5AYu{sg[VNQX^gpy}~stw}}{{{zwwy~~}|{{wtqmmpttusokgeddke_ZTOKHL]uĿjG$ %)022357:311025<HJCDEDFIOTSUVWWY[`coxr_G-"  :[{zmeiq||tP. %8DU^^fd_W?047;?ELQ[`einu{|{zzvpnprsu~}tkbWOOX``\YTRPNLOSW`aegihhgjmsy{xrkdhjd[VY]jii^UKKKR]cXD7;DLLLPSSQONKGD@<75751./-,*2220/+()#&(# $07:=AKLH>DJOSV\\_cfhkllmnnlhdb`bfmv_HTu~uka[SOGB;60+-6CMRNIC=8;FXq{[D&,G]dc_M94Jcjo|tiYG4-/07H\aZPC6(!#',#!2662   "%+*,''('&+266:EOYjxqke`[VQNMJIGD;3. "2@GGB@@ABDFINRRTSTW[cmsiQ4  (A[u}vuzwk\ekqwfK& ?Z_flec[WR?1549?ELQ[`dhnruuvz~}yunjijpz}wpid\QNV__[YUQONLNRU`bddddefnsz|vsmijbX\gke]QKHLNUXXQHA??DFFEHMNJGGFC@;764530/////1200-*('%" *24:CJNOPMJQapſ||{shYRRV_baYPHA>CJV^ed]SH@84440/-& 0H`mutsprxxnfjqqx~xzzww|tidr}seanzwi\VVbomwyft{¾pfNUinjnvmiecgimmbVKIJC:94/.5@HQV`de`ZV^hÞqO7 7QxӽzvmaWSQPS\elnvyǻ{xxutsxustvy|~||yzxytqigcefjjmjigd`VLHHD?@LYjx}zttwwssX2 "%')**0/+()+/1249>EJNQY[^bfikllmmmkifdabfks|p`lypha[UMD<4/*.3?GJJLLE=9;G\x~xaA%#4SUP90Obm{whYPE7-($&1CU`^ZM@2("'/( :UbR   #'*),(()'&*/46BQZ`ksoic^ZVPMMLJFB:1( &5?FF@@>>=>?BIKMNOQW\ahk`I. ,BYn|rinsj[Ybkntr`I3Jfpvzgd]\YD2246>@DECCFFCGFC@<8444421/./013321.**'$#06;ALR]_bdem~ƿ}|}|sbTJGHbee`ZUSPQW`eecYNGA72210.+' '=;::;95/----)' !1HWjpvx|xz}|yx{vpqxopzzj^WXcxyvthZfzujgjwNhqb\KADDC<;BMSSO<1'(/7CM`jw|znh^RP\kxÜqK,!%$##&%#&$ "5V|ӻ{tkcZUQPV\ceprx|ø}}{zztnkotvwy|zyvusrpmhcaadec_ZUSV]n̿sjhquqoT3 !#"##&%%%&&$%$&(+,159=DHJNQU[`ehijjihhjkliiiiijkkooppqsuvsjozvrj^QE;2.2489;BNWOF901@`{~{}}`>   0IJRX^cikeR;#"(!(5DNWZ][WSPF90,' #&(V²z=$&*)*((&''#$,3@Ufmmkifa]ZVRMHGDB?8+&-6:=;=;:77757ADKQ\bffb[OBA;1,*)*+,'"1DQahqw}~~}|}{z|zrjb`W^vsju~pajdKUh`UU_tTlraF4.&% %2<@?8308BN]l|xpbSRbr}ĿŖd=&"%&"!%&%$$# !!0MsĹzqj]WQQV]egosx|ǿ|zyrpnotvwy}zxwtplkklkg`^__^ZYWTU]pmclu~{rov}weI*"#"#"$""#!#%&&''(*/2681$ +16797;9875566:;=AFNYbfaU@-  "1@LWhv{nXOOJ<;93+.>Tbm`colmuxzN*#-16;@GMRW[`dfhkmwxxwrmfffkpw}}yurnjg^YUX[_aZRKGEEEB@AFOVZ]_acgmpnnoprsnhhldUMLXuR)+<@=>?GLGB@?=;;84402232/...-..01.,(&&#!,6BFLRYcoy½yqeXLB;98@AA=<=DSl}yts}xbA$4ADD@GSc~a4 !'.6,%#'. Nu˞`& +"#%'))(&#!"!*5HR^bcdda\ZWVUOJEA<81* $.354558665656679>CHP[df`P:' '0;EQbpuyxq_OD?9:/%%6PjzxwyM)#-.38=CIMUX\_adgimoqpnjffeils}~zvtqola\XTY`d^QKHHHE?:38?FLRX\]_a`]_eijnole_UKOVf~tM*(4:;=DJKD>;8487753322331.--.--//.-(&%!!$/;BHKPV]gqy{smcZUONNJNSUUWX]kmjaYPC871)"!',2),;DFJXhv~y~k^]dnkjoreba_QKRP?FSMHGUuȲZhk[O@9/& &4CKYasl[\my{pF+!!"!$()'(')272)$%&%#!0BWbhmppȺzre]VRU]fjoptx}}}ƿztnjmoqpnlptz||yxssoqiebfed_YXVUVXZZFMf~{wgS@3(#!#'(%'''&%$#"!$%''$!! #',5>DFABFLRVZ[]^`cfilnnoomjea^][XWWTOKJHQgz}{ul[I?6346;=;989AM[i{zqq~~ytgL3$ ,8;9;BSjk9#,/:EOQOMGIKNLDDJH@71*!"+ 6f}G  !"#$%&'%"!""!0>R[ba`aa^YXVVSPKE?94-''1431445322468769@EJS]faXG1   ,17?L]gkijj_K85:7( .OqqM-&*+049>DIORWZ]aefeghiifegdcdjv~}zwtrqla^YRU]d_PJIJJE<4%(+/5=FLRTSRQTZaacedYLGJZcnpme`^\H4038=89887542332/.-+,../0.,'$$#%%*3=HNQTX]bjryƽzvojb^`deiouyxurnqrqj_SJ>32-%&-2)!'2:=L^qynjnvymlony~ozxhagsrsn{aUW[OMJFFMRRNJSs弚Xg|wiaTF<>IZelz{jZ]ozzݹfJ0%$! !""!"&%,.2:IQJ?++)&" +  '1?LS_efuȳ}tiaWTU[dimorw|~}zzʾ~yvplkloqokgltyyzvupplngebea^XYYWTQPNO9EeƽžiJ2#!%*'$"%+/+%**))(&%$#$# !(09AD??DIOTWXZ\_bfilmlmnnlieba_\[ZVOIA>I`v~sbMA53/4:=9505CXk||}ww}ujfaQ?..387349Nhh7"+027AKNMKIFEB><@LID<70'#" ! Dp{ҫc"#$!!""$&'&#"##$4EW`fa^_^ZVUVTSPIE<82*%)3540353111358769@GMU_fZRB, "156;GW_b[\`ZD++94%!:fxslN1*')-26;AEJMRW[_deaaceecce`_^bny}|{{xtqnnjc^WNQ\c`QIIJKE:0")3:DGHHGKSXUUWWI;=J\gmaK;>DaXLB<<==:<<88;;6:9:8742220.---,,/01/+)%$%',3>GPUYZ^cinw{Ĺ|uqmidchqv{|utqpg[OF;2/*#(.1+$!'05Mav{gZPNWcn||fXTVRYiykhvtkmtywkz\LOYOOF@KQRXSLRr͘ox|K_ywllr{|rg^_fp}sC2&&+,%!&!&!$#**@`y|bG4%$&"!"" +"/`¿~U6# ,*12)*+$'(()'%" "+6?B8;@CEIOUVW[beehnklmnmkhfeb][XTMH<9>;=5*+.6J`zQ*)488EJHLXZJOo{x~߸zJfvvmcboDVozqka[Xamv~ypsw{zdO6*"#(&# !)#,4Y]B)%--(%'&#'5CNSRMHQdsɶwmdZUUZ]_`elsuyz{y|~ywv{|y|~ytmefiknosw}{wtqmif``_\YWVX\_XOHCCCD]½~bM:,$#!*+$&*#"#$"  + '2:<68=?@DJPRTZ`aagoppomkhfdb_[XVSNI;31>WqycS=3,/8>@AGO^o}{wuv}ussg`\L?>6=6)/;L^|mL,!"%-569@FJG@9>CIH@823>>:83201-(" (Da}ȧvL4) ##!$%! "(2?MWb`]]\[WUSTSQOKD@:93,$ %*+,,,+,-.135658=CIU_ddYL5%"1:;9ABCJONK>*%'#/T{xeddhq~vkj^F/%&(+059<>FIMQUZ_a]\_``__`Y\]^`fnwytrqrnigdc_ZWQHIS_aQIGHIC7-# !$&(+.1-+%"=[orS40&.Ps`ZRI90-.,+310//+++)**++*,.0240-('((1;HT^gjrsx}Ž~{xyrjec`]]dnu{|xomkcWLD;0(% &+,-"'09AKU]]UOPSNKHMUVZ[Y`mv|xul]Zbjf^W]n~tpou~||uxk^bx}mWEDKJ=:BHGKUZJOoxz֩oCbyvbSNUdv7E^wuh_YUT[hw|~uc^VPTSH<6.)*+'%"&24;=/.=;6-'  !"#&'(&%'*.13669=DIT_dfUF0" 1;=9:54AQVJ3&*-%8Zmi]VOQS^lx~vf^bV7#%).37;<81*)*DYcjbJLV\]QMGLX^o˫piaXRQSSTY_hmruy~xvx{~~vssvwxzz|~|{vvpmgfb`\][\[_ULNWh»~T0!  +!$-/2346?CQalru\QQ[O,!#&*05:=CFKNQTWZ\\__^]Z\UZ_]\]fs}wsrrnkifb`^XNFEQ_bNHFFF@6.)#   + +.Nd^S<.*$;ewe^P@0/(%&)%!*+*(((+.0230.,+-9CO[chkms|˿}zyqh`WQHBACGJMRXZWTRQQL@7.%%/45.&  $/>=CN`kijhX@:Iguwwsuvbd`Rj}ric`VJFK?::CKKKNWGPrpdmܯrBVWWPOZquy%'=c~uh]UTUekv|zv{r[RLLQURQOLKJD;557ImgSRlwaOKMIHG<@<,#$&!,3=81,-04>98<;3( *.;Rp©iJ/  !!-=P]dd\YWVUUQOHEDEEB?>CA;2)" #$*...137?GKTZ\YG6" #2<<7**JolIBD:.+-9G@*$.426BLRX^C;?J@)!,+)*-169AEIMORTW\\]]\[ZZV\`_]^co{~yutqomjgcbYNDCMY_PLIGE?711+# =U_WG7/+,JrucRL<*"! &'&''(+./020.,/2?IU`hkopw~̿~zypd]NH>4.+*-37=>>:88:6-% )277/($#4ION<$$2:Pl|uaQ0 '5732;UaTD8+?lvhsxlgp~}e^VJcxi\ZccZOM@=?HQUWZ_OXw{gaqm5:52@HOVZZX]\X]^Yc̼zm_SMKJMQV]diquy{~|yxz|wuwxʿ~wrkggfd_aVLSpɹznho~ÿþqL +  + +&*,.36?BHNOTaoqmhb`acekie^YVWVQHCERdt}~kS?9@WjzyxtfXF@A:=Qdyyidgiowpko|{jTHB@=@EILRSVURMIGLLJC;669EEA<6213:68@EB;61:Ld|}nS6   " %,BGKMORV[[]]\ZYYZ_dd`^^dlxxwuqolkd`ZOCCLWYUOKFB=7362+%   )N\YUE4-)7^uV3""#%%%&'((--1///35CL[fpuz|}{vuk^UJC8-#!$&&&# !  !.687.(%!39;4%$((4DJA. 2JO?3"35' (Lynbjxwkc_gsrWHHasfXVauygUOC@ENZckllY`x|o`hxv< -Nvzxa`h}ſ+$0Y|ue^YX\cilsqqtwx~qdXPLRURORVTTXZXVUXr|c_ttdYU\xvQEDAIJOTZ^_aefdhg^c~˾udTKJKKLSY_dlptuxwuux{vqqv}öxrmf][UMTwxdWM`{}W   +  + &)+/2;;?FKR^kokfa^_abiifa[XYZOLJJP]mxwdUOUi|{wrj[OC?=4:RfuypicdkqhfmyvbIBCFFKMOQUW[ZUOJHJKIC:425BEHHGD@A:89<==CIHVj~y}|xubE* $%#)5IZefc`[VVVVTRNJEEDDFEEB>91% + %'(''-9AJPRTKD7+  -8CIG3 6ggZD,+((,15656+)+0+!!*#&%%0COTI<0)),09=CHKMOS[[]]ZYXY[_cfea\_fs|yxvtpmib\RGFOY[ZSLE?;7552-)&" 9]`RL?1($GORRPP>=;4.0?Ol}uwrsz|yuvnP2 "#"*9N`ec_ZYVUTVTRNGCBACCCE@?90% &*+*-3;FOSUQG>3(  +18DQRA-EypbI18/./28<4++.36.! )%1944@QZYO@1*+047:87/-+)(&"!  +AdbM?5/%">iY:001,110/*&%'(+,-/48CMYgqz~}ij~zxvofYOG@81)  !+5:94' +  +Qyz_;& .Pw}qfkoqkdb]WYWYl¸bLLZn~k[`XVSU^lswn]apned`ky͛\.!'Br~o\OVjz/,<`{{xz}~tmbTHDHVgrspnigny{ulfWSOPUY\[[Z^cdceih{qebo|b[YPcjRINPT[`cfklopu}~psp`TROMLPU[`ehmmnnmmpssruw}~Ƶp_NLHhxi]OD=9Try½e(    &,048GQZbeQMHDHS`lue`ejrxyvrpgU9  !&# %3?O\_\\[XVSRRPNJHFCCEDCD?:2+ + + + %,/49@HOTWVMB:+! +*:KX\THZh[NC?;9:<9312574,%#&9BGFLYbabTE7/+-3;=?BEHOQRTWVUSTW\_agie^^flq{~zxuqjbZSMLRY^fjbZQHA:410/,)%" -LfcQC2'',8Z|qP@<<=CC?931201255421;ER_ju}{wx~·~}{xsh]UMD@=82,'&  !'09@@@5&     3`nJ)  ,Rtuumqqnga_cb^_hswUO\iz||{tmfc`]^acfhkefaZX^efo{ģsD%&@fr^LIP[q/.Bg{zx{xjc^VICBKWgonkighoz}wqid]YVX^bc`_]^bc``fkj[aqt[USJ^iMBKPU\behmlkovuyϿ|k]WRONRUZaehjllkjloprptw}~ɯr]SH`xi[OA6-1Nmwwm+  + %.4;BEP]joljgca_a`b^^^aa`_YTMLLOZdsyyw{}uple^VH@?8>MRehome`]]^ab\UKFCFJRVZZ[Z]\[Z[[[[WOA6/.1446BDINPONSRSTUW\^bfif__bhkr|yttrne[RMGHR]ejkb[SKD=84-+)&# 3Qc^PB3(*+5Tr`JA?HLOJG@@>>>CR]hjhfcehozztnlmlgb`\Y[afecebad`\[`n]K\vs[TPG[kF7DOT\bhjmnlrzv}ľzj^RPMPTX_ccefhghhkmklrw~~}|{ӸoYDTwuoreWJ?2')Hh{}qtq/$$  +&,4;=FVgpgd_ZZZ`bca^^bbcb[SNMJLVapw{snkd\VIA=>Sgfnlnlgc`^\\YQKDCDJPX]a``_^]\[[[\]UL@4./4868<@EP]hqrs|}uj\QPTYgntrlfinsfS?1+.059>91.37BJV]^ZVTTPMLLJGEBAAA@?>=71(! ".6>DMSTSQKD=7+!  -CVekhdqymcYSMEB@=638541+&).iu{wuz}xjYH90),258=@CHNQMLQPQRSUZ]bgjhcdcffiq}zursokcWNIDHWhnpnc]WPIA;6,+(%" :V_XN?5-/-2Mg}rSCAOSWTSOPNNLLHHDDCFLU\`elq|ywz|{wndYOJFDDE@<51(%"!%)0:ELOQND6,(# +  ,PsvR7 + .Yttz|~~n`X^r~zm`Q?:FXinifeb____^[UPR\gjwzͻqU;& Ee}fM>;>L`~&N|}xqopsvvv{yrg[RRRPHC?=9>HZfhe`_`ekqyyunb\X^figee`\^ejkhjgdd^XUYjM8X|{cYOCZm@-=JQ[cjmpolsz}v»zhWSMPRX\]`bbdceeiheemt{}|{zϤ~^BNtvrg]OC9,!!Aaw}qr~~qtym3!**##" + )/27AR]bb^ZWUZ`dfdaaddd`ZUPMLLT\kt~~zrmjbZSJB;Fj}wsomjhd`\YULGCFINT[aba`_[[\][[YWOG;1-08;<=>;;CP]lnprusnkXOC=;:81( +#0;DMSWVQKF@:6.%  -BVgiljt}tld^VLEA>:54111/.3:u}ygXF5,$',26;@DHMPLMOQPPSVZ\chlkikgfbagr{smjheaZPJD?G\qxtna]XRME=:230+'#  @YZPL<512.2G[t|VC?LORTUUTUSROLIGFHIMTZ`ens|wv{{umbWQJGHIIF@95.+(#!$)-4>GMQTTMA;73*%  6YvlWC) *Wxlmvnjlndciuuj\PJNX^`jeb_ZWVUXUNIN\hmv~x{~yz|{smp~ܻ`N9* 'PolM8./7Jaq!Svqmhda```cfeaVKDDFHC=7:9BM`jhaZY^fmqutj^PJJUbfghgdbchnrroigd\SOQc|@(Uk]M=V~~g7"4DLYdkorqlty|}xxbWRRSUXYY]^bbbbfd^_gpxyyxx䷎jGQw|zg\PE9*4Smyqn}zvu|vcLCPaxm8$+*"#! + + ,.2:JZ^][YYY[`dgjheddba^[TQOMLR[js}~~yrlhaYNH@>NyzsplheaZXTLHFKORX]cb``]X[^_\XPLF@9203:>@?>95===:654-$ +$2@JQVYUNHB>;80(  -@Ucciltyrmi`TKID@<4026:;:61-'#! BYUJI:400.0@Oi|WD?DEILPRRRMKHECBCEIPTZajt}wtyù|tlaWRNKJLLIC<863,'" "%(.27>CHKNOKCBAA;7.+#  + +.D`zl[N9%'S{pfj~eQKJSbqxvmgca][]_bhd`YTOMKOLGEM\gjsz{vprtuojjkjb]`r׶`C'"(XusQ6&!&2FTb|&^~jfb[XSPOLNPQPJEABCE@7.25COakh`YXZdmornbSF@ER``ceccgfijprrlhbYMIHa|7Ul^K9Qy~~{w`3!2DMYgnqsrjquy~˾t_WWTUUUUZZ^^_`b`Z[biquvvwƠZ^}|xg`XNC3#-DZgb`ourmjq|fG*'?[uv?%'$  + '(,8M_b^\^ejnnonmjgfeb^[ZURRPNRZeo{yqjf^UIC?BTz}unhda]VVVQOMQUY[`b`__\ZZ]^XPFB;86347<>=::89ALUWTO<+ &')3DTbijhhnttqjid_^_^ZWSWZYVQPSSSTRTPMJMJHHGEB@<;<;:731,&  + (5AIQUWSKEB??=4+ *>S\[dmw|wuqh]VQNJE85:CJPU[nutmnsun]OA7-''+/48=AEHIGIMNNORSV\dhkkmqmmd^Z`ks}upf\TOHDC@>=47Jg}sf^YUSOMGEA@;83-)$% ,I[VJD93+*)-7A\pZGB??AEIKJIA>;99;=AMQVY_ht|wrv̾~{rj`YSPNOPOLE?:960+'##! ""#%),36:=>ACFJGBBGIIIC>6*  + +$)I[hlmktqleb`dhb]YRLGDBBA?@KXacmssojhif^YWYWPLPeҰW0  (-_wcH5)$*4:Ea6lyfc^VRNLKDEHIIIJLMJH?2',3AK\fe^YXVbkjmmbRE@GT]Y[`_grsojmoqmf`VIDCf}7Wzi_M:Pu~z|xoZ6(8HP]joqqogmpvֿh^\XWUTRVWYZ\\^\YX\emoqru}˯zv{rda``YM<3,8AHKEKajhdeo~jI).OnF&" + + + + +  $2I`jkrx{rliffdb]ZYTRSQORZ`jy~zqid[SC<>FUr{tka\VUUY][[XYZ`bcba__]YWVSLD;700348:51/*(%#$',.42753248=ANQPORYbhowulnxø|ypg^WSQTTSQNG@>961+($%"!"!!!$*.47:;::=AHD@@FLPTTRJ?5,&! &+04=BKUewyc`UE8.)&Ab}{}zzylHA6-9Vcc`bn~uV9BiJ'  +   "0Gbsztjgedec_[WRSRPNQY]fu~|yogaXOA9>GRj~ywpf\RONW]dgfbaaffeda^`_VROG@71-(,26:>?=5004=BIMUQKD;/'!+.4:BLW\hlvxwrnjZTPQSTPNCIRUSNLKLLIHJLJJHFCCCA>;987772,*!  "*7AGMPPMGAAADE<3% &3GKHZo}~|}xrhcb][SIGP`jmopQOHBIYa[LA:2.&(**.49;=AAADFIIJMOQX_cedgkljcXQPV[fli]SOC553211/.*-6Oopb^XVRRQQOJIHE@<;7863237<@@AHWb^OA@1! #%AYv{{~]D=B><<=;730.--06:6249?EMUY]aj|{ecZME@>:Nk|wsrq{qTF:;H\kxsd\YYWUKHE?9521.148EPTQX_`YTQLH?8432/.4Nm翊Y6#2Vk}x|tdQJI@=Ncq{9Xxrh\UUWWPLMRVTZa`TE4% (0?<339=?@BFKMLDA>7.259;?HTZkqwtrssmbYSQTWVUKOSOHCEJIJIHEFGHFEDCB?:5555551,) + #)19?BDGFIIIIGC@@7( $/3>CMk}wwwwod_`^]VLSY]frpdH=44>HLI953-+'))'),159<==@FHJIJLQW^aca_adec]SNKKNSUQC6,(%).32/)#&7Urufc_[WUTTUMMKJHFFDDFHHFFFGCKOOW^UEBF4"0Lmz~~{sv\B9:=>=82-+,-.0368LWgwm]]ixĿ~~xlaZVPPSVWTRMGEC74/*&" "$%%%'+.9;>><=AEHFB=@JST_^]WRPQQQMQY^`gndfm{|haXSTUUQhzyvywqjw~}re@.%-D\q|~rieXJEIEB<630-.,/3=FHHJMVULDC>91($$%$(2IgКd<  +(L]rupnpovv|sogh_[bp{GbqbZWVVWSSZ^[[\WK=/ &7CO]__\\XZ]`floeZOLMRRNT`zvurnf[NKN~SCm{~skcaiw~upgZY_dgkpstoi\[\dֿsjjg[SQRORWXW^aXUZ_cfjllptxſwlhjowsrw|wiYJEILG@>HZbbVeqogoD,!" + +  + $4Ng|ƶqplhda_]ZVTVTTSSU[^hs}{zule_UK:7>KY_dhnje\ROORZ]cdeehmjhfa[UOI;1*)& ##+5>@?=9138:;>@BFNSNF@82369@ADBEHJLLIGA9,  )/8;Hjxqpqpia\\][TVYYVYbbY:404:=:31-+)(''&%)-268:9:=CGIHJLQU\```__fhe]SH@@EIMI@:?KUU\ZWSRU\a_^dmokilgmvpi_ZZ___pyrorrnis}yodI7*1CZkwzqiaUECF?=:8533255:>BCBBJNLA62.'! $"&0FgກI(  + ;Nejd`bbgjpv}|}Xlzkb]WUWVZbgc^[VB4+#;HS^^\YYVY]`dlqjaTPNNHEP`þ||wuqh]]`^Uv{|tmhjv|phhjllnquxxtmg][]b~Мrokc[WUQSVWV^d[W\^cfghiknqwo_YYmxymZPE;-*3DLK@V`Y`D1)( +  +  + + + )Qe˲{rroke`Z\\UUWWVUSSXZdnx|}{tlf`UH;=GUbfghje`WQQSW]^a`bdhkgb\VOF=7&!!&-4<>>:51289::<>COYUKB<659>ADHOT_gkjggidf^WTUVWVPLIC@@DGLMKHFDCCC@A?A=;624443,&# + + + !%(.048;>?BDFJLONLG@:/ $+11Bnyqljhf`ZVTUURWXTKIPTP;50/1/+$)#"!$&%%"'.144678:@CEGIKPTZ]]]]`ehhcWI;4798/$+461)$$5Tqzmmgb]\^dgeb\YWWZ[__`bc`YSNKLPPKILZ]M=3 + Al}|vvwxw{zy~oS>5..0)#"#'(/02.,+$%$&(/8?BIS[ep{|bSU]iz¶~{|}{xqaROPRRSYWTNKFB?62/*&" $&()*-158;>?>AFKPI>9@NXW[XTQRZejihmtuojiiowvnc^_dfgwwpjglookozxrjaR?27EWfmokdXI<??<9@A<0&!#&+2Ggԧl6  $1DZ^XSRSX\enu|Ľgo}{tmf^[U[emoid`[>,)!!:JS\[YXXUWZ_ckple\YTMA>@BFKLJGECBAA@A?A=<833342,$ %*-117:>@DHORQQPNIC?90  $')(?r}slgc_^ZRONKJJKNMD@FNOK>.##$!#%'# $*--03657<@CDIJMQVXYZ\^_ae`XLA83/) '/42,&!&4Kew}xrrokhfgghif`^]`cemiec`WI>55ARVMMY\^TKA)@FKRLB>FSXUXTRMPU`fjjknppnnhhluxqlecdggh|pjddilnmmswurnh_SB8;IS^a``ZJ;455899:=<:;@AA?A@>956/& &+3;Lh׿S( +8IOQNJEJOXaiosutyvrw}wlca\htvrifcY8$&%'8GPYZXWWUUX]`fnnihaZO>5AUy{wz~jcu{y~xpjlv~xyulp||}ukc`hs}̪righiYTQRRSZc^\acffca_``cgnux}widgn}}uaI:6887.;OeaA)"! !1OnŪ~zqnle[VY\[ZZYVSONQPXerz}|qf_YL=9KeypdXTRUW[^a_abYOB6*'# %,095112320559:99=>EJKKLKC9;?EGGHKMW`ffefhd^[WUY\_a[SH@@ACEJKJIGECBCAA?A>=954442)"  "(-/027<=BGNLGEKTVPSPQNPR[`ijlpstpl_WV_lrkcZ[^chkki{{jeaafknnqoklruocRC;?JOTSRUO=236599;=?=>80-.12266999:=<96431.&""&*.2139>CINQTRNKJIFB:2'   )#'7Xzpkea[WSOJD?<;=GNRROKFBHB:0'#$$#&&#%)**&).4/059?CHKMMOPPSWZ`^]ZWPHB0(#,.1.*&')*+1?FHHFHLE42:@:==>>??AA?DGBGNOG;4-+'"!*,+')1=FVi̠H6.1+'(#  ,:DE=>ADGKNQS]er|td^eorogb\UKB6,+,,4?IR]]ZYXUQTXY^fliojf`RGLZpx{zyyxoorw|}upns|zzwsmebZhwǬvic^]VTTSQU\]^elnld_YVW[adggikqy}~~|{xv}yu}~~vkefkrw{Y=.10)&8Qi~wu}¦{pkhca^[XTRRQQPPQPJLWfs}~ylb]YK;5MmzndZUURTW_a`fgXE* %"),('.58<5,*.23235879:;61.)&" !## !Adx||~xvaLG>*'=]uxpnqmeace`ZWVSLA71/,%! "%(('$!%%%"+4=Lbvqa^Y]gu{~tmmsx{ypomjfbZVQLMT[\\_TOFABEEA:8631/,-034558??<:;>A;-1AH@@???ABEGFLNGIRRKD<563,)*/33.-4?EVhΦQHN]bdgcL;'   '29:=<;8:;@BMWfrz}n\\h|xoggg]QB?:6.-7ALWab]\ZVRTWW[chikihf\RU_e{|}wotz~{vidq|yvsojd`bo{Ӿsd[^YYXTRW[^ahnpmd_YWY[`cbdeglqx{}|~~}{yxxvtqtvvwv}~yqsztW<.1.)#"&''# &7Oi~Թ{lgca_\YTIGGHIJLMNIFQamx~}}vi`]WK;*@]p{}uri_WVVVUW]`_ei\H1&&02%+35/.5;=82,+0342234667:=;CA=;;:8664.+(# "%)-267;?ACBBBA=:89>??4(  #%"%-V|wogb_ZSLLJFC?==CLMNPK=," *.,%  "%$"""".6?<4,++*+048=CGKLKKLNQTXXZ\\VLD94+$"%((/13/)$%'*%!!&++*2/-,((%#&CbyjNKH4#$6SikeflUOOW]YSMHGC:1+(%"!)+*% )'"$06=G\mslddflv}yst{~|yvypihmqspmkkie^WPJHMV[]\`RJC>ADEC;:75210/347688>?=<>;;74529;428ADRiϭǽjD# )/650+').1=HZhqv|~衝sddmzuskf`P=;4+(.69JS^a_^][SSSU[_afgknmhda_dxs}z}wlvxkdq{uqmia_dq϶}h[\]]VTXYR\^horlf_ZWX[_bbbcgilrv|}}|}}{z}{zyvtrpspnknw{ypPA301-(#)**%!#)07Vy׶|nib\[ZSE<958;>BAJJLQ[iw|z{~|xodaa\M<06BR]cda^ZWVUWYZVZ`YP[`V@<:4-+/2321113578:=@CHKJFDCCADJNOMLOU\bgklkge`^_difhi_SIFJIJLID>;9BB@;7569530'!!$%#"#"'.57=BDFB=63132349<>1) &627,$3gtmhc^XRNNJFB?>=ADLKCA=-"'$! !(($! /7AD<2//)*/016=;9755:9;;=<=;=;;89;AEMPVZWOMPPQRPNNSVWZ_cgjnnfZG969?@DFP_ikmov}{|w^MC;663?=.5HOAEDCDDEIJMRPHHNSQICA@A=<=<=:58AGHSgƨkG(2+##+..+'&()8?MVbkv{Ү}zyqms}tnk`]WJ8*+7HR_``\\XURSTY\^ailonnkgb^r~qsxz}~{qhtvow~ztqmjedhuĤo`__^XWZYSZ`gnpkfa\YXZ]^^]`cginryz|zyz{wvqvvvwwuqoomigoxɼ}yjKB731.04552'#3AZuֹsoh\XUMC<6/-048:CGKQZes~~|{~zrleaa\NB48>DHHJIJKPRWY\[UVUONPOLKE@DIJC60.03420024658:?ABDIHFFEDCDIMOMIMS[bgllllhdbbdgfghaYOKJGHHHD?<:AA>9534621-#!')'%%$(.6::>A=93+),.146553/' EXMF4''+Js~rkf`\VPLLKGDB@@CENLEEF:'$'%#!"'(&#).794+-.*+/22483251,($$%&%!$+,% !"$&%$ "*08;@ENUcsnf^`dfdc\VRSNIEIOPRUX\^_a`a`[UNIEJPRY_]YVPHECABDA@?==<:8:;<=====<<;:9931:D@?7*#+DYw~ܿ|ypbXQLFA8.((*.1FRMJOV[VQFJKEADGFB94247764465769;@ABBHGGHHDBCHLMLGJPX^chhlmkgfddeeddb_WOHBCCEB?=:?><71.010,%")++))''.364651-'$$).4671+%,$(e{jT7+(Aixokf`]XSPRONJGEEGKPOILNE5 $+)'$$%()&$%#$*)+021025;?ADGHJKQPQRVTROD?8559::851+'',1871+$$%'*&$$'***'$ !"'&$#Ppontr`QV``UHDGKE>8751.-+(&%##$$('(*+' &+,++&')')))*/5;=>BHNUcxvh\[bcb^ZURL?3,*27@HMRTVZYYXTOGDCLW\^a`^]VPLGA?@BAA@>=<;==>????>===<<>BEPW`bXMKQQQQONORU[\^birx~zulc^^ehlinppfdax~iXOIFDAFD>9:<:>?CFKMOOOQMBAJOLEAACGFFHJJD>>CFJXgҹs]E0#!$$&(+16@KZaefjloqv}Ъzqpt|vlicXWYUI*'9IS`a_YWQUSTSUUX[ihkrz{vodfutaiyxn{yzm__u~pv~}zupmjhhkwŠlc]YWUVTQY\ckmmjga^YVUTSU]]^`bdgillmoojgbehlnmhdb\`frŷxrx{utvn`GBA=:8?I@>814F`wȩ{j]RPNI@9.*(()3AGKNNLJDJ?CXI8MRTX_hpnj[ZXQOMLHD>:8:;;9557689:@DFGILLLOQRQND@:77:;:961+((/3873/+)*++)''+//0)&!$'('(& W~ymq_?,%$)-.+)-/.'%%%###")*+)' $,221/./001000038:=@EIKWmp`]_^ZXVWWO>, #.9@FKOSPROKGEBCQ`efegef`ZTKA;;CBBAA??>>??@@@??=>?>>@CEQZdfYLJPQPNMLNPRUXahosrsuwxvsuz|xzxukih{~o]UQOKJHHE;0/39;AGLQRRPQJ>>HNKFACEHHIKMKG@?CIPcvhB !$//104>KSOQUX]_fkywstvaZ]^X[b_P+':LVba^XVPTSTSSRUZdcgmwywshal}ehwvkykl|n`[b}tfiw~|xrligim{Ϭwg^WVVVUSY^ahlmlkeb]YUSRT\\\]^`cdgehjlgeaadihe`^]WaoƱlghs~zrrtl]JCB@A=<=545?Of|ԵraSPQPKF<4-)'.8DMR]my}{~}yvrnf[NDGQlv~wcOA==>=;6688::;=AA@BFGIIJHCBFIKJEGLRW^cdjkonkgedea`eieWJ@>;:;<;9<:620,(('! (---(" #'()+)((),,12562,$  #Se]@1f~smkfc_\XUXWWURPMMIKLLLD5&(,%" &#"%+) "$*240/+*/29?BEHLKMMPTURRJC=97::9961,()/34410..//*(&'*.00'$  #)+)'%"Wtp}vQ5#)/,)+*'+)((%$"#%%(%%"#!&(0361/+1220/+)'&)-36;@CDNb}md]UKDMSVPA/"*/8BGJHKHEDFEIWfkllmknjc[O@65AAA@A?@@@@AAAA@?>?ABABDFPZfh\MJPPNKJKLNNRW`gnrrsz}yprtu`ZXUOMIIE:,*-49?GLQRRMMF<=GLGGCCGKJKNPJE@>BJUrҼ~T5  '320+*.7<>FECBBBDD>EADOIOpԳw^NFIDC@?<<:6678:sspnhea_[XZYYYWTQOKKMMJ?-+2-!$"$)& !'/40++(+.59@CILNPSVY[XUPHA;9:<;962-++0430.-00.-)'()+--,$"!#(--(%%#PxwnroN0".200-)0-+*&$"#!%*.18763.("((&#!!)/4:;8BVrsbO>6CKMLB3!#)5<>@BAACILQ]inoqqpvrleWE:7BBBBBBBACCDDCCBA@CFGFFHIQZfj`SNRQNJIJLMMVWY_gow}~~ytrpmkqyvaYYSMIHEB:0./46=;4.,/9Kby|yʵwk[LGFMOPLD<5649@FOZfo}|yxvywvskgd`TEHTostk]LEB??@?@?AA@CFDDPsʶmUKGCC?>9765679;=@CA@BCGHGHJGBBEHGFHIMRX^dejkmmnklkhb^_ed]TF>41156420-**'$!!&,2/%#'+/26887542-'   + + "R}vspkhdb]Z^]\\ZWVSROOQNA0$%+690"#" !%% %-//+((&(-27;BEMPTZ]^[WQI>767;;8730--0330..00-*('))**'%#"!!"$&))-+'%''#*Iixwhcr{h<(585221.+)$"!"!(/46<81)!  &+/2*4FarVA:FJJGA:) !,1559;=CMRYbklnrttxxvpbPDBEEEEEECCEEFFEDCCCFIKJJJMS[gmgZTUSOKJLNNMTUV[akrxwriaZWTRPMLNPUcpu\SSOGBDB>;;;746;?DFFH?A;49GIFIGFIKHIJMGDELWnáuN-&,-.,&"! )18>EIOQSWY\^gxsggg`qiH,*8?GITX_ZUPPLHJMKIHMQ[\^adjqwvhbjxxiis~{qhl|jSbpxojjjimsuxvsqoszϹo_WVRSXXZ]`chijkiic\VTTWWVUVXZZ^\[XXWTRWYVPKMV^n~ık^VT`r{z|}|}~yru|xmOF?;6/++6CYo~|y{urqryл~rjbWKEFHKMJD?;;9<@CNVaj|~}xutruutrgccaTA?I`^\SIA?B<<>>>==;?AJF?Zýӯ{XGECA>;7424469;?CC@@BDHIGGHEAAFFGEIJMRY_efjlnonmnmid^^cb^XH>4./153.,))(&!$#'-41%&,279<==7442-&  )`vuqnhfb`\_``_^[ZUYTRTQG9/58<>5( "!!!$$ !!#% ",..+)'$%)+/4:@LPV[_^\XOF;436;<96510.13520/0-)'()))+)%"###%&(*-(+)#"')'2G^psaXekqwuxH"(7:4/10,)&"! ""!#*/102-$  %(('8Rv~aLELOJDDA2"## "*./258447KS\fr}|yvusvutrl`XUL<6:PLIC?;867899;99:@:A<=mໝ辉WB><<;6442137BB@>:2111.'  B{kutqliecbeca_^\\ZVSTVSLE@JE:/&""& ')( !$&# (+$*-*&&'("20BDIOVUQNC=658;>><72.596//1232,'$)')--$!%%-,*0,'$% (6=;9>93/7BIJKLHFKMKGMDEXtŨH((&,)! ,/3:842//5567877696;85cѻޱQ?<:=;84554335;?CDFABFFCEIGFDBDEFEKNRUY_gjklqtqpppplhcb_]\TJ>1++.1.)%%'%  "$&.,*% !.<>5('6;>:B\X\ivvtsoi_PD?A>==,5<7118<5532-*%%$%&*(""#!))*2,'"$('-49:MjwiZUZ\\XSLHCUgvXB?UR:140-,% $%&-0/*$ "$ %%()**&"1Hcsm\G?BC:1&#-7:214/02016@HQPW`gipx{zpbRNMNNOMJHHJKKHFFFKNRTTRQTW^fihda`[UOKLNQUWWX\]P<. + +  :Y|zzjTF?<;;<;@EKH@:4116996:6209CHHMOLJMMKIGN\sõqK,#!"/14;ABB@?<9656=DLWahpxv|ocYZ^`dehiokgcb\VPOONORSUUOKNNPMLHIEEGHFJOWWWY]bhmfgaX`xzyunc_`cefjljmx˹~paSPSSUZ^bbcaecc`\VPK@;:=ENSWSPPSQJEDQOKFFQh~bPKIIJMWckrrsqmihgny{x~~eJ=:CTdgeflqne[mqtu}|mcbjokaXlϧwgTLKQWSG?>=?>@@=;40.19DQ^r~|}{ywtqnpmkhfZPJB737765542001133545445:31RǗmD468=;635672./6>BDHCCEECBCFCCBCEFHIMSW]agimosutsrrpmkieba__VH8,'+/,)%$$$ #&*+/0/*##2CC7&");BEHDCBBEC?<5-$ Ct~vommjjijkeeca`^^\ZXVTSPJA9970*$!#,$ !!$$" .1Caeƽd@+(7D48;401579731,)('$$$&$  %*(,'&1$!&-13449F\iha^ZTMD?95197:10,&%*46=FNU^epu||qeXSRRTTPKKOQOJGILQTXYXWVY[_b`\Z^b_WMGGLQW^][ZVF0   *E_zysu}zl[I>744;>>===;6/,,05875302?>?@=;61,.3;JZq{{vx~|zywsplmifcbXMD=53752446421//00223365854C_qrU6-38;931347/*+4;@BJFDDFFEBB??@DHIIKNSV[`fjmptvvuttpookkgc`c\O>-&(,+*(&%##(.1220*&'5ED5 "(0=CLNKIHFMIF@;2' O}tonmkkjljfdba_]][_[WTTSLD5563,# !'()!'+$ 1DLRfvκvnkbO6:?:76526522/---,'$%# %,6LYSB'#!(146619FP]dd_`WK@<8306CS[ZWVW[fX:--+,+&"$%('' #(+()($$%&'()))(()*(%""+>XpcA;A><>:4230*'("!).3CFLPV\_^WRNLGFIJMJJGFCDGIFINPTWZ]bceihcZZixqne\W[]aimmo}ľļm[YZLO[emoppqlf`YQMH=::=DJMOKJGFEFEEEDDITeĿzaVSNOSWZZVW\bhjkjiklmuvXC>EQ]d`]XVL@7KS_ixy_TSSTUM@:_ݫ|^SLCR^[RLKHDBB???;8840./5EUjuzvsw~|zywsojjfc`^UJ@:436//001/,+----..112337=?AFHGVx~kZI?//13761.003/,-4:=>JEB@DHHD=;:-'16?GTXXSQNRNLG@5*" Yyrrpnjjhjjhfdca__]a_ZVWVOD5674-#)1'.//',@bܟtYe|xcWkŽKFII?89>?002344221*" !&4Ald*#*0223560:FMYba[aZOGD?:68;AEIOTW\dT8,)&'*((,+($%#!!"$%&'()('(('$! +::?5)  $! ,2CYnyxobZ[^edXPLMRVUSX[]^\[\^adeaZWY]ULA;>HT[de_ZXVND9425:9<9732DHRTXY[\\]|tme_ZUK;,/7AGLNQTUZ\\TNKHDBEEHGHFFCEHJGJQSTWZ^`bcie`YYcqzn`^YSSW]clpor½ɽvc[SIHS]ejmmokcZTNJG><CED=>BO_t~gYWSSTTSQQQTX]][XUUXap~uZD9?KU[XTMG=3,CLWaphJCFBC@95=hŎeNF>@Wg\MHLKGEC?>;:69642//=Ocnvssw~}~~~}|zyxuqmhhc`]XQG<73230..--)('++**+,/0*-,2@;18;9InՇP=513).+,/0/00.0---148;ID>:>FHC<89a~ƁАVKY\UPM`ko|sG,0AHE1/2445322(!2NcȰu/19=:62451:GQZ_[Y^[TLHD@=:66:BMWYbfU:-(#$*)*,*# +""#$# !!#$&'()+)('(&#!%3C[nrV>:><64.&&+! "7M[fmysledejl`VNPX][W]_``_^^adghfa\XWKC:6;GSZcd`WX\YRMKLSYZ^`gghe`_djs|{soklwzwsolg\PHCBCHC<9=DHEB=;899?@?>97?IMIBCDC;8G[ɹL" $''*/)&%#"""!!!%)/4:>DGJNRTWX{xrle^TJ@GJPSTTTUSUVSOJHEA>??BBFEFCFJKIKRSVXZ^_cdea__cmwzeQMONPY^eorrsvdUEBJPVZ]_a\SLGCB?:78;?BDDB@=8:?A@88AVp}cTTQPONOOQPSUYVRMKNXftrY@3X}wgY{y"0x⹄b]figKB7+%>{fF@FC<865201//.#(Fpȧl,+9>>8688548GS[[Y\^]XOIEDD=868@MZaghU9-)%)-(%$   "%'(%"  "#$&'),-+)'''%#!&5EVgv`O<37:5. "!'.)+'%   &0=F]bjmmknmh_WVZ^^\abdcaaaeiiihf`XRC=539DOU\_\TV_^W[\dnuvyz{{xpgdehmx~}|ysljggqywnkc`YSICCFJKPPLGIPSNIFC?>;?@AB@@GMMD<;?A;=Uqƺg4 + &"! "" !&+0369<@GLQS{voe_YXSRSQOKJMPQRQPMJF?=;;>ACDFFFKLJKQQSUW[]`ccbbkw~`FDJMS\afpsrsúxbHCEJKPSTTOIA<875867:?@CA@?=79=>968D^|½uRONNLJKNQMMS\ac_]W]m|wlR6+6QbhZI91&-Ncouyzz{wgC!&"3:8A[ɈQ;96-:UdYMMKBDA=;;;879<<8.*3DTeptuz~~~}|zxwxxxwvtsrqkgdb^ZWMJB92/0,.+('%%%%&#$$%'+*&,&#+$%?@ARrl4*-35*,&/43.+,-)$&/8TL@6:FICA=>@DILNLQVZ\_cgknruwtusrpnnmjihb`^WM<'%&&# #'$$%)+///7=C@1#!&")18CKPTTQQPSUVVRG9-&  Ptrusromjiiigfdb``^`cec[^aUB220)$$/Jl}p|yiizԪE0Flæ|[NVL5Be~dD9=D@930./03(4YƜ_'379646>=578DS[XW^`_ZRJGHKA@==AN\eeeP6-)*/-' "%(+-($"#$&()++)&$"##')1FZjxxVK:15;6- #*0)!/631/)! (AOcprpqnqjd`]_a`defedefiljhjje[RA;54:AKQV[[TX_aW_bm|{pfbbahs}|xvuupjedcdlt{|zpibZSJD<:AHLNRVVSQVVSNKHD@<=??BDGKOIB@AFIEJhýI  ! """! $(+/149?EJM}wsk^RZXQIA??CIRYYXVLB>::9=@DEGGILKKJIMOOQTUY\]]]ny]GCELWckmqttyr_OHFFCCDDGE;0))+-05:>@BB@><8555349LknKEFIKMQUZ\_cbdhnvr{}n\B.%/I`jbSC;0#"FaejqlhlhX9 "#1@Naީd<463+BNSTTG>?@>>;;:99::;;6/19I[jrx~~|zxwusrstsqlnlibccZLGC?:4/-*+(%##''(""#$%%''%$%$$(,3@301!)253.(+&$))0BZWK<8?ED><>CHMMPPV[_acbbilquvvvttqolkihg^\^\S<%! !$&('&%'*-,+7EKB-!%(,9>AEHHHEILSVTI<3)  0kvquywspnkkkgeecaaaa^``[^_Q@5.0+"##FOk{^OIullS #/DǸwS9/A{THKFA;6103:7/,@iȽU943)(2;68>;>;982..0( + "3LZbhnsyvrlgfhihhgfdgimnkjkh`UJ:723:BHLRV\_a\YU[`m{}mbaa_adgqyzxwtqhe_ZY_dhsrkb\YPF<308GQROPU`b\RS[ZSMFB>;;=;@JONOUVLHJMY{¿s( +  #$"! #&'*,17=AC~~|sng[ROLE?:8AEGIIJLLLIILKNNQSUXXVVj~eSNPU[elnrttxp]OHE?==?BA9.'$(+/3:=?B@@>;621002?WvǿiHBDHJPTZ`bdeb`afkrzzhXE<-"?[npnidZH8,Lcdcd[[^`S:%!'2BVdv丈S60/02IPOOOD:;=;;;::<<=<><7//5HYirx~~}{ywvsrpqqpnkjie_`^WKFD?;71,('$! !$&%!""#$%&&'$&(,0348:Wձo@5;-*,!"',..,)'(%#)*2Db_UHBEHD=<>DIMPPRX]acccbgjnsssutsqoliheg]]_]R=( #%(,.,)&%(*--9FLD2"')*/37238?LV[ZWW\ZWQLIIHEFIHLT\_]cO.$'(,& !),00-)'&"!!"#$%&((()))))&$$$!,AXl~qO@;96DVS_eo|pMLGILLPQJB97<=78:5),;L\lvzyurolnmkiihiimnnmkgbWKA4224;DIKNQW]a^ZTLPZekihhaWRTX[_gkt{{wvtogb[UUV\_ef`XSOH<5/1;;@?CKPRV`]PCBOk;  !  ""$'-06:<~||yywnje[UQNGA=>DJ[chge`VI>::9=AEGIIJLLMLLJJLNPQSUSNMbqb]^[]ekmptty˼nZME=8789:6-($&,/38:;=;>;73.,,.6KjbE21+ ,DWdu~xeRBFWa\XUKMRXUG96;IZp~ߺb@2*")6RUNHIB88<::;====?>?>91/3GYjtz~~}|zwusqonnnligdb_YYVQIDC@<70*%!!" ! #$%$(#$(043-*3ZԿ[7.2$ &'(++('''%&!&(/Aa^XLFED?<;>CIMPRTY]_bbccfimrsrtssqnlihfe]`a^TA."(/5:84,((),-3=EA1"#")+.4;@DELJLJGB?;1' +#U}y}wtvxvrpnlllffddbbbbbca_ceVC2*)'$" #*ItSM\eq}~X!!--,-) 1Kf־mD9|sF47BJE7/-BOVOEAFLRSTRT`rqO4+46?NY[[XW_\VPNKHFFHMNQV[[_cN.###'% #)010-)%""!#%&''+++***((%#"!&9Mg{gG>=@@SnuŚrvsh\]fh`WLIQWSSWMB4*%  ++F`puxyxuqqqnnmlooppmli_UG<4+)-3;DHKJLPX`^XP@@DGIEDDB?BJPYeosz~zxupfaYQNMQRSTPID?91**4EZd_VPQXadabfa]VNGB?>EGOW[[^caSDE_R" +  !!"%')/4:<>~||uvslhe_[^ZQJFJOVbjmieaWJ?;:9=AFHKKLMONONKKMLMNOPOGAToxx|wjda]_fjloqsyȸhYND>;;=<93-+)015689989630,)-3A[}uZB7;BGOU]dmnia^_ir~zp`I6045, *J[u}kg]]YNLNGGLX_^WVYbqdJ84&#:\YMFGA88;;;?@<404GZku{~yz~~}|zxurponlkjheb][WRPMKHDC@;6.'"!"$$%#!#'*'%#)K|d;&$&%!'%%"#'%%#$*:XWPJDAA><;?CJORTVY]_acdeehnqssstrppmjged_bb_VG3$(2>HID=62,)(+1;9,  +#!'+05;BFIKGDB???>6+   +fxvzwuwvurppnnmhhffccccdecafhXD/'&$#Wn`YTZy׵wC13;>@<>MVOC2'*-++20Puհ\37DOK;10Id~nWG?BFKUg~oM2(/4@P[\[WV_[URSPKEGKOSUVXYbdO0#!#" !#(+/1/,($! "%'''&.-,+*)''#! %1CWo|ZBBITcvȦf_emrwigs|x|tfWLA3$)FZmwyrruspooqrqqkhbVG7-("%*271+%!):Pgqj]QOS[begije_WNHGFHR\ehc\ZYSQ]h1 $$%$+,03:=AC}}~zzwoif`\^ZPIFLV_koqmgbYM@:99=BFHLKLLNNPNLLKMMMKJMC=Mcebnyld^X[efhknqzī{kaVNKFFEB<50/335577997320*)4@UnkR<47>BIOW_hjf``fr{~vk]P<*#-0,%#'@Maq}xlma^YMMPKHMZjtutv|˗fL:22%$>`]OEGC:<<=?@@ACD?>AC?858L^nuy{|zuw|~}~|}|{xuromnljhgd`]VSPKIEGIHE?82+$  ""#"!  #'(#5ShkY9+%''!# !$)#"!1NKKJHGIHHDCFKQTYX[_^_aefegmprrrsqppmjgdb`dd^XM=- &4DSXXUKB6.(+-13)  &&*,18>CFIDB=;::<>;1& + /nvuz|{vuvuurrrpqpkkihfeeedda`hiXB,#"! =Ŀl>Hkn˺U3*0Rcf\anj\VJAA:*':Nmӿüi@=BNOC>?Txl\W_huwYF4'*5AR\\YUT\YTRSRNKKNSTWXZZegS6'#&)-1311-*&#! #$&'('&%.-,+)'%%  .:N_stVHO_vżÙdPN[oviXC2" + +(8]s~powusqqssqpfbYI:.(%##(/9@EGGFKT_cb[TJ@83/28?FOXbny~~yuskf\WQIEAACB=72)! /F[nwpdXRQW_cgjpokcYQNOS[chjf_WW\nt>   + %(*),,/29<@B|{||sjd]ZZUKEGMZepuvnje\QA;98=CGJNNKKNONMLMLKJIHFIA=Oa]Yh~{ndZRWbbdfjo{θxmd_WVSLE<62667799997330-/?Rmv^G8149;ADJRbed`_eqyvobPC8)"-128@BCGN[ee]YT\^UTVPLN\r÷lK:/,+#/J^\PGIB;@>>@@@ACC?=?CB>4-&" !"#$"!#).*.471133.'" %(!*?AGQXY]_[SLIINUZ[]__]_dedgmpsssrrqrokfc`bfe]XRE7##3ES_ac_VH=82.-," + "#*-28=>?@98889:;=?8,% 6w}xvxwurruuuttusssoolkihggfea`hhV>( "6sV;Xƣp?6FSZ\k}wyonige`YSUM:* 9VrЀRC>FKFGMg{hcdTC=6/18DU^\VSU[ZVTTSRPMOSUXX\[egV=.#&+058731+($"#$%$()))('&&,+*)'%#""2@Vdu|~nVRasѐT?6>Y{ʽhU7& Ecspwwsqqrsnj`WK=3,*)))+/6=CCCBFO\fklf]VPKJLOU]djqy~~||vojh_XMLHCA>AA>91)!(;ScpxsgaYSW[_ekrsslaXTV^aeiqtpfdr|N +   %((*,/27;?A|vuwzwmg`^[ULDFO[gswvoje]RC><;=CILONMLLMMLMKMKJFDCD>=P^WTe|ui[QU_^`cfm{Ƴwnjd[PG@9988799;;934416NfoS>0025589=EV\\ZVTWZSMA1(#&.BFDDIaoyywttqttwxxxzz{zxuqmjhgeb_]YUQJGFDA=FQUM>0'! !"$$$#%&')( % 195*'" "$#&7=Pdruy{rfWLHLRX__`^]]beeflprrrqrqrokgcagkg]WVL=''0=JW_gid\UP?5-) $*.367653/1479:::A;3,& ;}y{zxrpnpsuvuvwvvurronkjjigd`^eeS:&   0uVOqʬ~X:=Ukz~z~~}p]I7#.4[ȷqWGJPNRZo}xohcrudJ=43:=IY`]WTU[[XSQPRTQRSTVY]`beXC7* $,/267620-*'')+,+,+**))))))'&%#! !1@Ucsxy}}dWath5610HntS7+Luyuxysqpqqkf[O?2/03340..29?@@>@FQ]inmjkmljjmptxz}zsqkb[XQI?>>===AA?70(2I`imrqkj`VSSU`iprvqf]XX_en{~s}ļ^'   !"&'+/49<>ztrtw{ypkfd]WLDCKXdptulhb\PE?<9;:9;;=;<6575;XrhM6,0132237>FLPMF<75+'&>gtZMVgolWWfh__gfWVa|mC1672*# .F\OTOHI?;C>>>=?>>=@==BGGINiv}{wsspttvvvwyz{zxuqligdb^\YUPMHDEC@rݘUQHLaymQ1! +!9eu[[^]`g^^benuwukQThwhG2.:DM\c^XVW[_[TPNQSQQQSSX^b^bXG=0%*012444101.++/11/-,+**+,-'&&$#" /46/D`ƿjF#9g{xztrqqohdVH7./389:62/27=@@<;=DP_gopy}}xmjcXROG?6677;;AAA91,"&8RhjkopjlbUOKN[emswsj_YZ[gzvxh3!  +  "$+-33xlb_aZSHBBJUalprnkaXLB??@DIJLOOLIKQTQQKKLI@<;5;:;@Su}bB1-./+!&#"%'$!""""CvlJDWhjXX`gidac^cmyN4-.10*$'6L\TLJIKI@:=>=>@ABA=?@??ES^twxwvrolpqvwwvvurqpnligeZZ[[TKHJJG?48Keue<''$ !#"#%$%##" &+1/.+)'$$%%$$&&&% -D`}mO?BP[_\[Y[_ghhhkmoqsrromkjiijie___[PG-%#*0:CMQX\^`cd[VJ8)'+489;<@EDB?;61.58>DGC<88<9*"!(Ow~xwvtqonmnpstwywwvvvsrpoolgic[dkU2  +%GĊ~~cXbhuxfK) -rwYSG57IBBYe[LIWx̪]06AP\ed]XWWV[[XUSSUSRQQRV[__``T8!!02101340.0/-,-/24110/.,++&'(('$ "7HVYellnrwfON[mzz~Ği4#.872KqY8N~wywyzwm`WG?848@FG>85335;@?<87;CS_jr}xpjkg^PB<<<832?HF98-'&# *CO^jrurmi`WRX`b]`gqush^Y_Sapjpzxpyƿv8 + + + +  + !''vj`^`YRGAAIV_iklic\QJB?ADFLMNPNLKMSUSOLLPLDAABIMS\XXb|xfUJJPVZ`l~uprǾcVRNHEDHFEA>;:@Mex]A2/,("  + 0Lt_FGV\SPT[]\_cgmwzM4+-,)&&-=NZSLHHJE@:<=<>@ACA=?A@AIWbruuutqpmopuvvuutqpolifcbZYYXRIFID@:4@Vo|a7 #"'#! "" !$&&'%$##"$$%%&# !&+2421.++(*(***)+)&'"!% *LhkO?CNX[\Z[]`fgffimoprrqnljjiihhd`_^[QI4,$%+/9BGJPSVY\_e^TF90./:AINOPOPKIHDB=98>AEIJE?;5;5( *Px|xutronmlmpttwywwvvusroonlhic[dhR/ Zȟٽ^PTgzyeJ/ +RҺĵ|Z?2!&70(9GDBMjπE98U^fc_ZYYWY[XVSTSRQPPQTZ]_abW;",/.,-//,*--,-./1210/.-,++(()('$!#7HRWafiinspL7AUtrvwN(.:;5CKNA<9644:>B<623DLRSRPQMKJFC@>BMWco|tF)!# );NWXRMGEDA>=;<<=ACBADDGGJR\ekmmlnnppnotttttsonlhd`\ZXTRPLDAB<88@YrkH-$%%*$!  "$&&)(((**,.47;?@>>?887763445564778614116/,6X|qYC=GPWQTX\^aaaedhkmmonmjhfffgeeb]\^[SOE:.&&,38==BDHMRVWUSLE>:89<@DEEFEIGEA><<;@@??=7-'+1.!  2Vyzxqqnmlkklruvxywwvuurqnmljgfc^daE$ +.6`θY:Ac{{hR71͸}mfU<0#&58:BVi{TPXcikfa`_]YZYVVTTSPPQQRUY]^ae_G+ &('$$&'$#'),.00///.-,+*)))('%#" "$#(6BKNUY\`flsq_;.MczpTITdpzvsoeWB<?>?ABBAGGJJMS\cfhiilloomnrssrsronkgc^[XVRONJB>>68?Mh~nT@4$"$0)$!$%&#"! "$(*)+/2544166:<>>=;<<;:99::7787:;<:;B?:8-)5V}|iQ?=JSWMPSX\^]^cehikkmkkhfdeeffca\Z\ZUQKA3($*/278<>BHNQQOOMID?::9::<>@ACA@=:9;;>=::4/&"'+(  4Wvvuppnmlljlsvvxywwuutrpmlkhdb`]b^? !!!&TbQ.(Jy~peW="xwRP^\K/"'0:HQyᴃ^T]knlfca``\ZXUUTTTRRSSTVY[\_ebM2$'(&##%'%$'),/00/---,+*)('(&$"!! !""$'&*6@IMRUX\ckncE$ &;P[]YUE>ISSTKA82-&.?ILA1$$8gÜyU3!08'2W|th[OGC>8../*&%),&&8@B:/++)3;FMNQUY^dfcdmruvm_VQOMMEFKH@0"%7JMB301IVdijljfecZNHOZbxqbVUeȐJ.4--(!"$%&.:EReyüÜP)-,,&" +  + + zz|{{|~}umd\[WSHA?CLU[]]VPLJIPU[\ZVUTUWULJMPRZ[\ZVVdsobfvpM78Mmpj±ý]D:67<=:61-36C`~xfO5% "  + + ,=HWbm|zkgc`^VK?&%&+..17EQanrttvzrD$ 1IX\ULIHECA=>@@??@@@>FGJMPTY]befgjjlljkoppopomlifa]YWTPMNJB;90:L_xxaOA,!$'.'!"$'% ! "&+/469<==:74+)((('%""$$#$##"%%$&'()(*1323,.=g~iO?BNWVIMPTXZ[Zabehijihiffdcddec`\YZVUSRJ;,(+..45:FUa}ݳa<@63+" +:EzğU-/-,&#   |}~}{{}~vof][XTIBAEMSY^\UONPRWZ_^YTPOLPOHFJOS]`c_VQYf}yxkbhvnRPeʿǴ;cH<66972-*'3;Pmq^G/$! #*-+$!'& '-8Kbp~~bTGBED@:(&')*'(-8AP_eijkrym? (>T^[SHGFFDB>?AA@???>@ACBCCB?:6,*%$'*++....-+*)%$#!!# 4Ws}ppllkkjjiltxwyzxwuutqokjif`]]^cW8 *-(!8r` (Fcx~sk{tQ(.cלgXV_vuspfcccc_\XVVWVUTTVTUVX[`afeT9(&&$"#'+++-./00/.-++*)('&%(&#""$')*'&))-6AJLMORVaifR. &%#-) !*-(+3393*'&% #(';VsɾĢZ01..(&"  +   +~}|z~ypi`\YRJCCGLUZ]\VRRW[Z^b`WPNKDGICBFOS\bhdWKOYrvqoqgagunm¼кrWI:874/(&#;Ga|nXA.%$"(-0,$#+-)(+.,'-6>M`x~fT@42133,()*)$&)/9GS]bbcjpuyf8 ,FZb[OFDFED@?@CB@???<C@8588, (-JPR?6+'%()((''),.+) +#3CKB41-'##!.:CU_[]kwzkc[[^^WPKF?5) '5GY`O5'*2N[hljkkkc[J3%! 2." VCA::6/*&#!"&4Kdt¾úŦ`8831,)$   ~~~ytmd[UPIEFJPUZZWWW[^`d^ZUMFC>?>>HU[ckgVFGOaeggdbbbs|Ŀÿ|`SHBC@8+)/BVm{lR;,%##$',-+%!(06851/+:?IWfxk]L=,$3./,'$)04;DLRRTTbmsswyrzsV1 !8N_aXIA@ACEBAACFD@<;<=BFMT[]]]gjqssojgaacdedb_```^\YVULJMTOA9:FZ|zM:*"'!$ $+*(4589;6.)  +(=Vtx[HGORM?ADDGJNRZ[[\\]^^_][\^`ccb^ZURQRSUPG>513388;;98:=@EHC>=;61+$#%&!"%&# .Qisdhgfgghklmnnqtuusrqqqnlkid]WW]dZ7".3, 1xoL2Cy|x||lXA'>xʶyojljfa\YYVTTXWVVVZ\`_]bgbQ=+!"%&##(+-//213/0-,**')')'('')-0325.'%%'2F>631+/,%&6CRW\aluumeXRZa[NFD@8.$#3EUWVJ6(+3U^hjkkid_R@,  " 6d}E@82430-,)&   ?W}ƾ¾ŬnLKC>5.)%!  |uqi`XRKHGKNS\Z[Y\`ede]XPH@=9;76:87?KX_fcTEEM[`cba_cdowؾ}iaXRSQG:79H_wfL8,&#!%%$#/2:;;;==CHS^myxndYK=//5<61.(%'-69AFIKLMZemmoxzulqiK()BT`aWG<;>BFD?ADGFB@<=?BFOV^`bbjpuyyuokca___^\Z[[[[YWUTMJLQJ=7:Mfo@)&"&% +24579872' + &/C`zoYKLOLE>=@CDHMQX[YY[Z[[\Z[Z\^a``]YVRPPPSQKD;66258::8779AHJF@=:63-&&(("  +MgpchedeeghkjmmprttrqnnnmjhgbWSX^dX8!*1,"/taA6Lz}rhS7=BEA>?AEHHDAB?7,#,11<>,  $7<3.+*,0479;;<<=;84,),/'"+5?C:223/1.(""+;GV[`elrof\SPX]UIA;5/)&)7GYUOB2)-7[bmligfd[QD/ +#'%%*.# "IxfIRN@=85332/*&   *AWiȺqTWL>72*&"  +xskb[ULHGJMR\[\[_befaXPF?964532444:AKQWWI?AIZ\_`__dfnr{ywzؾtqjhjg^RMLXmsV>2+&$" ! "$(*49AHNPSTUY`gqyuqje]WOPTK?3.)&$'.17:=AEHQ\dddjomch\>  +4O`d_TE:9<@CA=@EHIFC>>?DHQY`aackqx||wpkea]ZYXVTSSTTTSRRMIJMF;:AYxh4'$'(%$(.58930+&  + +   +  (J^odVJHKIC>>AADGLPUXVVXWWWYWXYY\\]^\YWSPMLNPNJ@73-/2795457@GID>:600+)&(&"  &Gbmchbbcbeehgjilnoommkkjjged_RRY_cT4"'+)%1q{K4Eg~xxgI:I̽ݼ˒|zpmmifeb]][YX\WXWZ[^``gfgf^N7)&,0.,/00.../.-,,/.-++**++*+.4787)$".>BJLFGR\^WB3/2:@668=A=559EDA::?CB=?DHHGECADB<0%%) $ $282,**,02320130.+*("").,$%,:AB7148631-)*3BMY_chmng^ROPUTK@:2+%#(.=LWOF<3/27V_mkhccc[VN9#"#)/+$1QxŦuJNfcLC94778696/' +   4XwƾpWYN=73.*$!  + zulb[ULHHJMRWXYZ]abbZRI?9865:88677;=?CGG?8>F\`b`aagjmpwÿj_Y`qϿzz~|vlf`lxiJ4-*'$(&%"#(/4;=FQXXY[\`ehlpvz}rkfelossWE3+(&"!"$*.4IMW[__^`krx}{ulfgb[VSRPOKKLMNNOOKGHIC;AMgh0!*%%*)+-/.*&%    +  + +     (<70' $7KaŹpXUG7222-(((!  +{uka]UMFGIMRUWXYY[]\QKC<8:==AAB?@?><;8660/8C\^`_ackppu{|lXNR`x̽yq{~~dE/'%##"$$'/;CIFGMRRUZaeijjjnr|xmdds\F/%#!"&.9DKMU[ZWY_bc^K* ,FaibUJA=73047=CEIJJGBA@JNX[]]`blsy|zsjde_XRNLKJFFGGHIJKJFDC;7CUtd+'0&%*.21+    +!# #$#-' (+& !  1@POECIL@@A@CEGKRRRRQTTTUUUWXXZXWVVVRNJJEPXQ=.+)(+1433478@EA:740*)('&""Ccn``a```bbccddefggffeeeeba`[VPRZ]L)"&(3RP4Au}z|dM:AnΚͭ{zqnmjgeca`_ZY\Z[Z\]`ccedcffZC23;?<7652-+,*+)+)-*,)+*--3104:;62%0@?FKIMYa`M5(+18A<69@EB;;>448@DBH_lfVB0*++/2::84.&!   +(>Rg´nVQ@.*-11**,%!  + +}vlb^VLEDHLOUWWXWVVTID>;;AFJKMNHGFB;3*#$2>[\^_`entvy~|sgUGEbƳ{~~w_B-%!$',4@IMB=BFIQ[fkoolknquwjdn{`H.! #*4@GLPTUUY]ag_G" 2Haf^RHD:4.*-4>GEHIHEDDDINXZ[[_blpvyxrjea[TOKIGFEDDDDEFGID@<32DZb( ,4'',01.!  +   &5CMLF>?>?A>:61*" !.;:;CDA85<><653.)#   '?MRA9.(&(,-+---++++"07:54::5767;CNY^bcinlc[XXYTH=741'"(9UlweI2# ,6Wbig\RE==CNL2#')!  2GS^hhcWB,"&34553/,*&#  + !,@`{ϾiQI:)$'450,+)'#! ~xmeb[ODADFJRTTROLJIB>;:=DLRWZYRQNF=, (>Oceeaadmry|vo`ROVf˸{|fQ:)$!"&&##*./&,6.)*18?BEEFDDFGOS[[XWY[bhnssojfb^XSPNLJHGEDDDEFGB?;47Pii.#.4'+-.)     7HXblvhTQOLIJD?7))% (56575) *6DGB@AA@@@?@ACHKLLLMMOOPPRRUUUSRQQQPOONNQVVO=("&(&*03=BB<7652-,+)%#"" ;\l`a]]^]]]]^^^^^^_^_^___]\[YPNSWP:%#&0379=957::78:;>@>;;@DILF;8=<47421/,)%!! 9R_QI?6333245334430) "06844;<799;AKV`digilh^XXUWSG?;61& 2G]lul]I6.9EZ^^WQH=36;IL8%382%!#'(&!.>O\eeaf]F- )+/233320,(&(&"  #1Xv`G?2+%+8A:1.+'%$ ~zohe]QF@@BFNOPMIEA??=:;@HPU`ca[VUMA/#%;Xmrpmgccjn{}}{uibPDRlüv|~SD3'%$%# ##BISY`eVL2$8H[]WQMJD<3+),/5ADDBBBFKW]`^WQQTZ^djljgeda\XVTQOIHFDCCCDB?><8@]{u:$(03'.,*"  >[gCFB<984-''+  + #L<("9HC=737;;??@?@@BFGJIIKMMNONPRQRQOOPPPOPPQRRSXZG)  ! %,296682(&=JDILJMWYT=*%($"-2<87::8:?;@<;<>EP\ehnjjkeZVXPTQGA=7/(#=UdjikleRFHTTRNHEA:169HRA *9EC=@GJIFB><=?BKNU^[ZhhQ6#  $)-1255420020+& + + /DWpѼY93(0*/@LD93+(&$"{ne_YPG>8:BHJLI@979:;>EJLU]ZZ]\PB>A04?Qjshfkmqr|xyoaWVTUlſnzqP8'$"$  )FY^[ilonjilovx{ujhospZA2(# $'+18:8;EJORY^U>! -82/136???=AEKRZ[ZWRNMLQV\acc`^ZXWWXUPKIGDA??@A@=;;;HeqA118;)%$ +(4,'  ChSW^K.$,20%"(  &KNF50?VacYPF>:::<<>=>@CHJIFEILNMNOPPMOPQQNONOQQSSXUX^M-!/?F>10/*,+,)%%''$!   0Tff_]][[\]ZYWVUTTUVWWWWWVVVTOQZ\F+"%#/49Lfy{vux|rpp^D.*5Kqٳɨ}ywtqmmkliecaaa`a`bbdeddegg]M7&&-/-,18:000--/-)*+,.0357?7356,! *;88788;<=>>=;;>ACCBBCBA=963300121/.,"%()'$%"*K\\ZSLF@;8>82*''$ "/9;E@::>BA>BCHQ[eklkhfca[WTOKHED>71%%AZa^bkrqf\Y[]SF?<:7515ESI, /ARSQNPVSPNNMMMUYZ]_accdWC+  +!',16884//32-' +  2EVnƷjI7%1>IOPIA940-+&!!#zmd`YOE?7;AFHIF@978@>CMTWWZa]]]XLHHO[pwihptw{wut||ucWPV\fʿ|ozkF0$"!""!"9P]bimppkjlovx{xolqtiU@4,'$%$%)*-1676;;<@FMTZ][XRLJJJMQTVWVUUSRSTRMIFD@><<=><98;APkp=(.=C-$!.AKC1& +0s}S# (4- !%" $ ,P]fdgr~}qh_TKC?<:=AAB@@CGHFFJLMMNMONLKMMMLNOPRRSTYWZ_P3)>H>/..(*(+)%%((%!   .Rdd_^\ZZ\ZYXUTRQQRSTTTUUTTUUQS[ZF*!!"27;Lbt|{wuux~}soo`E-$(Ao˪׽{}~}zxuqnmnljhddbcbabbdceeeegf]M8)&,.('-575552131,,-.03589>5000& *=CEFGGOXSH6#"$&0079=<96665589;<=>==?ABCAAAA?;7412000110//(*,*)&&%)HYYWTOLIDD@:2)$! ",:EGJA@DFD@<;:88?O\a``\YZ`iox}Ƕ|lku~{qnmux~|yqe\TR[ju}Ƹyq}{`:'  '-49AED7,)9N_gjnrrmklouwz|ustr^N>60-**++///2568=FLORUXL4 8GOZWRMIEFDCB@<97:99:?FOXZ\YVPLIFACCDEGHHKKKMMLHE@?<989:;8445.' 7inH %-;G=$ + +-, )0'*?Vmy}smdXNE@=?BDDB@@BEFGKMLJKLLLJIJJJIKMOPQSTYZ]`W:"  $=H@/**'(%''$$(*' ! -O`b^]]\Z[YXUQPONNOOPPPQRQRRSRRYUC+!3:>>;5321/0134431-/0/,(((#'DSRQRSSQOOJD9/("$).9HQVNA=EHAAHKR]hpturhd`[WRPMIFDA;4/( .?LQPT[fmnjd]ZPB83/.,22>MRC1((4J]c^][XYZ]]^^`beeba_^_`_WD*%-3360*(,-)$ +  4C\yoWXdb]WTNE=940*!!  %*/3|ski]LA825:;ADCBC@=;=@BFGLLJGJJJJHGGEFFIKMPRRUVZ^]ZF+  "=I?+$$"#!%&"#'(% + +#  +,M]_\\]\Z[XUSOMLKJKKLLLMNMNOONPSO@)18=JZionhimnsxzoha[PG??ADT\glooprfJ*+dľz}|{zxuroonokjighgddcdcddcdded]N8*%'#(/33694433-215598;:8-%" -@GGGHHNTNA1"&.+46::745411457:=>BCCDA?><;<<:5221.-0234443441,**(%$?IHHLMQRQRRKB90)&'(07=DOUWO>:FH>@LR[hsxywsid^XTNMKIHF?8/*%)7BGJKMQW_ge^WTL?5/,,,008GSJ8)%1EZdb_\VUY^`acfijhd`][Z\bbQ8  %/434-%"&'$   + /WsusiYZVPHB=70(&'(&#! $'.4:@@>>>?B@9879?GRZXYUSPIC?64.*),03:=?AA@>=;98679;<945Gfg4!"?hx]H@:7/ "1:6 1OXOJML@'&"!"%)& .Pw|sppni`WRMLHFCB?>?AEGKJJEGIJKGECBBCGJLOQRVT[^X\P3  %AN@%!"!$$   #! .JX\\\]\[[XURNMKJIIIJIIJKJKKLLMOJ<-,6@BCCCA?;9:;;97543-,0245656653-+()'#9ABACGKMMOSLD=4.-16@EFFJLMJ:7BE=APZcowywtpia]UQLKJKKH@8/(#!3ADEFGGEELUWRLKE:3-,+,,-29:CJNNJH:!0ERRSNHDC?>=::;>CC;:::AHQXWWTSQLD=4/'!!&*58;=<:9:875568;=:68Jlk>.2TfA2# % ,2 )OfN?6BQR7 " "'=htnlnonhc_ZVPLHEB??@BEHIHDGHIJFDAA?@EILOSRVPYZP[X:  *ER@  + !"2KV[[]^]\\YURONLKJJJKHHHIGGHJJKMF>2%'29CTagg`cktqcWPLKOPS[j|pS:)  #%.18=<;9+   -?FGFGGMRJ=)''2599745554568;>@ABBA@=9779986543.-1234567761-))((!5ADFIKNG?:5,-7AHMIEDCAE95=@?HWdksvtpnjh_ZRMJJIOMKA8-&!*=GGCBDC=:A=93.+*,(+,6HN@-")5J[_a`YY[_cgilomic`[YX[acYL:" /:;52'   8gynmhb\WPKKEB:51/.46:AGLQSupeW@4206FJJFA17LTSSLGFFB?<<<=?DC==>>DIMSVVRRQME=4.&"&269:8667432247:<;89KnnME@Ow{zaG5% $ '*.))$-F]dD62@UYH3&')))" 4Wo{qnoqrnkifaZTQLB=>@ACGGGCFGIJFBA@=?EIOPSTXOVUHY\< -IU@    +!6LUZ[^__^^ZURRPNMLLLLHHHHEEEGIJKHA9-#$05?NZ`a]`ir{yxsaWF5(!,08BTl{Y=,&#(1=GQY]SK?43AVfiT:$8_~xyywwvtspmlmlkjikjkfeeccca_`^^]VH6)$&$!"! *344699==>>=:74!  + *;BCBDDJOG:%#&0367534365657:=?ABBA>;75466544521.1456658851.*+++#5:<:::=@EGG@961(+8CJMGB??=B;79>FS_nrusmiige\TLHGHHPOLB7*$ (6GNJCAA?955::84:982.*(($(+2GQF2%(1BV_ceb`acfloqqmjeb`]]]a`XSH2)=GF>1%  +    + &EVrungd`\ZUSLHC@>CDGNTY^_}sncR>3028@HQSOQUPCGHRfʳ~sw|unlmj_TVTQNMLNNNJNRYVLBNSYYVPLH@6+",Sȴҿemz}sswʴ|y]=$   1Iewxzytkb\Zahruuspprvy}~s]E=;85.,+/155544213;BIHB<+:OVUTOIHHEAAAABCED@?@CFJNQUURRRNE=71(!#'159974452101259;;9:KmoG<>@EFECDGIJFD@?>@CJMPQSWLTPDW_? .LWB  + + !$ #8LTY[^``^][URSRPNMMMMIIHGDDCEJJLID>4* +/:GS[\[]ekmcTHB8) + $1DbgK:615AP`ny~wgK2)4L`gVA' +0[zvwzvvtspmjijijhihjkggeeccb`_]][TG5&%'& &0337:99:;:851-  ):@BCCDKOG7%%,1553122755458<>@@A@=:6413432243325677877752-+-,+$6::6456:>CD;75-$(5?<86835673/9884/*(("*-4GWK8#%+=Q_fhjgfeimqqplidba``]_\UTP:$#2FQMF/#  +   + ((Avxqqqpgdd`\WROOPUZ_cfh~unaXE4.16:ABDFIF>5ASn~z|xv|xsfQUPPOGIMECFLLOPHBJKNMF=77/-('U~Ʋ˶u|ƽxsxԬzzjL1! + 0Olzvh^[bgpvzzwsstx|kQB<71//36:88431/-.3;85.($%')048:976676433467:9>Om`5@l~uQ:/>OQNQZYRC+  "!#,6=47LdldWGFU]WSUP8BEEQYI'"(:Qhvzzsolklprpqpjf`TKF?9=FHDCFDFHIGA=?@ADGJLMOOHELZUI!4KaD + + (*&*>GOXYZ]^^[YVUSRRRQQPPLKIGEEFFJSMHNL=2)"#! '!0AMW^ZVY_YB& !,@^ƺxZF<@CM\n~}pZD9@@?AD@96:CPaoxupkgdca][ULDCFJOID<-!%;GPMD=AG?;767852=?;3.,*'(+/4FRH7!0GYdhjjjkjijihffed`_^`XSSUPA5+)6GOWVH.     ".DdtryxrlhgfghlmmmmwrgYF62576>=?=3/@WoǮ}}}}q[YPROGGKDDGIJMOLFJFD>700464,)XȾϲ~wttuzԫvy{dD-!%+$0Olzyka^chpw{{zvrsw{~fL>;51/169;:861/-+07=?BB90% +!?PWUUQKIKPMKJJKJGEFDFINQRQQQOOOJC=:81,(')*14798767543235799:>Mi|{gA!@RO;7;KVVVZVO@0 6KRA6CWYJ8CGU[PIJE7<@KaqgJ%"2G]nrsnljhhijorsqoj]RI?:>DFECCCDGHFC?A@AEGHIKJJGFPZTE% :\gF     "+-(,>GOWUYZ]][YVUUUUUUTRQNMKJGGGHNZTJPSD4+#'&%*#(:HS[^YUQF0 ).4:=<850*&*9V~wXF;7=GPZahlmfZMDGOW^bT3 %Ltlopomjgd`_`cedccdbcaa````^\YVSTQG5((*&  #)12/0,%"   &:DHJLMTYP@*"!%,,+,*+,++,--00223456998776331.+,04466777764355752010%%*)(),/357:@?:7775279>@A@BEC<:ALXgruqmihfdaZVSLFCFHJE@8+!!(?GLJD?DGD@:88864<=:2-.,+)+,1CQI8%";P[ahijkjfgeecdd`_][]WVUWPC;:9ET[]WH-  +  #@f}ywssvvwxyzyrjZF611-*1/8@=>[ʰfZRTRKKPJEFGEIKLHIB90'$)3<;5#4aľ|ÿɨ~y{ztrojhuحyos}qY<)"#(**5@9()"2Qn{~~oecdipvz{zwstx{~_D:743157:>=8420/.4:ABA=3+ *FTWTRMHGIMKJHHJIHDDDGINQRQOOLKJF@<<;61-+**.03433452222479;:<@Lc}kb^L-+/5FYcc`_]O@*6RVA.6FLA48?RZMC?70-4JdqjT-  (=Rdiokjhfdddjottvsg^MC<>DFFEBBDFGFC?@ACEGGHJHGEFQXO?+ 9glK  +  + !"%--*!+?FMURXYZ[[YWVWXYZYXUTQPNMJJJJTfaOTZJ4-&**'.' 4FV_^WL>/#%-wqhlnnnkhea`_cdcbaa__]]\\\\ZXUQPQNF6+)+&&'$! $8CJMNOTZQA.#!,;?;6+*&&*-/.//./2345444433330.,+/36685410.0/34310/10#!%$#"&+0369@A??@=:8;?CEDDEHIBCM[fousmhgijf`URQMHFGIE?91(#&-DGHFEDIJKE=98886;<8/+-0/+*).AOL>+ /FU^efjjieeccddeb`^\]Z\[[SIDJJWgjg]L1# + +  'Ks~wodVF8.)&'+)0BYuðmYQRVPQVQGHHFFJIDF>K\WE<5*'9Xr~tjheipvz|{xrsvy|xV=5434479;@=8534667=EGC;1,.HTVQOJEBGJIHGGHHGECBEJORQQOMLHGC?=<<840-+**,.../02112469<>=@CK^ysUCBLC,!->Wnoh`ZQG5 +,5'%2-BfqQ   +  "# )./)+=EJRPWYZ[[ZXWYZ[\[ZWURRQPNNMM[pkUX_N40)..,/*.G[ee[H/*;GUgu{woiQF7--@cy\H=93( %,1:FQ^ho||^</imdinpnlhfcbaaba_^^\\ZZYYYYWUVQNMKE:0*)%   ! ":FDJMPVZL=/#!1IPJA0,&&,132-.-./032102123331.,.1576751.+*,,/0210.-)  "&*-04>@A@@=<;?BEFEEEHKHLYiquvpieejlg`TQROMKKKB<4*$$+3HEEEIMPQPG?777549:4.*.120,',>NOJ1 )BV^`bhjigeceeggeca_``ba\UMIMQappl]J3&    + +  +(Bc{}ul]SF6& *6@IV{Ÿv^UX^XUYTOPOLLMID>4(!2FON7Foĸ~v{}w||okı|}~yursw}wprupibΞvk_eu{|o^H511:HQOXgfUQJ<8D_wynjeipw{|{wrtvy|~mL900247::<:74225:=;AJLE;32#2KUVPMHDADFHFEFHIGEABFINPONMMLJIDA?;<951.+*+-/001355679EFDTbaU?(!);EDEE-# $.33./!AFNOWXZ[[YXWXXYYYXUTQRRRQPPP]ur[Z`P85.21.2--H]gnbI)&8HS`ijfa^KE>76Db}hXPM@2&" %)3ARet|jK*&e|kcglmljffa`_`_^\[[YYYYXXXXVTVPKHFC;521,$    +" ! 6B?GNT[^N=-"!5PZSK;4*')-/-+----.0/0/11223110/.14532/+(&%'(,/440+*$ "" #'*-/9=@??<;:ADEDCCEGOMTcrvusmgcdikf^SPPONLKIB;0$ '19JGGIQWZZRH?656329:4.+.232-'+8HNN9$%C?ENOG:59=) 7NUTOKFBAACGFEGJIGEDBGLNPONLNOKIDA?;;841/-,147888:;;;=>@BCDHIIL[sxY2*QT;,$)AO`mnkibYND<652/**##056;?H@L_igV<,''))&.5/-/26:<:;#$>Sbifeefeb`_egghovxt`TDCGIKLHHIJKIC?>@CGGECACABCHJHFA'M\    $!!)140#&8D>?HMVWYYXVTSTTTSSRQQOPQSRRRT_wxb\\N>;330.2,/I^eg\D(,8EIJF=510:<>>>Hawxoj\SLJMLG?:739:4,&&%# + + #$""/;CLSZ`cS?+!#7R]YRJA4*('&%.-,----.1112200.2.-,101/*(&$%&(*13750*'  #% $)*.:=@@?=<<@BCCABDIQS\kuvrplgeehhc]SNMLKIGEB:-+9ALKJPX^_\QH=643218960-0220,%'.2)# ,`u}`býunmopw{{wwx~}yxvqifgkov|z||woi}svtm\]ejt|qYD8,)+5?GC>BINY[UNPcx~qgbis{~zwtsuwz}vT?;57;>???<63.,08BHEIQQF759D4 =QUTNKGDA@@GFFGJJJFGGKNRQONILONKD@=;;84200059=????@AABCDDDDJIGIXowvxoV5/ZY<2,/IYblnjhda\YSKFABC;=7,&-476-*3AOY[ZMS`gjbP<;:87;@BFCECBDEHJ-)AU_c_^^_^]\\cegiouvrgWGDGJLOJIHJIHC>>@CFFDB@>@FIIGHIH("XT + + +  !$#,585.5FL=8CJTTVUTQOMPOMKKLLMKLORRSTV`z~j_WMF@740-2,4QekeZE/&*13562*  ?@CCACFJTXcpvsomkhhffd`[VPMKJHFC@8*1BKOPRX]_^ZQH>7642.6861/1210,'&)0@MF1 &=MYZ`bcdefgfdeehhikjljh`WQXYfqjaR?,'"!""  +  +  )D`x~vmY@*!(Alzrosromqvxc[gvtkigigaYY[]YI9/' -c|wllqllr|{su}}~rbXRI@7//28>IOYgu}~}~}~uרthqup]\ahrzlQ<-%"#,7BB?BO]UYVPQav{qfahs}zvsuvvypM<;9;7103.">SURLIFCB?>GFFGKJJHKJNSUURPHKPPJD?>><8522336:?BBAAAEEFFFFEEKHEGWl{}tqqjV<+2_`C@89Q[`hjc[YZhfaWMINTbopc_qbJMlyhdea_[KHOW^jsurgb_YUUUXT6%/GT]^][[[[[]\^beintqljYJDGKNPIJIJHEA<=?CEGDA@8>HMKFGIA Dy|{H +  "#  $-9=:7@QS=4?FPRSRPMKIMKHFFGIJHJNQRSTVazqcTLKD950,0*7YntthR;0-) #%$%,8APW_a\\jyui]XX]_bfpudYB*'U|~{sjhihhhgda_^[YWVVVWVVUUTTTTRPIKPPL@5+),*((**)# #$!!'++(%"(-4>Mamhie]ZVG3)%*;MX[][SH8/,/4.-++)(*'200-+(&&+)'%(&'#((*,.35963.&  %*05<@A@;9:6( 5IQQRV[]]ZVPF=8651/7983122.1/,''-SWY\_accdhedbdfgjkiijjcXTUUckf_RC.,)+-,%!! +  + +  + (C_x|}xnR:'+Huغi^WWSKKNV_cdm_Zeqqt{wqi`[bkf\TH/ 'Txkehxqrswzl_TB71%*6GV]fr{|vyuwlnhb^Z\coy}|bD,"-8==CTc`ZQKRcu~vkcjt~zvvux~fI=CGGIJID@>76468@HMPWQKG:239),LXSTQOHB??AIEEGFCGLILRUUSPNIMOMGB?@998666668<@BCDEFGJLMNNONPOMMXhstqolieXD5FZ]I;5D[]dge_\[[db`^_es~~|qrgXXZPBGO]l{{ihjifb^ZZB29JU[ZZWVWXXZZabcippmke[OIMOPOGHIID@>>@BFGFB?@??@CHKKJD @izw^J4 + + + !! $-7;?BBEZ_C9C>LKMMOMLIHFDBBCDEDEGJLQTXd|of\ME?=;73.#'FessrfTC;6+ !&+2@LY`feaclu~qgelq{vcQB4-H`~~uojiggfedca^ZZURQQQONRRQQPPNKKCN`aXL;71'!"()'# "%$!!$****/32@KS\dici^SNG<62$)4BNV^c[UNC@;8710-+)(*(++-*'###""$$'(.//7;:8:=;71& #*.4:<;<:;;;=?BCDDJN\elmnomhdceca_]YVSRNNNIA9.')3@NXQRUZ]_]ZOF>85533566420223/($&.:DI6  ;QXVUW[\^^gffdefilokjikg_XRV^bb\PI<6235840+*'$"    +F_}}~{siJ:7Jq˺}YI?>:0/17==9@KQNPLWhkqzyqkb_ipnfXI0=wl``guuxz|fR>0(  &19GUkw{tysұqjnf`]ZZbksyrW7!'7>@I[ld\ROUdr{{|{{}}ticjt~|xywz~cG>GJKLLIFB@8879358$2NWVROLKGEDDKFEHHCEIKKQUVSPOJNPMHBA@:98766668;?BCCEILMNOPQQPPONOYgmmgcbcbYMCKZWA74D\bfhgec_\QPVcvrYNJF@EIR^kqqkihhigd`^ZH;BQ[]ZVUTUVVVW]^beloljf\PJMQROGIIFA>=;@AGFFB@??>?BGKMME) Tyzj^YF + +  + !! %-7>ADHNa`E;B>FEFGHGECCB@??@ACBCEHKPUYby{neYLE?<:40+$  .OlwtkcVKGC8.+.1689AKV`kmjjqy~tbRC6/;Tyvliggfhfecba^YWTQOPPMLOONNNNLJKDRkqof[LA0!#$$! %''&#$&&)09ANYacb_VMG<2+'! "&+7EPW\_`YTMIEA@630,(''&,,/-*$%#! "$).8=AEIE?>;95-!$/1+#"(/3;====<<>>@DEEINR_gmmmnkfbbcb`][XUSRNOOJB7,(.;98=?DDDA???>?BFJKKA5 lg+ !""!$)0:?A@LUeaKAC@@@AABCC>>=;:;=>@@ABEHOV\eyyi`THE>;50-*%# /Rowpfc^YYVK@ACFJIFJQ_kxztptzrbSE7/1Kn}uibdfghggdb_^[VUROMMNKJJJJJKLJIGAWyk\D*!! "'$ +$'((&&$'/:CRWWRJB6,2)!(1>?????>@BDEFKRYdjnlkkhb``a`^[YVSRQOOOJB3*)5GT\`[[Z[_^_[TLB;744266642245540(!#.8F;*6L]YXRRTY[`begggjjjiilmh`ZQV[``\TOBA?DLOLHC@>:50+&" !"$"  + *G`{}{ufWZ`v¥vaRPGFR]_`dbc`ZZVG3*%/=?FKJJHJP]gkic[P:5hRQcpy~ziTA) +  + 5L`hlqngrvÎrglnc\^[X\bgkknronkjknsx~zfE%"1@P^fgYQKMXbhfpqrtxzrhdjt~~x]CCORQNKHEA@<>>BGMQTTM@?NNC=9$BMRWMJKKLKHDCAEKRTVV]\]\YTOLLMMKHDB@<;:876668:>@ACFJPRSTTUTTPPQV`gbXXTPMOQUV\YE**4I_ihge`WVXeorfZXaknka_bcb_\ZYWVZ^_\VOMNLNNOPVWY^bghkh`TMMPTRMMJD;876;=@BA?>>>?BEHIFC;6"ou1  ##" !#&+1=BA?@BCC>=:989<=???@CGOW^iyudYMDC>92**(&(!%HgmeeillnkbXYYY[ZZbkz{suyrbUF5+3Hhurz{~znf][_fihhfc_^ZXUSPLKKLIHGGGHJKJHA=ZxaG2)$ ''  "+**')+/2971*'#!  + .6@GKQUU[YXWVTPMF@7-(%$$+/45420./0351((# $C]g^I73+#&/6ABCBB@@@ACEEIOW]glnjhgd_^^_^[YWTQPQNOOIA0(*:O[^]\[[\_`_^XMD;653367864267540( %0B>4&0EZ\YRNPW[`dikkjhffgiklic\VZ\`_[TN@@@IRYWSLIE@;40.-++**% + ,Ib|}zr`P`qѾ}mf]VUOR`ighjkmljkeR:) &/27:79:Whg]PJGLW`dbmoprwzsidjt~||y`GFTQMKHDB@@>@CGJNQSPG9@@??@CEGLMHA;70 Q|V +#%##"$$*.4?C?6I\e]RJDEB@?ABDD@>;:9:=>@??@DHQY`n{s`TF>A=6.&')*-)" @]c\clty|}{uqnkkms|ux~reWF2$7Leibm{yyx}yjZWUW_ghhgd`^[WTRQNKIJJGFFFFHJKJI>;;;?ADFINTVWYWQF-(-@T][X[Z\^bdcbZOE;664476975489651'&:><0 *=T[ZPKPWYbgkmlhedcegjkgc`___`_ZRN?@CLV][XPKGA>851432/,%  + 1Ld|{yn\Kg÷qbacd`YTYfkihmuzzx|yjV+ %').+347;>;<<*1LJ'%"0BgiQ^nv}~p_N8$ +  + +  +  +3Ulmc^[iٵjdklbab[XZ]_`__[PMJINU^frxxq[@' &*('$(*7Tii[TQPT\bcbkmnqvyrhdjt}|{fPLWMKIFCBCCDFJNOPQQND7;QVJB7 .FKLQPNID?<=?ENYaju~yqg]UONKJIFHEC?>;97544479<>?BFLPRSSSSRRPNPZksj[ROIA?GS]edTAFLWdfgjfVJUe~lWIN[hic_bbb_]ZR]ec]YYUSPNMKKIIMORV\bglhbWOLOQRPPLF>652569;;<=>DFILLE<59.!%`}M)   %'###'$,15@F=2Haf]XOFHC@@ABDECA><;<>@A@@BGKS[aqxmYL>:?<4+#$+0691"&>U]W[fs{wuz~|rg[G/9Oc`R_swsv{n^JPWagjgdfc^[XURPNMJHIIFEFFFHIJIH>;Zt`L@2(   (//& )8DONMTWVUTTTTSROLG@9521259@CEFHHLOQSTTTSSTRJD9/$';Ua]QIE6.'%&+4:DEGHHDB@@CGJNT]chjic``_[\[\[YWTQNNNLLJC:-*3FX^ZU\\]agffcYPE;645568:976:;961(!09?7)$2GSXQIOVZdfjllfda`begifdbedb_]YSNDCFOZ`a^TOJC@<:77762.'   !7Qg|ÿxujXIqxndaeiklc`enplnx{}}x~zl3# !%",-164,&'+SZ8/>8CE``Vkvx|}z{~r]D- + +    :N^h]U]kxЪzibhhaabZXX[[][XUHFDEKS^fnt|}umM6# '+**'*)0Jeohgeddfgggjkmouwpgekt~|{x}{mYSZNLIGEFHIKMORSSQOOE8;PTF=/#$8LPNMOMJA75;AVbnqu}teZSOOKIGDGEC>=:86432279;=?BGLQSSTTSSRPNO[o{sdRPJA=CP[fnkaecbfbacaWQ`vzkZMP[gld`cdd`]]Uaje\XZXTQOLJHFFIKPSW^dkgbWOKLOQNNKF>53//268899;>?AC@;4.>4( @b'  (($#')%.26@G<-Jgh][SFJDCBCDFGFD@?==?@BACFKOV\bmqeRF98?;2&!#,4;D>..?PUNU^ksshior{ypnpyxqj_J/;Tf[GPeijpwv^KFTetvrjdeb]ZWTOMNMJHHIFEFFFGHIGF=6UvhaRB0$#! $-/(  !  :JYXW[[VVRPPRQOLMJE@><<<@CHLNOQSSTXYUTSQONLE?5+ '.?NJ;27@1-)')/6;FGIIHFCACEJNRW^degf`]__[[[\[YVTQMMMKJG@5-.:M]`]Y`acgljhcXOD;6466769:87<==7/'$ (4>>0 (8JVPHNUW`cghidc`^`cdfdcehfc`^[VRKHIQ[bb_UOHA?<:86884/'!)?Zn¿|upgUGwέofcdhnqqqpklmkdhtz~~D1'&! # "&,2-#,ZeD>QKCAY}]^x|{wusu{tfL- +     +  /Je`SV]bȢuh`cd_bcYYZYZZXTNGCDFKVajlrx||~{rkA.$(()),),Catvxwvtomlkhjknsvoeektvty{q_Z\OMKIHJMOPRVXYVSQQH:3/;Ecr~~tdXQNOKHDDEEA>:975321179;<>@EJSTUUUTSSPOP]t{mXVOD<@MWfu{y{tie\WY\ZYm}kn{v{}yurfYPPXfhdccda_\ZUdng\[\[UQOLHFFEFJOQUZdkjdYQJKNPKLJE>61/-.24568:877853.+@;12M ))$$'*'/38AI<-Pnm_`WHLJGEFGJKHCA?=>?AADFJMTX]dik_L@65@:2' #-5=C?2/=KLBRZenyycYZ^adit|}rcX\_dmz~{upkbN1?XkYADY]cirzziRAL^uymfdb]YVTQNNKJFIGFDDDEDDEFB:1O~{wq]E4' $*/+! +"'+784% :N`a_a^VUQNMONLJNLIGFEDEJKORSRUWRTVVSRRQLLF?80$ $0.:A5 ):0,+*.3:>EGIJHEBBDGLPTY_dcdd^\]^[[[ZYYTTQMLMJHF=3.1>Q^a_^cdhlomhcXNC:557787:888:>@8.)&"!/<@0!!,AQPIPWV^aegfedc_aabccdeffc`]ZUSLHGLV^__RNF@>;:95874-%  !/E^r}}|y|omcFHqͮtbaiuzvpkkpoquqlp{{~\>/- %*"'*%;SWRPNGC5Hxsbp|~|wnpru~|rbL/ +  +   + + 4RUVWL\~”m`ZX]cc_Z_[WUTVSPKKNRV\_afkruvwx{~}uj<%-.".Vuzwpknmfaemplebhq||slq|ubX]NJHIMONLQUYZXTRQNHBDLQG:((4GQQMLH>4,,1EWs|}oaRJLULIE@???=765545446:;=<<@ESTTTTUUTKVLUx_VNIDCIQ`w~ugW\_ZTZl}jRMT_lc\akquwzphkptxyniquolia^^WQMP\ab^\\\ZYWNbnf^_aZOPNJGGGGJOQTV[bjlf]TONNNJIGD?83-(),/0/-,34,*52'%247QY&  **%$%%&+3;EF9+Qrne]RUMJIJIHIHE@=>?ABBEFJMRVZ]efYNG<1064/)&(,')-/)'2CGDOYeps_OCBF@FR^]QD?HJR]ejxztlfaS<$;GslC5@PX\enk[JBUqxvafc_ZXTRMKJJHGDB???ACGGB<@*>]|r`PA2%" ##! %&#  +Jd_bW>" 8MZY_a\]ZZYWVSOMOOOOQRSQRSVVVVUVSQMNQTVUNLJG8(!35&,,%,*#6-+,.05<@CEHHIGGIEHLPW\\^b`][[ZYX]\\[[WSNLIILI>3.-;ER`bahhghkqpjbUJ>79:;8=<97889;<7.*(%-;>7*!%0AQTSV\Y[cfgffeib[[_ccadda^ZWTSQLFHOVZ[NKECBA=8?;60+&  ,=Rcr|Æ~~{wykiaFHoѳxi_inwyuswz}{}|]L?.,/)$$%(($%(2I]_[YSI9(@vrct~vhhlru|}tfK3 !#! + +  + 5KVdPGZܷmYSSYad_Y`\WTTSQOMOQVX\^_aemosruy{|tj8'$ ?g{{snlsmfcfnqleafp{nfjutbY[QMGEHNTWVX[[XTRSMIDGPQF8--9KTTPP@1"'7NcqvqaRMLNJFA><<<:7645556689==<<@DNRRSTSSTUYNZbZQLIFIP`u~ufTZ]\WZfpurhXKJLOWMEIOUX[b`^`ddfba`a`a^\`UURJEJW_d_]ZZZXWM^jd^_`ZMNMJHKKKJNTUVYagoi_URNNMFEC@;71-((+-.,,+-,"*)#$335BG  + + ++&%&'%189AH;&OokbZPSNLLKJIHIF@==>>@ACFIMRU[_feSC>90+,.,*&&#$$'1>B@LSZfxv]I<0*)+2?KH9(!/=R`b_hs~yxtlecXC.7GwtF0/9LS^e^PGD[}psefc^YWURNJHGFDC?>==>BCC?<5'6Km~ynbXG6("##%#!#''$ 0EYrwY1 5N\\_a_b[[[YXUQOPPPORSTRVVWWSRSRSRSSUUSOLHHD:-%$4@?$&.90--/049=BCHIJHHIHIMQX[\]_^[YZZYX]\[[ZVQNLIIMK?2++=JUbbaikklosqh_OF=79;=:?<97889:<5/))%%2::2% ,>MTRUUTW]cefhfhb[Y\abbdc^WUUVWTLDCKQRSJGD@B@;8:84-(!  + 1G`p|~ă~|{xtugg`GHpϵyjjlrtxwwzjVA;=:0+(+./25FUbca]TI3"9oqiy~viVajty{scQ2  "$$"%*.-+(#  DUl_HEkͨkVONVae_X]ZVSSRQORTVZ[\]]Z^eglmpsv}}vm;!%Uxrgbdnkfdiprleafoyh[\hne[ZPMKHHLRWWX[YUQNOKHGMTQE835APWRKH3 &C_qpty}p\OPNIHD?<:::8656657789;<=<=@CJMOSSQPPTTO^c\TPMHIKYk||wmbUY\\YZ`d`[TMJMIDF<36:==?LU]ab`_[\_UPXPFOJNNG@DT`ea^[[[[ZM\c_[\]XNNKHEHIFFKRWUW^bni_USNNKCBA>:61-(')**('&$"!!113 3zo,   +  +!++'&()'299?B5#Llh^VLQLMLLKLKLHD>><<>>@DIMUZ_bf^J756/& #$&&&$!(+1:??GKPZmfI6-#%1. 9Zli[Z\lu{ursmga`WE4-ByzH+ #:AMTNDBCb{hnifc\YVROLIGFECB>>=<>@@@><0(/3X~}{ywrcP@*$#'#  %((*1>Xuh> 3O`]]]]c```_^ZVTRRTTTUVT\[ZXVRSUYXZ\\YRKIGGE?512FLG,"  )-08720/..158@DIKLJIIJJNTXZ[[[[XWXYYY\[ZZYVQMLHHMK?.&/DT\bbdnpnqtundZIB;6:?<<:98:;<60+(%!)5><- )8JTRQNPRW\_bhggaZWZ_bbd_XQORW[XPGCHLJIFA>>==:5542.)" +%:Vm}}|z{ywvuuopce^EIsɲyjgoxvx{{u_URQND<8;AEHJPW]]^YOA6);a~ts{sf]S`mz|weL7" + "(),./,05::962)'$#" /<\hdZiƟiVNNWchbYZXUSRQQQXX[\]ZYXUY^chimpt}}xrC)"$Gsyf_]^gifekqrlfcgnxwbVUakh`[HLRTSOMMWXZWSONOJIKSYSF>;BMTSI<4 /RkytsuxpUJRPGFA=8877577787888;;=>?@BCEJNRSPOQMQWme\UROHFFKWgnpiaWYZ\[YZ^a_YTMMMG@B:379843;NcijiicWZA8QK7?BJOI@AO\daa__\YWLU][WXZUOOJFDEB@EKTWXXZ]hd\TSONLDCA>:730('('&#"! "0144wf!  + "**((**-.5>B8*#NlfZQINJKKKLKMLJC==;:;>AEJU^dfedTC4.0)!%),&""/5118@BFFISbu}nW>/( +  +FgyvdWQVaqz{vqpgfc__VE5#:uxH*-19DFCABjxglkgb]WUROJHGFECB@?===>=====6,G}|~yux{}vi\E:*$"(/DO`unR7 +0N][WTV^_^```]YVUUWWWXYW][]ZXX[\^_`_^ZSMLHFFE@?DMOE0#(22%!3;?=01/0//27:ADJMNLJILOSVYZZZWWUUWYYYZYXXXUPLJFFJH:,#6N]^cditrrtsqg\QB<859:77644686789::=HSYUOK]YWUTW\__[VKFEB?A;8>@=410Lhory{ubV-;?06CMTPECMZ`aeff_WRKPUTSUVQPOLHHIFADLW[[XXY`^XSSPPMEDA>:841*))'%" #!+04 ?t+ +  #++)),,5(/DF-&NmgZQHLHIIIJLMMJB=989;@BFN\jqof`K@6/)! *4335>>507DIDCGO[ju||zx|sZL<0'%1>=<:;=?KG-<~{xstwyyvqaQ9# /?[ds~}jZ>*  )HXTNKMVWY\^^\ZXWWXXYZ][[Z^\]`deda`_^\WRPKIKLJLOOMC/*3BIA34?DD<,/.0245;>ACLOOMLMQQUX[[XWUUSSVXYYXWWWWTOLHEDF@5*#?Xc_adlxvrsoi^SI<8658<@B@?=;;<==<93-+(%%"$'+2520,*0?JLMMRRTUW]belg`][]^__\VPMMNPVPIGJLHE;84476401231,($$)-(    + 3Kct~||zwtrpokfh_eaGGzͷt^Xaejq~şjUei`^\USXYZZ]SQKLOMA746:@YstrsfLG[jkrvkV<$ )4:?EGKOSSQNMNOOQHB93/*'$"?TZU`zhWSV]de`ZXXXVTTVYZ[\ZZWVTVW[aiprsw~XE(!(=ZYIDR]^`fdeinolhiknt{vf]VUZabcdSQPQPQVY[]`^ZVVWPMR[[QJJNUXO=)Ieqttrrtw|~eOIOPHA=944532578899<<==@CFGGDBFLOPNNRNXsdWRQNHC@0*+6ABEJ[YSONQXZ^]VIA@CB;64;@<617Wsx}~e2!+NWZTFDNZ_bfjjcWMJJKMNPQNNMKJMRRLIR\aa]YZ\ZWSURROFDA=9630+*)'$!!#)/5#Fs.  + +   +$++(-..8(-FF(%KjeYRIMIGGJIMLMJA<:78;@EHRaoureXE@90$ )5=?BHB3,4ENDAEMV[flwtqs}tfRMF=1##)7CQZgpuq^M@EQ_hkgd\^^[XN=.)>tp?##!2DIC;89=ARR2 3s|~~}}}x|xwtstxyrcM6&#?<:50-*('('(((,/3/.2>>?ADJKJE?DJMLJNSTZwgWPONHCB1 +5DS[[UPKKQU[XPC<;>=4-+07764Bbz{~Z4(;^a^TFCN\`dhjjbXNHEEHKKLJKKIKPVVROXdjhb\[]\YVWTSPJHD?:741,,*($" !'*2#,?l^'  + +   &,)+.124.4CA-BdbYSKPKHHJJNMNME?;889?CMTalrl`RB>7-! + *CNX9'_k{}{zyyy{{{vqosxypaP?0$ .HYba\SNKA7.  4PXOF=59;@GNTVUTTTVVVWXWTW[]^^ac_\\[_]\YXONQRRQRVUN@8@P]_X[WIC;+..348;ACCFKNPPRSUUY\][XVUUSSUXXXUTTUURNKHGD?4*-6Rirlnprvrnh]SGA<8899;;?C@@?==>?@=;71,)())*(&%'*.--2=FILPQRRSUX\_fdb_]]_^^YSNJGFIMKHKQOHC=:769952023/*)+285(  "6Ni{yvtokigebfaicFFv車k`VS]dgsȺgRfkeja[XVRNT[VOJHIC:5206@Ok|wmYHAATinvo`E+!+1=CKQX\^ckrtmcYWZ`ec^UKE<60&&#!%0GKIGRʺpd]]^dggd`^WXYXUVY]^]\ZZYYZWX[clsxxy~~m8,3#!&=OZdecbeikkjjjjlpv||k^SVXUPNX`sh[SQRUU]_b`\UPPRNOVTKIPHJA- 1Rfpsswyxvxu`URMEAC>9553224887;;>>??BFLMLD>@IJHIMT__{iYQQPKFD9 +.G]^_]TLJOTWPH9563/1($*069:Gdyuzb7/JdjhaQDCP^aggjhaXPG@ADIIHILKKJQVVPT^kolf_^_^\XYUSPOLHC>;76/,*(&#!  "&(0')27TK!  "'*+,044.6=>;1%>__XTLRMIIKKOOONHC>:7:?CQW`gmi]NC:3(  .BNSZWG3'-:AC<=DHIS^ifcbgfZLJKNOK=3--4DUZVRRMRV[gqnfMD +N]v{||zwwzzsw|xpmqw}xocS>.""4KX_XJ:4/! 8E\`QC5()%)2;BEEEQQSSSTUUVW\\]Z[ZZY[\_`^ZZTPRTQNNUWSH?DT_echaMA9,,.147:?ADGKMOPSUVX[]][WUVUSSUWXXTTTTTRNJIIF>0)1;Tnxsutrome^QF>769::;:;>CA@?>=>?@=;82-))))($$&'&'(,3?FHJNPPPRTY]````a_^__^XRJGFHIKHHLPOG?@<;9:;744651--28<5$ !/I]sutrpligdc`bfjcUIzӡoWVOP]hr|ƤfWcdga]XUTUUTQPNKFC>=?:?=;LestjU;3D^ptoiR+&3?JNSZ]\`lsvvpfca^_dcaYPH?964-&# (0*V]]WKÏcge[flqpmjd^a^[[\]\\^_`^^\[ZZ\]ckqvy}?,0)9NX`aZZbhggjjjjjmptvug_\SV[VNMV\sqnc\ZYU[_cb]O?8FTXQIKKGG=/ :Yjqtqy|tpxuc\RKJFG@956521798699;=??BEIJKH?AIJIIQZ]efVQJKLE7& 6Ra^[USUKIVWN@,%(+-* %4..?SalhlyaWlw~_IEFCJ\`cbfgaUJB??>ACDFIJJJOUWTVboqoi^W][ZX[YXUMJFD@>852/-)('#! "$%*0@C76!  +#-.)/3267DI?40&9Vc]YSMPLJJJNOOLKFB>==CGS[bb^VPG652&  +:NbhiP1&(4B>>AACGLQ`YUXa`TIFKPPJ?5.1AVemj]OFGJPZba_H>9BMRTTQMHA6-&"'Hol< !1@B?;kkcaZURNKHEDFGHGD@@BF@>;847=BT_=(Ztv{wv{zuyttvsomnpzwrkaO@4"(?OO@/  ++ARgibTG>2%""'.228>CIOQQPSUZY[Z[WURWVWVWWXWTQOPSTSRTWUPLQ`lqqkXB2/2-.159=CEHHLOTUWW\\\ZZWWVSTTVXYXVVSQQQOJE@JF8*&5QcmyyslmnfZO?62347:=<77=DCC@?@AA@=940/.-,-,'#"!#(+/48CLNNPMMOUZZWY[^_[[\]\XSOKGEDFHKOQPKGABFC=9432579;;;:7/ + *8Ymusromkgffdgloj\QzдeOWSYfs{ǣgVcaf]YSWX]ZWQTQMHB@=?=@=;IbprgP74Icssf[B""+5?HMPV\`hrrnolkjgc``\WPF<4/,)%##!%,63`oulV~ùvEVegmrvspmidda^\]]]\``a__]\Z\\`gmswvzE%(' ;PX]`[\dihhkkkjjloqsw{}xla[XW[]WNJPWlorlgc\VWZ\]XOA;PZ[PGGD=5* 8Wjqtosrjmvc_WMLJKB;66522677679;=?ABFILLICDIJILS]cq;o_NGD:9-??@CEMQQOQUVTZfrqnhb]][ZY\ZYVPMJGDA;852/.+)%# # ',5FL<4$./*1439APTB4/((%'*4?CE<67CRUUSNIB9/("!$>a]32@D?:gkb^WSOLHDCCBBDCA???@<;7426=BO_AOnuxuszwsuppqpommmqpnidZNH2)-;2( &4DUgtytgZRL>0((+00,/3=BHJKLPTXUUQPNMKJKLJJJLLJHHJORROQUWVTYentnaM6,-1,-1389F\kn`I49Tmto]H,!"'.6;?FLU`jrngfkrspi_Z^XOC91,*$#$)+*18;@CGJMOJEFJLLOVaoɫw\KA265+ (DX]QSPQTMMY]UA(1HJG@CNYZcsuptxy|bL41CTXW\_chibUI?=<==?BCNUYVSVZ[cq{vlec`_\[Z][[XTQMJGD?<:721.,(&" $&0=SZM8  %00+245?NbaE./-#A\ic`YRTOMJJJLLIIHDDDGKNSTPKB=<80-)  +;M_opZ8(#)389=>>?DGJHJS^]QEB=7221115?LV`c_VNG;1--05108GUUOJFA70)$5NJ(  0@D>9b}kb]VROKGB?>=>?====985410/5>DN`F$ @cmronqqjokkmoooljdefffb\ZI;'! +(6Naq}wg][XK;32550'%&.4>?>:<=;97::<<;AEEEBA@BBA>:51/.-,*)'&$#%&%)1;FMOPLJIMPSSQRV[][Z\\YVSPMJGEIHJMNMIFLOQH<10326>IQNA7# !*7I[rvvuutqponnruxvspӮfac^Yap~žcSaad\YTYdpri`^ZTMHCCCEC<8ASaiYB4DfvqdV9 $ "'-15:ALW^cb^_jsvqfXNYTJ@71/..,-/22;A2% 6[pttkonqǭ}`baTQPPE<66543121247:=?ADHKNPMJIMNMS\gζu_K//74(1K\^TVTSVLK[e\J.+D?605>LR\jbZnwop[N:2BVZUY^egg^QI<;<<=?ABJT[XUZ`do~pfcb`]\[^]\YVSOLIFA>;9620,)&!!$%3Gcna@  "&0.,46;H_qlE+-/%C^ifd^VWQNKIIJHFHHIHJKMORNF;2.2/-'!  +9JZkoZ<*!#-/17:;=ABEFKU^YK>873.,-26/8ERev~y`D-!-/;KVOD<95.)&",=9! 0BD?9\v~oc^UPMHC>:8::978:940,,,-/7BIPcJ' 1Xfjgdjhdfgginqrnh`aadedbb]M6  !2?>?>DGGDBAABBB?;52//.-))('''&("&1>IMPPJIILNQQPMQW\[XZYWUUQNKGEIIIJNMIHQVWK>12604=MWQ<, + '3DXl}wwvvurronnpswy}~׽dR[fham~ŷ^Saae[VQT_lqjb]ZVOIGFEEB<8@LZaP@:Rt|m[N4&('+%&&)-38;7BNkzwjxz4%_y~yyxvqmhdb`][\[ZXXWXY[^cipsrps{d9&52, + +C[\Y^bfimprsnoqrssrpic^[\_bd`]ZRNLMNJOSWbmqoc^WRPRTV\_WKA<1$3Vhlihq|ϵde`WROOF<675610/./35;@CJSZUOS\auuicb`]\[_]]ZVSOLIFA><850/+'$  %"3Kn~sJ$   + +#)//.6;FYq}nF--0*F`khgbXWRMJHGHFDHIKMMNOPNH=1)')+(  *4BR`hX<*&%'.358=?CFNX^UC3..,%#*:K[essP,+/5-+))(& $/+0BD>9Vn}rf_WPMHB=865663455/+&'*-2?BJTVPLQZ`|mida\[[_]][URNLHF@=;831-+%!! 3OstM'   '+112>FUojE/./+E_jhgbZWRMHEDCBBEIKNNNMKHC8.%#%'$ &0=A<:DJ>4,%!1EB?PdaXPJTURJHKT\]_a\SF:3,/26:=>AHRUSXds|rmg`[[Z^]]ZURNLHF@=:820,)$ 2QszjJ' */457EPfbE50,)E]hghdYVRMGBA???AFILKKIF@;6,%""#   + $-5AGVO7& $*-18GTYL7&+%"1DT]cfedd]UE<1" $56=FJD;7/)"!'(# "  -;=84BZpwrf_XSMG@:5223530-,+,+/4:>DKPMXG62UYUU[WTZWZ^abddfhklic[WY_c]L4 */8Lj~u|{jXL?1)3FX\RJG92*%! &/8FRVOD;+&$*066227=HOY_``__^WSPLHA7,%'$)*/16:@FMRTVYY[ZUTUSSPONLKKLMNLJKLKGB?@BB>/'*,6HHB:1*')+)-16;>CDHFGFHIJKHFDDDFEEA=630/.-//.,,)++**7IQIFECFIKIGGFIJPQPPQRRTWXVRMIFDCEIMOQUWWPC6.+ ")+" +5CO[hxpnnljhedbhpwzèg`hnqum}ǽg[gdcZQOOQUXXXXVWUTSOLCBFINPSZC?Jf|znh`_[TPMHA@BFLQTSSZH7'&9PccXI4!)-2:DKQRPMIHEBBHM^\`e_cj_) 4n|zxunjd`^\ZXVUQOOPRSVW]empqpv|Q39#3Ymkjiopkjrxywvyxtoic]VRV^bc_`\Y[_cfgd`XSTWTMVTPKF<2.KUWLA=;64&*Hcwâ}bVWTDD>;:995/+*,.158<@BGKOPTSRTVWZexɇ`J:=CFP]YXPJHAH^kswoc[SOJPOOUPLSSG<3$)?;-ATF:@COMLJKMV`_`_YPC81*-16:=?AHPX`ntnia[\\^^\ZUSOKIF@=962.,)$!6Trt^E(""" +  .488=@EHJJIFB<:4-&"  +  #+2=AQK5  #&(1BRVJ5$ "-2372% + 3?>@FG@856,! "&&#!" *684/:Rktoe^WTNHA:5213540+(+,04:=BFJLHRE:'MQOOUVQVSVZ\\\acdfiha[WW[c`Q8!$/49JbucjePDKU]^VJ@/("&-5735=FTZbggb__]YURNE9-(&&#'+-27<@GORTXY[\]UVUVTQQOKJIJKKIGKKJFA>@BA:+#)(-;>:2+$$&*+.3:>BFGIIGGHJKKHFEDFGGEA=730/.-11/,*((+++6IPHCDADHJGFEFILOONNRSSUYYXRMIEBBCIMNPUVTNA3(",3?M]ht~ooqqljggimt}Ɯy]btwrjuw¢i\hejeZVVX]^\ZUWYYXSPND@EKLJNV62DgwlekkhdcaWK@ABFKMLHFKD?7/'%(:Uqzr^@&-//0247798=EMTVVMP]_QNURN% +>s}wspnje`\\ZRPONNPRTZXXajstszĤ|^> &7WtpnstrsqsvwwwzvpifbXOPZdc_]]\^aabce^acc^[]]YRLF@86:SZWJABFHF=2&:dĭcZZRD;=A=40/1/.00358;CCFKPSSPX[_]\f|ѳbJP\XUYZVLMQFDRimqokdbb[\_bffebcO@6%$@5310.3DVWPMOOKMTZ]\XPB3$(1:;=@EJFQ^rзsoiea__a_\ZXQKIJGD?951,*(%#!"#"'Cc{tZ:(*.#(0%-7;?A>Ji}SB<:4&AEFIJEB@9751+$  ".58BMF, "(=QXN9)    + + ?]dSDAA;-#$++%!#'%"%" %00+)0D]mmc^]QKFA>943461,)*/2;>DFGFEEDHI:BMMJQSRQNNSW[_decba__`^a\bcR4 #5@DINTMJB3" 2T^TOUNOQOMMLNORYad^NB4* '6CS^koha`ce\Z[VE81(( &"('',3>CGGLQTW^b_Y\YUUTTSOIFEEGIHHJJHC?>AE@<84///3584)#"#",/:JOHA=EDEGC??CLLPPPOQQUW[\XSKF?=?CIMNNPMIGF;#  +   *-@P^itztqqwlnppmllmoszǽy^^iqrrxuyţhZhgkda\[^acb^[[YXTPMJFBCHIEINB>H_kfdhnheda\QJFEB@=95346:><658E^xzhM4=:4-)&$$ (2:BKV^OLSWOLMDB!!K{|wsolhc`[XWQONLMOSUZYZ_gnqr|üuD.  + + '>^unmwwustsuuwwwuqid^YSW_fba__^_```bb]`eda]]]`WMD927?OSSG>>BDLFCA@7+!-KrƵiXXQE:Pdwqigcbaa`][XRLJIHD>940-+)&$$" !$%%"(Dc}{aM;/*,36,&!!&&# 0;8<@FWysKDA<5*@EEFEDB?;973+%  ,45>GE4! &5ISP=.*."'&1TqyeNA:/##('!$'&''! "15-&*=Vjkb]ZPLGB>:32351/-038>ACFEEDDFHH89EFDLPMNIFMOSX]____]^^^^UXYK3 +$5:611300,# 3R[SQWZ]][XUUVTTY`c[OD91(#!"%-=FS[ehc`_ajb`aZF94)'%#*,/47.##&(%10.,,/4798=@DGJJKJIJKJHFIKJIHHIHA>:610/2583)#!##,1=KNGA.(7HRXWLDADGHLT^e]I8B]rVTSH;:<95224544468=>BEJKKNX^\Y]h{̵hOP\MJGKTKDIU[fjiea^_enrww{~vpg_UJHKC9/)'-;HQQSVUQRW]UYR4,3--*,9BA?AdŬ{qljdccdc_]XTNLIHD?:40-,*'%'%##$&'%&@^~lbU8'2=9520155/% 4@79@Pjd?EG<3+;R]Y[XRPMHGDA?<=@BBA@>>=9762,%   +*0065*##" $$&% 290Mdjc]WOLFB=931255548<@CDDDAABCGFF8 2;:8BHCC?=DFJNSTVWXZZZYXONJB2 14+  9RXST\___\YVVTUUX]`[RJD<63.((+)+.29ALSVY]^_^]]ebcf_NB?4,).*-*.39=ENU[[[X]bc_[XVUTTQKHGGHJJIGBB@><=@B;3,#%&%!*.3345=??BGGGHLOQNLJKIHIHJIIGGHGC@<94210683)$%((26BNPH?89@JPI?:>HKLNMORRUVX[YVQNDBABFGJLKIGGH>%  +0/9IVdt}|vnhdc_UQQNE@9548:;?IPYh}jkjjlptx~º~nfchqtnoy½ádUdjmafccdefhghd_ZSOKJIGFGGEFGUVRKIR]`c^ZY\]_^UL;+$7FF>:CSFF@BLF>APXbge`[W_fptxx~{zrid]TLL@4.-0:DMQWZYUVX]W`Y1")$!#+7<:;::7630)" +  *,,,.7A7 + !5NWOCZjL+0331.*/;LWjsvh]bunR?4*%% "!,4/(/E^jg_WSNJE@;63578::>ADEEB@<<>@ECC7 .743>A?<75<>AFJLNNQSTTSQLG@80+1% -CUXSV^^^]WUPOMQRVZ\ZUNJFCB>89=>@BFLUZ\YVWZ[^]\_\aieXSS@-&*+./4?CEFLPXZZX\aa_ZURRRRNGHFGIKJHF>==<<>@A<3($')'#*08:::AG@EKMKKNQTRPOOLIGHJJKIIIGEC>;9411895,(*,,5;EORH=31:HQL?;;HIJLLNRSWXZYYVRPFDDBCBDFHFCFG=$  %! &7@CIPYbloqplnqrold\SLLMLEBBB:2,)((()(-/5CWmkllmmrx}tidgnlt¿ȩjWeipefeeggiiihe`ZTPKJJJHGHIIIJNI@?JVX[VSSVZ_b_TE6+'')1:HRQIEFTeu||n^[ZYVQIC?889:;@HMNJPUQQPG;:875566567;=BDGEHNX[ZVT]l|ԶM26FFF>;C?9NV^`]ZZYc^`S. $ #5Iewolgffdca^WUROJGC>940.-+)'''%$##$%+$):TyswZ=;81857>HNH@:* +@H>>Ig\6IN9--9KQNTVQRPKJHEC>=BA=:888730/,%  + + "+,(#!)6/  1JXSKavaE78KLTRNIKQ]gztim}w\F5%!#!#)& !)*+#-ABCBB=:778;@@@7" ,41.6:851068;?DEGILMNNMLKD:1*#+" &*31%#+/0./8@B?>DIAEMNLLNSVVVUTOHCJLJKKKKIGD>;:8419;70+-/05>HNPG:-(2CMK?;;GHIKKNSTZZ[ZYUQOGFGCA??AFFB@@3 #5;<:?LXVLNPSPOLMP[ab_WNJGHIGCBB@7'!(3DQXlmnpqv}~qkoowּ}_cfpjffjkkjllgd`\VQNLKJHHJOLI??=@HKS[]XVX^ly~td`aa^[VQMIFEFKOPNNMUWPPUPL?Hdx|yuplifc^XSRPMLJKLMPRW]eggjqwz{ݪb" =ezzmw~xsoqrtrqtwunha\^fnnkifbcabceeffbbccb_[VTLA2&%7M]\ULECKWd~ϼsZRQB?<986656667;>CDIGHQ[^ZTVfzҲV4,1DG@:?;7;=EOXYYZ[^ckosswyvrh_\WLC=60-,-4=P[ce`][[e_P:"'=.-Cszpnhfeeb_\WUSOIEA=63/-,+)'%&'%#!!"-&*7QvxxjTB1+5.3/! 2AFB@Qs\6EH3)*4DJJRVQPQOLJID?=BB=76442/-+(! + + + #**&'!  +@OQPbyjWNJY\gfd_^ain|tnuyaK7' $#$"  )%'-)+2I^gc\VRNKF@<:>==?BB@?==953259???8! '1/)--+,,,047:>AAACFHIGGH@7+ +49:?HOSTUVVSPKGFHKKOW^a`[VNKHFB?FNZZ\^_``]XTSTX]acffjnhbir_>2=:3-'0;JTXWVUX^cccfgf_YTUWWQGCBEHJHD@;:9;>AA@?/#'4<>=;@EFCCHKCHMQPOQTVWYXWOGALMLMMMKIJC>;;963<><312245@IPOF8(")8EFA=?DFHHJLRV\\]]\WSOJLLGC=<=DED>8* %7JLF>FPI8:9876598?HQY_b_`[ZZ[\WTPLKKNOSQU^eeegkvtdfdb`\XUT[XWWZZVSXRYZRSZVUGRn|ywsmigdb]XSPOONLLMNQTW]ejlotx{{֙X0 =[t}v~voiegikhimrofa^_gnsqonjbdeefhgggeca`a]XSOD5*&+?96:9>FMQTXZY[bgoprrtlc]XND?62.*)+8EUbjha]][]\C,)1oc_sŸrqjhgfb^ZUUSOHC><52.,+*(&$')($! *%)6MuxtgH.,0.3BA><99632158@AB9 &20%%""&'(-0149<:;=>@BCD@:3$  )16825:BLRSQMJE@>?DGRYdjkg`ZSLFA<:AK^`bbca_\RQRTV[afpnoogbm~`BG_^PF79=GPZ`df^egdcghh]WQRUUKC@BEIKID@<::<@BB?>,#.@IJHGHIHIJPQLORUVUTSWWXVUNHCKLKLMLJHJB<:<;85=:977778=6279=DGJNSURTY`jmnmkbYVPA760,($"&8JXfmjba^\ZcH6?)>ǽwsljfeb]ZTUSOHB=;41-++*'&$'+*&" )$(4MuvvqL.-/.2:CIE<60#)5>?;=<=>BC?:64330047ADE: &31&#$%&*.037:998:86>IX\_`_\ZWOQRSUX_euqpnfcq~eymSQPQW\acdggb_befZQLMRPF=>@DHJHC>;98;?AA=;,'5IQPNOMKJLOTUUVWY[ZVRXUUSRMHCIJJKLKIHJD<8;=;8>BC=88757BPRPH7$#3?ACC@?BCFIOS[[_a`]XTRTVQJA=;?FJG>4+!#*8GNJDEWQON?(!"-:DRbvvw{{uuvr^L*#  adhnvƿwaT[q|SUuceeknnggigff`ZUSSJMIEHMMH@@BM[gkihfhed]VRPT[_bbbbT[djkkkmsw{sdfdb`]]dlklnmmkihg[XXTW\TNFMh}|xtqmkgba^YWSPNLOPPPQUX\`gkosx|||ٻ{i^amtx{ume`bfe`acgh_W\gruxxvpnkffeeffggcca]]\SJ@3($)5FZtºhN>GIIB>=>;::9:?BGINRW[UQXgxͪo;!7:=8557798:861&",6>>7@cS&/-%%/4;ILIMQQQMIC=<85/*'#""   + + "'#  -BV]\ZY[agmrtxyz}yx}|xzwkT<& # + )4EUM- ($))%&4ISSSONJHD@=>>><;;97543335;?GGF?& -4*#!!'.4679;:98/.@BA@<7311ARQOK=." #+8@CA??BCEILPUXZ]^^[ZUVXSME?==BFFB;:>9DZntkWJHMNI9$&.=QnsV:0$ `cgnv~übLOhʶ͠qKPpebbgllgeggec`[VUUMMKHKPPKDBBKW`ca]]`beb]ZV[aehhhi`gptqligfkr{yjcbfouvy}wtrpollleXTURVYQE>Fb~||yuqnjhea`\YVROONPQQQRVY]bgkouz||}ֺxollwrlgdegeccfd_Z_istyyuqmlggfffefebc`\\ZRH;/&&.;L_~ſvU@CDBDABGSWXUQPKD>4-)%$%$+7JWinpne_[\^dXRbgoɿwkhjkgcaXTNJEB<:41-+**)'%'((&$$$*#,EhypcI2-2=>>><::86656556;>FEF?& ,5.#!! %,357:<::=BA=3,! 3=7/'!!4N^[PF>;@FKRV[enoopnie_VK;1/3@LUUWYYWWWZ\^bgkvwxtom{}ǹvj_cjwxobejZUOPUTLDA@DIJC=<778;>@@>6.2?PXWTPNKKOQRRPOPTZ\\Y\ZZZUMNOMKJIIJJKIC<9>?B@CCA@<72/0BRTPK?4(%%+5>@A>@ABCGIMTWZ]__^\XTTPLFA>=;>CKPW_]myXA221-'  #+5BY|gB90(  _afnwy]Xkٵs^^y[@Hhg_\agjgededc`\XXWQQOJMQROJE@FPXZVNSY_efedadjmmnprqxyogc_fpva_hy{tpoooaSOPPUVL;5?[u}{{xurolhfc_]]YUQNNPSTUTUZ]`dimqw|~}¨~snqmje`_ceb`^\]\bjrvzzvrnmhghfeefecda][XND3)"'4CSfŰc9CGFBAAA=>>>@ADIMMXa_VR_tƓ\7855510012148;=>=<9:=FHHECC?94-'$$$&'/>Satvuoe^[^^\J8CkĻ|niikhedXTMID?<:41-++*)(%%$%&&$"("/Nxznl\='5BEADGB64)&+7AE@FFKOQROLF@=40)#  +!(# ,Jfh_UOORVZ`fpwz|~~zurojssgR:'&,37AKQP<=1$)%!#1ALMKKJHB><<<<:998789<<;;=@FGG>& -84)!!  %,1459:::=;5)$ !7A:/$,HZVJIA?ELPTXX_fhknokje^TD701;ENQTWXX[^adeinqz{|zvuɳlejvxpefjb\WUVQHA<;?FID@>999<>@?;3.6EUZXTQOLLPQTQMKLRY^]]`_^YRJNVNKJIIIKLKF?>@ACGKPRX\^_`^YTOKJGEB=79BP^lx~|O1&+3;GcsHC<5' +`chpyv{‘gKCEYUN@7Eac[YZdihdaabb`\[ZZTQQNOPRRLD<=IPSOKOU]bgnprrtssvz~}qieditz]^gw{vqonbUQRRVXN=7@Zqywxspnkhec`\[ZWSPMMSTVVVW\_bejnty~͸{ib`_\Z]_]WRSX_gnrtyyvsonihhffddcab_[XTJ?-%",>NZjʾt>CDEDDBA?A@AACGKLNUZUPThحrD768<93+'---036879777==<:::73/*&$%%(*5F[k{|xnd]]b`M5'\slkmkihZTMFC?<:52.+++)((%#$'(&"&,NzpogG(6CFCIOK<4,'.;DG@=B[u[/$#&)9ADJMOPOKEA;2-&   )% "(FhlbVMHHILQZgosuuuooomjgefoocN7(  (4AILNKE96&#*(!%6EGIIIFB?>>=;:;:<9;7.)*178::==?@DFKOUY]`aa[TMKLLJG=9:FR`tuE%)2;BPiƾǽ{OLF>/ `cipzýspshjŞqRMUV9,.-1BTYWUXcheb_____\\\[VQRPOPSWLB78DNROORUY]dnt}{yvx|}rkhhjrkZZ]els~|uoldXVVSW\UIBF\qustpokheb`][ZWURPMLSVXYYZ^acfmrvzŧm_YYZYZZZQHISbkppsxxurnmihheeccdbb`[XSE:+#$3HW^iʹMFCDFGECACCCDGHKLNPOKP`wS0-5AD9,$+'&),16696647541430-+'$#%(*.8I\kxyulc]^cX:%-M¶wnlnkifZTNGD?:852.,++*(*'$%()'$#%DouphM36@DENWRE6-*1=FG?:>ShyZ2##%3=@GKMOMIDA;.(#  +   "('  !!%>`haXNDAAELS^ejjiia_][XWY`lm_G3)#$9NUOHA;71"!()#-=@DHIFCAA??<;==@>?AGGHEDEHIF9$*;;2*'& '+-*++% ,2)""),'!1FJCMNPLG=?EQ[glomcYTPNMG@<>DDDFLOX^`dhlnprtxz|z}~ҹ|md_^\YTNHHG?:9>B@=<87678851.3BT_]YUUTTUZ\]\c_XZahiiimofUHMUPMMLLLLLJGB?ACEFKGC>9."!AIRdĨ~H#'1?JZuʩWSME5$ bekr{¾vrxhejsPO}ȟy`]rv?&)+.>CLUSX`ea^^\^^^[[[ZXRQQPNSYL@56CPUTTVWWZ_ip{{{{~ymfdedhuqXMLLPT]kz}ukec[\[TW_[XOPaqrnokkgdb_]ZXWURQNLMRVXYY[_bdhosw{ͳm]WVTVY]QDETisrnqtvsplkgfgedddc`a^YUOA5)#%9Q_bi|cJECGHGDEDDEFHIKMQJEH[tʚh($,=E<.'(##"'/7:976340.,.-*'%" &(+.9EXeprof^WX\L97aµû~sppkgb\TPJGA;762.,,+*)+)'&''&%$!9_ukVF:>@JV\WM:0+2>HH?88KYh|zV4!#09?EIKMKHCA9-$   +  #&'(*% + %!3S_^[PE?@EIOVY[ZYVRMLIFFNYnl\@.*%  !7NRI=631-$ !&'%$07?ADBCEIKIGGGIID5! (:<3,('" (+*$$).0+&" *>NPILMNKB9:?NV`fhcWJ?>@EEBCEGECFJOYabfjmpruv~yy{}~ǹvb\^]XMC>BFE<7:>=;:6543430.-3FV^ZTQSRRTYZZYqg__flmjcjneNAFQOLNNNLJIGEA?@BEHLFA<5*7SWNKKLKA4("&-4258;;>@CILOUY[]^XUSSTSQMFBFKQlɛ_/!% !->RgӲ`XQJ;) +bejqy~vos|uicfhFGqkQXu]<=6-43@NNV_`[ZZ[]]]ZYZYXSSTROU]QD55DSYYQTWVWX_dlqz~m^SOMKMZlnX?213=EP^kvwyxrjc^`\_]RS^^`VWdnlijgfb`_]YVUUSQOMLMRUWXZ\_bgjqvz~ܯucXT\ghXGDXpyvkoqsqlihfefddddc_`]XSM>1'!&=VdfkzġzQFBFHGGHEFHIKKMMRHCPrԱ1&'7?:1.'!%0;A<:964/.-+*&" $&),4>MXegfaYQPSYjvŹ»vsqkd][URMJC;763/,,,*)+*)&#"#%&0R|ob\A<=N[\UP@5.4BKJ@86ENVfvtjQ6 !08==?;>?@BN]up[;((&! ++:GF>4.,((%$ !#%!#.6=A@>?AA??>?BEDFHKMKIIIJIB1&9;3-*)($   +..))*,,*((3CTdi_QJHFHG@?BFINQSOF<14:EIFFFFCBHNQXaekpttwwx{tw~ƣ{yuiTA8>DH?66;<<<753220-))1ETZTNKONMNQQRPg\QPW^_[U\`T<1:IKJMNOKGDFEB@?BFIKE>92%6UXLFHJME5(!$+2/36:;>@CJLOSWXZ[STWXWSPLJFILLdŎ\799@OUB(!+QU@'.@NY`klmmhb\Y^]d_SS_af\[fnkhgdc_]]ZVSTTSQQQONSVWXXX\_bfmqvz۹yd]l~r`KI\u}xgjopmjhgeffdddcd^_]WRK>/%&?ZiimũVIBFHGEGFFGHJLKMSIG^ſȠC3,4;877(#%1?EB@>950/.)(&#!&(,.2;GP_bc_VNIM{ĸĽ¯{vvmb\ZWSOJB;562/-,,+))+*&!!$)-Mz{noK>3,4BKJA<9EIJVb`\G/#28;BFGIHE@<5%  + +  + + !*//-55(  %-#'B^fj_G759665/)%$$/-3;@EUg|v\9'%'!  ;CFB:4/,#%& ""#*2:?>==@@>>=?BFGHJLMLKJKKI@-%8:3/-,*&  + +#181/.---..:3+1;HNJGEB?BKRSYahmsxy{~yxtpxѽoRDFNOB88;=>@75320.+&'/ATXQJGMJHHJIFEQE97?DEAFMOC+"/CJIMQPNHEHGECCEJNOI@:4&4UXKCEGMF6)"#+1/17:=@ADJMNRUXZZPSYZWQLKIEFIGS뽓bbdrh=$+:NjžpaVND7*! hjouz~ſbU]jmiaabmN/,E[`W4*.Ny`-/<:GQ[^`_]XVY[^`^]\VSTVYXVRLQ<3JUT\a`[XWWY[efkry}~}|hTF8-%#)4=92,(9DGNUafgfjjaTchg\W\bdchlllkkhcb`]ZTQPNSVVUWY\USQTY]YTQ\hkilxͱzF@`ptwmomjiiijhhecab`^^]]\RI?71-&Kff^j\8S[HJDBLKHCEJONGL`{€V@2%?R:.!%'&2DFHH>61,')'''&'&(-10139>CEY]ZSBMyrpqlcZWSOIC=9610..,,*'**& %,#&'/O{xeI14?>?B>DC85@DBCAILIRZUF4  &-17=ACDB<4-$  + +   " "+563.+" $++-.ER`c\P@4/*('"%2AMMKVfrqO2""$%2;762-**+' &+2:>@>=<=?=<>BDFGKOPPLKFD;-)44+$"   ",2-0*(/2AXx~[J>BF@?DCE=55626;:FQVSJB=9DNOMQ`mpsw{yyz|xzȴydYX<-:A99B=76860*&%4FNIA9=976357::84221104;A9+&.6FIKLPX[Y^XfvkG:GIF?50)3OSMJJGG@4($%(',-15=DHHDEIJMSY\QTVYWSNKC<:?BLgѶʟxQAEZtogVB0)% egkptx{||~½{ZIO[]][^cbP:/45/'"':^q75BEKR[__b_\YY]^__^]WVUWWWSPKN=3HRT]cb]ZWYZ\abfkrvuvwymUF?9/)%'-1//,319DIIMS[`ddee`Vbgf]X[achmqmlkjg^][XTSPPNRUVWY\_YWVUTTTTPYeiin~żsHCastuimiiilkkiheb`a`^^\`_WH<1,&+Mcc_lǡb@VYGHHJOICFKLKGHXoϡqM9-9G>3,'&-@KKF>51,''%''()*,124334699KONMJdwqrnf]XSNHB=941...-,+'*+'! $++.2:[{iM22=AEMQSL=7=?=BCIKISXSD0  + &-28?ABC?70)   + + )2651-&  %+++.8DV`c^RD92/,(#(/IVa_^er{wcE)  2><72,)'(*(   $*29=@><;<;<;>=5& '4;=9520-,*+-/521/.,*(.6<4)"(/<=@@HT_ajm|]@6CA:2.) 5RUNLJEG?4+%&'))-27<4*')-27AG?=BFEA@DNV]_^\YT_bb[WY]_djkd___]XWTQOOQSQRUUSUY[ZY[VRQTYZ`gkp~¯cHLesrrimjlmponkgdb`a`__[_]WH7*#"4P]^brƿʬnKTWIKPSRFBMTNFAF`}٨vJ;737>686'):MKC;53.('&''&()+/13320126@A>EVyoook^YTMF@<;740..--+(*-*%#$'(.5AeoT=?LT_kpkZD9;>>AAFHIT\UD2  + $,28>AAA?8/*   + !!!&-2543- +$((&&*2CTdibUPGC=;9BH\dmjhhoshV;$ + &>G@9/'$#&((  + !'/59<<;9::;;86/)" "#$(7=BDBA>=@ELU^_`^ehov{}~}uttruȶuK685(149:4)'(#!!"&-111/+*''&)/--+*'# )182%#(110.5DSZXbt{W620,'&#7UVONKBD=3,''''%,4889>AADINQQSRPRTVRMEA=89?AAGT}ß~k羛vphVC5.+&QSW[_chipsw{vUCELNORZa^gjaK5)#*;^j1-7AJRY\]cdc^\^]^___YZZ[ZXVTQMBNXQQVWQIC?BMZ`]XSQYZ[WTTVX_ffZRSWWWUQNLLORSSSRQQSTXY\XUUVZdegnһfQMZkrnmmmkmorqolheb`a```[XWTJ6$(@UZ]gyƱ~\SPMRVWOEFTWI@CMkytݥqE?H7+26<;*,5MIA9651*()((&'()*.464213>;34Hn¼}okli_[SNF@=:741./--+)*,+(%#%+9Lm²{eRTaiww\D8;@C@>BGHSZTB2 + ")09?EBA<5.*#  +   +"""%+0567/" + "# &)2D\ki]cZTLLNX]cflif`a`XG0 1CKE:.#!!%('  +  !#&,279=<9:=<>?ADGHKMLLKJE>5' '34)!! %"(BXǮ~`r}[IFKG@:, &).4;7-!#-61*"$,.31-+'&$&)())'##,52( $'/+'!%3AEAITfoA&&&&(% 5SUOOJ?@;3,'&%%",58538=AFLSSSPPPSSTOJA=>:;DGDFMjļݳݵvoeVC60+#BDHMTZ^`hksx}qS@AIKNPSWT^ff]ROMJTkf:10;IQX[]cfe`^^]^`ab^``a_][ZUMGBBFPSYXWWUWYZWWX[_bcccc[MFDHKFEEB?0 ):EKF;-"!"%($  "$%'*/36;<9;>>@ACEHHJKJKJHD<3$ '35-# ):AFY|˹dOoULPVUK7(&"!$()+1459>EKNLHHQaklinsx{yricsonwøpRG7!$:LIA/ $%)(%%##!#&'''%!&11)$'*/.*##.47?@CRzo<%&)-30#.IPNNI@>91+&$#!*57206;BENUVURRRTTRNG>9777>DGJNKhrooxo՟ѫqi`P@4/*"459>FMRT\ajqw|jO:;CFLNPTSV]bglmmiktfI6(0ENUY\cee_]]\]`ceceggdbaaZNLIABPRTUWYXXXXVUVX\]_^c[MB@GRY^\\WOGIOdgjlkdUF?GVa_TMJQLLONLKM\fePBITYWVPKIGHJGEFGMRVXVUWXZZ[[abkڿzC@avsohhtnkjkmkjifcb_a_]]YMEHE4=Y`bku˸Ū\T][^SUUWTFCSkwutzʌR?KRJ<,**''&+*?CE@:960.-,)('&'(,/1,(%&+$?rƿtlc]YTPKE?:;640/..,*((+,,(%*@Tf|xx|lJ0'*16>:?DDLOD5'  !)1=DGA90+))' + +    #'+**,25693% + "6KWWZVNGIPUVUPORPH?:)    '6?FHA8+""$&'! $(&'(+04:;;8/(" '03//5:ADLSUVUVVWVSNF<9566;BGMPAJTVL<4/9-Oܢɢme[L>3.+&!+,/39?FIRW_gpv|bJ76=?EILNRSU]hptvrtz{fU7)?HQVY`ba\ZZYZ_cffiklgeee^OPOA@PQRUY]\[YWWVUWZZ\\aTE@JU^agdda[SRVgjlry{n]GIR\ZPKLLHGMLIGIT_[B18GMSSNKGDEFDBADJPTVWYZVUW]bksɪùsGGkzqrmhpnjihjhhfb_^[][[YWLEF=*&Hdgiv}Ƚͻm_dZ_W[[UHASx}zt؛bA?ZcH.&&(& %,6?GE?97421.+*(&&'*-.*&%$*'?f¾rd[XVSMFA<=87320.,-)()-0+(8M_m|yvyy}sY8!!(-87=BEKK@." #+6>FF=2("$''   +  + %&).1.-13598+  #2>CGF?9;BDA<42791'$  %6ABB?;2("$%%$  %*()()-1799:>ACCEEGFGFEEDB<5+ &27,   %<;5' *FkʽyKVgQONSPD=;5/18<-*1,'@KGCF>7-%"*,,.49?BHOQUWZYZYWOF>856668=DFA<BFHKKMT_hlkkqzsni]<*;DNTW^_^ZWWVX]begkmmiffgaPSRA?QQPU[``^ZWVUTUWYY[aPBH[ghcc_]YSIFHKMPYjtl]OMQWVNKMKEFKMFEJR^X=+1AERPLHECCCGDBBHKMOZ]^VOQ^k|̣j~ȲiBLpynusilnigefeec_\ZXYXXVVMIF7!/Qjlo}³|jhY`\[YP?Afźuly¹~O:\hB3)'*%$00=IHA;9742/,)''$#',.+))+6=`vdZXXVPID@?<9541.,.(&(/3/-H\jt}Ż{roprw{dL+&,329ADKJ>+ "'08DKF=.# %'   +  $*'*131,146;9/# + + +!.3772,.44//&#*-' + -@D?956.%!$%%"  &+'(((,/579;?ACDFFEEFEDBA?81' +&25+ '5:>1'7OkȽѾqMeɒr[QJNRJA>6.08;;;=>CKQVUQQQNMS_hgc]XXZ`eiѾ|{p_4!  !((# #+.+&)/444/03+ %21' :JDBH>7,#$()-48>@FKPTZ\\\\XRG>:.10.-0466-).3/11(:82,*($')),5;@DNY_clvy{W;42346;AGHMTTUUX[\alxwoc^]kjF#0=MW\`bb\ZYWVZ`ejjhhfggg`]VJECJOLTZ[]_^[XVTUXZ[[\UNZvykbXH@@?8:C>4/5HZbbPPSUSNIFGBFMQMNP^d\F.&/9CJKC?BDACDGGHJKP\^^VNSfxϷqgqų|VSemsrtuskkhhb\Y]`a\XUWURONLI?."4Wb\nuaZX`WNEE`§uhk÷΍g`WR@:05*!"$4?AB>=??><81-,)*&(%(*,+1;L`l^[XWRLHDA>;730*(+,((/,+7Pewô{opjkqq\;$"")*26:52( '25*  +"/=98234;>\sɳ¿ʾZZ՛o^SKII<3('*,(&)-29BIOPJLOQU[digXNNPQ_q˿c>' ""$! !"(+./1142& )35""'0;BDB@6*!!"#%)15;>CHNSZ\^\][WMC;73--'##&1*!-:;2$"+4Pqmk}ɽεxobXQMIHC=;:5.)"$&(-.:=GQW[dory~pN;30/138>ABIOQQQVYWWZakonlTUYkmM)"-;JUZ^ab_]\YX[`dggefddee]\VMHCGJJRWXZ]\YXVTUXZ\\[TMXokUH=3-/6:?GJ=-+4CNOKLPTTRPOLILQSNOT\daM5-19AHGB<=?=CEGJMNMPQ[a_^e{¬hhxƵdSfpnnntxshkgd]WX\`_[WTUSNKLGA2%#.@\fbo|vpҮj[TVTRQ_~pdnĽզpS67/4/1<56DCB==@A><81.++*'&'()%'6G\}scba^WOKIC@=851+()--.3,)5WixƷ~znlkeT2!&%%%.28FG:'%1@JKIG8'%(#    +"*-+).231/04:6.$ +!$&&"  +8GA62530$!( + %+()('(+138872/%  )34'"'15GMR[ejpv{_A92-*-168:;DMOLMSXSQQT\```HMVjoS/',7EPUZ^bb``\Z\`cddbcabbb\[WOJCCBHOTUWYYVYWVWY[]][TKSbUCJOSVOS[euؿfHhŻYQrzohirzreke_XUUZ^\XUTSPKFI@5$,?Rbebijdi׻t^MLNZl}nfz÷Լc6,(.+?XF3HEB==AB?<820.,,*%(+'!#:Sl|khd^UMIGEB=962,*'/126-*9^n{sngYH) $  )/4BE7'%5FPMHE6' #%$     + %+-,)-021/.165/*!!  =G=42650" ( + #'())(&'.346:<<=ADC@>>@=:5.*  *33& +%-6@M`tòd}ܴv^PT^ZPB7//036;CGMMLLHDESch^THCGR`oǽoK,$##"$)/446;6*  ')'" "'07;;81)%$')),.+%)2WL<1285-++./3=KYnnmvʹ~{yrmhca[SM"',0028@EIS_eiouy~S651*'*14547?KLJHQWQOQXZZSNDNWfnU5+*2>KPU[bcbb^\\^abbaa`aaba_YPJA?=93/../,'(*'!%:Ssýuk`VRNJFGD?;830,)344723Eiuǹz^TRdwvqgO>',1>B7'!%$ (6EKLJ@5'  $%      &+,/,++-/0.-0553.$!!$(#  +  %?C:1285/ )   + !$(--'""*-027:;FQUVUZ]\]``]SH?<523104BEMY`flruy||I-0/)&(/4305=HJIGNPNNQWYWNIKSY`gS7,'-7DJOWbcbc`]\]^bbaa`abbhd\QJ@<9ELPPRUVTWVXZ^__^\UIFH92:YznS=7>EOTZ]gnojxoqzxwyyrhbb`ZMA916>DINQT^dsŪgW]fĶrcrwsrtvuoi_[[YWTSSRPQRSOGB8/& (>:4101/-)'''%(6HrƶlZOQROJGE?<952.-53487AVz¾pJ.+3Lj{vhN2  $*.:A8+%$&*'!(7DJJJI>3'  "#!! +  ,.,-,,++-/.-03443'&&).*  +   + + + +AA6-274.)   !+..(!#'-/4788;<>;98:850'! + !&270#)7DUs˾ůvcZ^bdc_YQORWcgigaXQMOV^\TMLOWbxuA ! '' ('*-,))),29<8,! + +  %+--.)%$%'&$!"&/;BJMQV^c^]^[VL@540032138PVSA66CJ?GJJVm|þ~x#&&''*-5=@BHRZ`gmpux{rE+)-)'(-//-28BEGFKKHEDINQONPZZ[aT<0%(0>DITbcbdb_]]^ab`aabbclg^TMC>8DJNMOSTRUUX[`ba`^QB>A3.:UjscQGC=TNE802:DW_dhrzyr}~Ż|pjhfWH?6=EHFCEKjӹrVOb{plywz}yrmkXUWVUSPLMLNPQKB<.(#%+5?IRZZVK@B@@;72100,*%%*,.6AjǶkUIKONIIEA<:64/1601:@MdyM2")RpykS1  #((7A:/--00+#!2ISSLD@:2)"""   &/0-,/-+),/..13553')*+12)" +    /A=2-260+(   *,-(# !"(*/35566:776540,! ""(4:1%!*IVVG68FRKQTWey7+!).-&)2;@@ELSZ`fiotw|~g@+&(&'&(***-09?FGJF?:8/!%9A?- ",9GSempqxylx̷|mkldUMCFF>:BTi϶{eXWnut}yz|uleeTPPPQNLHJILMLE;4*"!*6>?AENMD<=cŽ}έǾw= $:AJGCDFCA<72100,*&'+/29C^ȸ{eTLGEBIGC?;75145.0=DQfc=.@i{o]A$ "$3@;86:AB=411=KRQH@;60)#" +   #-00,*..+*,./.02344+/006:4.   +  1?8//33,(' + +  &'*(&%$"$&*.00005110//+& %/88.'%4Nnþ|neb`^\YVUW_dd`YVWYY]__gvƾg3!" + !$)*'&)+1791+&  + +"$$$" !#$"  %.//2=BIPU[bejosz|y\?,%"$&'$%')(*08ADD?7337, + %9M`mpx{wz}rdҤpmqoc[TPF64Kv̺qZTW`xwt~wtsoc]ZQMIJKLKHKJLLIB5-(!-AGQURKICEFFEA>:4/)& !$ !   + ,401+),.+*,//113343,1328>:4(    +  +   0<4-.12'%' +  "%&())&$#&*,//.-1/-,.+($ +'8=6)'-R¾§{ZZWVWXWYbed_XWZ_cfn~ż¹K$  !#"&)-*%!%)+/1,,*!" !$%# !-)&'-45789972.$%*2=JSTLINZ`ils½{P1#%.'-.2;EHAINU[agjnv{|}nR:, !&())+,+-29=<84/..02544:CMS[YF2$$3>EQ`_bhkjhghbdcb``acbcb`ZPC<5@GGIMONRQT[flkhbP:7<)  (8K`ouyyyyvsptŹܾ}mjgdaa]TIRp}z}Ⱦi`ZRT`{~{}yqlgaZTLHGHKMMKKLKIC8-(&((/7>=9=7.0DtùĿٮe3' -DTRIGGAA<942233,25.*.35ErŽƳjWPNMJHGFC@?9648?HWm\8""5HYuaL- (29;@EIMPPQPFEDC@>:72/+%!$''&##  %,00()*+-+++.02342/0126:>><;4 +  + + + #,3--10+%  !'+*# $+000.-0,+)*'%! + &00.6HWʮueWTROOS[bec`bhmu¾nG$  !! (*+($"$)./.+*%    ## ($ "#0332)! &4>IQVX]doyxV6!"+2766;EIGJMTZ_dikqvwy}hM6)!')**-0127:<:3.+++-///.6>GQXTC2%#1>DLWY]ehlikkdedd```ba_`]ZOD<7@GFHKNKOPSZflliiZE>;#2?NXcpvvvssqoqqxب|ϿĨshb``polm||usysh_\ZYSQ[u~{}xrlgaYSKIHIKMMLIIF@;1)%$3<8/.9C9,%:jƿĿ㾖зvF4 2DQOJIHA><964364133-,//.>güĴ|i[QMLLIHGFD=:8:>K_xsD($(8NcxeO1 + )29::?BDFGEEAAA@?<63/-+&$%))$"# + &-1/(**+-+++0245440/2259==<;8# +   ,1++0/+$ !" "&*)$!"(.00/-,,)'(&&#  %%(4Ln½dz~g[VPRZcgkkknu~Ȼ^5  + "! !(*+($"%(,.,*(#  !""$'+.,"  + $1??:1,*)*,---+19DOSPA3( !-:?EKRW`ejjlmfgfea`_a`^`^\RG@:AEEHJLJLNRYbilklcQF;  !1Xbmquwuprmliimpzיχسγ~laaddcai{vqppw}|m`WQMPUXTQ[s~yslgbZUOMLLMNKJD@:4/(#"!-74+'2>.%,[ý̽ٵʻ࿉`L2'4BMNMMKC@>;8657531//3741;]Ͻ}hXLHHFEDFHA>==APkY*!(9Ri{cN3  )066589;;;87799:;840.,)%#&)&"  + )/1/)*++----/14566322348==;T^gnwƠ~T:16;=<9;98974/.2:;YwθÿwfOJFA<=AECA?>EUuP(/;Sn~umjljdUC-   (146565431/./258:83-++*&%%'& + "*/0.*+,./-//034687543247;==<=0 ')   +!(.1002/+#!"$&$  + ',-)%')*'&$!" "'1Lpſþ¾ùóǘh6 +  %()'$#&),..*(&!! + #%   + #.''5JQILMVfpsuplkjgdeefhilr𷩣xi`][[gc^X_inpjiltyxxxz}zwwg]VW]]SIFEBCQgy~wqjd_WTUSPNLIC@61'!)'3/#'WƿȲ⺔k>")5CMVVPJIFBA?=<:<98217ADA@G_uͷvf^RF=:?BGB?AJ\zU5J\rp[PLKID>/!  (/355530-*)')-15:81-*((&&&(&%*//,+,.01/1.0245885523369:;<7/& ,+   +#)/01111.+!"#')'! &,0.,-)'##" !/Gl½K!   $&(&$#&*,//+)'! !)%  #*(# +  #0>KWlvǨ|`<76=EJOPONQSSUZ[adeehors~jJ2'$ !#%&*.6<;?@@91,''(+/20/-(-8BD?;=<3$ (7BILPW\`aaacccc^[XYYUXZ`[PEB==AEEGJJKORW[_ab_SKD4/:Nbh_^^enssqicdc`^`bfghfi۴ܸvg`a^ZXUZ[Z[bfgjjowzvtssz~wpkhg_UPQXVK@B?:=Qkyy{unf`[TSRRNLIC;8.*!%"$&!(M»ŵ̫T@KY\\[VOHGD@@?>>=><;669<;MZf}ǵ`L99BKPPOOOQQSYZ_accelnnzzbC,###$$((,1AA=4+&$%&*-12/-(+5>@9:B?9+$'2?FHNUZ^^^^__``\YVVXUW[b^THB<9>CCFIIKOPRUY\]WIGLFESh{~okhilookc]]][\^_`bb`apkjlld]ZRX]`cgjijhkptqqptz|rnmf`ZUS\TLFC>97;>=@Rkvqvy|}}~yrkc]XSPNNJGA:2,$!#*$0W¼~}ɿym|lZPMIGB>>>??>@><<>>:4:Gdy}prн͹}}na[YQEAOg}ucvvpi^PB7.&$.46430)(&%'*,.131-)&%'''&&# +  ))(,-),./13320/236655232014678.+'%$ .6482)((*(!  +  #''%$+18645630+#&+.("  *6;=3,$   !O`nzǻjH>ENQRMOOPQSXZ]`aafknmyrZ=&"##'&**.4?GBDC<3)$#!#(.01/,&*2==7;C@;.%&/:BFLSY]]]]\]]^ZXUT[WZ^fcYM@;8>CBFJIJMOOQUXWOAESTWdvxqkfhilkd__`^\]]]\][^a`yo{œuc_cmuqe]XQSTV\ccbca`gklopy||tlgd`ZTMHFSOE7,%(.5=ACQgqmptwvx|}wpgaZVQOJIGB=5+%  '*$"U|wstxǾϴvWJKKG@<=>???AA<=AA:5@Pmh]yѽvnlVGDVvvwhZRI=4,(  #-3453/+*(**+,-01/+'$%(('%&! +  +('+-)-.013320/135754252114457/+%'& $/56><1-.32.& "%))'(.3:64584/,$',/(" + *6=A6.#  ?oþ½ļȿkD#  +!!! !"##&%#$'+,00,)*)(+#).!#&&" +!!"!%&'!   %1=O`qʳ^IFIJMMQSSRSS\acadjmmv|}iO:)"!%)&(,6=EGEA<5.($"!$&*--*)*.168:>CA=4.+/6;AGOW^`_^]\ZZWYZ]`bffljbVKB==?AEILLNLKKMPVNDN`dhvsjd_eeca___]XYZ\ZWST]bft{Ç߫d__]ZYYXVV[`[RMMPQY_cdhns{{yvpha\YWPG>96KE8("#()3>@AA?;;D<3AS`jjkdUUmƻzux}hKK^~tgWE>:0(" ! #.2540,)'"&*-+)*..*%$#%'))& + + )&$(-,..253/.2-0468874300./0/27/&%% $17DA79>8=91.6@>3, $+-*+3:>:66983,#(*(# + *34($''# &S¿¿ƾʿS +  #$# #!!"$&()+00*')&")& ($(+.,("  +#$ "&#! #,9I]pʡ¿ǩ|YIKNPNNOOSXZY]a_bimksy|}ybL8)"#&)'),5=DG?=92,%!"%')*((-./3:?BEC=4.+.24;AITZ]`^_][ZY\aeghllpndWJB=<==AHKKLJJJLOQOJVffhtzla][[\[[\\ZXWWXWYYZ\Ygsxtlǁ£ub`ZVVX\]ZXUQLMPTU]hjjijlvsnmje^YTQNE;311;92(%(-.8><7BWa]`dkrzxtnia\YTLHBA;2)""&'(&%(""4Y½ulggmurw̘iY\igc]XRI>>;99=@CCD;01Kk{ua]WPSdôvpr~}qOPewzzocWJ;55$ $%%$ #+/1/+'%$#'-.+)),-)$&&'(*(%   #(%#',,/.033,-/02698876100..-./5,&'))*0>KXQ?AOSJB63BU\V;( !(-/,.5;>955983-!(*(# +  )1;BA:4/,(!  &)8dľ»r?,!!"#%$#" !"$&(*+/.*(($)&!!('(.10)!#$!!%#" +$-9GWj~ϢΨxWKHIJJLNQTTUW[]afjiotzz~s]H6)""()&'(18?A:63-)#"%%'((1.,3>EGE@<2/132.672@V]WZ^hpzysoie]YVRKE=92*#$)*+,-)7`Ĺ{ia_cipzwz՟hNL]gpj]QKF@>;<>ADDH:?>>=67Td\mtOGHRTOWmĻévxz~knwZfoeL@3*##**(' ',0,%!%)12/*&&&$#&')'&$#! (((&$$(+0...+%%)2579;<;:55200/./5.)*.+&"7Zyc\TMJQcxyjI, #(.0./36;733762+&+*$ + +  + +!&,4;EKE8+$" "'$3Mj¾Ǽ˾ǺM# !#"(*&" !#%(*,,+*++')'$ !#$'*+)# !!#")(#'3AO_qȿfECCEIOQPNTSTZaegflqvvyp[C4*&$%$ "&+/2,)&!  #"##%&%&.)*1>GHD95149:5.8=DLQUVUY[^bbefhoopnplbUB82149?DEGKKLKKNT]_^^SLS`ecUHEJOORRSUSSQPQSTXXZ\a\PTjȜˠpSPQVYYUQMIOWZTKB<=ER[`a_\d\RLJIJIGB:.%"(/1.&#(*/457H[\PT[hx}{zxtolie^ZVPGA71+$$""#().46147.^¬zyogkrw||}QA\n|ubRNL==<;<=BC>Dfr[]maHGOYRFI_ƺǰ|zx|tsx_r]M5)%++)$ %+1,$#(-2/*%###$$%'%$"" ,*)&&&(,.,,+($$(3589;<<=;:7664335/+.2. )NnYOOZol[=' &)/20137:73464/)&**%  +  %.8FPM<," 36/@[yƼʻȻåj; +""$*+(#!"#%(*+,**,+%%#" #')%! !# '('  "/GPTSOPX`becgmrruy{{nXA4+'%%%""%'*.-# %%%&%%#"&&+1:=>>>;7597508:107jɲ|vqpmmu|ݽW>PT\fqrfUMJEAAHS[kenn[UWJGJTYREEUzǽð}wvw{wtvÐeyxA, #+-/% + + %-3/$$)1/,&#"#"#'+(% + $0*()*'(,-+)(&"#'337:<=>@??>;98876/-187&8kr\TS\c]RG2)$(%),154488964462+$&)(%  !)8EPOD0% &9;7HdüǹźǺa +$!#'*($##$&()*+*+-)"#!! !!!%+,"  !$#!'( %5EXguû]Q>45>IPRLLU^_a^_elkmrtuiS=1+'''$!#&(()&"%&&'%##-24259@>;787868;AGJMMLILQWZ]^agefchjf]O<++5987;AIMNJFDRdje]PKQQQLB>@@@EEEEEHJLNPUWYWVTXfaVQThcQVXVSONMNOQNLKMLMKIHILNPPPOKE@A@@=91(" ""''"'/0 +26DX]TT^puqnmmlifc`][ZUMFA;5222/-)-8A<8CVϽ{wsrty~ֻgITMHPcmgWVURNLOX^sng`WOGBDKTUQJGLeýw{yx|z~vpmsʞi{d.  (-/# + +$.64&#//+&$"!#(+/,$  +/('*,((,,*('% "'0268;><<:70-1@Toÿ¿ùŰ' '!##$((&$$%&'()**-.("" "$#!&-+ !! #"#+& $8J\toaL?=@FIQJKT]]\Z[bihgloodN8/+*(*!!"%('%!%&&('&""/3/+/5<99778???BFKOOPTVXWWVYe`TRQTakymZ\VTVXXYWROMJECGNPMEHFFIMOMMFC=::9987/'##%$$)*% $,//(01@TZU]fx{snljigeb_\ZZZWOIGB>=BC@>::>BAGdɵ}zy|ƻӾ~`wlZIGLOKRSWVQKKJHONMLEAKDKNOPOIFT|z|u~{y|x{wtqtŧo}V)" " "((!  '1:7*-/+'%#!!-140#  (%  + !11)),/+*,-)''% "(/136:>?DKNLJKKKLNU^gjjd\]eheQ@.*05535CGJLNORSRQOOX[_]YWVUXUQNOSW[Z[[XWTPOLKLLOOMJHDDGMPNLC@9522365/'#$%%&(%&%)2-")16BNUUbs~vtjddda^^ZWSRRRQNJKF@COLA847=E_ƴΰyvvifW^o}ڿsUJBHCKLOQMFA>38@HJJJJMKKJHEBHYl{}zxy~{|qmnq}«jH,'.& + + "" + !$2@9,53"'%&)-*    ,,20.+,+-,/+++)$&(02368:;=@@=<:8522.+/:?5$&/IzɽlQ;,$#%.,+-*# ",/376424024894*&"#'+)#  +-2ADGHILNONNS\ehgaZZaecRB2+06877=EJOPRSS^jmjgd^WG;53012//59>BGHIJNPPPOOSUXZZXWVSSSRSTTTWWXXWXYWWTTTTSRRHDBEJKJFF@81/-053/&"#%'&+(*&!(0( &18DQWWizzsrhbba]YYTQNLKKIHAC?;BHD70-1A[ʷζ}fGOP;;7=GO_wö;eZNME@@@>;75438BHMOPQQONJHEDKQ`tžzxuy|uy~{rmnqL. %.3(   "&(/5;."'24&!(&  &%  +#+-)0//,-,-,/+++)%&+113479;;?==:7420-+*.8=6(.3GqdO:10--,&&'+*$#%,0576321.15883+%#$'*+$  %)/5??><>BGLPSQNPX`ec]XW^bbVI:.06;<;?EHNPUUU[bgijf^QB71/,,-.0269=ABFHKMPQQQQPSUWYZYQSVWVRNKOONOQQSRRPONMOSSMJGFIHE@C<4-*,-2/)!"")(*&$*$%0:IW][rzspoe_^]WSRMJFCBA><44209@:."!+Kx̿ľձzfWD1HQ=?>0//;;8541/'*+/695.59EcfE4(+3652%%'+*%%(+/57631/025983*$#$'*,& '-..06<@=966552'#*EoĿ¿ƿƺb*''"('&'('''*,+*+* +-*&',.)% + +! ## $ 0H^reKCHRSVXZZXSTVXZYVTQD;3+'"" "'*(%(*-.57=>BADHD>CEE?99>FLRWUPPV]`]XVV[_`YPC3.3:?=@EFHMQUSVY\bge[M@40.,*+0/0258<=FHKORTUUSOLLOSXYTUXXWURPRSTUUUURPNLGEFJMRPNMOKC>:60*))+.+&!(&)&'$,8I\dc{|solmc]\ZTNLHEA><963)'$%/84/$8cƺ˿Ŏo[@442VjaXG50+0>COgӎlf`]QMHE@=:=?@CJNRVZ[WUSNKIHNY[]lĺĶrkmolt}tlidht{A0;73,  %,5CCFKIDIMMF><@HLSYYUSW\ZWTUVY\^YWM:/29?ABBAAEJOQQQS[b`UJ>410.-,112357<=IKNRVXXXUPIFIOUX_^`adhloqruxxvspnicYRNMMMKLNPLD611/--064451)()+0576310357981' !%%&(,*$  +#'()+*)'% $JĽÿ¾zx}¼ža>,#&!&'$()*)((*,)**$))&!"%'#   !  $%&#""  #9Phzſͽv]SUVTUZ^]\\YYZYZVPIAA>2)## + ""%,.//57:JLNPSTSSRQNMMRZaooru|}tld\KHHILIB;,+*('&'(("# !%+:8RxüQ79-)<;IKMNOOQSQPONLHFJUTNRbýǯwohclxvmib[ZeylN.#-:91%  + + "%3PxƢk7+&!%(%****)))*-++,*'(,22345687755310..&'+11138@FG?<=?>@:751,-197783*)*.1576422568:70&"&%&(+*&  +!$&-,&!$! &L¾¿ulmƽĶV1%+ $%$()*)(')+**&  )(%#$  +!!!!"$&'(%#$" +?Vl}þ°h]]_\[_b]]_^]]]\XRJIIG7+$!     &--.-249;?==BB@JPVWTSSWY[_bb^XTPMPX[YXZ[ebM7268?@>=;?CHMKJIPUQIE;56653387678;?AIJKLMLJIQX_bbemv}uc[SMKGC=4/+&%%)+'!!#2Rtvmkjf]WTVWRLKIGDB?;62,'#(9G^mپgK57KѵB4=0(Jv`[kجkRURTQLGB=;;DHLLMLMNMNOMLJFHSSOMUmĭð}picjvtmiaXXbr~tG,+=@70  + + +  '8TֹD '40$ %-*)('()*/--/-)+/1234566764211///)')01018>DC?;==;9569942432352++-13665445679:7/%#'%&'**(  +!#('$ #$%",OƿĿþ¼rgfȿo;0$)!!$%*+,*))*,.+%%)(#"# ""$&(((,(%&$  1EYn|½±pedhcbfgaaccaaba]TLNRN=-"    &,,-+029:=97;=;GMV[\\[]_`bdeaWPNKPZ\YWX\jjQ:235==<;9>CGKJIIMRMGC<679656:888:>ACFFFHFDABQ^muvxtdWNHB>=6-&$&+-% *NvsjjfcYSQTUQLKJHECA=86)&! 1Ce{յ{TE49\զr;2>1)W_SݼtUVUPLHA=98;AFJKLKKJJKMNNKGHVVRLOdʴriajwunicXW`oy{nihoO9!5D:,)  +    $1Jss;99#,0,)'&)*,1//11-/34345767664211///+'(.1.06:>=<=@<44.08=:42++.21,-035665467689:7/$#'%&')*(   "!" #(++'!#2R»ƿþqfdǾĿ|D:''#! #%*++*((*,/*##'))$"#!!#$'+-,,0+()%#  "5H\n|ξ}srmrjhlkc`ace`_cZQTR]gC(%  %,,-+02;78679609HNS\^[a]_`b`[SNJMQSRTWY^_c\J3,129;86<@AGEDEIKGDBA<98:;:A@>>?A@>>BFJKKMNcr}qaVQOMJPOPVap~m]TG=6,$$$#)2& + 0Ux}tnjecYWURPNMMJIHFC<41%& "#4Q~ȹ̱k?H>?hŠU:3;APzڷR`fV\TSRSNG>63/8CHJJKLMLLKKJHJOOQTTZxλrfcjorlqhSQbqr~|ue]\YSH??EA1   + ++@nʼn6,&+22,'1((.-))04037505:::88655531/..,-/.-+,1344/59:98797640.-..2343113346664579?;:<7+!#&'(&&**#   .-;BWųzpnĿƻ³hE2'" #"!$+-,*'(,00,#$&#$! $"!#%&''(.020/,&*,## + $6K^o~Ŀyquuwnkhdjunjcbh`VX^nwL*( !&---,13;89645424@DIW[Y_VVVVVTPNLMOPORW[]^a\L4&%*1865:?CBBACFGED<;877;>ADCFFGDA?@BHOV^cfox|o`XOC80--*(+*+/7BMT`istqgVB3-'('$%'% +5\|~wrjd`\ZWTQONMJIGFC>74+*#(-!/Y²ƪf=G>;^xOFGDPs֜bY}n[ZROLLIE@942:CGIJKLPNMIHFCEGJPURTj˼veacjmjngVSdrs||te^YVQSLLKD.  +  &(#5YڽmQ2)-377*(+/0.03:76:97:><<;@A?@AB>=99;@EF@FKLKGEEBGR`mv{|~~pdT@/'! +  )9Reok]O7-%$&&(*!  >i~zskc[_]ZVROMLJHEDA=863.)3;-&2eǵçf=D==\ӢhLREEg{Wey_TLKFEEE@><9?=>@ID@ABA:1862..-/1/--...-,&&(-276587631132457664676787679;?;:<7+!!$&'('(**# )>Shlci¿žŷý¹¿ʺb?.'!!$$"!$*++('(+.+' $&$  !#!$%&(,+(*04213&/.)&!#! (;Qcsǻyx|sfcghlkmphafhN # + $)../.4676:7107@DD?COK>>89:;=?BEHIKLKNSVXVZ]ZE)%,)'*287<@@<;=@B@;:;?DGJMMIC?@CGSet}~r_H6( +&5BLRUO=+"),  !Fs|yrka\`^ZVQMKJFDA?=;76/-*5<1/Boj>>AMmڼaPUHUʕf_ɉgQIGDEFC@DI>?BCEHKMNKHECA?>?CLTTNS_Ʀpb[[[^b_TUerutpgZQOQR_`_WD/  $.3)*;WtP*,65+,49229=;9AD?8:6442222.-.-.+**)+./0035654113245575547889:988:CMWRWOBEJMLMOPSRU]bS5 "-548<<:9:=?=;:<@BEXVPE>??DGJKIGDBA@?>@CJORRV]p̴uh^YU[_^VZhtxyqdUHCGMbdbVB/" " "+25)(Pvt@,-7>4;<21;CD8CSbklic^TJEJLHB:9897530.-.--+,,39>7.(-443311134556443689;;;9:<>?;:<7+! %''&()*+*% +  8gvtǸĻĻ¼þX?+%"&&"!$+,)((*,-("!$%# $%(.1/+%"$/14ATneF(!.,"  ,@Ter||gUObnvyvienxG$#   %*.---48405842;ILJEKP?'%%,3889:<>BHLLLLMOPT_jaD'*0-1589;<>>>>?BFHKLJFBEM[ervyupr|xn`N<"  +   (B>7/*)'% 8^}}{upljeb^[WRMIFDA?=<:721+*''%3`Ü|yʈ\PIAe٩tXd֨yOLIGJMG@FSC>>>CFGHEC@>?=@?A@EIQUX\cͻ~ujaXS[a`]bkx}~rcRB9>D\]XH7)%# + + %,20*#'Gޫܽ_;16-!'0000//13566644379;<=<;;=??;:<7+!"')'%(*,,*%    Dz~|¼ȺºÿbD-&$&&"!$++''(*++' """!!'/48<:/*(#*Hi´s>&/  0AWgs}ž~r^T]finslipF"$     %)-,,,474.26406CFC?EH6!"(.6999;>=AFIHIKLMOT`njP2!$$'+19>@@>>@BEGJK;==BEEDDB?<=<>=>ERRK;.&!%(!  +34("1S{nةnC.57?CFM^mɼlN9B?<:9897.*-+-/6:DJK>+"*/000/2348785549;<=>=<<>A?;:<7+!#)*'%)+-,*&!  Z¾½ɽƼlI-&$(&"!$+*&&(*+*&" #*38?E?-*2):uѪa59  + "3DZjt~}yxyxyĶmaW[[bpqou~E#" +  %)-+**153-.43,2=@?:>@-,28:9:=A?ADFEGKNLOT`mmS6",8ADD;;==>>>>;=CLXckopllow{{xmj_M;) +  + +  +  + ),+*+&# !  +%,Ps~|yuqlida\XVQMIFEGFFHE@95.'!&(&G|ѻiPDTp㺈`IQ}ŏZVWGAGIB=>B=<=BDEBEBA<<<=<><=AKQQP\­znic]XX]``bju{njaZMCFOQOI:1.,')*) ,67'*NˠӧnF$*?Zm~̻~jOHB;88;<...,,07?IIG<,$.//0258:<<:968:==>?>==?CA=<>9+#$)*'%),--*&" +  %m~ž¼ijú½|U/(&((#!$*'$#&(()' # #*07AJB,,:0`ܪݻg0- +'7H\lv{usuv{}ſd^XPUejquA#!    %&+*$"&,.1++/1/02=521+ '4?A>>@@BDDDEGJMIQTVcmZ=)'3;@E><:9;:522=N`igb_eht~yuvhW@*   +  + +  + "%&    )(>a~zxurnic`[WRMHFFFHHILJC<81+% ,)Cѭy]K5KҔ_CJ\wؤqZ\MCGLH>5;;??ABFHEDD@?>>=;>CELRQMRv{olke]\ab`dntqld_]YSPSYNB5/.147."! #529VýֳT+HS|ǫuro|ο{^EBD@:;70))),6?HIHA@=<;:<=?=??AAACD?=>;.&#$&&''')+*($  +  ;us¾ɾǼ¾ǼǺú\9+.$%+ ##$$!#&&#!$$""!%,098=@5&&3Íݾh1;" ,<970>TgqngahnwzxrliSB*    +     +"!  )1Hi}{ytqmhb_YVPKHFHHIILLJD>81*%!/2ṆoVL@@BBDCD@>?:/&$$&'('()**'$   +  + M|nlŸºƻ´õǜlD--)&($#"" $%!$$$! #'/584(!):ѸǕٲa08% +.@Rfv|~{oiiilqwyyxvxt`RMGFao>%!   +!)+,+%!&,.0,*131.0/+% +7EJIJIHHIKLKLPRSWVVakbN0  +  /6EHIGA=<=8EWfnonkjsxrkf\O;+ +      +"" +%8Vq}}zzzwrnkfa^YUOJGGIKJLMMLF=7/)>aǕ^HB8HsrVI18l͗kKPPLHHA5<=AAAAEGFDECA@?>=@CELRRNOkº|song_^behnuwrje`_^\``VH://3=;989<9.% %%'(&&()*)'# +%! + 6d~lhü¾ȽĿȹʽԭS-*+(#%"#""%% $#!! $..#,=ȷܴȖS+,  0BThx}ykaaaejpnlrl\]¼o^UA;_k=%  +  + "*,-+%!&-00,*253..+*# '3=GJJLMLJLNOMOSUTXXYckfV4   )8LONH>558HPVZ^forlrqe_YF,%   "!   0%  + " !?cx{xwxxsnkhda]XTNIGGKNMMMLKD<6-))!*CuĊQ=7.6MgqwrkeZQT@C=AAAADFEDDCB@A>=>ADJQQNOd~³{rnmg`]_djrwyvsngeddgf[L;238AD:+ # %!,@rɼhPLGJO[bYH?@BKIFZƻjJDB>76330*.4::9761.+,--.5zľ{nbGFne:&  +   "),.+% &-00+*263,+'(# %5=DGFGKMMMOOPPRSVSXZ]ekfZ8  + );LMI;,##(PVYUV`lpnoi[VM3  + !%())*++($   &:F3 +  Gn}zvwxspkheb`\VSOJJJMNNMLJHB:5+(+%LִtA2/.2;A>;=GJ?25.KcnyDPSKHNJ?>?BABBCECDDDCA@>:?A=94469962268;>@BCCB@?<9:82("#)(,,*(*+)(($ "#$ +,]xϻ}YLFO]`XPUgĽ}sʸʭ̼Ŷ}."+ ! "# !"# "$%%)%/8*LĢ|U5)41 '8L]ny|}s_QQTVLX^WdiK>`nxqM/%     +$,,)"$,0.)'173)$!'&$3<;@A@@FJJJLMNMORSVXZ\_fgeR0$!+7:2#.DSTUZ\X`ZP?-%+154540,$"5BA/  +0Yy|uvvpnjfc``]\UTQNMJKJMLKHE?72+ (%:{ǕT.,4Qpwzzz|yqhff_Fg[MHJMKFACDCAA@ABCEGFCB=77?BFIGHJLMKMPSXXWX[chj]<,/)"-45* +!6FIKSXTTPD1  ")/45640+"&$!&15'   + :_{ztvulmieb__\[UTRPNKIJNKJGD=61-%)JNJP29PưÜz@2u`KHLKHEACDCA@?ABCEGFED?88:=DMOMPNYļrijjidZUY_`^`ejlkouxqaVKFDC>5,%   TľhDFanQ@4@WҴxD@U׮zV?/*1;<40+2793149434466530.,+/5@BCC?=;:8881($&+*,+)')*+*($! $$ +/Zvnw\C@IB=?Paiji^LAMj¿sɵǷΖB.0!!"$$""# "!#%%#"!(3L͘D;BE:;4 *;O_myzz|}~uaQNQBEJQX[YXVD^ͺeYE2&! +    "*+( !+1,)'.56-&%*(&3:,3;@DEDEHJLNOPSSUUZbbbenbD1.)&(#"/>A=8,9@<>ACEGGGFB=98=BILPSMPx{mhkmpe[UX]^_bhrtnpwzrbYNILK@3-($"$'$!'-|ԦjRzƘH9\@6|аyNGR`Q4/IF3"  +.7386/! &()061)# *.$"  $Nitturmmhfa]\\\]YTUTPHHMMLKED@9,!#Ez{ZGQrǝ^8&CҢgCHMJHFGEEEBA>=@ABCDDDB?=>AGKNOQOUv{mhkmolaX[`adhqz{wx{ocWOOND5.*'"#%%%-*"E͓o|:;_OQ͠iEGϱ{Y<5AD?8120/.0454=<;961-+%$,0:EC?>EE@B>045783(')*+-,)'),..-'  " 0f}tjsӦoTE@>BIF2.Jsذ`KI^ɿһȼբa6.()+ $$&&&#  %))# %!(;RŠ?;@HB/! + +.>O^kwwwy{¼zZB?FEHJHHIMRMI@D`pdac]UG3$   + "(%'-.,*)066.()..&"$(**/7=?>??ACGJKNRUVVX_`bekiPC@711-025;DMQSK7' 6>>5//*" !%->A8* !.0'"  $($ -Sluqpmikeb^ZYZ^^[XVSOHHKOMICCB<1 #YeRP`~جr<,1UٶuIFHIGCEEFECB?=???@BCDDC?CILNOOMMTmɺ{mhknpulaagknp{zocWURF962,)''('(3mټ~j\\_^\^[WYf|^ݞi:@VWpܴkPKj͒Q4.>DC@:D:2/4984@?=:4/-*++29B@B@FG?@>2/3:8.$$'-,.-)(+.++)  + + ## &AyjiΦtQC==EWa\D3N٧pQHQoǿͰʻͨvH.$+/%'&)((#!!"$&%" %!HwഀB>?C=+  />O]kvww{|Ľ~Y>:EIJJFCBIPMJ<+2Kaj}zsdXUZ]\VH2!  + + +"&!*.-,++166.*)-/,(&&&+06;<=;<>AEIKNSVUVW\^beifPIG>68878;><9;AOHB:+$;??83/)"%   !!/JPE4  + %-0,!#$" (,("4Xmwqokgjc`[WVX]^\XUROLKJMKE>?A>5(/lޮ_LMdR1;TuญoiWYfŃNEEDF@BDFGFA@>AA@@ACGFCCILNPNONKRfofp¾|okoqtwkhntw{|rje^P?=3-**& K¡x[K9&$ ':P_]ψbHDD_꾴dXMTyߞT50?FEA:E?98=??8D@<83//.1"$49DRYJCED>@D=58=91**)/./-*(*+)'% +#&#1OofyΥrHJEHN^zwR8QyWFGbùƻ¿Ƨɷʱ[1!*1''(*+)!#%%$#!(L͟o?;;<3$ /@P]ktuu{}\@ADHLPTWUVUX\ceg`NLLB;@A@BC?0! '9=EJC749CDB=:6/($! + ! -N]TA' #).+%&$   */*$ 7Vnxsnidha\WTUW]^YVVRQONKKHC<>@@8.-Iڷڪ{oʝbJIb͜c>;Vz˜oSOJMV{ҏXEBBE@BBDEEBBACBDCEIMLFHLOONNNQOSbeRRm~squwyrmr{taL:*$),&#!`۷\9,+,'! %/461.+->_ƒŢiYUA5kݣnUL?`nK=FHB908;?BDCD?D>:61024.(1@HZzSGEF@BD?<::65694/,,++('&+&$#$# + #(& CABB33GV]_]YSE/"    " ,0-,-.465/-*+.11-+-259<:988=@CGKOSVVVTUZcedZLLLA=DIMMKE/+2?IHA>@JHEB?80*$!"+QhcQ5"!#%'!$(()%$"#(/32)(% !+.+(!4Qjytphbb^ZVTVX]_XVUPQROJHFB<>@?7.>eԵiZ`q{HBTex޺Ӳ[CAeqA4GkaMNhsw~ܜcKB@C@CBBCCBDDGGIIMNQRKORRQPPPQQRZ_J>IZÿzx{{|sns}mU5(#,2-#%!jϴkF)!"#!#! '1760&!#2LqС߽\WZG>~گܥobW9W|T?BC@921=KQQNLIA<962023-/:BFddPIHDA>4774.28=7,),-.+(&*#!'(! + #*'")Jf~b@DMN`ñJ:^}aJ?`uüپ¾ÿɷ|;'--*')--'!!%''%!#+&0KfrgO8//.*"   4BR`mwwwyz~¼`?8@AA?>;97657dYMTypRC@C>CA@@BBFGIJMNRRTVTWZXWTVWUZVX]N=?=4DT^\XUP=;:961-+-4<:?jfNG@><2;?<32493'%*/31-)("  + &+&!%6Zvɱ{S=P^[s٬oGAlnWHFl`j½ÞmdjvзɾƇD//,,(+.-'##!"%)&"##%0<<4( (*)#  +!5DTboxyyxz}ü[;17@>>=>;8338>AFB6''9FKB9)  +  ",20,.05852/50.23//335896556:=BEFJNRUUTRYcfbYNOPB=>925<>;94/) !.-/-'+#1E`uslbWXYXYZ[\]^\\WPNOLDACCAAB;1.IkюS?DXjc^ǍUB]ytڼ־ݳ~RRFX{B/RƊZN[УryXE?A?CA??@DGILMORUWXW\]_]ZZ[]`gebfZHDNUuɿ|yyxojp|}y^E1''+'$.(&yO/ "#"%+//,*,/233258741)!:UlkT;Baˣu\OW@f޾hB:;?ED7CR[[WRJ9:>@<3*%*6>9Gش^J@AD?NVUF945/ (18851/*!#  + $'"%?c~{ƣlN=S^\zcGEvܖZKFKwbJfȟr^RKMXoĽбĻ¿ҏL83-0(+0.' &%$!'**""#"$ #$ #"!4CQ`mwxxx{z¿}W7-046=DIIC=9<>DUcYC1  !-,   +  +  ! (156//2679773322454474367548;>AEHKOOUUXXY\afaJSHEREHIRPB:2261>UcfPKFEFD?92+((((/98:=@AA@@B;96+%;]~w^C658A>:88;?DB>97:<<96.%  + + %22/021(*-I]sq`XSOUY\^_^^]ZWTQNKFBBEFCCB;2&Caj6/UdkXWöu|ɳӭeHH^ѺiJIQmْP8Foי^P^ps\I<;??=<:9>BGLMNRSWZ[__a^\[`dedfrxg^miDVʺļ}wtrmhhptxvyxuy~{o\G7)&$# #GڶJ$%$'''*-159;>?;;?B;03550)#%((8W}UI34a澠xVLETxƧ~UFGECE=6KYMKRI27:853,"%=7>b鵀bZZen{ZA* *-9@:412/&#"  ,Rv~—WIHEJ^[CN߻yIDKa`MkҦ͜iRbnlbZVmȮüŨ¼ܤe?/4,**12(!"%$ $(+) $ #&"!  &  .>=>@DHKID>;>><95/% &363486//2EZml^UPOTY^`a^][ZWQOMJFCHIFCBA<1%;Ohb'9fܬpmUX~rxbR;+3Tçr[JR`|˂==Lr٢cN_޹xp]K9:=<::9872/056?DJIFEGILORPI>8>O]u}|iP?74;=BGMRVZVPIDDB@;5.$ + + '5534871119Mfi^WQOTY^`_]ZYZWQOMLIGNMGB@?;0%0=Kef'@>943667663267559?BDGILOQQUX\\]`aflJ)>MCHNUSPL=26;?8()9EEIDDBDBA?73126:?CEDGINRVXTRH97FT[nzq[F;4;>GOX\`a`ZPLJGD=4,"  &4433563410D]b]WTPSWZ][\YXZWQOONMKOME@>>9/&+6>Iut55_mzщ^Bރcɖ`6[rH:t̰R=@ILTzȜb18=H_wT`ϐݛj\M832/03544579;AHOTXYZ]`a]\^adluvCxÿvjdjgdjv}|kWB50.-*.(/ĞrM %$+76238>EKOU]eqy|xqjd^WSONJC6-) !**4G\xɝiMNKC;BUa_UIHO[dkmmFFikWIFEAFJIHJE14:;;:9:IVsӳU6%#*/'%+7?@=3/+)+,)&"!! #" Hq}yqomlmgZO`zS@IRLW|SEYoU`mǟQKRwܪۃ_f֪uY\ov_ֽaSN`eRW|þ¢״i./2/-,) ## !#" #$" + !'3?LXfqtu~}{ún\]hgefgd`[UQX_addc_Z\[P>'      #,498468:;>BDA=6257776336866:ADFHJLNQPTX]^bfgfpE,;GWWRJPWL:735-4GGJEC?@>?>;855:@BCFIQW_cef\YK99JY\hxwcL?5=@JPY[_`\WNJGD@:2+  '343247560(=U^ZWTORTWXYXWVZWRQQQOMMJB>>=6+!);=AoÂB0Rwաk9oauIB{dI}گaC>CGGJ}ݯ{VCCA5:[uʀVZٓܟmZK;4,*+.10002362...+$ CÝi4 "('0;4)%&*.28EWet{~ypcXUQRSOD;+%"!! &Gr|QHMLDIUsǓJBZvdeuњN=NοЙsa⽑q`VkתrdśbHSpdMaҹžn).51-+& #"! $$   !&+:EQ\isuv~}{þxhhppmlie^XRQTY[[Z\YV[^WJ9%    #-4:857:;>>DIG>6379:67448988@A@=?>94.& *64313678/#7PXYZVQQSUUVVWVYXUTTSPMJHB@@=3%$PlΉXRxԌvXIB;)'(,-,.//049>FKOQWY^_]^bfjr|ŜQfѻvjdmmmspXD7111-! !dĐ\().%"&-/(&9J]emsz}vnlfb__\TN?93/)%9DktLBAHT^nղqI>TeOLDMNOZR>0,1@FCBHRzxE=7/3<.((8Tqs`H7/1450*# 5_{~zwrkeei6=XvґAAVhka[bmʒS6M̖qqۤxk`XzŒbgۭ{RRwƉ`gžͲǿ|4450,*& # "!"&+*# %%#  + $*1?IU`ktuw|}{zmknqmkgc_ZTTTSUUVVVVXWQNJC;+ +  + +!$-5:858;=>?EKIB748;<88559;::>DGHJKLNPQTXZ^cinkpI%)ucBT}~[A/2*(GZUJD>96:?DEFDBKRUNY\beed_[YXQKIMTWi{mYJAJIIIHHHH@:64774/+$ $-75423687-1LVY\\WSSUUVWXYYYWWWUPLKJEDD>/!;>DεٕT/DwBeѐjǼۡCNwȞ\Twv֛g??IF?E`PH`nC76QӖeWqƁ꺁XHKD)'&)*)+-/027;BGLLRTXYX[`ehuUf̷tjemllsp]J=41-(&EcnZ.  + (/,++# !  &9EPXcmrqsme`ZWQOH>3,% 9wgA/DlˡV7;boY]Wnu{tmfWMEBFUgєʛjSXYYSG71/Ch|cN>710+'" ! Bi~~}zwhzoyҍ>FSTNR`~ڼN>QǔwzҔaZ\fy]wϐ\K]ʎgjĽɭĽ֔LA0.+*' " #""&+-'!"$&%   %.5CMWblsst|}{ylgfmjgfca]X]XWWYWY[[WQJN[a`O7 +  +  !$.6:969@HOMD96:=>:;66:<;;?EGIKKLNPSUWY\agnnpN1*î~WkwV58/ -LXOHB<65:BHFEEENWZQYY[YVOJEIGILKKQUl~q]OGPNJFCA@@84024631*$!%''&(2;8751487-0KX]cc^WUWWXYZ[YYXYYUPKLLHHG?, :@JA?LuȳJGjcA/GؤuctӽzŊYHQJ*''())*.//169."!!!@Ri?8]ٹN6=iyep{ŻfOKTi}yΟqw\C;7Lw˲rWC5/+(&%" +%Kp|{U\}پȊ@FLJLeв{DLUÑvvȉPFZtКee{FGoÐpvýƪþƶyydK,-+*' !"! !!%*%"%% #/4ENWajqqsz}{~oaaf``cgigb\ZYY[_`_[]VOMSZaeZY?   + + +%+16=?=9>A;;ZnJCA?C=>:98768:=@DGKNPSU[][X]ggcg|W-(ƼRmZF88==DONEBCD?9:?FKNNT[a_WQLMSUSOOF@ELQVZp~~gSIIOSUVWRJGC;6451+#& +.)'5GF:993/374'(?R`ca[ZXWWVWWZY\[ZZYSLFHGGD<-2CSӯ]ziDFݶr׼x>ZۏnyKRwTQxٿMieHsϥ[658GkߺcHSv֨p9)?ˊUfϼu՛[KQI51%*, &/#./48=AFGKMOOQTZalshcwjbWZ]ahpuvv{}|ywtssqgN4("!ZlR8 ! %%()+19@ONKA4&'-5@KU\_d]SK@5'   /=UfThרdP?JŲ}vѹ˼kcpEcַ~~{_AfĻW9!).% +2\zb^o͂8;@[qڒcTRcżֵ̝NAMǏXyЙlIRmt๣ʾɯúⶠwn`]^bʒN,,,&!!!&)++'"##"  !.4HQZclqqs{|vdVXaeefhiiebWXZ]cdedc]ZXZ\`bhfR, +  %,16=?C;9::Dl{WNIFE<=7655579=BFILNPSTX[\Z^ffdk{T*wcvr@DPPCDLFFCEF@8:?INOPS\``UNJMY]\WQKIMRTX[qhUKKQW\cfbZRMD9551*(+"$22+,CXSA=;2.151%'?S`ed_ZYWVVWZ[[^\ZZZTMLMIFA9) 5Sp—HizC?{֭jʄ>O΅fv=@dk]oʮYrűnGcռoF@GbѣpH:Z֪v?0EԐW]oݤbMNH:0#).%)/&-.37FKKKKE<3,)//5>OY^`e[PC7*  +  :GK_wk̰ƆM@ChŰĨƫOY٬٢ž]콣ðT1+-!! + + #=c}qflµ͈<-AySPXeحĒvMCaɤ~k€]J^۹z}ϣǬºёnrvjqm`VRdəT+-*" !(***%"##! %/8IR]ensru{}{xp[MS_VVX[`cb`]]\]`cbb^`aabbcd`dZB% +&-37>>B:78IMNOQY]\ROOT`db][VWYYW[ap}{eTLIMRYcjh^YRE8441-/1(*>;14NcX=>;4./3.$$;Pbgf`^YWWWZ]^^_][ZYTMPPLG@5$ +5d8YʐK>sϤhڔ@Amza}:5VˑdW|by˼TUydB><78=BOqyWQMHIA>979;4255355,! 6MLA@ScR7=;3-,/+##8N`jke`\ZYZ^bd__\YXWRKMOMIB4  5ks8\է^GpØdE:^maľJ8OֳvIfkkv`Og̿Ҟs]JKwzL1Kw̱g]g|upwQFJR=-(/-(+.-.26;>BCDEIHKNV[cju½x[NJGGIOV^dknxvvwywpgk^L5%\slX`ZA)19<:867<=:7?=;4*"'(0;Ocs{r`F. !!" 3@?CLdʨmVPP_aw㽀P4:ayþ`f]NP[΢yĿϯt^tإ\LMTXmY9;;/'& ",Gaqu|zry¿͇29Wd@MAGZcUO]hjŭݣcRQfҾe}˞VASضczà˩eg¹vXU}ϫZ%.& "   %(((&"!!)3@HS[dipwwx}pYGIRWZ]bhgdbnkigknqqtttpidcekout[2 )17:>>969?DQnpNKKJKCC:9;>@CEILOQTTUVWVWZ[]bmxr`> +Gӯѯ|PE]eWNGDEKKD::>DFHFIPRQ[clibVRTPLHA95=GVY\TJABDLHB?FPURLG<31795580))$*AZ]TP[cQ6>;3+()%$5K^lpic_ZZ^afh`^ZVUTOHFKLKD5 +>xԞj@esOg^K9U~^dϣ]@HwϜVWaTes\EVȇ\WWk̩iQKqƚtc[cmWDL]RA/*)%'0/035:=@AABGFIMUZ`ht}¿tVGHDDGLSXahlwsruwri`\P=)!! XtdQXK/  &2;CGE=5.)##*5>LazkG(+8:97! + '9BCETqYGKOc`՚]92Iyô`oúM``Wd}֎sβQ>MxܚP>@MMRlP72,') + 3Rhtx{z}xsΉ63\_BHRWeh[UXWOػ껦ՔTGY}spֲYFYϙq|ҋgntȿƦfgж\\t۰`*.%!  "&'&%"%/8DLZbjqx}}}}mVB>DJPZfs{wqmmkkjkkigghjrpwwjJ$  *39;>=<76:BUsgIJLMPGD;:=?BEFINQSVWWYZZWY[aclymQ55hĬʱ[H_h^VPIGKLH@@BDGGHJQRQ^fnj]QPRPI@7,%+3?A@:46@JPLC:;CJKJE=5388547502-0H]fa^cfY@A=5+&%""0F\mqke^[Z]`hja^YUSRMF@FIIC4,RƏY?l݆UTh~n]U;K`b^tаyMEkjRG@XgQN?PȾzKIU~“QEOÂ泂aOVxʒ`FMcg[<&&&$-./248<@>=>CCFJSX_fr{þpRHIFBDKOT[ahlmnopj`XJ?/"!$! +YweVP<"/9@HKH@3& &*29CFN`|wO+$7DDA>-%"6B?8JrtRIUWor׷}P-8bĕhfQW]ot}wq͌dQINO}\BDYWFGL|xA(.0+ " ;[ox{}{sfsDž:0ZԠ^KMjvveZMOԩ뾭UG\tnН]WjҶziЧ̻}ƾж_fƐijxl7-$ "! "%('%# %,4>GPclryyjVD=?EMZozupnhhimnqqqideinbC& + ! +5:=@CEGIKORUWXY[]]XY^dbgn\<*$(P||w_\gjilgPIIKLGGGCGGHJQUT\^`]WTW\aXL=0%%+-0100:KY\YPB:01TϯxG5h^FF[bj]=BJTo˹_CZױqT=9D~k_OHVIV{SQ_ò|<6Hp|]JYآlHKbtnG%%)#'+,/048;:89>>BFOU\dnu|lQIKGDFNPSY`gilnnjbWP>3&#"kqj`P6  *7AEKMJA7($%)*,19=ILQQXj~W4  &%&(-*#  0AC8IncSR_[ogH.>qϼzڼXOZשty{~lYqz|NhrOOorWA7Qxb961-#&Abs{}lZeȿ|:3Sѵ̖[NT|xcORߪ|ķצx]ISq~wsБoWjرixʼſʴtƽƊekzŝvmvz=-""  "#"$" &)+)%# %,39?GOWhrz~viYJDFAAC?FpɺmW?>9b[KJHOh[`ݢ˚k;@RdkȐYG^vLJ^wtL#&+$$*+.037:966;=?DKPZbkryȾiPKKEIKOQTX^fhlomcYMF8-$9szkP=' & -=CHJNLG=1('/5157:>EOUXVWV`u^?,%"$)"&+)& %?OILgxZVXeXd֪wT:4AoҾٳ۞[N`{yZdme{[jY@;PQ;&-#.Kj|hOW~ƽw:0NպƒSJVѧdMYђmwź͐mbKI[^dm͆XIvƍsiԵ˻ƿǰnŽĽДnmkӺ~qtغ@.!##%&)'('$ + #),+($""%"!$,=GLPT[`fpx~þzkYQSXGEAI_zrnpkgkqfR$ '$#"""  *38:;:819>@TuY(>LSNUJCCHKMNNNOQTWZ[]]W_aY`lcQ1%!+67<>_hmnrmcd`VXgoi]VHNMIPSPQHFEJNRPNOLGIS`mrrqhWPOE4203>KYkuxupk]LA:6,3=3/59>DKNLIINW]ZY`bUD@>94,)*)"-AUdgc`^\[^efcbc`_]WQKIF>6):^u}lI/1kƍD57al9.8h齬f79U|w_@CVUME2?Qenhlþ|REX|ҦVgȊMOey[QMf}W'+-*(,0022567758:@GLTYcltzƾ~aK@CFCFMRUZbglqpg^UK@2(+$1v}|nPE7 '4) 1BILOQVVPE?ACC=>BDEIPXb\[aqdL<67=@6& )0(  &>IM_wlLUMNPhսT0;59O`r·۳VN^ĉ֍֭Xwߙi|sʻmJEs~D"%$ >byeRVuĽo<4Tź趇bLgݡvT\nֈ^nahMHJMX~d?Q}oe¼˺ym¼ձszƁduտU/"#)%)300.$ " $)./*% " %+034-/357:>FXaipv{z{z{ƺ|l\ROUEDDM_py{ȼsvtkjlfY6  +('""!#"!*269<<916<7300/" )8L]ccaa^]_`afghca`YQNNI@7' :D>DJB;9jܧY8=?Z}rT:Me}}ĺڼhJNpѼ`wҼxNRgϟpTGA^jQ-+'&(*/223577788<@FJOV_got{Ž}aJA>?CGLORT[`fijaYPF:&-(!!F{qfJ9)+3% 1CMPWZ\bd^SJ@7:::[¸豁bRpהjRbԅ_ج`TaTX\gĐT>Kuzdxжǿɴsk¢ڕmhßo5"!'%-520.$ !##!!%*/0+$ "&()08<@BCHPVYZ[anxĺzm]TRTNHDL[iopjnvνtmh_O6 $("!!$##+269<<=38?G^yG:IQNXPHILPTTVUTVXY\\]\[]WSW\P?#&6=IKJWsp^R]i\BDMOXYHFCBELMID9;AIWeqvxxvvzh\\dq~yl\J@37>607>;821.%! %2CW^a_`^\]]]fghca\UOQMI?2!)NJ55DF@;^ݮe:CՉE)Iݺw]QKA@<->\lTxl`epyv}{y|ժX=KyЮwj[HK]׮dUH?OPJ:-"!$+.058;8889;>FHLQYahmsw|ƿtYH?<;?DGGILRV\_^VNE<1-.!%XrbZC0$ 74 6HRV^`blsrh^PEHFEHQ\flww{~raZQLC<6/*($!!+14)&=WpcIMNRzvF6;K\U>2BTrdRX~˕ڞkSNgllvuq]:JW1! '=^}i[[lʺaEIeƹu^]͂ZJgzYҢYGW\kvhSJHgxn`nƲźɾũliſοґl_̰|= !.2.,)! """""'*//,*&(,04=>@>;53.-$!$,9MZ_^_^]ZXW^_a_\ZSJOKF<- +IxxvnYB5I{Μ`>JƃI0IȨknql[SVYs{qZPYchgkfdejoqpwy|||z|~yզZ?MΟhKFGCNy忏pieZHI?JM6$'-26:>778:<>DGKNW]bflpz¼iQE@7578;9;=@CJMMG@;3*"&#'AeeXQA2(  47&(JLH:,:i˪ׅVKNBGVJJKMOPI@9?ENXgs}trt{zrtqghl`KCA87AHIB@B>9613*%%'1DS[]^^\YVTWY]\[XQKJE?4& 0mè~Y<5U|Q?MץrL>KuѲwŮhVQMOU\aa_^aflruuxsopsuw}ްqNTζwvWPWYJEf׻{zi]GPU;)' %,048:8::<==CEKMV[_cilvx|¼aG=6-))*+))+--48:751,%#!/c|yk_ZM>8!"*)# -BPYainrw|~|khdZNI=0*+,,+-1:?<+8YtdZKQiα{L6?ko_::|靷̨nD'""$$%!&1:=<:836BMXuA0CQPYPKGGLTVTROQVY^_bb^]]\R9!%-7AGHCIC;?SYINHIPLMORQMGEDJNU_jwwomgb]YSRSL@;DOXeqjTJG;;DJG8. DײW6;n[DAMU?7DeΘ˵p^MEO[WIBHPhw{tnh`\am}⿚gO^v\^f^vx`GLq|tz˼jeaG2+#%)...019;<>>@CFKMSX\`gjrtx{ǿX=1*  !%*-,,.,%## =xcc_J<4 *2%!.BQ]gqy{{jekkb^TF=<=@@KNPOB+"9WugXKTsǏ\NLVӮh=<{Τ좿ҶL;n֭m{ۚߪdKSQk߿uϷ[UmFy7Hke$&>uxtf]k}58dϲڊPP}ˤiSRuÒ`byeZYGNŷ|LNTNn{_ORmϸļŶj_kÿֻc]nϬU)#& #### &'$#(/59?CKQWakt|»xssty{|ǼwgYME@DEKI??\Ͷwou÷saS?&"(&#$)17:;;;=CG?5,5HXYO?20564255:?BB@@<90+'""3GPRX\YSQNOTXWVUNG@:5+QܴYKfhaZUsfPFDGRūyzǷpbSG?BMYVKGNYw~widWKHN[iŒcRL[bMQu~qbJTahsn{ݺrS7!#&*-..01;=?@@AEFILRW[`ehnsxzŽ·vP3'!#'')-,&%!)[ra_XH;,%64#$2DS`kw}z|hbmxwtlcZWVX[a_^WH. %7Np^IQ|vIRar׭cFQԺտV@m͝bݖ|sXZK[Ɍ^vۻcGըj4:`g($D~xvgWgɵx7@fͶ~MW㵑d[[zyYkďifPFBYOZѺкoM;Wxk\``pѷĻžijb[jþȹwpxҳ`6)!!',*& $*1:@HPZcmvusqtxz}ǿ~vi\NB::BOOBCgϹmp˯̽_aүocT:% +"*(#(+0469<@JDFUp> #:LQZOLHGLSUQMSTX\]^]_eca[D%)0:BFFIJB5,/SԕUCI?:BLNMG@DSbgcXG:5596.&(-2432'"0-"6f{rhZSTICCD533CZc[E>104734639?BDCB@<1,("/CMPVYXSOKMQSTRQIA@:3*ZٯpvĚbenj_gruYGYk}teͼ\OUTKA9;@KZjv|tsrsv{{qkfaWE64?LRkد{c^\IQO[kӻcY]hyŬ|J'$*-0234<>@BACEHIKPUY^cgekswz|ǹĸjD+ %$(*+&% #Qyi[ULF<(#(47.+7GT`jw}|pztpzh`n~}|xrmijjjb^[K4&3EijIR̪hATmӤv\NfӶҿ_HlĐ^xugy侂gaDKњa\UvKLǦ|V7:_t*%E|vvfUeέn9LlμwOeݦa]`|hSoʰvYeY@?^XcܺfP4eüԞ\_d\jƩl]ZXTVoĹû»±]XiüϵxmjA-%.-+& %/7?IS_iu~urosxz|Ƚ~|{{qaWNE>>B;1KսhDHgvиZ\ͱj[V7 + &+% )//4=:9EGDHYl44PXIPPJGMUTOMTX]][\]aed`Q;%$.26>FIGKD3&0M`˼޹V2C<>;DIMFAGUcigZ@)"%+&-26,-Z{r_YPNH=?J;;9J`^QJ>3368535469AHKHC>7/,(%+5CJV\XRONLPSUPJEA944$iػͳqikrljp[KWa`|߿ȿpQNOGDG=@GTev|st{{wtqgZLA=?GGX{hXCDJLIIS^feYA-*054+&$"(*048;?BEFD53Xmb^XLIB;@LKFCOa\OI?5378524357HV\YQONKNQQNHCA921 $mƼģudhwѢkoxյȿs`RNJCELMPXcp|vi[OJHFJ`عmLJ\ɝiJ/.4669==ABBCDEFGNNQTY\_`^hkmw}ν}Q! +$$ $  $&&$#!$$ttd_ZSSSG5.34*.HN5%5J\ksz|mcau~~l^Zl{vttf`_O.$5:=Z}¤Ɯ{^JWǣvWPi弨ۯkHbi^p崦Úu\MQc˵BN|oFTȧ~WHRPF>;Qv|d(!,!+P~qlrxoTKGfθĠgQsް~cXbwtU[r}gSSV_̸rRNVbű͟nVKYeӮaF9DXfhb]JVսuQ]m{˨ghբp-" "+//,&! !)09FTcsɿxusvxyzz}~~vwvvwyywvvvusqonkkigecbakTC7758]qDBJZ|ɷyd~ݝYAT뽋{jY9 $'#$!,5?HA8AGCNtH$ *GVGC?HMIIMQPTVYXWZ`dfaVC+(59,*5?9;DNPJMX`aVD45>DC;9<>=@AEKRURLJIEFE77Sd^^VH>95>MZTOVbZLHA86985342337BDBCCEFIIINPTVX[[[\ehju}ʺůuH  *,&)(# #%$$(*dTYYOKNE7/-)$1MQ6"2J^muz}we[XVY`jxz|lR]}|rshc_M+-??SuufrأmWRgЕgiR* $%" $!-6AJB9AEAU{A +>RE?6CMGAIPPSVVUUYage]O8!*8;?DGEFD=4223/4.5ACKlޭe9)1;53;KNHIS^^VE;>HLMHHKR[gqnrun`QID8?C;>Q_deYD512/& +7ؽŸjD;LTKDObnu`T]Ҹo?<>??BFJECEEJJKKNQUXYXXU[hkhpw̺qE"2400.(! !%%$ *0^OXXLEC<03-,'/EE* 0J`muz{o\WZYR;8@Rt|nulQSmsuvlf_K+0CE?DGEBB=1+-201.8B;5JkƇH)%.403?EEIT`b[MFGLPTNOQSWakopocQB;9=KQMLQ\jjX>.+/;GUYW[_PDHGA==921410--/37:<;;4-&'3FRXUVSQJGEEC?>=-! +>ͺkJ7>JPINe¿z_Wcqè~B?A@@BHJFDFGKKLNPPTVWUUR]imhkqj> '9>985-$"!!&'% &5gZ]\QIE<39:>98EA'!1H\iqwx}x^Wdql\=.+;^y}cPPTNLRau~vuleZF(.CH@BNzjZkՎaUd{uwPUVX˕FpݴuPICDR[lwkVA9FekdK;Z̻E"" +#(AUsysj_WOLHG;.<@252Tdťױ~pvk~{gLBK_ῤ]IJRSa`[]io`HLZ|ǻnVTZZjץaTED]ǁNqد̲ŷg=;:98WID?8?JJI>@_׻l_^mndwdTP^ۡu[gj^>!%$#!" +269FRPkye2$:6;6;ADCDIMQQRQQV_e`UB'(5>??BFC=@9+$$-066=@7,9Q~P/")52228BNYeig\SRRRNORROMR]qriYE645DS[Z]Z^qjS5&%09?FOTZ\MBHLGB>81/310.**.268994/) !(7FOWZWQIEAAB><;) GжƝtO=>HJLSgxaQHdȱC@@?@CIIFCDGJLOPOQRTVUSQ[ikdem˻`4!0?E@?9/(%# !$%$#"3ruf_[YSJ?=>CLGCID,&4HZfltu{~ymae{gA+)FZddUF4,Siv¾d;]ХmxϿ}ovؼqF7  &)*)%"%'+3=IU`kwѸ{qlhihgc`\UOLIJKKLKKIIGEFEFDCBA?;9::;79EJFEKNOPOPU]d\O;" -8@A>@EB?=4&!)+..00(!%/HbvF.".774+0CU^nutld`ZVLLORQTaru^PNOOZ]eod`raF(!078:HQ[\I=EOJE@9/.21..+(*045781.+%(7GT\YNGB?@?<96"$Q˶w_NFJSQWkýþ¿}[>CaϹBABBBDGGDBDGJMQQQPPQSSRQUde^`pи`2 #4DKFE=2+&"!""#"$$#/SrxaW][MBCDISROTM5,8HWahqv|~lmmty^7$*4;=50$6W_QS[m}~vspfYF2%7GKFKRDJ]nܾt]Vsw|޽t?Eeݼ̚Zu‰gOey]UN??:]}TCQe}ѵzR2!+#1Tbu´re]YWVXWUMDP\rjRZaB5?@DFCC@?=;=>>>><:742224569;:789:9762411--*+(*&'$%#Z>5;EB13Qɼ[IJc^cu˦qV[t̴|`D7,$&&##-46=C<6CRLoU!&EA?BC@C?3%"&$))))&#+XO/'-5=8),EZapy|uoic\TQPNQ]tj^_cinjo|l\iZ>,/-+>LXZG4+(!$$# "#!)<`kZefSFHQSY[[aY>4Aaì|XB[֤nQR`nkBH\{f0E]oӢpjήx_eϱz<%0&" !%'&# #*4@KYgr}Őtlhgea^VOG?9678?>=<;:98:;;9:630/-..113587324553.,,+)'%$#""!kPIM;-5FvȠs\Y]hproKF]ȥVD5$%("!'&,07BHHDAHLog&,:G56ISLGLQUSRU[^^\H1!,>GID>@CBB?6'$,/*$  "$%*1636DVaot|}smib^`cfq|squ{}~~m`^I, %(&#.;OVF>KQOKD?962:640,**)/,,---*'!%8ISTWJHLLC:<+ )ZŽĮdGOZVQfex}\90>iظOCAFEIOGFHKLLNORQSRRPQTVXLYeeᾕ`<%%6GOJC;4/*((($! !!R}pldTHFPSRT`g[E8AOX_gqx{zrnorqj\LA;-0AQeu`?Rz~{zhk^R9'4BNQRU\RPTRFIqشcM]ذ{oŹǿuKBrÑȕ`YstSEfǩvhsþnFAADKJD=;>A>3'!$)*CuĹxqokllquvvxzvlghmfRESi_c`Y]msokc`mȷϯfG=>BKWjvz^TTh࿂eL;BhsTLdzppMGR\ѶmCJ[um;&$% "&'/07@IJF@HLlf,(5@7;JSMJLQSTRUZ\^RA*'7BJLC>>@BC>3!'2*' + "*'+36=DPZemy{}xvwutyyvxnUI9"  &%#+8KVG@KPOLHC?:6;8721-+(+))*,-)' "->IOMIMQPD81) &/]οǤ]PT[\YsvkC23RzٹVHEIHMPFFGLMNNRSQSRRRSTV\YahtǦf@("!$)4AHGD@9/&'&&#@h{dOGJV[ZZdiYC;EPZ_fmsv|~}vlnpmf[RMD8,%" +3;Rn_ITowxxmcZO4)8ITUSW[NOVXRRe~ǦmRZuV\zsWFHs˭˱SEXw|YR`ѥnU<757=@=:8530.,+,-234388:;=>>=940.,+(&)('%#!u`LA2@_̠mOThoںrQIrЉq]RA) $##'( 2041 ):2* ( #,&$-9CCIQYev~|sQ6%'++08GSG?IMLKHD@<8979662/)'%%'++'% ".=EGJOMKC5& ".4]ýͤr]aYV``~ĿX<)6W}cRKLLOQEFGJLOPRTRSTTRSUVYb_dݷnC' #(,.DIFC@9/%(&%".FnnUORQUY^ggWA;DO[bhmqtx{|{tjkkic^ZX`XME?91+(,.FbTQYgprplYUK,+?S\YVW[TVY[]_bfmρ]S\`mpXOXp}fECWideSHCAa©mG@LVNG[ƞhLKyz_F92<8668:??B>92+# #*:ayn^`gmqr|{wyytggW3GT][[_b``XPF52S}ƻƿٰhKWIXZ[d^JBA>BDA<8:JXqӜ`NAOִdBJUd}pUB>Qcm{俊jjojz{kVOWp‡N>02)'))'&##&0@Qdq}ǡ{`[wwnigbWOG@;767<:87531320/,+)(~zhO<5Q~php{~`FSuЊ_zɴrcWRA' ! !&%!5129EIFACGYq_4*6DGJMNIMORRUYURD0!-;GNMA89@BJ>0&1@5( &+"(:DABKS`t~|sQ1 &,148DPF>DHIIJGB=87698740-%$$&*)%#$$$1>9;=>;;BMDR^eomdaVTH' +.E[a[WXZ^`]Y`jmf[bn~޲pmjooaHFMSIBTrXHNPPFA]ݼl]WQLOgεlD16;LYRB2/1;::88<<=?ADHKKLLJIFDBAA?<;;>AEDDIIKKMLMLJGCA@?<:::864210~~pO86\~gRFHC}ƗkgÕj\UQ?$  $#"5127BHFCHKUcskV8 +$5FFFMOKLNPPUWOH=+$0>JOI@:=DDE9+ .9@2#   0&(8A<>FR^p{zaC* +#+59:BND87687653.&$##%%%"&&#)2DLOHB:./9:aƿ˾о^[pb\t|Z6)6U{Ϳ޻ybPDDQUGFFJLMNNONORRQRTVYf]gP-&04DFB>=7-$-*&$ !-RxqS9;=FR^]P@:CTakpsuy{{laXVYdon`S79=@@BDFU^^UPRG51" +F_bVMNVUT\h_?,+3X»ɺ{_ea\RR]`VJGDIb֡x|ۙT6Ibc8FXgn`:1Vozv_G;GRSYe|ˮ}x{ȗeK8:)*.,&"$1D[sgdy}pjhf\TMGB?@ACEGKMPSQNLJJIGFDCBAEHJLMOQSSUTRQQNKIHGEC@?><:866|{~oL45_ȸǧ|XJB:DXؖ_dѠwi^VR?$"! "#%324:ADDDJHOV\hfTN<0@CDHLJIKMPTTIA3$!)6FMLF<;CIG:1%#0:;. +  !/'(2:;;BIR`krw~y|cC+ '4<>BKB:?BGKMIE?875632121*%#!"#$#&%#!(2=IJE7$3>BjɽУhenb`seC58-;5/,19<=IYQ<@DLU\jǼȡrM230/0,%""%'5Lc|зueh}voli_VPKFEFHILNQUVWWUSQQRPOOKKMORTVWXYZ]\ZXYWURPPOMKHGEDA@>=|{{{~eB07`ŹY53BUvǮuP}и}af[SQB&!''#!#)027<@BEEFCKPKORKLD *8@BCFHHJMNTPB9,"%/>MQLB;>IMH5*!$2:5,  + + + %&)/69:=AGNSW^ksurx~~~}iL,$3=BDH>7?AGMQNF?9963-,.110)$ #%%&&$!&.>JG4"""5=Epؿ͌uojdep|¿lQBETh{׿}jVKUZJMLMMIHFGKLONOOQUVTq֯~M61/:CEA:/(#$"#" !$#/Sq|vlH8+#$$'$8J_kkjlqxuxyjae_WOD2 &294* 3FMIFG`ncaf\Q9)!).>P[VQTTQPU`dfbYRSPOU`rԝ̺ͧt]ffmpo§xdSJCA>5(#'#''),//0/.037;7, "(&7k}bRMP^he^___ZYX[dow|zseD/+9B6" 5L[aehd[QMQMA4+)CoƿܽpZB=Ln¶jsPNHkĪtK?>IOC3*08JQP`w~vk\QPTWXZawƼïY3261-'$!$)0?Vmðtmz{tob\TPMMOPSVY[]^___]\Z[[\ZXXXZ]abbadehgebc`]ZXXWUTRQOMKIHG~yvuyzszu[9-9cvvodcQMZwʹؽhaqY[QNOB* **%"$,-4;?@@DFIFNQHHNNNJ&  &4>B@CGGKLOSP@4*#"(/?ORJ?7?KPI1(!$060(! #),28;8BEGJMWdqwzvllt{|sv{vgW=" 0=CCE;4>?HNRPIA::71*(*/23+% !"%&'('%# %)7EE3)(,-/*5:Cnһ̀eoofjs|pYMNYivũvbSYZLOOPMHFDDJKMMMMQTa]޹V?4JLE8+#$& 4Q`il]E,!(-3G`lkims}vu}tgaec^UH;1+'3@HGDCB: &,7GG@c|ldgVJ,!09DSZTPUVOYX]ddZNGJPWXW^rʰȤyҰwn]OGE>6-,!% $/,*('(*/10.& !+/$.fȿmUHIPameWJGJLPT\`fc`SB12)-?RR?(%:GMOQQLFHI>1"1W{þƿϨ_E9>Vm{sc{ł[F6dʯaI;BKIMX[Za]Vg|ȿj?<71)$ $*;Kawʽ}uf`ZUSTVZ_bbdfffgefedfeeddaccikklklopomkifb`]^\[YYWWTSPPN~{tsrtuuuskaO<5Day~hM<8950Ls«wågkոuYUTN@/$'*$$125;?@BEDFEHIKMNRQF* #-9?ADIJKMMPK=1#" "+9FNNIA94+''-11.*%##%%$$&&%#!%)29=80)3389,*Oxɼzbchlr{~{zujXMVjq߿paZZURNMJIIFBFCLTTXXOel_HNRF/%')$ "'7QcbK1"&&,>Whnoopsv{~{shacddb]WROOI@Eaz{o`O?/'6>@KSUPKMSTX]cbS@88BHNQPRY_tݼֿm`VKHIIE:.$ '*-+)*--001,# -+!1Zs[PHDKXelaL<=@>BKQNKB:.'!!1HV_aS>-!!)4?DDBCC;0' ((GXs˽ŷýմ\C<@DLU[YW]l{ć`E2eǯeG@Phzxt}wtqon{y?B74*%.DZs¹{sicaaabdjmmppqrpopopqpqprqrrttuwwxxyzxvsjhhddaa_^[[XWTTQ|wtrqpqssrpeWA-*;VjqR,0BGzòuprˮ[ھziXLA-$"$)"#/25;?BBDECCFHHJLPPG,"-9@ACGIJKJLG8-##!#.:GNMG?;@FMH4%#&513*! + (-0101..4;FMQSLRVZ]c`X[[ajqsmgUE93&   *3:>@>95>FJOSNC;>:4,''*030.)'&%%$%%%&# "&,153/+64:9++Tܵw^ahnx~zwv~vn`RYgluǣwf]_bYRONMJHCEBMVUTRO\wⶆbL@41.& !"! !" &@SWL?-! *;Tgprpptw{|yrlida`bhqw{k`K5+,--& $ #2=Dc|}p`O;0&(6DJJNRTQORXY\\]UC0('9?HMMLPTXcklsȮywŴ˺{\S\]WUNFCA?80& '*+)((+-.0-(  /Vm`UF6227BS^feSB:;<511.-,&$&,/>L[aglbS:,$+-.02/' %$9B[ƹ¹ٴbKCCP^e^[pđpS=gĬyad{rqwni|vmfbeggdsu=;83(".?;3*%%(-642/+*('%$$#$!!!$)-,,2396',_Ķ˥q]`go{|xusryxvkZ[ehaͬp]`kbXQOPMJEBBMWWRRYoƽлݨuT=-/2&  !&! '6BIO@+%4Mdqtplqw|{wstwrka]alx~mT>787+3AJB307EMh}wi]N;65;HRXVORSPTZ^\XSOD2 (2>GHIKNMKKIKSg|w]SVxε[HDIJMPHD@:4.% "),+*()-//.*'  /K_u{eVPE2!5LY_ZE8575)%3EO^glhgjg`UG3$##**?Ŀźģldi~ƣȼ}fSFq໦r~¾wnpsroxvrkd^[Zloux||xokd``fif`s{D520(!"+8EXlǾ̽Ƚvpmppqu{~~snmkigedaa_][YXWzuqpifecb_[YI>.&.Ej|uiXam`OϹpZq]S0!,%! "##$%15=ACDFD@>@BDEGLKD/ # *7;;;@>BA>=8* !")3=FID?9@:1)'$   #*3:?@98-  + #$$!/cµŶë՝aPp_KESִzpƾfK<9{uf: ,* #&$!04>BDDFD?DFA;9?GKG<("&% ,966.(# + &'&%# '++)-+1>A6.,*)*+)% '( %.4<@97;FINQLE=A=5,$!%*8:973/-)%#" $"*oǵҫqgfjqz}wsomlkquzo]ZbaOȾcZcg_WTSPKFCILV[QZʳ˙\WD( + #7LLC6&*?Vimf^clvunkov|jUHIPh||tke^WRPW_unYJ>;:;AKRWYTVZ]bf_T>5.(!!,7AGLPRIB?6+*5A3#%?UhsbUMJQLMJDLQFC:3(#"'-/.-,.//..,$ +#&#"D`}Z7" +$0652&,8IT\bhkprqmhhjlni_P?- +""%+Fx¶˿ڠZ=RqmN9Blư}rpnnbd|μiZNKFBADKO[Z\_dglnjmpibbhpb?-/3148@MewIJŸwroruvz}snljgecb`_][YWVUlljhgccb_\WRPJFD=6+4Sflstphca`VUTLOY]xɠ`5A{P7SyA --!$*&/6>BFGHC=;=>ABFJLC-!(&!)2646868750+!#.8?CB>:7-$ #'7;;:93.,'$")vŹΜwtjhls|{urmkjjoqwpa^dbR¹ufcfb^YVQMJJPMRYPaϻocUI5  #!   $4EHIG9($.AUegaZ`hongcgl~v^JDEN_q~tWGGOUWU_ynTC688:>GOVX\^aac`VL6.&# !(/9?FIJGEB>40/7*1Ph{ubUOIIJGAED?CF=<7.& $(-//.../1/.)!&& '^ɶX7( + #%#((0?HXfmljgefijlmnojkh]N>.   (',[÷¼ž~UOW__TB8Pɷo[RKEIWv̾}kYKB;8_\Z]`dnvosrh]buro{jI531,.9G[o´Ƹ~xppqux{|sllhgbb__\]YYUUSUSRQQPQQPKIED?<<7.# #=VY]_^XRKOPJFGHVn{R^|ǖX6PæH$41!$.(/6>CGGGC<:<<>AFIOE.#*)"$)02-03032/,%%0:??>:<@EIF>3'%,,%/:72,)&   +  + +  15,#%+4:86BJLPRME=C?7.$ &4:<<<61-(%")yĿȎkrnmpw~{uqmjiikowujfjbYȽyjddd_YSPOPUMP[Vq_Mla   '2=GQ_mssq]C;FX`aagxyaJB:ACGJMSZ\ab`[XRIA1*$$$$+28=?BEGDFC<3! +F_pyaJDHHHFKBEHA>=53.(""),010/11230-# +6va8 "!.:>GLU`joni`^bgkklkeii_RF8,  ($MƼ½½֪`OGA>DNn¤ymQ>3+)>Xtò~vle_XTSVZhu|i]fxmL52.(.=Mc}÷Ƿ}vporuw{{sonjhedb`_^[ZWWU<:9:9:;;B@>;:834% + 8MHCEIIF=CC89JLSobTpG^ײI%92#&0*-4>CEEE@:89:<>CGOF/&.-##$&(-.+.1-01.(#'3C?8.' !%27;<:40+&$!+{cqvrt||uqmlihmoyzomja^Ⱥrdfhd^VRSRWOQb`y]<:&&%" +)2837DD;3?N\eec`\`degp|}xm^K;0(((*4=>8E=8@SflhurulO>>?PSUUUW\_``\PIC;4," "#%.69;=DGCEHB4&''"(+?Zixyx]C?GLJIE:?ID=<6,)%! $)-033221342/.!  ?{e>  "'1ADC<42268;BHNI1$*+'***()),/2-+*(' )47;??9<;=C?5+$ *0))3:92-)'  + + + + + -1+%#%()(%!.CNQQQMICAB>5,"!"+14764/+% BԷv]wsw{tpmlmnotrstg[bhǼnefjid\VT]UUZg{ûƫwK-"  + ")0622;>9BIT\ceea^[]_^`fn}v`E-#+=Qbnk`eeaTD=AH\\]]]]^]`ZRF<50,%!"" + (/7N^_^c_UJDA><:>>@AB?98/%!  %'.1223472/375.&  "$*LTP?1*#  (0679AHKJLOPRYdjfggeeda][\\WL=.%  +#GĹ˶ϪpVC63(5QjuqWGMjȽ^A!%.8AHRhľμwnjlpqqy}~~xwqokkijfgdeb ""!&*.-00)  ,=DE?=@@9>CF:BRh{RqÜʵ|d•c9+0.#&./&""-3:;?C@9212469AFOG2#(*)/2/,((*+*,+,)( *58=A?9:8>@@=90,%#!!"'+034456941364-% #(&-'!!" %3;@?=BFGKNQSSYagdb`_`_\YZYUND7,'$    +?¿ŽŧbU6*'*">XeZG.%.bù]<%$,9FOTcλvojmonpx{|~zvsqonmkjigg"&&(& -7=DC?=BG=8;EEZ]=ƥ͛g`ӭtK2,.-'.3+#-37:<@>9212469AFMF0 #%(132/-.-01+)+,( -8=@A>8:0$&,1**3982,)*       + "-98-$&'%%$# *?HHGGB>;886/(! &-034/)%$ (!":wƾԹjsx{{ytuustvtjnvl[ZsƽϺthgnk_Z^ibUUuͨsH"  /798.*/33;DNUW[ce^YY[\[agwzulcRD2% +69Ts~wneaYNB89?EKIKLNOOOGDA<9542+)'$" +3BDGHHFEEH>642,$">MI>ADADRVRH>7337766421/($  !&*.12234630131)$ "$! !  %09AGFCFFENRUWWZ_bfa^_ab`]YVQIA81/+*(#  + 5yƽþϿ`B79$ AXV:"$8wɿȿF''$)7JVXasɸysnpqruz}|xusppnmkihg ! "#  +59@C?9>G=54HHlhPXˣ޴~kŒ]B1)+.-56)&-3779><7332469>CLF. "'26530./02...*& $0:@A>:7:64342,&"&-0320*($ &"VȺαvxuz}zxvssphkuiWVwǼǽj`mth_`q`Ugޯi4&5% + 05670-0336BOUUW_b[VWZ[[]dfmpkjid`SG923;GT[qvmfXOD969;?9:;=?@ABB@><99880-)'%! +&/NMBEEAHRXTH<4155201.++-*! !#'*/2333463222.& #&  + )58AHIGIHGQVYZYXZ\_[Z_bb``WUPJD=8711/-&  -]u|~þ¿ľgF- $-! $'!8I?!;U}Ͳǵx=(!#(4JX^hny°|wrssux~zwusrpnljhg!""! + );8:<:348;86IY:WË|Ņ_{֡dG?.(03188()-2557;:6555468=<:99782/+(&#   "+26=@CBBBDB<70*-29GH@DB>FRWPD6/145114/*-10"  "$(+02333454331,$ $) +  *5:DKLKLKIQUYYUSTVSQU\_[Z\VURMG?86252/*#  );Ub[R\Ǹʽǻs[=*" &,*))( &/@9$%5GYh|ŮοĨj5&'2GZitoruµ~zwvwyz}yvurqoljged"&$" '779;?@A?9>?Swr2cϣj^س{A5;/*64287,&-1546986665668;?EE4" -354348:;E=3'-4:A@;:::86. $*--%$,.(*)*)  +')' +  +-400+!***))('')+,+-,.0)*)(&$"!&+--./,,&" !$"*ֿҲriXX]bc]PB;:Qn~qcj~|xuvuvyiUUoȹggtzpfj_tѼ̀="&' (/1043/,./;HV__]^^a[Z]XPGEEEDA=93-5/.8DMSWep|}zmZH?:7221/-0//24578;:97766630-*(%# &-3;ADDEGCD@8,%*5:FEADB:BMPI;2.011-/2-%&,/! !!$&),13333454430*! &' ,)  )4EMRPLIGDKMNLGEGJIKT^[ROTLLKHB92/330.+$  $)>F=28hƲoT?1$ %&*,32/-(&,5:IMKT[_djq{նùɷX%'2Ibr~tqq¼ž~|xx{}{ywtsqnkhed"##"  + (17:9?GIE>ELb`Jz֣_SjɸzW54C<481-393% .12237658876679=DG:)$*-0027?<=@<7.$!+**"!)+%$$&& ')(   "/540,# +,+,-,)&%#"#&)+/4%&'())&$&(((*)+,&#-ǥ~qc@BBED@6+%!T­}w}yzvz~lSNf̽ǿudittn^jz.'(&#)+,*-.+*.2?HS[][[YYVV[WL@<:832/+%" %-29?QZdfaZNC@=;73210+++../1279766554421/,)&!*07>AABEBB=6)")4>GDBFB8=DF?73223/),.(!"#%'+/111122332.& '&)/& )4ELNIA><7:;84//26;BPZQ@;A678751,,21.*)&#" +(.,%!'M|gR@)').338;CBAACCJOS`gmxxw}~zvne\UU`{øO#)8So{~ton~ſ~{y~~|zwvspmigf! + + )1=?54;;6CHVo]U`Ȱ{.Fht^IB7=NK<3/(098).12137658:96677;CF<-$)/20,./02.+(#)-2:<;>D@5*)*(&)! #" %''  +   "%1684.# +,.0./)(#!!#(,04 $$'*)(%'&%%$'*,&#"&6Ǿȼ|vc7877752,)TþǧkiԡV:5>HMTbwzsxqRGbϽrWYp~~h˴Z2% + ! %$'))+2;HMT[^^\\]YZZTB3*,&" "$%/:?FIGBBB@<982.-./-,,,..016878767653311-'!"'0598982)$,5=B@@FB69?@<:99862.02)  #%(+/211122342-%" +' #*4_{|snm|Ƚ}}~}yxurnkhg  + +  + !)3;>621+&CCsQ[ŗU16czhC& =]kbQE;/.7:4%.//23447;:886678CDA6)!$042-("!*01.,/9@:3' *%"$'%  "%($  #$!!  +37785) +)0410+)"! #*/28'$%+.*),&&''&'')%#!%%Nɾʰm6*(;D867'LFJ}nH! #B_qwib_dowsoroot|ztcncnxgWK\yžżnSaqwº÷ЖG  .20/49MRW[[[\\``ZWU>%"&(31//149964420.+)*(()*+.15656656854521-*'"! "*1540/>=94,&.5C@@G>/.1:BCA=742/,,*%" "'+///01223542-' $ -94)./320/4@8>yíl`l@235482'!(./145669@@:86445?EE<+#2884.($  #%&)+-/*!"$ %&(%  !!"!#! '022335* ,3862/+$ #'+050.-,-)))$$%$#$&((&# 9}Ƚñ}hLFQWG0!"1/0252./ %1#     + 38FGAPUV{k`kŽƿk+)5 $39/.011?NWZ_aa_``]\WSO6!" &./1//-+)*))''(),/0565465669886520.(%! )07?HNRME8&#.;GD=;2.7<>?ACC@=6,""&'#"(+..//012232.)"! 4>3#/57:9606>FIIFEC=1&*ETM9  3>LVUF?3,,.01,% Põyohd^WTSPZm}z{Q97;<=Qby}|}}{utvy|~}xsyѰhٷǾg=1+,()2Hd|}yvzĹ~|xuqom]WLKJ1 +  *;428;67@7,WzjS_xºd;*%5582$#/./14577;CA=97424;DG?-!.5752.*) "%(+)& !"%"$(&"#$&$"  )21..14, -49620+&! "%)+021.+(&$%#$%$##%()'%"Kúzuiekl[=###+-#! !  %((0-2R]QʾydqŷٖovW1,GMA9=O`heZ]`baabb__YUQ8%/4/+-+))))('((*-0255546577:998533/*& $(-026=CGEC<+ $/7GG<51=UYPFADJMPA4%"&  ! %*-//01123331,&!"!:B1 %3T^nqjeOJS]jz~sQ4(%3373%"..025699=CC?:75337BFA2#)032/+&% !%$"!(($!&! %&% #()$ +0,&*/2+07;841,%" !#%-0-'#" "$$$""$')((%"^ɺĹsnrz||wjN/     6G>'&()'(,5;*%&S^PͿuĵ½ºƝxWA+(>LIC=Iss\_bca_``^^XTR;! + + )38/+-**)(('&')*-025766667777875321+&"#'*.1798;?>4*,48@>;HUi|rcRJFJJ>6)!#'  #!"',./00123331/)# &>A. (8BDE@;42320258<81((I^ZE)%! +426:5-)%#(/498.  +  ?bwqeULEEGO]ixolllhdhlsx}f8!+029Noztqkhhow}}|{~}|zxutrqpqqrryxxy|wt{{ymhv…lDZsA534.4>Ql{xyyuȷC'  +!/65676237?>ED<=HMRIKUX\VGSLOOKUdfztm]D.,21052&!+.0278;;>DB>:86235>DB8($,.,&   + +%/1.(!&" ""%)#!#$#""#" $,)  +1*"'-2-17<841.&!'++$ $$#""$&(((&$!$sldhwuq]>,   #& *ZlW*  &4552-17;4# "WaVͺþĻĿ־Ȯo^S@@Ic^_bca_``]\VTUA+%  + +  !)251.-,*)((&'()-/136666668877986332-($""#! #-4;A@9017E@8DhnTC;;;>8-(& #!$),.//011233/,& &=9& .>HHF=5(%#""&-38862+'&&/Na\H-"+%"(*! "%.5;=4$ + + ,Gaqwqgplpywib[XXZZYafmsw{~c9 .534@]}xqhc`^`cqy~yvx|}}~~}{yvvsrqsuwy{zzxyxwvportkagwwocaĕ`ZӶs?7234=IYl}|w}zyأhN4   +"04323:=918GD9/%0=RFGPQPG9B9>D>@GIUQRPC3390-0/'!&.047:==@BC>:97423;AC?0(*'!  $'/:A?70!%*&!#%  %*)! "$&''$##('#%+% ,2) $+2. 28<963.%(*$##"!!#%''('%"$>ĽqfaoqvnR= ('   >O:(-2)!.YI %08EA;3*'&&) %_h`ξ¼Ͷtt{_bcda_``[ZUTXH73# + +'-1241/-+)('((**/03488888888888762321-)&(&"+AUdiaUK@8/06GIFNmz]KINakiR:(!  %),--../0111,(" %:2  %5FNJD9.#.1343100;VfaO7.71,-(%-5;?8*  &'*3AHRTh|qg[VPLKNRT[`fkpruwwzyxww|za;$".60-5Nkuuqi`VMMSY`oqtrppsvxyzzzxuronnnqswywvwtpkgb]ioeWVcp|q_RQ[|ۿ}Ykȹ~m?;99>KV`jrv||w~{z潐yN)  "153/0=E9(%<5-3.3@R@?FA@EGA9?OKFJLRF>CE<762-.-& &.047:=>@CB=:96445:?C@2##    $%',/5)(!&,(!$%"!'-," !$&''$"%*)$&)" +.3) #*2.!08;941,%%'#!! #%&&((&#!2Uʺľwkanpz|bM*JXflmnou~y|}|˹= $$$48215414>8648AHD>88>CFFJFDEB:30,*+-' #,,-059;>?DC>952110/7CE4 +!4ILFFHJKLPUZZTL;."&/+%&($",2.& $%!#'+,( +  47)!)4/,7<;4.( !### !#!*(('&$!7qϯ¼eXXZbntvqmi3*4O]QFELD<)'woR6'}v&&9HMSWNH<-!  + 0`ouƽwje__aghfc_[WWYXQL82("!!%)('(-46421.141)$%"!%),.27:9;;;:89:<<98633280))-*" HjɼwZI;03AHZc]^qgagtf+#$  &*,-/.-+--..-)&!!%:) (2?DA;2,()(",47CB>;7566128BD3 'HYjrojc^TX]aa]XTK@2% '-,#%(+( '++(#! $%")++(  +   #84#+4.-5=:3-&!"$!"#"((**'$!DǠ~yr^RQXdkppqrH;9DRUW\_P@#"'DzI% :r1.3FW]`_Q?2$ '@goxŻzmgbaadgige`\[[XRK@91-..-)"#$(/00-36972/01451($%%!"&+-28;;=>>::9;;:87442373,+,+%"5qϹtVLA58IRZ^dug^]uw;!),%"&)+.0/.,../.,("$##1- + ,5>A>977?=8,%%''.9ACDFD?JYigP938>?=6(!!',/,-173,(j{xw|wsonotvznegd`ZTRW]^]^]ZUSQNNRV\bhlhQ:3:@A?>8009BIBDAAADHOT\^]ZYZ]]\]`beefd^\\[]^]Y[ZYTQMJIFCDGOMIDBDHHE@99,\˪tPNivtRMTxmJIVYkyvonkj~|z~ՓN &&%$0;565424:=<:;>>;717>A?==>B=:<:9:;359CE7# 9R]bddehhecgjg^TMIRMF<0(%&'$'.0+%$'+.,%$()'#('&()'10+! $#!*;.#-3+.6<94.'""&&#"%$#$(.-(#VؾmW\afloty`O@8@MX^\O=!&=KgG2]vC24AT]^XD/# 6Wmkxƾļxojgeedeimkd`]\XQJ>952220.)+.17863>??90,03641*'()'"#%*,18;;<>>;::;88664434872+.2,!+OĺoTNF79NXWVhv_SPqqB%$+&!#')+-00/.///.,'"$%%.#09?>;:AHNKB5./116@HHEDDDScpm\J;1=@CA9423::=?>65771'(<^lz{vw~wnfaa`ca^\]`dgmkgegkpqmgaZWYZ]\YWUURLEEGMRW\_dS@--:DGFHB:.-2;;;:;<>?DGOQROKLQUWWWVY\_^ZVVUWXWTSPNLHEB@<889??=9:;;:83/0 /YɛaA>diSVjxoSQ^`krspw~}}|}~~zzx~|y{yttvuww{}~}|~l$ '('#.;9864348;998:98568<>?=<:>=>@EGGFGGGD:0/3532*%"*0012388:;@@<<:::<349BG>*'6KZ]]^Y\`cbba_[SJB8.*KYm_4QU/+:UbaQ9   Gjlezþvnlkjfeelqlfa]\WPH<7300/,()),/3676BED<0,1720/,*))'''))*/599;=>;;::645344456=8/065-ErrPNF7:M[W\w{dVNUwiD,#)'! &)+,-.10/0//-*& #"#02& 2:@?;=ITSPI>9:;:>EKIEELRbowrh\H5AFKMIHIKOOPQK?:991#$=OBLW[WX_chdXNOTUPOJGACELORNIHN[ire]UQRSUSOONLJEC>>CLRUVUYL;*(4?HHIE:, '3;7789:<=AEHKGBBHNTRNNPRWYSOOMONNLJGFC@:9551/.331/220.,+(*//^\9WuqcerrYWabejnu{vuvy|¾{|yyxwz{}|yy{|zy~|zyyy|}ȅ4$)*)",::9866779785756398;;=;;8<;=@CEDCEDC@6--2663)$"*/123488::??<;8789127@GC0# +  0GRTOIDNZefc^UM:657;:5.3;JURE>>A;3//1-%,/11,$!+, #0421/-(#)//*%",5 &,0*.7=93-&  #"!"! &//*#! !%!&OἯ}uqpvz}~ud\WI7+'!!>FU\rb(&?fwsY: + + Rqgfѽžtmlmmhffntoha^\XQJ@:50.*(#$$&(*/36CEC<3/49.-//-)&#++***,147:<=:::9534233348@>3.165oīqPJE<=NQYlsfYKLioK1 0-+&!'-..,,10/0/.+($ !"3A?' 1:A@>@LW\\YTRSQLNPQOKOZfltxsmgUAMQUVSRUXXWWUM>74:1&#0AG27>BBBHMHB86CRSLD<5+*+267;BJRY]]VOHFIJJHCFHB;4556>IPOKEGN<+%+5?CC@6$#2;679::9:<>@C@>=DIQNJHHLQRLHGEFDFC@?=;833/0,'%))))**(&##"%.#=eSMTzsms|p\Zccjpv~|}{|vqlkks{¹xtrsttvwwxzzzx{z|~ٝM&,+(",8::87897;:97665589:::::89;>ACDDDIEA<4+*.675)#"*,112388::>=;;8778347>GD4% + +,KW`aYRLFNUZXSKC;/,-5=?5*)$*6<;=AB<3-.0/*-012.& *, "/552,&   .21*%"+/ $),)!.6<92,%   #  &-/+&#!'&1o߻oiqŻ}toouyzymZC=5*!23CtĠh"9bwmO/  + +]s`pͺؾſulkjlifhotqjdaa^YSG@80,'"!!"$).6?8.)+.8@IJE;52D;1,,.7<=6- %5=6665556889;99:@CKHCA@DHIDA>;;<;988742/-+)$" ""#$$"!#* &=gZDkyvukZ\edlu}yvrory~~ži5).-)",6:;87:<9;:9644455798779;::=?ABCDF@:61*),475)#"))002389;;==;:89:::9:?GF4$8MnndSFISXYTKA>A?:@CJTZTG:'%)0784.(+24/02451*!!)-"".440% "'01.'! #)*!'+)"-596/)"  $#" %*-,)%"'$Huacwþ}xpklrww|vhcYTEGIARfl5#)CMG1 + 1hq[}ͺǰ½xnhgihhhmpogcacb]XLC90*%  #',08@FLE<76;@C;66:5.(*)+..-,,-14787767331101/29@EC40FdʷeNHNPLIGdl^QI?J|qgaQA>6,%#" #*)*-/---.//.0.+'#"$  )122.,)38;<=AJQ`befjlhaVMD>738@MNSXUMFE@EJLIEB@?=:6442.**+/@DGA4%25:=:68<91&+6953310./1223246:;A>:879=?=9534221421/-,*)$" !#"! !  !%0.$*AsxWgvmaX_llnz|xwwyz}|z»yC/.,("-4:;87;>:::86323547:9669=9<>@ABDEB;431--/376)#"('/01389;;;;;;9:;>@@=@GG3!5SgkldOCGQVIA73690$%0APUL<1. + &*-,.*$(39643675,$!).%"-34- !'(01-%  '** !%)(!,585.("!#%"%)+-+'"%!"_Š|i_n¹xwsmiint||wzttk\mp{qZ5"$'"  $>opWϾɽ½ɼ{nfeeggjmokc^_bb^ZTJ@5/+&#$)05:?GLQH;36>DHC><=:1/0)*./....03666455311000.15:FJ>9XȫyeRLTZOCPn}ifUROZzfae\N@0.)(# ,442/-,.0//./-*%! &"$0=<715888;@IO^_abgjf_SG<4* !**2<8-)/#',05?LUURQNF82150*)37) &' *$,346:?DIJLLOQPKFCGGE@>7530-))-357@C@3# #1CMKB?A:1#"-6632.,++-/1-,,/366;8311468961--.-,00/..-+)%$#""$$$##$$$$&(081/44Ojgvte[Wdruy~~{wupqtzПL262+#,59<::ADFGFFF<30.,.1851)$!'+112378;;98:9;<>BAIJGDC6$0KX[TUY[WNE:- 9A.&6=@=3+,% !$#',*)(*2;=859;862()/,'&*-,% + (.)--)#  +",. ,/-(+8;3+*$ $%'&$'12(!#!Hʪ}nioļ¿~~|wqmmptw|pU.  5VjbiŽ̺÷fX]bbacgec^[\]^]^UNF=730/245;EPPKOG>98CFT\`\\_XKC<1&   %)0>KADJHA621+),'!(2+$(1892& ",;GP[elnpnlihfeefeaYNIGGE@<654/..28>BCA7,!-FVWMHIE6%-3//.,++(('%%'')*-.1/*)),/11/.--,--/-..-...*(((''&%&''()*+.9X_Wt[U_jsz~~{|yvpqvګZ350)"+59<::;:87666677899::<>DEHGHEG;401.13851)$!'+112378;;89::;;>CCJKEED7(&:GPUURPLHFA;(+:3%%5EJF>4,/0598.&!$')*3<>8:<=;85-"(.,''+-)  +,%'(% !+--0.*09<2)'! "!'$ %.0'"#+jˬxhk{Ķ~twvoppuw|~~wlZOGB;6:8+-C]ham˰ǿƋfTY^__afec^[Z\]]\XSJC<865<;9;61.--,+.2464556111/011458@C9<@>81022+)!*<:%,5<@@>=<<@FNPZcmnpqruz|{qcTI?=;85478;==@BCBA6.$ ++?LMGIMJ>+%/0,,*))&&%&$%&&&'(*'&#$&)++,--/01/01100110,,+*)(''(()+,-.09;DJC59CmɸoUoWR\ivyrqqqtzo)%261)!*48<:=<:988899::;<==?AFGKIJGG;415366741($!'+112378;9789:::=AEKJEDC:/%'0>IKEACCCB@;3,!#.3/(#0=>?<;82*%,+'(,-& + %,)    *+ + 15/(3:<1("" #'!#*,&#$?ƫypfqzxzvmllqsx|}|v|wmgbZE07G[hf^sѭ¾°̎eOTYYZ]cb`\XWZ[[Z[VOIC?>=CGIKMQLE=;==>BN\vjB;DB:?>;6.++-035745462220101548?A9Hȷ~m[VUXXSPLt|y]LGaomkaP>751(&%'(/87652//.0121/-+"  "'"&.>HB.)/*06;=<:8:DKIGD9,+06:;9885564,)0:++.0,(*0.23.*(-15/+#,=?,28:;>EKOLKLMKQYcbaaelw}wcQE<:7679>AEGGGFA:7*""+9AB>ENNC-'-(%$##"!!%##!"!! !#$%'*-001111101233/.+)((&&'()+-//19:AJI>88UΌd}hSPYhwzslmmsɁ8-25/' *48;:>;;9:8;9<;>=@@CEHJLJJHF;43879:941($"(,112378;9879::;?BHKIECA:2/.3FUSC1$,3<<3&1B<,#&++.0/7EQVUQMF7%#,9DD=<<<::;5.!#**&(++$#$&(#"**#47.%-472(" ""%'&(#!"')%$%#Vٺypkkvxmu~qhegknru{wvy{nvtd[TTSN`nod[yɭſ¸ЏdKNVVX\cc`\YWZ[[Z^[UNIEDEGKMNOPI@8:=AADLWmgSG>47<5FįsfUPSVTNSZ{ruU8IqytmaPB:?BUfy}xgR>001/0//1242.*'  "&!#/6CI?)'0,168/,& #,7??@@BCEGKKNKKHG:55<;=<830($"(,112378;9679::;ADILHEA=9456:EPNA1"%+352,&0?I:$'3,'!-@MQPOKF:(#-7>;178866961'"**''))$$&&$$$ %+)$63&$,32*# %*+++)'%&&&&&7uүujfnxwn~ynfeinrqttvx|}}xphmxukms{xrl`pxrf_żЍaILTTW\bc_[XWYZYY^\XQKGFIHNQPOOF?787)*2357<@<3+-154221/;FTZXSSTXWVWZ__]TPNLA1$&,,! ,295=?76:6,383)"%*0049:658:98446;>GILOLHC?989>BC@@@=830+%&(%#*8BD=<>>3$#$ !  #$%&&+,.+,)+)*+,*--,*'%"#%%#"$$&&()05;=<<<<=>?ABDDIJLNNMKJG<47=?>;830($")-112378;9557::=AEJJHE@<963:A;5578:61/28=@@<5)"%.196.,4>DDACGNI8&%*.266.!111/1763+"!)+()'&$##%')(&$$#"#!!"'+% '5,!#)12+" "+//110+(&''& QѬsjdouuqù~ulgiltvuttsttyz{y}yqkq|nnihlyzvmaWfruoji͛ƼɇaHKRSV[bca]ZYZ[[Z_^[TMHGILRVSQNGA75:DJLKOYeaE410/-+'#!,01200010101123474699Nɻ}poaJIKIJWspnjWMHyxiaidK8CiqQIm{R015552//252*" +   +/7:40/57<:8:>:0''(+*)+/3DOYYPIHLOIA?CKLHGFHNI;+""+,,2>8@F@@GCBILC1%'" $&'(''()+,/258877:9?@BDEFGLMOPPOMKI>69@B@=730(%")-112378;9346:;>BGGHHGD?=;9=;-$'2:GDA=>ABA:/)())+*79812:CGFAAGJA6/;>@@>:/!+++*.698/%!),**%#$(*++'%%'(&$"%()'%# +&' +.8-!-16-032(!%%  +157;:2+'))' iӱwmejq{¶slecfkrtstvuvsvu|v{yw|z{z}~oZcdfgkuvqjb_hoolquܺǮƿ^GJQQRYabb^[Z[\\\^_^WMGHJPTWSNJD?3/3BQWVVX^hQ@/&#$!)./0///1/0/102143-0;E[ȶ}y\DFD>Ec}nng?JhxpiZWNISgx}pR;A`wr`65765201241(  -@E6277:7-##$&&$&,3CKQJ<35:DC?:794+/19FG;* '*,0;5AJGFKKMTWN:!  "%&$$$&&"%)-132253139950*&!!$4AA9532.*,/)! !! #%%%%%$$#! !&#)10($&@hiBG?BRgqrtztM071($28<<=ADCCB@?>=====?@BDEFJLNONMJIH<48?@>:720(%")-112378;93389;?CHEGHLGCABJB4'&/:9>DNSQH8.(*3;5'"&$+,%#.DOZH74:?CDJLMLKE9*((((.8<<3' ()('" "(,.+%%)05521132.)# !# +%8?1!,2,0BT]\[_`~ǭ~eC2/2/-,/222133//.00/110).?Ogʲ]FKE7Bjq{opc*A}skl_G4Drd3<]lPD53431235140'  +/JS?8GRNH>6454+!##&'%%+4:@C9(")HQWRI@2"*8>1#*+133APLGHE@IPM@,!%%(/-//,,+./(*059998)%!"'('$"!'9>:4354/..,&%$#!! "#%$""##"!$"" /5-##-Nd0C;@Vnwtt{|ʝe460)!/6==?ACBBA?=;:99:=ACCDHLJJKLLHB=:649@C>750.)'%*,001289<:779;=??ADGKLLHCDE>0$,;?5+H^njdhqqspmfb`djkmqu~ǣ֬{VJMSVST[afda^[[^`c^THBBHQW\[UQMIC1.3BYdcafei£_@8;504::756973-&)252:5:6MðjNUSBJyzr`LAzum_YDNm|P=Y{nN5+-154230.++(  .?@AEGJKGD?@=9-%.?B:0%".75*!"(%!+44!$*%#)262*//-*((.384+"$&*04-78FMY]]WRPKE525CYgjikk\kܽbI;&87656:@A><5,+..,9:>7U|eWYTIWoP>/StogYQUy]NQ_rybI6.,.24420-*(% + !0?GNQOK=71/1.)!! $(,+1/-+6J]g|R4,%#((&#'& )+%.5>CGHA7+(%&)-//('&(,/0265223653..137650-'#!$$"! "#'*,+&!"$   #&(*+,,,--+**,,,*)**))&&&%%%##"! "#%$!!$' #&'"!)IxV)8AMXgswt{zzy~گs>6/, .5=>@BDBB?>=;:98>ADFGHJLJJJKKGB>6449?A=82/.('%*,001289<:86;;>?@AFHIG@:5643.+5BD<871(%'))'-0(%% !##%)"**%1.-(#$),41+ %'/7<1:CMVZ]^ZOB<:88,-- ,BHjTGfxwG862'"(,,(#"%)*#!! 'I٫{nnjfkɳuroijpkhltz~}}}~}gMDC?Xm}tmhche^XSSW]ly˳¿­ʒbWLOSVUX]adcb^ZVSRPJB:71" *07<;99>@CFHIJKLKKKKHC?656:?@<81/-('%*,001289<:78;=>?@BHIGB70,+1578>B=31'$--/,"!)' )/0&"+!&)'-,+($$+.0("$ .=C6=N_head`TL;?FA6' 4.#98>K]hjimwPH´wPNKGA:5047<=62027@A:r{kZMD>Ipr]),|t[Lj`U\gsydNA=;92-/5751.("  +7FNI@6.*'**( "#"$&$'   &,/#$$$((%*07?FC7.(#&18IPY\WK@;3.#)(+.21/,$! "'(*+/157:;:830.-./.020.-....-)(',*++**)(&&))))*)(&&'((,-*)('&%$#%&'%#!!"!!# "#"! !"'')-/2589>JKHMG:43;ISbmu}z|ڪk65/, -5>@BDEBA???><;9>@CGJLLLLKKKJGC@778@ABIIF>2'#$/7?DE?2'%%.+,(##()%-/.%#982'$.0' (-.,-+)''-0.#!&'+CMAJWitpklj`\KJQND5#$/70+DoyusuL?<9(!%*-,("!&.3321+AdϣtmnqxŹmehlljnu|scZ]anu{xrnkkhd^XUX`goztƸÿȂHKXTPPUY^b]ZWTQLE@><9:BJV\WVPHDDA979CSelliq}XO̫x[E::867=FJIǠyjZJ=>VdQ)8p_\pNIh~wiUC89<<2-.3531/'  '7CD=4,)'((%!!""$&#+#'(('&')(" ")041+(-14;DP[aceikiaUOHC9.*((&,*),..,* $)+/1578:;===:8654553469;:99530.*..,+*)(&&&()(%&'%"""$&*+**)(('&&&''&#"#%% #&&&*('&%"#%),269>ADILXVHA71838BJQYdot٦i74/,!,4>ACEFCA?@@?><:?@DIOQPOLKJIIGC@89;>?=94/-+'&%*-001289<:87:=>BCCIIE;-# *3?FC7'! %'&-66/0253)!#(@:/!)15-$#*03.11/+(,-/&%-.+HWO\_mwwuuuonaWSUN=.585>RcvkiL>=7%#&+.-(")1325.KsϤwqppvķe`impkot{~|mbelksyzxsnkie`ZVYbjozoɄJS`WNLRX_b[XTRQNGB>=?DLRY\SQJCAB@;7@BA@=;98998656<><<;:9766643/-*('()*(($$#""%''&($%"#!#"$ !#$ $*,/2-,(&$%&+389<>AFIJQM?6-(458;@@ERayբg:4.-!+4>ADFFC@?AAA?<;=>BIPSRPLJIHGEB?:<>@?<62/,+&&%*-001289<:87:=>BDEJKF:* (0:?8( %(&!)),596/-0891*((!  *6,"#),/142/+,,/)""-5 'J]Yhflv{cPZU?5C=6[g_ZH;:4! $',.-(!",-,01R~ϥywtqsõddontmotz~~ufm{rtuvusqrqlf]Z[dllznȾƳýN`gYMHNV_b]YUUVUNIDEIPWZ\ZROHAAFE@;@L^oxwyzryǴpWF><@B@CGMM_t̶kK:2QrO?Nssjp|vK4Nun\QKE<96721//-./,"  +''#!!%*+%"'+%*  +  ),('!!# $6=AING=@GOU]aeglnwtpjgfjmllha[QHB:50+*('&%%&)*.1678<>ABACDEDC@>==>@A@??DFEEDABCEDBB@;841--..+)%$"!#%%$$ )1233/,)'$#%)121268=><>7//($,459;>EWnҞf<4.-"+4>BDFGC@@ABA?=;9:?FNRQNKJHGFEA?;=?A?;51.,+&&%*-001289<<88<>@BDFJKF9*!*/78- '-/+ #/+(0780(*9C>0&  .6+ "%).332.-.,-*!,:  &H]\mimvhK[ZA7QF9rɊyLOID850 +  $(,.-(!$%&*3YШyurtxŵgirptnruy}|uzsai{}xrnnpu|xukb__gnhynľȼ´þõyQlk[LFMW_b`\XX[YUQMMTZ`_]YQNGACJJE@EO^mtvxuz{ЬeXMJGA@CPMc˿jA:6`kF9azjbfqG7LvxbQFGE@963221-+,.*  +$+-(!#),&*  +%,(!% !6ORYcf[ORZ]^cab`delpuoibfjssrpk_TJD=6/--,,(*.15<@DFGGIHFDDEFEDBBCDBEIKJKNRRPNMMMPQPMKGC=97213.,&$# #%#"!  !.55320-*%!!"$(&%%+/34.0&%,'(-26?FRlԔh87/+!)2=CHKIDC@@AB@<875:GONMOKJHFC@>=78-!#)(+054*&&+.0* )5 3J\liipxqbUTQ?J4J{{cE.-:2/+#  $%(+-+& ! $'0]Ш~urst}}ξÿmhooxoutmo{{kWkmUWechhglty{{vngdbgjmt}ɴɚ{jmo^QNPT[d`^^aefaZ[Z`cfc]WNKHIMPPOLGL]nussvgзcN@8ASD@^οijbIDU{p\CDo~xqj^M>69guiURPJ=119;60+++,-# + +$*+& "$-3-!,    %/42)*  #'@]jputmbZTb]ZQONVZdispkdehprrniaYROG@962-),06=9=CDA;630-+$!!).1112679988;=BEIKID;.!"(-263-'%$-/+$#+5:-72%0/++1;DA3% $#28.#"!&/41+'*345/(%(-#!&2CWgqnn{|lffhaQC@:\~ZtzeF,&-2:4.# + $%(+-+&%(/^˨|~}xvuw~{rjnmtmssllv~{xcJgyZ@=FLU\ajtx{|wogcadit~Ƚ¼Ȗv}zfVPRW^fdaachhe^^`cfhc^XMLJLPSUWVQVcrwvvrrֿx\MLL5SǺufpwnYMezje[E5/:XxcMOLMH?2.3<62-,,*)"  +#(&# '.-'.)'#%)+597-.$#$-Fbosqi^WUWYWXRQOTUaelifafjoqstqjf_]UNF@72-28>EMV_egc^[ZYVSSRQPPQUV[^cinqtssrsvxwtplhda]VOKDB@:52/,+%$#')*((#'069:5/,'" "#&#""%"(5FZn`=81-#$.;BILKFEBBBB@;8534=<@DEA:520.+$!!).1111668878;=BEHIG>0$ (.6;@>70-/1-$'38*(!$&).5::5-' %(!)/&"-2/)).8::8520+20.)&0H\ljgr~lgfn{qZP3=c_9GY[P4#%*(?8. + $&),-+&'*/a¼ƭ}u{zxwvv~uȿvihgjiprlktz{}}nXqqS;47>HT]itzyzvld`aek}տčr^UX]chhecglljeefiijc_YPRRRSUY^ZW\hvy|zѲn]Y7Sŵp^dxaYJ.!'L{lT:CADEA8208420.+&#   #%$ #+..46:/'3:8:AC;/&#6=><01' '4NgnpocRKNSUUYWWSUSY\b`_^ekorwyyspjg`ZRKA;6:=CJR]hoqnjfda]ZZZYXXZ]^mpu{~ywtqole_[SPNFA<9550.-///,)#(-5;:94-)###!"!$($%8Kd~xZ?92.$!+9BILLFFDCCC@<86546:?DGBBBA@?>>?CFE@:411.+$! (-1111557879;>ADGGA6( &-2==?@:/'%$$ %'%",275.(((-/0& ,4( ##"+1-(+17=@ABB?7?>9,#&;S_cfn{}rdlluud:EgndL16;@?1%#$62&  !$')-.+&*--dƴ|qxzuxuuvw~ox³yg_acinspmsz|y}{}zs]OHHLSZbkv{|wpha_bhp׼}yxz|비zh^`fhikhfijkhfiikkid^ZY\[YVU[`_`hvsQjȱǺ|~cM8%-Br~g]K>67<@A<942001/*!  "''$%'$$(.19:9951-(! *09@>:1($ #(-+#(=VqrV>:30%)8AIMLFGDDDDA=9653027=@??????@@BEGF@:421/,$! (-1111557689;>ACFE:2(!%,/182042'#$### !!#1571'#(.;;6+*5<3*&*./,!#'+(%,65=FGPTTLIKG>-4JQ=*%"% 2Mcntoiecc^ZRQQPOMJIHMSWYZ^aehmprpnliiihecbcdefdfkrwytpnkkkklnrs|~}yvsnha[WSPLHDC@94,$ !)2;41&(7AILKEFCCDEC?<562,*068==>?@AABDFHF@:532/,$! ',1111446678;>ADDE81*&&**+) ""&*+'$""22'#)5894.-39?>7,!!+7<70./1.,##-98;2;:;B2&%!141) "%)+./,&!-//iľ¦}efedk{}x{λl^a`inslaZ^frvxxm}pink_pnkio{toe\[aktɹpgc[]cgaXRK;17;=I\测tsutopmjifecagjkjgb^^acccdhkoyʼǾƺ~Q*)MpYB47:<;6686312564-$ %)*)!#%)&" $,LmkQMY_chgWRWWPGNb`C,&#"!"*@\nosh]Y_deb[WUSSQOLIMSWYZ[]^aeilnpoqrssrswy~}{wusvy{wummnoqty{{vplgf_ZVTRKC<2)"  &,-5@EC;- "')((0@WnhP?<52'(7AIKICECCEFDA>9;6-).34<<>?@BCDDFHFA;642/,$!',1110435568;>ADCD:5-'#"!! +06:74564118EG=307:=?@BFG?>:/#"+4:9751/,) -<@:2:Z{sWF8348406.9R`aj}vȰVJS>$.8>E9+.;:4+ "%*,./,&"#./2oƷˮgdcaitx}}z|͹o^`]cgng[PT^kqttwzcvllxxiqqppu|zvni`[[dp{Թܘbcmffd]ROPA9?LJ3$'Ls꾔|vwwuqomlhhffeikjgcbbijijnqtwǹƷi<1KtzjO:1/;@>8554044542* !  $)+)!"(&!#(Hmvfgokhrra\fiba_jbE.(&%*2JfqihaYX^egcca``a`\YRTVXY[]]abehknprvxyz{zyyxyz~}zxrnib]TIA3*##"!%*/68=DEA9,!   *5A<1,055;<=?ACDEDFHFA;7530*$!!'+3112233345;>@ABC<80' $8DNPOQUTMHIRWPA689BGNRSREDD8-*07AAC?:42/ -.)4VVrėvw|{rqqnkijkdhkjhfdhrsopuyyyɿU/CqnaC33,5<=856516543-#  !    ())% %'#"'+>\qx|f]jl_\ingh`aX>+$',6Pmoedefimmlgebeeifc\\YZWZ[`ajikkmoqsruzz~vncVH=0'#"&!  %&,/7<@CEC>5," "$"$/AQmzΨŭ»ûף`M@72/%&6@FFGIFGHHGFDC?;:;:669;>ABA@@ACFHF?:863,%#*.85432222/2668>?:3/+##+#-LV^bfjnla][_b]M@;BR]eeb]PRSJ>544CGNKD<;9,(671#$Rm?>ZlxV/#!#%-7CQkӾηɷ̿ҵԞ]J=72-#&5@EFHIFGHHGFDC@<;=<99<>ACDCAABCFHF?:863,$%*087422111.1458;:6+$"/;0%.FZbhklqsqkhfghdXONVcotvsofhiaUKGIJOSRJDBC:% !$#BvdH`ϱtZDHYgrtA(&+..42/()4<>>1# #),.//,&  (/4w׾ήcbbbfjjq{Ⱥ|ncZZ[RV]][XZ_cinnu~}}vvx{td[ZXYYV[nºʸѥ^\XKRXzW<871&,K^lžuvzyuollijnnlmot}|v|νrtgYM@3../0455589::90#  +  $(# "!!&(')/;Qhz{sg[I<51.,"$+=Ufmmjpwxuohehiklmkjhfdb`acfhnqv{~~}~~~tcQF<950,*))*.4EFIJGHHHHFDBA==??==ABDFFDCBCDGIF?9752+#%*076321111.1458<:4%.9C4&!",BZjptuty|{ywtsroieioyy{{th^YYY\\YTQOPH3/UxjdxwЬu^f> ('#,,(%'29:8,  +$*,-//+%!)/6v̼ħgcc_cllr|tkea`_RRWX[Z\_biry}}rw{xgXRTZZWQYtȿɵ̖zfGOS9/Iȥ~K*,3/$(ZfUuǦŰ|vz|qnqusrppty{{ǹob`WG;50,015777:;851(  !$!$#!$%$'*/9Kc||lZN>3./02*&)8Ocmmpv|}xpjfhikmnmlljigfefghnryziXMB?;743336;BJQVYYX\\O8#2C\{պӽ͸̷ȶƽ˔XI;82,$"0?CCEGGDBBBDGIF?9751*"%*066210000/3559<=:+!&3[pvּŝl;#2! %%&*)# %.664' %*,-/.+$$)/;xɾ۾ife_cjkq|ĸzqkdbaRPRUY[]^`jt}||uxxnaTQTXWRTfĽʴꯅ]>EIQY`ehhbhcM/&4RhѵҼ̷ѾԼκŎVJ=92,$ -9DHKKIIJJHFDB?<?CACEECA@@EHIF?9640)"$+05510////23649?A?7-$'*-133( '2>Oaty{y{xokied`][[]_L7#"&1?Lg{ıd>-!"#''&!#+10.!  %++-.-*#!&*/?wɿªnjgaehjoz¾sgb_UQPQUXZ[`iu|}{zwof^YVTSQPaϺΥhE<1;3`θV'!)-$*LkyeNOjѫij~|}y|Ŷ|gZYP<224/258999;<:-"   + '% !!'*)%$.CReilhaWI=641/-*''.),9Pfpt{{tmjlmnprssttuutspmlkov}yrrv{~oaWRPMJIIIJTYaiosuumpgH&&B]ҶѻʶӿηʷŰͽSK@92,%*7CILLJJKJHFDB?<Ur}qs⿔g^ZD>5.(#$(.22-'$(&,>B>@CDBAAAFIJF?853/(!$+0430/....2676:==811352(  3BJZix}~}|vroomigffgfiaL1# (&!$-?OYcmqtҸgJ82.*  "% %+)$  '-+,-,(! !&)-2Guʼҹumgbgfiowvi_XUSMIFHKNW`rvvsk`ZTG=>H]½ŷ㻡ĕZ=%+*&&]NJ`eio׳Ǻ͸srwsh\K=7432568::86783" + ! "!" +%#!"*+)'""'076/&" +@[pwxx{}{xutuuuuvwxyzy|zurhimtzvtuwy{xrpnkhffggqu}|zh?#)2GgƯԼƮȵîκҶDZzLJA:2,%  '5CJMMKKKKIFCBB?>AA>?B=@CDCBBCFIJF?853.( $+0430/.--.15::;;6/)).1-"$;JUct~zwuuqokjkmkmjS7(#)(4Rdf`NZhuhFO9'3- $#%)'!  '-+,-,(! $'*.4Kvƾֿvkeaeghox}woicYUPKE@@DJPZo{srrm`VL;06Fdýɷʩʷþ~#?9/%!CңzmckظƹŶηvtwtkWC66630579::7566/  !!""" +%"!$+*'&$ "*396-"(B^qxvvyzxvuwxwwwwxyz{z}}wtggipzytsuwu{~{yvsqpqqx}}h@%.=QlƫĮվŭǴͱȦsLBH:2,&"%3BILKIIJJIGEDCDDB@>>?@BEEDDEFLKID>974.)#(0220/,+,.425:><4+ $%)=HSbp}|{zywusqlkjkj]E."!#!"(+#'BX]XT^gaRQXUDC74:?6# &*$  "'*,,+)$*.*,9R|÷׿olaXefflt}vaMKJXjc`[UJCFMJBGVntjpndRF?827DZzǼ¼ʳzG39?@84I~~peiƵƬлĵ~zof`H@9334587888730+! #! !""  $%%$(,-)%"%'*++0133/(!,Gdx~{wxzyyxyy~yutwz{{}}qjhkpy}xurouuw{}~|g8"7[}«ʷţǻԽȮǠoMEF:2,'#$2AHKJIIJJIHFDCDDB?>>@@BEEDDEFKKID>974/*# (0220.++,.1126<;6/'8DPap}~~}|vusqmkjk`VE3(&)+$ *-!3KSOLSZUHADB<<89?=4'"'(%#&("  !'+,,+(#*/).7Tôεmmf^ffejrz{^?)*-Gb]]ZXNGHMKEEPm~ukbgaVG><95=ENb~¸νɻY>8;><8Gqحm\d͸ƭƺĺxof[OC=610235:;:96/)#! ! + % $+0342358:;<<851,&" *B_rzxwy|||||}||{yxy|~zrmklq~|wtuuvy~{g5/M{żůλĦĢͳؿŘiOHD92-($"1?GJIIJKKJHGEDEDB?>?@@BEEDDEFKJHD>9751+#!)022/-**,...15::73%&3@O`o|}}xxurokigYSI:-(*,( &11 4ABCJLKC;8:>;;??7,&%"+/.(%"(&  !(,,,*'").)-7[νĿĨ~hhc]addipy~~^C +<^YZ]ZUMIJJHFNmth`YWQF;7986;"3_ןtldi׾ù¼qe_QA<:43101479983+" !!  !(0:@DEGHIJJJA:/%$!&8Ulvwz}z~zy}{smght|utstw}{c/!4Jmϸʲ«ģàũγœeQJC92.)&!/>FIIIJKKKJHGFFEB?>?@@BEEDDEFJJHC=9752+#"(.11.,*)+--,0278880)!!'1>Paoz~~}zzwsoida]XRC1   +,31'$0=DCA>A>8;D@>?<0%"#"%,.+'%" %*(!  +!(--,*&!),+-5`Ⱥzgb_]]aaekux{hH.AaZV__ZQIEEHNUs{l_WSIC9201015<>@KkĤ\2-;>95>]ދUdwzƤóŹýk\YO=95620//214540' +  !"  + $+5=CCDDEDDC>6*$/Jaotw|~|{|~|}zpfclxwurpquy|_( 4Vṵ϶Ǯؿžy{}{ǫǕePJD:3.)& .=EIIJJLLLKIHGGEB?=?A@BEEDDEFIIGC=9751*##'+/0.-*)*+),/135:>70&!$'+3ATgr~~}{wxxvqlgc`\WI3$24-2-%(;J=439=89>>851,$ $(,*$!## *-)! +")--,)% '*,/7^͹xidcc_^_bhqtw|tV9#)OfZTca]TIABDS^|tdWOK>:40,*)*29<=BZ}ĹŽβT7$,60-.j͆MSrʥʾükXSL;32430.035652,# "##$""  + # !%,1667765432,##'=Rafmv}}~}|wjbem}ztonoru~}U"&KxʮӺ˰־{tv|zӽ~tè̝iMGF;4.(% .=?A@BEEDDEFHHFB=975.(" !$$%,...,)((&)-./28<;4,%'+07EZkr|xurtvxywsni^ZYO8 !9FA666/#!0;9217<8662)''&" !%)*& %#$00'  #)--,(# $+.3;TĞrkace^^^afmtuzs^H0 2UgYVd`[UJ@?BVhyi\PGA520.)#$+;756@Rk̽÷޻c/&'02+-4gʠ[FaʦþþqZMC601331-03>=7/' + $&&%$""   #'$!$'****)('&#! %%3@NThs~uiefn{|uqpruw~qI!9a˰Ծϱħؾ}||Ϸ}׼ѧoJCH=5-'$!.=EJKJKLMMMKJJIFB>=?B@BEEDDEFGGFB=975+&"!#$"!)-/0-)&%!%+,++29:/& &,3;J_nr}~yw{}~}xsm\WWS?#2LXOB896+#"$$+-147551& $(-)" '%%0."   #),.,(" ")08@MyĪmnqeeh[_]afmtu|~o_RB-9WdX[d^YUOEBDZt}m`WMC;--.-&!)6<5.2CU`g°Ԟa@(',.,(/:Wɰus^Tq˪ξv]H:1./31.-15?;1'  +#$#"   +"%*,+)$!"""! "&$#!$&-5@I_lywnjeo}~wuvxt{mL6@aзԼӴͭ~ּ͵ϲԮsHAJ?5-(##0=FKLJKMNNMLKKIFB>=?B@BEEDDEFGGEB<875)%""%$"),110*&##)*'(-50# %,4=Nboqv}{uob\[YH+5R]RA==>50,#%'&''$%,+# (&'1-     $(+.,'" &.7=Etʭzfs{pkn`aachnuv{saTKA+;UaW`c[VURIEH_wh\UNA7&'**"/B<1+6JWYSҽʿԺy;(/--)%&.9JZjxaTRnѰ¶ѼzcI7212430.1681( !!  &.=:3,%$(& &(*0:BPZinljlr~wqqv}}zz|t{x`XlտӷնҰԻʵȫϭuEFC?6.)&!!.:86-'$"&&# '*/01+% $),,)(($(7CUiwvw}yuodgb]S9 "7CJOID@>6-    + (#$(% %,* $),.,(!'+)*5fɾֽ|rquwtookjghmstvzpfYNH<&EX\\\a`ZTNKMQdp^VPE7/$ "+27;753:86-'$$''# '*.21-%! "'()'**,'/%(:J\o{}}|ujbaiow~zsmfd`]Z@%$8AHE7542-%  + !$!$$',)  %*,.,(  #(%%-_ȼ̪{qrrwzxtsqmmmosssu{{a\VKC5 "M\[[\`a]WOLOVjmZRK@1*%4=;7049AKTVXWjɲ¿ľ̶߮i@;;6('26-2?IKPY_b_]eanɷ~p]K@<=>AB@<92'   ',1220$#!   &#.@BGJA.&))" #$#!!&*.38975,)&&''"%)-11-'! $$%&*,=BNA$)?Scqy|~~sqoj^NEDJSanspicgc^afO./?EL?"!     &''(#+.(  #(+,.+&!$(%%(Zٽ}rotw~|xuqppqsqoq{}nVWWNC2 +/V^YZ[]aaZPMR\r{hUKD9-(,AI=/$,9FOTWXIMϼԹٙJ3@=2$7aueZ_llffi_WaoaµzhVK=<>BFE>90& !%*/2420&$  $0:0*?@ACDFGHIIIJJHC=964.)&'''##',00,'!#$%$()JYgX:%"",D\jqux|tlgdb]X\ciow~}h_VPICBDJP[fmppnle`gp\6!':FNU>  + + ((!.((.,#  '*,,.+%  "%)%%&Y¨xvuwyyvqqqrtqmn}l]QW[TF1=`aY[\Yad]QLT`xwePE>5,)"!'9IJ9)&4FTXUTB:ǺøŹȆ=.:/(;pvjh[Ym;a̺ĹtcVD@@BEC92*  $&(()++,+'$&.17EI5,DSFDD;0*,+&%"  #$%" !',06=AKQUVY[ZXQmkv~tijXE1+6GUVURSPD502DGHJLNNLJHECA>>?@ACDFGHIIIJJHC=863-)&')&"!&+0/,'"%&&#$#J^l_H1&&!-Ebsuvzz}yrkbYPHEKUZcnyx`O=530..*-2;HUagngckva9"+@LU[>  + +  &&#*3#  .0) $*,,,-*#!$'*&%*\||yvx~wrooqrtslmyl_VT[`XH4 Ec_WZ\U^d^QMUbzr`MB93/0,2;EHA2&#0CUYQI8.oξЫp@;A47lôu5UijpdXQJGD?3+!!-89852/,,(&#    '1:@CEPM3(@PDCA80-,+&$#"%$$#$$'+.4:?JPVY`dge`w`kjq}~}YQKSN@0-9JWY\WSK<,!#.F{s|½ÿȶնñϺ̸ʼƯҰ{KJFB91,)&!#0=DGHJLNNLJHDB@>=>@ACDFGHIIIJJHC<754-('')(! $*//,'$&('#" AU^XQ=*('-Cf}~}{|yrbRE<:BKQ\jxy]J5+&   2CLgeckt\5"):,))0:COW]XPH@70*%!!!#*0:AEFIJKPJ.$;LCDA70.,'%#  "$%%#%'*,06=BIPUX]aebj[efhlx^XvV'+4KUI:9CQ]^_YRH<0'"2zx}~}ǾԾijڼȴϹ˷˻ξнҰ{KJFC:2-)&!"/@ACDFGHIIIKJHB<744-*)*)'  %)./-($%&&#%%8INNYL4.-+>e|{ynaG5$$.ERdvgVE<7/'#(*-28?EG`aclqY6%&*9LWU9 + +$%"#+.&):3! "(+--,-) #&),'(/_wrtxwxwywtpmmikoruphfmaa`\Y\ZQH9',Qe\U[]YafaYTZbyiWF;77:@AKQH5('+12:DJE90(-O_hrw¼ҪjILBEmӷV ":`ۼ~{wrnhiltz}zn]K9-! %+04=<>?ACDFGHIIIKJHB<643,*)*)'"$*./-)$##$$(*5CDI`X=51*9a~}{kQ8 #6E[qsgZTRRV[`aba[RHA]aflpX9+.+9LUT6 + &,#"+, ,=2   $(+----( #'*-'(._{rmmswxuusnjklikprtnfcqyra[_b]WWSLD9)!1Uf\U[\]cgc\W\dyfUD:68=EEMOC."&.7;BEC:.&-7LMXa_sxyƾˣM?PCIݾwޛN().aۼy_G6 " !'1;ADDKW__UIFFEE@1);LHG@40-'"   "%%%%(*-17=FLLOUUX\_Z`l̉Qc]fc]h{t]:CBFIMPPMIF@?<;:<=?CCCDFHJKKJHC;510,*)*+'"!)02/(!"! "-5;;IU[^P554Dby~{qeZQJG;AC<8>FI[`ixvg\\bdeeje]YZ`inmmv|rZHCDGO[d[9 %*)%(* +"05+  + !&++((+/-& $%&(%(2b{zywsqpntqplllnmnptspe[Wdhd^_`^YPPKGB<. ';U`]VWZ\bfb\X^gzweRA==;;:9:<>ABBDEGIJLKIC<521,*)*+)""'./,%!!!!'+7?Wc`ZL3/?Thyvi\TRTUkpqjeglmmot~pjfhijlqgecdjs}wty}r]ST\[[bh]<   !$)*-)(34' + $(--**-0.' #%&&($'3cƼ{yvtvvrqpqsomjkknopswuo`QK^ed`_`_YNNLFB>>AFC>50.//;99:<=AABDEGHILLIC;521-+*++)$ %+.,& " !2EgqaPE5.H`mzzqhdejmrvwqlkkkknr|xvvslfhnlnqv~xtvvjYW^okfgh]A$ #&'+/2& 162"  + '+./,,.1.& "%''&($%2cyuttsvutttvrqolmnrstvzulYF>W`c`^]][OMLHE@4(6CSZWRSU]dkic]`cvyiTF;9=@DGL?1.5960:IQE,+4=IOQRW[WQUcmluÿƊW=7>@6GƷδ@($'+'"XmhԸjM5"" $*-29DLNTZ_^WOJDFNZ\SE>@@:36CIJ<:3/-*% !$&&0127>DKMPRW\bfll\sqFZe^XCIM0%5K^?%3UM,9=5BU_WK<.%"!3~mpuy÷Ϛӻʮվ̮жŮĭɷϧtMEGC;4/+(%$"# ",:ACHIKLLKIHA?=;:;<>ABDFGHIJKJGA9310-+)++)$$(,,'!"! -GnsWB?;9L`o}}{qrqmjjjjgjoy|uopvtpspbTU_nnle^S?+#  + %)+++-+ (:9.  + "),..-,-/*# !%'&')&'2a¸xvvutuvutvwsrqopswyyyysfTC:T^fb^\[XOONHFB8+8CPUTQRTZbkkgbbeto`PF<9=DMPI8)+7=:4@LQ>$%18?IMQQTW`ZX\[X`oĿʽn>2CDEEJNPQW\bgjiQqlQ[XOM>@B&=QZA)1Por=$252AUVSG8.$#,@Ƚqqpps}ҫѾжպͳ­±ο˷ΦsLFIA:40,)%$#$""+8ACIIJKKJIIDB?=<=>?CDFHJKKKIHD=61/.,*)*,+$!(,-*%"$"+DjkK6>EMMXn}zwttvwy{{}}qqvthWXahopdQC6)'"! !)+*)(# +*=9* + "')+,-,++,$#%%&+)+0bý̸wrwxwuwuvusqrswvvuwy|||ysi^PGBV`ea]YXUQPMIHD;05>IOQOPRV^hkjefgq}ueZUJ>7KMH5"!,7'!$ "38AKUZZWVTNGCBBBRW]ce_TIB:3.29:8?91,,,/.(%$" ! !!!$'*-789=AHMPWX]`egiiaw_NH4)6<@A-(JZYC00IWU:.44;MWKL>1, 1Pû½|sopvzĿêöԾdzʰ̲οüΥrMGK@940,)%$$&#")6@CJIIIIIIJFDA?=>?@DEHJLLLLHFB;4/--+)(*,+$&*+*&"''(>beH7DP`VYm{}yw|y}}olpri\^gpwtbH5+$! !"$$"!%.21/ .=5% +  %(**+++*))!#$&**,3dľ}ohmvzyvwwutsoopvwyy{}|||uk_UNLLYaea^\YSQQNHGE;039FNRPPNRZeijfggnxn_VXOB7:DNR5,-5<=BFPM@.&,5;@BGJLOSUQPSVYY_jgloja^cjvwvsjd_^bcgkqv_96;03Myݸժy=.&,/))'FhB]ޟؾ~xsrompmbQ?(!!"'1:IJOTVSLGWVSQRSWYZYYZ^`XNA81.366596431.'# "##!"#$"$#!"$'*,49;AFMPRXZ[]adfgpqZTPD,/EG?/4XbSB53FGE<954CSRMP>23$5^Ŀzy{}ýдǻçξìкϥsNIM?941-*%$%'$#(5?CJJIHHIJJFDA>==>?CEHJLLLKIGB;3/-.+)'),+$$()($%'&9^hRCNXlhgmuz{|}ogfhe_gst]C2)" !##! !")120+ &381  $'(+++++*)(!""$)(+8iŽ|qnpy}|{zxwvtsonqux{}~|{zyodWOLNQY_b`^^[VSSOIGE<139DPURNIRXbghgeejsxh]XVPE87>DD0*/=ECGLMJ?.,7>=EEIKMPTVUSUWZY[aglnjbafkqqokd`_`lnrvvs}}S?25@dǮsݽ۔I($'.2.*);4AAKЬvuwcnʹwma_\\[YOC5& %6DLNPVYUNJLOcipyul`[_gaTF;31342022221-%"(+)&!%''%$%"!!!#&*28ADGJKKKJJHC;4/./+)'),+$"%&$"&$8]n]QV^owyoqz}yrf^_adrqWA4+"!#%%''$#$#!!!"++,/3-! +)84,  "'((-,++,+)' " "# #'&&;lxmjny~vuwutuutssstwz~~{yvmbUMJNR[_`^`b^XSTPKIF>57GGIILOSUSRSWZ]^beedbaacehhfc`^bdfjqwuomoxЩ|YCSbޮyhÕj'/+'31&"<4:}q}輈f]iklºufZUSQOI?2($")",FWWQJU[ZUXiyywinsjWQE9562.+0.+*+*(# $$''" $(**&%#"! !$(05=DMRUW]]]^cglnw^OD7:ITE1TL60FtnE66>YQM=9;@IRMNR>6A0%?b½ýϿùDZӨtPFE<52.*(&%%&&(-5?DILLIHKKHGC?=>??>DEHJKLLKJGA:40-,)''(+*# "%%/Nhf`ejq{~tqxxumjb^XXdxvY>41-&#%''(*)%)($(07:6+ +.63  + $*/+,,,+*)'&# "#):svidckt}|vvvxurrprrru{~~zrkaTONU[TXZ\]bfjd^TNJHFB;AJV\[RMS`klmjbZadp{tqia[TMF@<<;267CUWQWPE;5;BGJHHKMORSUUVXXYZ[[a]YWZ^_`e`ZVVZbfgjlmkifcigq|ݷ}Ẕ|zoq۾|E/0+-+.)",P~ԡuTVWoµ{~xtpmlieUJ?71-($!(-9CKSY^ULIWh{ȸzogd[M=/**,--(# "*.0/.("!!"!#%'('(!'+15??>CEGJKLLKJGA:4/,+)'&(*)# !#"'C`kqtoktywtvy{wuuy}zvpc_[XXdumQ?73-$  "#""#$&# &.883+ "2:. !&,0,-+,++)'&"$"&IUde]TU^efiib\]_m{yrj]YTNHC>:@EJWdb_a\N>7=DHGHIKMOPRUVWXYYYZZ\YTUXZ[Z\[WUVY]`^`bffecaa\erջ滔mk1nlS2#,'(14/)%*Et}yͽ}mf[QLGDAD>6/+('&&"'3BPUTTVKKWsþtidfj_VK=3..0::7.)#"%)+,(#! "$$%" !!#'.2;>CIQV[[aadhkjd`GGFNS64XU-EHKKHILLIGC?=>??>CDGIKLLKJG@93.,+(&&'*)"!!"  4Ohvknv}|yy~snmsz{voa][YYaluwkYE;75/&#"#"#$$&%&&)+.350$.99%!$(-1-,++,+)'& "'%$=u{mc^agq{{tsuurrqtsvvux{}}qd_YUVRKFVY[]^]ZY[[YZZXSP<9?NcjbWPW]`fgb^VYf{~udb`^UK@7ADNTWRQRXK>9?EHHKKMMOORTWXXYYYZZXXXYZ[ZYVUVVXYZZYZ\_``_`aZ_n‘tnk箇s+#$-*#3+$)7>LzدĶ|nYQF;6321630+&#$&&#$(4;FPSRPPPVhzlqvn`[enndXH>622:>?;5*" %*($ #$"!""!""&).4:?KLOPWY]]dfijhbYRJLIKI-.VT-=N8#(Bu.$/J]snK58J]aPA4#%%;aÿĿֽè˽úңpKCD;41.+)'&'(((,4=DHKKHILLIGC?=>??>BCFIKLLKKF?81-+*'&%')(! ""$! ):Xsrw{z}ysquyxrjZY[\YYY[VO@50/33,*)**,//31/141-)$ %5:5 $$&,0-+*+,+)'% &)&#=>AGJKKLLMMOOQSXYYZYZZZVWY\[[YWOSVYYZXVZ[[ZYWXWd^eqyٙz~ڗnsپG!"+2*!..+Ck|ͻmVE>:76678601.*#!$!",3FEEHLNNMYdvubSE<6:=A@<4,&%')$$)(!!"" #'.34)]Y0>Q>(*@v1$-Le{O25J\`T<0&!#,InĿμϳ˺ңoJCE;52/,*)())(),3??>ABEHKLLLKF?60,*)'%$&('  ""$" ! $(Ar}y~}vu{}|xtss~{og_TV\]WMA:1/+# *1-,-/3689?;;96-   +/<;.  $#%+/++*,,+(%# (-)$ICG; *=IMMPPLLMMOQTTY\ZZZ[ZZWZ\^^\WUMQUYYYURWYWVTTTTbenttvx}ԃf~ŶW)&'*)##(./Kwõ|gVF7,'*/4:975*,*'# "%&2:JHHLQMB9J_tvltx}pdZSRKGB>;:9650&#((" !"""'+4??>@BEHJKLLKF>5.*))&$#%'& !#" #"$ ._~zzvwy}zyzvtt}}ti`YRV\[Q?-&)).159:;9651)"6?7) +$#%(,+*+--+'# "(-)!(;c}qkikotwutpnoorpqrstvxx|y{|~p_NLPTUI4"  $-<4Ffw|{¾ŽƧԥoJEH>8530.--**))+2;AFJJHIMMKGC?=>??>?ADGJKLLLF=4-)((%##%'& ! " "Dvwnrvzwy{~}nacmuyy{|}vld`VXYVJ6  +  &)+*)#   +-:=/##%).-,-.-*& "*/*"#-:Y{|qjnquz~ypkkmpnppqrsuwxzzyxzuhYILQVXK6% %1=GNHDCKZeklbZZhrmaYICDThvl\JQkh5$(1ANUUMHKLMPRUVY[]]][[[[Z^aa\XUSRRTWWTPPJJMOSX]bdjfjws|أpm⽂XsۖK%(#%+)$.8<1.Vɧ~{|vz{vzkM5126553210+&"! !!!  &/8@CJPNHEFLUeqyynf\UNEDCA>7/(').+(%(,.3??>?ADGJKLLLF=4,)((%#"$'& $ ".\tqnd\cswqwy|uvurv{|xjUEJ\mw}{~zsmjXXYRE/   +)4<7% $"%*/.-./.*%"*.)#%26Pnuljqv{{oikonmoqpqrtwwxywttncVJLTY[O;- +  +(9;CL[gpsjZT[ed^YIBAM`rwg[ifMSHB@EMUULCLMNPTVWZ]]]]][[[[_ba[VTRUTUUVSQOJJMOSY_dkl^awxw忆cwbYe %#%%#%)(#48Jùkgп||~{wyy{zx||u\I2'(.2282-&$$#"#"-7BGNNG90=\{q[J;?EMRI=0*054.,0506?GKOSSUV]acbbbZTIC@ACH)L`,!YU(6MC9B]di<64@Ka[:4DKGOWJBHD7Kimgpwxwÿŷ̶ɽңuNAG@9630/../,,--.7BFKNLKMMJEC@>=>?@@ACEGIKLKD;2.+*)%#"%)( #"!&*  +  +:>2  "%)*,--.0/+% "%'%#&0<7D`|nqwwvuz}~zwqnoqrwspoqrtt{{{vobVNLPWYXPHB& +%2?@<>P`]WW`modVH?@KZhzwmvsxnZJEMSQPUOPSVZ\]]`aa_^][[^``]YUUTUTRNJGHJNPVZ\]]_akjem|~ܳnfӑXt㶓z<"&&# &*)-(()+N״uwsrsqqzs\OP>4.,*$%,&%'%#! !0>FHKD@FUjzwi`OCEKGDA@BB>84355=CFINMLNOX^]USUAIE=@?=>?@ABCEGIKLLE<3.+)(%#"%(( "! (33997Lq}uorux}~nh_[^``^QD?Mjzumc[]]WJ9& "/9:,  "'**,--./.*$ !$'*)+/74?Wwzustyxrptv|yurqqrsutqpstww{zxsk^TMLPW[\WRM-#'/1&"+("#0EVhw~tvmUGKV\^`SRSUY[]_`a`_\\][_`_\WUUTVTQNHFGKSUZ\^^]_ahjekv{wpҦjrƒ\؜yrX %&!#)+,&$)5`øoӻӠɴyphfp{K-:6-++(  #   (4FOVQMIFC?>=DHHIKJHHDDLRRLFDF@BNJ:5>:179!'VS38G;:Xn`N@;>A@AC:>EEHNJQ=0)!9OMPewuotƾŶïңuOCJ@9630////--.-.6?CHKJIKLIGEB?>>?@BBDFHIKLMG=4/+(&$""$'& $(+Afvtqswx|~yunfb_\\ZY\i{zsi]U[\VE. (382# +%)++,-.//.)#"$&)-/0023:Lfxyspxyzwsorszxvtsssstsqsvx{{{ywpeZQMKOW[_^[Y:,.:?EC;,    +.2:EQY__UMO`t~}~|aalVRX^YSWVVWY[_```^\\[]^`_^ZVTUUTQNLIILQZ[_`aa`_`egeiqtpn͝g~Ȳqa€juփ2 #'+%%)*%!&@x὜~hdϺŴmWT^xҥL46,''# + '3;>@BV]k|pZC:FT`ZTQOMIDFKNLJLLHME>BKK>.4?WuvN.7;333#0aW87E78Zr]NE=8>D<95>IEEJIRC+%15=Rgpsy{yôŲѢuOEK?8520////--.--4=CIKIGIIGIGC@>>??BCDFGIJKNG>5/+'%"!"#%%  $(=EJE:>X[8"1355)8e^95A35VnZLD:/9B86,5?BBJMWM.%->Vhu|{u~ƸŵϠtOEL?8520000/--.-,2;?EIHHKLJKHEA?>??BBDEFHIJLF=5/*&#!!!"##!%)6L`jux|{z{zsqs|vkd^SUN<##   # (3;0! %'+*+*,-0/.+&"%-*((-2576;HYisy{xwvvtuz|ywvvutttuuvy{}~zyrh_VQMIKQUZ\]\QHLURPOGG?/!  +   )1BO]cdeec~ƥ~ifd]_\ZZ[]`daa^\[]]_a_YWVVVVLKJKOVZ\Z\^_abeebccefiifsÙϹy^z/ %""'(&%''$'*# ?͉fe๕ίaF- )EЮ;<92'!!"""#$#"  &08>HSbm{taOCIOVZXSPLKONGCEECCJG:7ALMy̠pQ?$5763$4dd<2;./KaUI=0(077>)(2;CPW[V6#))5G^qzxt{¼̿¶͞rNEL>7520000/../-+19:AFGINQPLJFB?>>?AABDEFGHID;4.)%" !!"" !#'0@Ubuy}{yy|wmeaSSJ8!&!  !#%+78)  '(*++*-.10.*$!%.+'&*08=:@L[kv|{yuttuy}zxyvwuxvwuw{|~|{wuof]UPLMOTV[\]\RHNVQQSNKF8+#  + + 0C\g^RPVy|x|~{r¶c\cfb_\\]^`c`a_^\^^``]XVVWVURONOTXYYZ[\`bceedcbbeffhluԦwgUV $%&!##&+,(&*$ =𼝖jF cջ[8,-+*(&"&)(%#!! )07:APbuu^G9AKPNJFFEFD=98995DD7;Wr~gO@/6330#:qj=/9-,BPZR;-..4IP2%+3AUd^WF2%+5603>Pfsuv¼¼˜pLDL>7521001/../-+07;BGHJNQPNKGC@>>?@@ABCDEFFA92-)$! !  $*5K\rw|zvv}}||~|wuwzzx|~~yskc_TPB/+&"    $(,52   "'(*++*-/10-)#!$+*+)*0:ABIVaoy|xuttx|}|yxuvvyyyxx||}xxrqkc[SNKNRWY\]\[TJNUQQUSOMC93.#   +#0HVJ54EswsqpkȔbU]^b`^^__aa_a``_`ab^[YYXXUSTSSUZ\[Z__`bcdeffcabcegikhחbyԀ^[ߘ3 )%# #!!&)*&'""@ݹaE7+ 7{Ã;&-2.($! )+)(%$#!"25;AK]q|zz|~~{|hM26;>=;848;:315887GPjoWA75144%@o>.91/>Fea>/;36agD0/0>>??@ABCDED?82-($!! ! "&'/DVnuxxssyrojc_^]^c\WXcntu{}}wpf_ZSL<%/,)&!   $('"!&,-3.  #$'()***./10-)# $'),**/;CJR^hs|{vuuvy~|yvtsuxzxyy|||vunkfaYQKILPSY[[[YZOQVQRYVVTNFB?3# %+;>QaS;=Qduqppҟl^a`ba_``ba`___`a_a`]ZXYYXUQRQSW^`_]cbbacbdcgc`_acehj\{Ӻؔ]kl[gk +/&!%!%$""CϹoP7!   U١F17:/'$$%%(%$!"! '6=(=|s@/;75@Cig=,C35owV>6/8WsmbdU/0A7/((7Pj}¾ǙnMCF<75432224.-/+$+9CLTSKEGLIKLIDABDBA@???@@@;51/+% ! ! %($'7Kbiqwvx{}zqgWNB:9975(3CNV_inwwuog]SMRK<$,-03,! &-1-%#*37)   %%'')*..0.+&&+.,)-8BNZhuz{|z{ywvwz|~xvtsrtvwvwx{}zuqje^WRNIFKOUY\\[YVUWVVWYYYVTROH@:24341-($ ,BMXU^prgbfhx|xpoeaa``_`_\[ZZ\_^_\ZXTSTVVVRUY]__^]^^^^`^``bca^]aef_[lηܢ[iqnhs/"!!%$Aֺ|\=' /nEAA../#$&,6I[gs}r`^L1 +  (Eaywvw{|{~~wkOLA?F@;=9=ia3#@32j{gUB07UqgfgV2+84.($*>Zw»ǗnNBF<76432224.-/+%+8CJQRMIIKKKJGCBBC??>>>>?@A;51/+&! !"#!"!! #''(5EYcnuxxy}}|zuoa\WX_ehhkf^[^flqsrnibZSNTM;922-(-=MUTMP\b^bi]lvfm}jig^a_``_`_\XXX[^_^]ZWSRTVXXVWZ]^_^^^^^^^^^^cba^__ac``jտެoaf}duC##&#@ܯybH3" +   [̌_F@4.,!$)+.=Tkzz~t`NEB?8/''$$#!"!!$&)+7;@FKUahtv}zwy|}yj`pusvsqt~ϛmhZPopQBBIRI,@y|E:@=912gZ.#@60Znn]A29Pgbd_G)#07:1('2JiŵȘoOCH<76432224.-.+&,6@EKOONMMMJECBBA@<<<<=>?@B<61/,&"!!"#"#"#!!  %)+2;KWhtzzxyw}~~|onqpnljd_XSOPYP:  %'.65.)*,+)(&&&&++-......00,'&,20!  #%$%&&('*+...*)$!#&())+5EQait|}zxyxvuvwz{yurpoqsuvvxzzwrmb]VPNJGDILTW[ZZYWXYYXY[]^]]]\YTPMKMLLLKKHFDCGOQNDDJW`ahobei{lW\][STZ[V]]^^^^\[WWX[^``^YVRQSWY[Z[\]^^__^^^^^^^^daa__^_bekjw۸rmldYr+&&"# #?׫jXNOJ8)$  !:n}G87-( "  !(+,-Jaw}vz{y~nU>+9+,gW0&B>1FYqb<4=I\[aP3*CN?.$%9\¿Ž˿{trrolfghiklmmȘoODH=86533223/-.+(,48;AIPSTSMHA>?@?=:::;=>@AC=61/,'#"""#"$$$#),/1=K`qzzwvu~|zxumgd_YTNMNO]V= !,682/0/./+,*,*0/324110//-*)*/2,  +$&('(''((*+..,('" !$&''&&,7?JRU\WSPSZafdfe^WV]bb`ZRHBDFGISdrvuvos{vfq׼g8;<+8hkKDAC?..gX;2FD76?mb99FJWUZ@!*TdI,0RyͿsja\[ZXURSTUWXYZǗoODI=87543332/--+*-2.06@KSWWLF?<==<:::;<=?ABC=50.+'# "$%& (,,)3AWjwxuss|zx|~~~~{ytqolida\XQJHJNPbYA'272/10/.,-+-,--00200//,)),/12' + #'(*)*(()(*+..+&% !%(*(&(2F^n{{{{|}}||{ywwxzzxtpmmptvyxwwvrlh^XPIIEDAGIQUXXXVYZ[ZYY[]ZYXXZ[YXXWVTTSVTXWZaaS:(5Zb?FtnWQOEBJSUW[TVY]]\YWUUVZ]``^YURRUZ]^`_]\\^_a________`\[][TTZcpohʾ|YMT%"!#<Ӫ[ERJ+$(   /*PR9;1,(&%%$#! !!&"!+5@ju||{}}wtwukc;.):Ypunpj`WW^iprsskd^adllmpmdWMB;BF=-/\W6=MNTON4.ZqM* "-Hj¿ǶþƿʻzndVQNLMLIGGHIJKMNNƖnNCH>975433320-,,,.0*+08BKQTJFB>=<;:::;<=?@AB<4.,*&#!#%&%+*&.;Naptrrpwxsqvz|~|xtolif\\\[YZ]`ZVMHGJPTd\C + !042/01/0-.,.--+.-0.//-*&(.20- +!'))*)*))*)++..)%#!$(++-3@Tjx|yxz{{{|{ywvxyytrnlmpux{ywvsoie^XOHGCB@FHPTWWVUZ[\[YY[]\ZYY[\\\\[ZWVUUUYX\dbO7(;clMXQ4.29GY]URRPPW\[ZVUTUVX\^]\YWUVY\^^_^]\]^_`````````_YYZZQPWckmlŖiZ}P% #:ѠkZJ:992 + $ +1 :kG901)''&%$"!!!'$-ASpz|zyyvwuZB5.2DYo|}x}yrquxwv|z|xg[UKBEP^nytrppv{wpyl ?C43LsY62?46U[TN?FE,+JQWG8@B-+IG5ANOQD<( *NgB)(++9TʹǼyuoojjfjjorwx|}ȹyne]UHCECFDD?ECFDGFHGĕmMBG>976444410.,,...-./16>EJIIGC?<<<::::;=>?B;2-+)%"!$&")*%.7GYhopqpsqmmrtrpmic]YXXWTSRTX[_\XOJHMSXb[A ,32220./,.,.--+,)+),,/*&)/2,& +"%*+**()*)*)++.-(#!#&).7DTet}ywuvxxvtywusrsuvrpmkmqw{|zwurmgc_YOGEA@>EGOSVVVT\]]\ZZ\^_]ZYZ\\\]]]ZZXWW]Z[`]P?8MrydnlI501?R^]RKIKOTXZYTRTSTVYZZXYXWX[]]\\[[[\]^_________`XY[ZPLTdfjqϨvgmh! #9~ͤqNI;;310&"!!!"+Wc\@Uʏ\6.4))))&$"!"$!"4OfwzxxzysdI7.GThv~xqneWJCEWhxtnkqxxsza)-D>58M{[30C=:QY[T@HI./6LbN.:K94655?HLJ5& + 1E,$36,.EwÿȵǼ{vme[URMNKLIMMRSXX[\bhotzѿ|uja\VSKFAA?B@B?DBDBDBDBÔlMAG>976544410.+,./-220./4;AJKKGA==?99899;<=A:1,)($! $&  ()%/6DTdloprsqnottqpnib]YYY[WVW[]___YRMLPW\`ZA+43450.-,,,---+)'&&'*1,&)01)   $'+,*)'(**+)++.-'# "%(1@Qboy~tstwyxsowusqpqstqokjlrx||zwtqlfb`ZPGEA@>DGORVVUT\]]\ZZ\^_\XWXYZ[_bcbb`_]a[YZZOHFc~nrk_\[\]KWce^UPLHLSWXWTPRSSUXYXVZYY[]^][ZZ[\\]^^________aYY]ZNLThbgs|ͭxgXPºl( $#(&#9}ԩxYOK.3,""!#"#" "%eڨk5,6)*+)($" "%$(;Yt|}usyzeNCFWdhpzzvhP9/AWytliovxuyӒc?HO?8@N]1/GC=PX_XBLN45*IkT)9SC=+*5mºÿê{Ĵqfc]VLHB><<===?@CFGHHIRX]acir{írh`VQOLKFB=:889;<<<;;;:::ŕlNCE<887766620-++,/125850.04BEIKJE@<@=9557:=@6.+*&$%""#!!!!!  "$(36?^rspmllnpqqppomkihgfngdeillgbYNGLVaffW=(-47521.,*+-(*+($"$).-*,.*  #+**)()())'''+,/-' #"%.=Reostunptxywustsrqpqrsponnpsvx|zunlmjd[NKIB=@;EHQTVUWW^]\[ZZZZYYYYYZ[^b`bdeaac_WX\ZLJQr{|s^U^jondfjia[WSNJMVZTPRNRVWVUWYYYXXXYZZWWXZ[]^_`^\YWUTVWRQNKHMTc^aq{}ӻ|R@or*$"$"$*0tȦ~aTMB81'$&&"$%%##$&! Ku00,%&-'$&((!#39:779;>A7-*)&$% "# !!!!  "$(11;\rsphjmprsqpvvvxz|~~{xxxysoc[PLQZdij\B"#,32010-+*++++(&$%'+++..($',++)())*)''(+,/-& ! %#'9FZhoonmnptwxwtrtsqppqrspppqsuxy}{tmlmjeXKIIB=?;DHPRTUWY]\[ZZYZZZZZZZ[\_a`cgg_\\^WVYXQU^~rsmewrnnrurpnoqoid^ZNJLRVOLMMQUWVVWXZZZZZZZZ\]^__```^\XSOKIGFB@A@?GOZX\ktuŤiQxY3!% ! %*4xټz`OLJE=3+# #&&$!!$##" """! & K4&%$-(%(+-'#&$+878W{{{su}{o^IFTj}o[D1&BSlzzqlkĉcG]hTBASd<CFFF@?<;:<>?C7-)'%%&"! """!  "$'-+4Wprpehmqttsrwwy|~~~|tna[USV_gkn`F&  #*+-132/-,1/,++)'''+.1/% + ")--,,*)*)*('((,,.,&!"! &"!-COamqnkilnrtutqpqpnnnopqpqsuxyz{~{tlkmjdQGGHAHQSWekkκy&" "';պqdVPLID=71+)*)&%#"%&(& #!!!#""##6G "$#"&&/95:\yxvrwwiSONZmy`;'0Vvuqsi޺]FYfXEBTg@?B=802;@ORP>&+:H@5,"!-EjԾjNů­zk[NC<:77773-%""""$%%%%'())),8:3,),/38>?@AD8,(&%%'# """!  "$'+%-Qlqpikortuwxzzyyz{|{zwwxxrlg^\ZZ]cjmpbI,  "$,2310/3/,,-,(&&,24.! +&-0/--+*+**('(),,-+% "#!$%6HTepspmllnqssrpoonmmmnpqpruy{|||~zrkkmibIAEG@:=:ACJMQTZ]\\[[[\\]``___``a``bdaVPOUU[bb_bf{ycVVc{pv{{vtuy|wtsspg^UUUTQMJHLNRUVWVVY[]_`_]\ZYVQKD=:76420/..0-++,/5>HNW`dc}B%# +!#!AԶvlf_VMH@:;7410,'$&&',.,&"'*)*"-cn- + '49Cf{tuustkUAM`ryL$:W`tjsճ[DPXSE=ThB>A;A7Qt]?DLL;'%4KK8+**083(!!!6EY_WNKMQQQMA.6]׳fZҿøs`ZUOE74340.+#$ !#$% !#%&&%)079;?@BELMOWdv¥m[UQJF>;;;<==>=;;898;:@?A?@;:6ϿgLCG=998887741.+*+-/17>A?81,./1369;<>?@BBBBBD8,(&%%'!!"$$#  "#')!'Jgprpqrrruz}zwutqsqqplhc]Z[\_cgknqdM2  %-123341//0/+((/54+ !(-0/.-+)*)*(')*-,-)$!%!.CP[irsqnmmnprrqonnmlllnoqpswz}}|{}xpjklf]B@HKPTZ^[[[[\]^^ba````aac`_^\SPQWWX[\Z\_i|lcYOLQbssy|xvwzzuoqsri`^][VPMJIJKMPSUUUUVY\]\[ZVTQKE>8454433457;853103:DLWac`A&!$' Dгvba_[UMGA@<9653.)%'&&+0/)$ %-001--IʝM&  1>Llrqvwpi]G=Vu^91ErcfҮ^JNUZM>QxfB=?999888842.+*+-.49?CC?950//0258:<>ADEDCBC7-)'%%& !"$$##  "#'*!#Cantvvurpsz}zuqnlijhfc]YSRVZ_dhjmopfU?( !'+/100/00.+*+250#$)-//.-+))()(()*-,,($( "9Q\dmrqnkkmnopppnmmlkklmoprtwz{{{zyuojklcX<8AE>6849=FJPUZ^[[[\]^`abba````ac\ZXVRSV_WONRV[ZXgkglh_\XRPTXTSPm}~z}yvrpwtoruungeedZSQPLLKKMQTVVTUWXXXWVNLJGDA?=??>===>@IFC@;45:BMYaca{l !#&)'"FƧynd^ZYTLGB@98530,)'(&&(**(&')+.11/398Wl" 1@NgqoyzhVNELdmP"/Ym\p̤xXHJTdW;GqcB=@?F;TvbHFFOP*4N:  "#&5>>1%:wDzsϼo\G?ADA:-+,+(## ! ""&'*''& !'*.37;;=?EKTgzиw\JFH@:35566777:<<>;=;>BAC??;̻dJCG>:99988852/+*+-.46;@BA=:530//146;=BEGFCAA7-*)&$% !"$$$#   "#(,#!=[lwuvuqmntzusojeb_^\XTOKIHIT[cjmnmnjg_Q>$ "(,.0221.--.22)  "'*,-/-,*((''((*+.,+'#% ,E\ejpqnkjjmnoooonmlkjjkmopstvxyyxxvsmjlk`R86@E<4515:EKQUZ]\\\]^`bcbba`__``^YWWWTVX^VPQZ_]WHFDMXPGKSPSWXQNKm}}yuqnmttqtwyupnpobZXXTNKHINTVWWWUTRQONHGEDCDFGGGFEEEEHQOMJD;:=CLXcfau׋: +"! !#&))"Jɢqklic_]YPHB=8752/-,,,+&$$#%(.2442/,0ARq+    %6ALbxro|{]ACKiw{f5 /PiÚrVB?Ke];Ci`DBEAE7JnbPKAKU,'K? + + +,;CE7,&;mɷxní}]NA>AEB:*+)($ ! !! #!$$)),))&!$(-48@B@B@BA@?BAC@A>κdJCH>::9988652/+*+,.026:>?=<;83/--/19=BFHFC@?5-*)%#"!"$$$$!  !! "#&-$ 8Ukytvwsmlprqnid^YVTPLICABFIRZeknnopeghbR6"'+/330--//0-"%*+.-.-*)''&&((*+.,*'! %4Lcgkppmkkkkllmmlkmkjjjkmorvwwvwwvvtqljlh\M65@G<23138DKRVZ]ZZ]\__cbb_`]_]_]XUUWXWVZYVV^kndT=65HVK>FTY\YLGQ^\m~{tnloursquxzxuwzvi_^\XMIEEKQWXZXUQNKKHMKHGGILOLLLLLMOQSPOOJB=@CNZehbtX!#&)( M˭medgf\YWVQJB=7630,,/153-'"!$(*2663/.5Pw݊B1   +;;9977671-.-,,.../2468997520//058<@AA@=92*%##!!!"$$%% !!! "! $,$$*4Omvwsomnnlgfd`\UPMKHEB>>CLP]`hnqqqqjihicN/ +"./22.)+.6-" +#*+*.,((((((*+..-,*&%# '>VfkkjjihhejhkkkjijiijjmnpszzyvvwwvqlijkdVH6EQZad`t̃2 $! "$$&#LȨ±~led`WRQSTQLD@975/-.38A=4,%!#%,+2741+1RXZ>'ERS001 0JX\ahZ:.>MP@ETxzuҿoZLG@:5.'!!#(),.02444265530.+)!!"&+-+*27@FFGP`yоbSHB<4--/14446=;9976660--0-/0,,-/246897521000259Zd_\[^`]WQNV[_epu}|xsjhkqpruy||{ywtojea_[SLILQTVYXYXYXXXWWWWWWVVVVVUUTTRRPONKGDBJT\ad`sX!"$$&&Oվ׿|xȨ{qmldVRNNNJEA>><:5225:>;5/)$"%,,06:C^»ӾſͣV*() #8H=/X{~s]?).LlbD ⺊hTMABV^ODOQ_PCK>0*AT_>,]zqH-A/ +5L]fb^WZSC66>FOVZdromx̷}aMGA=60'"!%)-0269;<>>6787530,+''(*)'%05HY]cmv~ytmeaZTQɳdMAE>=;9976650./1.13/--/1479;:7533331369;<:981(# ! " !"""! "$" "'"(,2Hftsssttqje][VSOMKJDDFHLT\cfjnqopqtrplmng[P8#  $+00$ + $*//.(,*,-,,-.00/,(#&;RcljhfedegfighhjjiilkmmprstyxxwutrrpoljcUD839==920-4:GPXYXW[\\]]]\\^]\[ZZZZZURTXXQJLI[yiZDI\a\[\^_\WTPQPUbtz{yrhfhnmnptwwwtttrolhf`YRNPPPNORUWXY[[\\[[ZYXXZYYYYYYWVSPNKIGGKT[_dau~+  "!#)Tݮ{rt⺔vmxkd~}}|{|xm^VRMKFCA@BA@<7567441-)%$&$'.:I^ƿŭԸv>7,(" ,>H4(V}hD$:d¿mO' ݶhZQJMY^RB?NdQ@LD608ZqF6{˸?,A4# RdeG3 !(0),Xb\MNWk«oT?@=;5,%"  !&(*/68>9510-******26:@==DPjʶwZOFB;/(&(+/038AK]ho|}qe[Tȱ`LAE?><::87751002/36300248;=>=:877774567897791(# !!"  !!! "# !"!*/2Hhwstvuurnib_\VRONMHJMPT[agllnoomosvsnmpqokS=!  #+-* %*00-),*-.-,,-...,("0EXcghfdbbdgghfghjjjimmopsttuyyyxutqpooli[G5,36:;95/,29FRZ[XV[[[\\[ZY\\[ZZZYYVTRRTVVUMHRoq]]eaY[\c^ZWXWSOP\nwyz~~unfdfjiiknqrqrsttroljc_YUTQMIGIOUXZ]][[[ZYXXWZZZYXXWUVRNLJJKMMTY^dcxe  $XǏzxqjk٢rbwerzwy{}wj]YQIC@????@<621.,*'&%$&(!&2F`|տ͸{տY9)''#'('6;A2)SvpU0.W{t[:+ /ܷm\YZZYZSF6KdO@RK::2`}J:̦\'$/+' +";F[`e_P8# *'CSPBKf˷¾ûϽjN<:994)""##"#''+.19@DGNSWXXVPKE@:62-***,-/24:>=<::87741112/378678;>ACB@><;;;<::988766:2(" !!!#! "!#"!!,11Ddstuwwurqpje`[VSPOMPTX\bhkprsqpprtwtpnqtwxk\E.! +  + ++0," $$&*//-(++./.,,,,-.-)$%9M\bdfdbaadgggehijjkjmnqrrssvzzxwvtpnnmkfS9& -3;<:4/-18FQYYWTYYZZZYXXZZZZZYYYVWVQLMU]ZOL[pzweY]ab[UTWYVRQUbnwz|}~sjdcdhgfgjmnmrsssrokiifa[VNHDDFLQWZ[\YYYYYYYY[[ZYWVURUQMLKNQTTYZ]cbwخT ! [έvrrrؖbasnzru}~}{~}vmh^RH@<:>?>;61.+($$"!%)//2;Rsðy׺ȴsmu6)*0*+.*1:;>.'Rv_?Bp}hK6=۷q_^fcQPSI2PoT:GHC<*XvI:mb3., (JgrTA& +",/)%7:>]î¼˷gN>5660)"##%$'(+/17CKQXbioqtncYPHD?5/-*()+-/08=>>DOiȲpOFB>7-%%(+148@LYpƼoaǽ«~]HCFB?=;;98842211-27;:==>?>=;98878;3(" !"!$" ! !   *//B_nvxzwvuutmjd\WTRPOSZ_eioswvxxwtvywusrruy{|kQ:)  +'34, %&(*,,,*)*./-+***+,,)# ,AS]cddcbacehgfdhijjkjmnqstttswwwwurmklkh`H*%.9;70..29FPWXURVWXXYXXWXYYZZYXXX\[RGEP[_QFNd~l\]b`VPOSWWUQPWftzzztjeddjhfgjlmmstssqnkjmjf^UIA;>BEKOTVWZZZZZZZZ[ZZYWVUSURNMMOSV[]ZZ_]qÍD \gnjѐbmЧ{t|ru{vw|}{{vm_QC93<>><730,)#"!$'.7;=CWx¹Ͽul~ѷhoA,+0,(++&8@C,JrL.*W~uX8 Nڵn`[gaGHTM4Y~]14AM?'MfOGYpt{~v[0"21(@SZQ2'14.$ !,/;`ƲfO>511-($#$%$'*/35=OZdo{wi\TOG<74/*&')-.4;>>DNfɳnMD@>6,&&(,38=DP_wξxiŻ}\HCFB?=;;98843310+05;=@DFGGGECA@??@?><:98::<<3(" !""$#  !!  +'/5Jfssw|}{vuupke`[YYWY^dimortwy|zyxyztvxxwwy{p[F4'('$ + .92! $'**(')*)*./-+*)+,-,("6JU\`bbbbcdfhgefghjkkkmnpqrrqsuuurpmjgjhg]A*8:3+,/7E1 =X6 Cn}^3+iװfWLVT>I^W@[y\34@QD,BSX[JG?Tk|Q3<7$&8<6)!'&%(:LI2!*0/9VrĮ{bL=41.+($$#!#&+17HTc{ɴ~nŹ{YGCIB?=;;9884331/)/4;<@DGGFECB@?>>?>=:889;=?<3)"!##%#  !!!!!$&$"  &1OVY[^abcdfghiffghjkkklnoqrrqppqqpnjgdigeZ< %68/'*/;?HNPOKHPQSTUVVVTUVWXWVUSUVRMKMPXLJdkhhZUPPQSQQOMVeqrsws{}qjjmnspmmorssvusrqppppqpke[VRNNORTW\]\[ZYWUTSPPQSTVWUPMHFDDEGQQNPX[qU. #"$`ehѧl~Ӟusvyzz}vwxxwqpsqpy{zuhYJA8898533- "%),2:?Wqhl{̧ƴ[C@:2.(-33B;&08"-^`/:Ԭ}^L:EH:Nh`OUgT)$'  +/+%:XT-/21;VpƯ|aM?40-+)&$! "'-3:AGeuj[M?<<92.,.,*.589=<;854///.212068>CEC@=>=<<=>@?<::;?A@@B4($"!!"!!  "#'&$#&%&-1/*$ + +Fev{js|}xtqnlhdcegmosvwuvwyxz{|{{{yyyzz{}~e_^ZQD3$-98) %(*'#%,2///00//.000-' 6LPW]\^_adgiiiiiiijjkkkklmnmmlmnmnrogbdhc\L, #9>.#3BDHKLKIHMORRQQRSTTTTTTTTUSPNNOQSXMHrwd`WVTSQPPORPRWbmtvvtsnnnnorqqppqrrmmnoqrsqppnljfdaVWTSRTX\\[YWUTSSMLLNRTTQNE?A>747;AGNTUrA  ^ǵhsիlϔ|xxyvvtursstttqpqrvyyqdUK;863331* $+/27Ng˻þ˴_`ijwF?@68//.3==.Dn}Z'MělS@.-3:I[_LRQTUGBNGO:/]oA"09GYim_L:5* ).(#;_^4-67?HhȳaJ:30/-)&&&'%'/59ALd~y`J<89=70*,+,/05:=<;8542110212156?AB><;=@BA@A4($"! !!!  "#(%#$$$  %+/00- +Ebqvot|}xurqojgfikquyz{{|{}}~~{xw{qqnh]RG=612671""'&&'*,.,.-....--//.,&9QT[_^_`bdgiiiiiiijjjkkllmnmllknjmpngdff]RD+ !7<. %4BDGJKKIHMOQRQQRSTTTTTTTTRRRRQPOOVSXq`\WUQPPNLLPNPU`jqtvtsoonoprrqpppppmmnopqrppmnljgge^ZXSQPQSVYZ[ZXUSOMLMOPPMB91/*$$)3:AKTWwԉ;  ]ƴcoբiЌt~yvttssqrsrtrqpqqstqmcWNA<8320.'#)/6AZvĽƺȾp]g˱NjoJGG>FF<78<9);gõ~_1 `ҲkR=,&+,4?@AEPbdId^5+59AIeȳdK:30/,)(''&&)17;EOjʻ~eQA<<=8/),+,,059=DYrísTC<;4**0005<<8655431300/26>??ACDDA?>?ACBAA4($#! !!! !#($!"$#! "&+02'!0Kboqrx~zussrommpsy{~~xw|uoke^YTSSRLID7$  $&+&"'160+--....--//-*$>W[ac`abcfhijiijjkklljjlmllllihkiikjefgbRC8) !6:."(4@BEHIHGHMOQRQQRSTTTTTTTTPQTVUQMJR\nýiYTUSQONMKKNMNR\emqvutopopqsrqonmmmmmnnoppnmjkiiiiifa\TPLJKQVZ]^[WTQOLLMMLI?8/($,4=HSZ~w1 _Dz\iҗb΁k{wrqrsttqrqrsqpnoooljgaZSJC=52,)#!#'/@Qo̺~kY]վĬ{XMD8CC?:::4$ =g°yc:+zĜ}ZE3++().+36MqtJ4DOcSCWbRD"$5M_bei`I+   +>b\3)5:DHcþɷiO<50.-+(&'&(+39=HRsǶlWGA@=7.(+*,,/4;?EXqírTD==6))///5=:7665411..-049>@@><>>?@BCEDB?>?BDBA@3(%#! !%'$ "$#"'+(%!&;Tgoqwz~{xwuusrswz}}~j_][XY]abeba[M7% #).0/0*%*494/--....--.,*&!C^bfgcddfhjkkjjjkkklljjmmlllkhgihhgfdeeZE1)%!36,%+5@BDGHHGFJNQQQPQSSSSSSSSSPRTUTQMJMa~²~fVOWURONLMMLKLOV_hmvutoppqrtspnlkjilmmmnnommjjhjkmmmhcZTOKKOTX[\[YWSPMLMMMIEA;1% ").6?IT\֫`& _ŰXf̎bݿ{j{qmnqtusqpqrrpnlmmjfba^\XRJB93,&! "##)6NflkgX}Ţ`K@3;5<8883#2Ppta?9ȴÍྙcM;43.0520.GtyH.CVm[EDKTR'!)@LO\mjO+  7VS3"!'4IVzq]LFA=6-'))++16:>EVoŭrSD>;5**00.5;BGTc˻}eɼgRJGICA@?>;87432//,,+/27;>>=<=>?ABCDB@=<=@BA@?2'%#!  %&%"!!##$ "%#"$8Pdprs|~zyyywvy}wdWWXZ]acgimijkcUGCDBCFHGFD>:312421..////..,*'"Gcgjjghhiklmmlkmmnnlmkkmmmlihfeffeba`a_P8#"&44,)08@BDEGGGGJLNONNOPQQQQQQQSRSSSRPONIbƿzcVM[WUQPMMMJIJLRZciutsoppqrsromjhggkkklmmnlkhhghilmmjf`[USRRUUWXY[[URONNPPMJJG?3--/9@FNV]̔L _ïWcݿfˬs|}okmqstsqqrppomkjjf`]^]\ZVNF<4,% #''.?\yiifmʴϣaJGFJ;85630#%D\r~qc]gvybMHOYdl}rZDR귓ϱuȨhE623.3?C7/?goF0D\ubI8:Z`1&&4=DWls^< *@D2($*9@GDZɽƼϿqUC820.,)((&(/5;>IX}dzxbOHC>6-'(((,05:?DUmĬrTE?;6+*1.-4:BGSa̼~f˽bOHFIB@?==:76210-/--,.15:===<=>?@AAA?;88:=@>>>2'%#!  %$%#" ""#! (--7Nfvyvt~~}{||{y|}r_SPY\_befddkhfiigehdc`aa`[XNKB:30./..////..*($ Ieillillmnpponmooopnnmmmmmlhgedcec^\[YUD/,40)*29AACEFFGGILNONNOPPPPPPPPPSRQPPPQQHcpaWO]YVQPOONIIJJNV`gtrrnoopqrpnkigfehhiklmnmkhihiikkjjjge_\ZXXVTUX\^XUQOPQQOORRLD@<:CJNRX^{=Z[cέnʴ|x|plmpstrqppnnljhfgb]XYYXWUPH?7.$ $')1Hfɻrj}tarim߰gMQTU?..1-* %H]lz[;!4QxeF((9N_x~sWTrє}Ͷwگg=255-2BL?69S`H7D\zjV:4_d0&"(3?Tin_G+!-2-,+0>DIBVƼîuZD941.,+)'')169=IX~͸}ePIE@8+%'&'+169@FSkĪqTF?<5,)/-,39AFSaͼh˿^LGEG?=<::6430//.0/0/027;>????@ABBA@>53359=<<=1'%#  $$%$# !"$#!!'3;AKbzvt~|~~}}}l]RQU]`beddbadacggghmihghffa^URJB9310--....--)&! Ifikllooprrrqpoprqqopnnnnkjhfba^ab[WUPK:*(25-'*39AABDDEFGIKNNNMNPPPPPPPPPQPPPQQRRIfycYWP]YUPOMNNIIIHKS]erqplnnoqpoljgfedefhikmomkihggefffhlllfa_]]YWWY]_\XSPOPOMSVUQMMICGNRUZac2X^bu~wwwsnnpstsqnnnnlige`]XUTSSQQMIB;/$"$)3Gfɲvf~~]gײoROLK5+-20+ )LXfyl^SJNhnVRYan|x[i|{r}ޙo|]?9?:,+;F@;5ASNAAVypd?-UP!&7JTRLA2# !"$-18DFJ@Rȳy^H:520-*))*-278;FWѻhQIFB8-&&%'+05;BERjĪqTG>=6+(/,+28>FSbοjYIDDF<:99742100/021220079>=?=?>A@A>>;1/027;<:?1'%% !! "##%" !""#$$!!%.;EQZouq~{~~~~{gWONT[`aefffdd^^bif`[Z_^^___^ZTQKHC?:6-..//..+*%  Heiklottttttsqpqqrppoonnnkjjgcb]aaYURMD6',66,%*49AABCDEFGIKPNOMNOPPPPPPPPLMNRSSRRLhjWTUS\XTQNMNOKKIIJQ\dqpmmmmoqonligeeddefgkkmmmkkjgfcabfkmkfa_^^[YXY[^_ZTPNNMLPRPLKNKDIORX[eT+ V`c}xwsrktpoprrrpmkmjjfea]ZTQONLKMJHD>3($#'*.<2 4SYfyiju|_s}ywr}σۈ]vJ??E>)!.9>=48NTG>Owsl@#D6 ,;><9740% ",5;FGH740,('%'*158:GYѼjNIGC9-'&'&+05;AESiĬqUG@?8-)/,,28=@4)$$!  $%$"#!  #&&!#*3=HP^izxwqeVRW]^]]\]Z[^abbehhfcbaacecaadeb^ZWUPJC94,))*,*-& !Eckqonryzyyvtpqrstqmllkhhjihed`_X]]RMH=5% 0B0$%(9=CA@ACEFELLOMONNNPQQQPNIGIKLMPSRLEiy_RPSU[ZXSOLMPOONJHLW`lmlmnmnoqlgdeeb`_`bdhknpmmljhecacegihb``Z__\XTTXY\^XSPOOPLJNRRLIPUVZ_iΙ9 Xcs}vzvvxqhqvsihmofihiffa`\UURNJECCEDCA>5(#*%5DMhDZզwTLe}z~ɬIBGCYpnScidpm|~^lѾqlnlδdt57\H72"*,7750=95../38=>>?3)&$! !$$%&%#! "! !!!!-6;CNW`n}ut|n^XRSY]]Z]\[ZZ\^`cefebabcdefebbdgba_^]YRKA:3.--++,'!Hgosrrw{{{ywuqprrqnmkjjgghggdd`\SY\QID93% /A.#%(9=CB@ACEEFKMNNOOMMOPOONLHFDHLMRTRJJfrYONRXZZXVPNMOOPPMIMV^hjjklmopokfdefca``acfijknmmkifba_aceb_\^[`a_[VTRVY\ZYVVSOLLMSTSQSY\_ajٵ/Yfl~tsxvsqrtmcrvsjflleefeda^[YSQNJEA==>===;3)(/->Ud|ÿجqNUolbĒΧT:G]wyzyosŷ}r}s[cx橀ɻxh46WG:6(13753/9UZB49:0   +!/2,# + #,&4:/@;6Pȵ~aL?95/)#*249I[~лfQHB?:1('&(+/69?DRhȮu[JC@:1/41-26:865653.)+23EdzݿܰɬsVuufru_2@f~z}x}Ĵ~~sd`pɳ۲kne,0JB:7,13643/6LP;(   + + -673&#(@:2@:7Kx῔;ɷcM=72-'#'038GY}ҽfPGA>90''&(+/69=BPhǯsWIC@9..31-15;?IZϿiɳvRBDMNKJKLKJHGFDA?=940)+.2579:987665430015:==<90(&# "&%%$#"! "(.5;75221/+(%+8@Qqľֶۯ˴w`~sghbj{KIk~sp~~|vjwɸƯ{gD&1?CB?50.43643>>+    ,345/'  )D<6B>;GiޭrXhƬʸcK:40,&"%-27FWxҽfPD?<8.'''),07:>CQfƮqTID>5--20-058;GW~§jȮpN@DNQNLLLKIGEA?=<;830(*-14789888643221126:=<;6/)'"!''''%#" +8EPY^ecc`_VOFn~pcZWXTWYYVSRRUUUVXY[\Z\]]\[\]c`]\[ZYXWXXXY[^`]ZTNE;.'$ +Uw~|ts{{|||yuqpqokijiebdcc``]]YYMJE4-/*$ +#39"'*9=CA@@BCCDIKKKJJKKLLJJJIHHHGFGNSPHNH@=:7512/*(#".DYhø˯۬saXnxzximxqlv}ڥr]}Źxu¡lC.&9:GNMC2(/1:;42+#%   + -2599*#+$'=96AACH]zYeӽʸbJ80.+% #+07CTsϼeOD?;5.(''),07:>CPdĭsPGB<3-+.+*/469DT|èmƼdLABJNHGHHHFDC=<::962/(),036889;;:74341247;=;95/)'! )*++)&#! "##%*/7>JTZ^abplgb_ZTOa|yh\URU\]\ZVRPQRUUVWYZZ[XZ\\[Z[\]ZXWWVUSWXYYXZ]`\[ZWOC3)"*Uw}|usyz{|{xvrqqnigihc___`^^ZXTVRM=-+.$ +57(*9=A@>?BDDEIKKLJKKIKKIIIIIIIGFFNRND@4*&-9HU^YVOLNTWQMKHIJHGKLMNMOPPT\dhfdfhfhihfedeaa``ababdeeedc`_\[ZYWXX[`]ZX[aej]QHHJJP\VUUTUX\`]cfkr}]&_ɷhX]lqswqutpklrusmjgdccccbba_\XTPHB=;<<9623/,%$$4Y~ɻ੢viJ\lxpik}ȃX{þŻuy}гqZ[|sXPQ8*>MQK/ (,;A5,"$&  !07?7-($!#&'+"1@429=HHRң־ʹbJ7/-*%"*16BQrμgOD=;6.)((*-16;?CNd«tSH@;60,*&)079:CT{Ҿpj\MA=>AC>>@BCDCC?=;:850-'),/35788;=<84332358<=:85/+( &(*+)% +069:=DJ[_dfd`]]nnjaZWZ_lsdXUUTW\`\XTSUWYXYYYYYXXUUUTSTWZVSPOPQOMRVYZXVVXRUY[VJ9.%Npy}yw{{z{zwuqpqmgehga]ZZ]\\VSNQVT=).0-55(+9>?>=?BDEGJJJJKKIJJHGGFFGHGIHIQSJ=.##*9GTTUQOMPSTNJGIIJILLLMMNOOOXaeb_`cfhjifdceaa``acbcddeedda`^\ZXVVWZ\[YVW]dlgZPLHCIWVWXZY\`e_abl|آFbѻcUaqtqtqosqmlqroica`___a`_^\[WSME?99;:96331,*),@qƾ;ղ벟{sbo|lhdv܇Mzüpu{t{];6/**&(+16:=CNduUI?::70)%*3<>?GV{Ѻq^aa[USLBD>97867766:=@BCCB@><950,'),/257759<<72002359<=:850+( !#'('"$2?GJPUWX[bh`dghfb`akol`SQ\iucWRW[ZYZXTPORVY[\\\[YWVUXWURQTY[UROOQRPNLRXYVRONIOV\ZN=1!"Ikx~|y|z{zzxtroqlfdgga\UWZZZTOKNZ[@*30 .64(+9>>=<>BEFFJJKKKJJJFFEEDEFFGHIMUSG7*! %).;HPQUROKOOUNHGGJLKMLKLLNOOLV_c_[\_fikjfdbdaa`abccdcddeedba_]ZXUUWZXXYWUYailbXTI?ERRTVWUVY^\[]l͒7" aһfZgvuoqqmqtrqrrjea___^_a^]\ZYTQLB:57::963550/05MƫźǸ̨xoak{wfvVlmƻpwuc\kb5D”wq]C/ #;7.+)&(+/4:=CNbͽxYMB=>>5,&-8BCDLZ{ηp ")),0652***.28=BDGDB?>;63))*-14546763.,.1/159<=<<9+ #((!"#%'& '9IU[^himrvxvtea[W\dgemigdWQfyxz{eWVXZ[_b^VPKINX_`[ZXWVVUTTUTRQQRUVUMFFKOPNNMOSRLIJJOQRXXF2@gw{z{{{zyzxsqorlecfbWOLRZZWNIEH``>#"$02#&18<<<<=?BEGIIGGGGGEEGGFDDEFKHGINMGB30*'-9-%% ,,,(" !# +&BXO4)8KdmV*08426KdmN6--,'! '&',.2>Kf©nPE>95-*)'&).59=BL`z`OC=@A<616AFGJUeȰud#"! !)3=A90'$#&*07=@HFDB@<73*)*-14546651,*+-.0379:997-$#"! !!"!#*5GXdihfegjmljhf^]ZY^fhgceddnxmc[VTVUSUYXTLJJOW^__ZXWVUUTTTSQPPQSUQJCCHNONNKMPNIFGINOQWYI6:`tz}}}~}|zwsqplfcd`VONQUTQLKJM_^="  *60"&07<<<<=@BEFGIGGGGEEEFEDBBDFKHFHMMHD;9418EOOPNOKIGGHIHFHLNLJLMNNMMLLHOV[^`cggedded_]^^^_``]]^_accdaa\[YXVVWWYUUWSKQ\cdcb[PIEQVQNTUVbid\awѶu&"  Vɭsomqponmmoooonmlgd`_^]]^^^\[XUQMF>7796-'+25645?YӰ}nuˬls|win첊{~thnxzpddlƿlGMxoD)%/.'*K[A,"/60% +  +,+& #*52-'(-8?'"*797G`bP0$-+)45=C>=GVpnP:0.,)"#%+*-056BLjīmPE<95.)*&'),49<@L`}òfWLFFGC>:?HLNQ^oīo^(%%!'6?>6.&" !$)19=GFEEC?95,++-15665540,))*-/2467553-'#&%$ !3ALVequpg`[_cc_ZWWXYYX\bc`Ydeh}seZSRSSTVTNKNQQNOQTX[]\ZWWVUTTTSRPOOPQRMF>>DLOOLIIKICACHLMNTYM= 2Xoy~~|ytrmjfb`\TPPONKKJOQQXP6 2<, '06;;<<>@BDFFFFFDDDDDDCA>>BFJIGHKLJGA@=;ALSTLIJGFEDDGGGILNMKNNOOLKJJFIMSY_dgbbbded_\]]]]\[XXZ[]_`a_`[ZYYVVWWXSSTPHKU^ade_SEJ`zȸo`UNNMJEDGOUW\k|ϽhX(%$!&040++,)%$%)07;BCDEEB<8/.-/368855420.../01345430+&"!'&%%*9N]hmruqg\UTZ__XSRSYZXVY^_\Xclsyog[XTRRQOMPVWRMMMLTWZZXVXXYWVVUTSSQPONNNONIA:9@IMNJFDEC>>@HLKJQXQD!   !.Pk{}yvrjie`]WRPOKHDGJRWUJ:)):A*'/5::;<>@BDEEEEECCCCCBA?;=AGIIGGIKJICDCBGOSOECDDFGFEGGHJLMMLOOOOKJHGDDCJT^df_`adfd_[\\ZZYWSRTVWZ\^]]YYYXVVWWTQRTOJIPW]bb`UA3MSLEJJLXac]]~ˋG& +S[eisuupmlnnnmkigb^[]^_\[XXUSOMIF?7562-(*09>@@CUy¼̺ѩzpr|tobdؤg]}wj|mhmǻaCP{tG14EL1#2AH@!   &&$#"/7B>/! )/'"5@=J_`N1@@.*.8F;8637JiͿpTC9554.-./15;=>HTwϾgMC<:7-(())*,267=H_zʻvk^UTUPLPRX^`gyƯx^O&#$"#*12-+.22.,,.168<=?CEC?;21/0489:5555665401234544/'! !$-:J[gnyxtohb\XY^ca[VVX[ZXX`hjf\_jxxnbXQMJKNPPMFCJVada^XRV[__[XXXWUTSRRQQNNMLLKLLE<55=FKLGB??>;<@JLJGMVSJ(  "% .Kfy|wtqhfb]YUPNKGEBFJPSN9# />@%'.489:<>@BCDEECCCCBBAA><;DP[ad^^`ced^[ZZXWUSONPQRTWYYZWWWXVVVVPMNROLKNTW[Z[S@/LPIADBBL[_\[~y7!I_jlsqokjlkkjigec]ZX[[[ZXUVRPMLHD>53420.04:?CFLaĻzlhlunochjVv}gai‘^?O~ǢpJ9:BT5#0KL*! + ,891'-;KI7! ""!&*,>JGPZN3(`uI$,;;EOYarȽ­u[E<;>=720038=?AL[̸bKA985-''('(,236A@>;31/0379954579:98112345551' ';Titvtxsle`__`cefc^ZZ[YXXar|kcdtzm`\_a_YQLJOMJHFC?;J]r{l_SX^`_]]\VTTSRQQPNNMMLKKJA:34;;;;>DMOIDITSM2# "% !,C_v{wrpgd^YWTNKGEEEGFEC<' +  5>: '.378:<>@BBCDDBBBBAA@@><<=AFGIIIHHFFBFJLORNE>;<@FHIFCEHIIIKLPPONJHFEB?A>?HW]Z\|f* Ghtstogbehiiigfca\XWXYXUURSOMJIGC>444126565>1'6DQUK?>IQF6+EP!(0J_}z{ǿȴ}cJB=AB;6547??=:86679;;971/,-046743369:85001235565*! &8Tm{|uonke_\[]^^][YXXYZPPVixhctvgr{rkcVLJKMOPOMKMG@<<@CEYn|gRV\`a_^[VTSSRQPPNNNNMLKJ?935ABBBAAAAAA@@>?>>;:;?GIEAADGHGGILOOONJHGEA?=AHRZ^\[[\]]YWVVUTRPMLKKKLNPQRQRTUSSRQKIJIKLLKMQTU]]J3:A>9>=>HV__buP#"Osuvtsld^`deegfeca\USVUURSQOKJFGED>84327:702:FVkysx~|{bckpwwwtlode}~{ӸwZVlĕ^>WL08Nh< "KJ2&,8=9/%! !%/.2:FLMIRCANQFGPs@/Oe{~rfXZoĿϽnRF>@A?=;9?DHHE@=755677531/,,/36765469961///02456;.&! !7Mkyohlif_^YYWSONNQUXYKMVowjhcds_H;>CFDQIA@DHHFA<66;ENShhTW\_a_[VVTSRRQPPOOOMMKKI>835=CED?:68:>ELSRKACOROB/$4So}~wsog]USUSLEBFJLI;(  +"59.(-1679A=>BGHC>@CGGFFHJMLNKJHGF@@?AGOW]]YXXYYVTUUTSRPMLHJJJLNOPRQSTSRQPKHHFFJJGJOTX`cO7-755=>?IZchhiic]aYSOLGFIx۪A#4[qsrrld_afdddcd`a\YUUTRPONJFDCBCC>85228>910;I`yǯ~rusw}v]_ouxunv|prrgdʧ|{Կ{\Zp^A\Q.;Xp=  I?1#  "(-)# + .;EHOSM>%7IWYV`wm.CmI;BIMTTjŭwXJ?>?@@CADKOQXlϸkQD;552*%#&$&+147=Mbzʷwnihhkrx~ŶeTE<8PLHB;62.225776657>HOOKEA8765456742/..258610453111.../256764&+CXjxyspkgdb_YWSSPLMTWXY[\IL\vt{~xgmnSDE?:;8:>>8/*(+,:<=FKP\x{kY[]]ZXWXVUUUTSPMOOLGLMLD>0.59@C;66668=CHNKEBBFKOJ9$ '#-Gct}~wrm[ZXQNPJC>AEE;+  )97)%,1468;>@AAA@@@??>>>@@?@A@CDFFGEFCBBEHLNNKGDA@BCCDDEDDFGHIIIIJKIHFCB?ACDFLUYY[\ZTRTVUSPPQQOJHHIIMNPQQQQSRPNKHHGFFCCBDJOR\bUB-/@24D=Kdhk]B3%#*.4&IŁ= !9Ocpz|kjjheb`_``__`]_][XSPNKHFA@>>>ADB95216=:66>Qn~{uuwzzz|rruwrvonzvd_qurpuwvt{~qz㳠ÂdczeAcJ7>]eK#'37$%!"&$%"!/CC?=?;55DHIHEC;:754345963002575105765610123456:71' %(("8Vjw~}~}zuo^ZUMKKICA@<0" ,<8)%+0368;=@@A@??>>>===@@@@ABCDFEDCCCCDFILMMIEBAABCCDEEFGHIJJJJIIIIGECA>@BCEJQWWXWUPORUTROPPQOKJHJJMOPQOOQPQPMLIHHGDDAAAJOQY\QA-B41<4@YdmV+ +*Ti0  *EWbkv}nhdcdda]^^^^]]]]\ZUQLIEC?<:;>?CA63536;;9h~rc]kb:$8>C@@=<;<;E@GsyvuƵlYNKJLOTY^gluĮlXE8995-$""!$(+136:H^zʵ~tmssstyzj`SJHFGG`_[WQKEB<8624468:;=?ABBB=;842122:841/0131..4888943467888>5+'+9Qe{|vi^^`c]][ZVSPOVY\\[VSRUZhw{fXfovr^_joqhejrrcE+#%.+ ")38HRVW^WNPqeXZ\][YYWZWVVUURPNNIGIMJD:.3?AB@6/5:<<>DIDEFGGGGGRB, , ,G_nwwuuuutog_ZUMIIHC@9,  + +2@9( &+0368:=?@@@>>>===<?ABDGLPYYXUTUVYUSOOOPOLLJKLNOQRNNQPQPMLKKHGDDCC?HNNSWOC2KC;=3;RarT +$%aU(" %9P\]^lwpf_^bc`[[[\\\\\][YTOKGD@;:9:;?B>64745679?Nax»}~~||{xy}qjnqpqtttriqfoz_`nmCWPBDS]WF8(/-' &%&#   ,,7<;FOOF1/>\zoK4AD4-380.069;866H@@?=;742234:740//01/,-499;;86678:;<506<><>ELDDEEDCCBK@/!  -%!(;N^hnsvvqkib^ZWRNJE@6+  + 7B8'!&+/257:=?@@@???>>>==?@ABCCCCDB@?ADGJKKKJHD@>@AABDEEFIIIIJKKLIIHFDB@??@BCEGIJTUUVVWWXSRONMNOONKMMPQSSRTTTRPMKJJGGDDCCAGKKNRNH.IKFB8:JYqS 0-'#o@"!! "  "7DTVRR^kkf_\\]\ZXYYZZ[[\YVROKIC@98779;==74443536768;??=<<>@A>;751//0357530../0/+,3789:;8768;?A@/$,AWhrolhe`^^`TUWVVTRPUY]]\WRPScz{nig_IR]faWc|{{znN)% -37=DJPUVY`\PG>KhzdZTVYZYXXYUTRRQRQPLLHFIMJD9,1>>98438<==@GMGEB?>=>?@:1& #(('(/=HRbjstmddc^\ZXRG;4!  "7=3'"'+/157:<>?@?AA@@@????@BCDDDCCB@@BEILLKJHEB?=@@ABDEFFIHGGGHIJIHFDB@?>@ACFHIHGHJMQRTSRSROMLMOOOMNOQTUUZZYWTQLJIIGGEEEEGHGFINOO%6GID93>PoR%#"%9n(!!#" #&#!  3LMOLHIS\dec^XUVYVWWXXYYZWTPMKHEB::8768::;20134237Po}zwsqnoefd^YQJF:6310.+*+.-.38604;63=A>BIOYakpvywwdblՊ]Xkòl`{t`Xm~x{̡pwZTvjyY\}}lWF<>=EK8#+,&%(.2( +G66GXXcsgiwwebaP8::3111)(#$-4=;LǷ~wvzyz|}{pbRF>81,)&$!!&,38=CNeϼu`PHIKNPW\]ZWUPHB:33,($'())_`_^ZWSOJF@ADJMKCA@BDB=90.+*+.258641////0,,1444486679=AC<.&5Obkmhdcec]YXSTSTTSRQTX[]\YVUVh|mx~pa]^]IRZ_\R_wlQ4-:0$1EGJNSVXVVMWXPB:Lpu_USUYZYYYZTRQQPQQPKLGEHMJD8*0?=65369988;<;95,!#!&))*.56AKTUPMNQSRRRJ8'  +  &791'!$'+.0569<>???BBAAA@@@?@BDEDDCDCBCDGJLLKHFC@>=?@ABDEFGHGFEEFHIIHEC@>==ABDHKKHE?AEKORRQSSQLJJMNOMORTVWX^^^ZWRMIHIHIHIJLOKHHKNON2&DLD>4:LnW,PݤX! !###""%)&" +BYSMDBBGLY_c_WRSWUVVVVVWVQNMJIHE@=<:77687:4//1/17C\|~|tni^XUSOKFEBC<4,# +  %&-6=GOX^eiZ]gbJSzl?5]³sk}h_lmd[qjeWfdpµvYa_WVWB!)1,*+'*<*0Sghv~qc[P><<<70'#$(38LŸ|}~~{_VJ?50/,(#! "!&.5;?ETmʶhQB;=?AFJONHDA>850+)&$"%'''XYZZWTRNKHFJRUVSKEAACB=80-*)*-25;9620-,,/+*-/,++0158<>??7,,@\lmjf^\`a[TSTTRRPPPPQTWXYWVV[m}puwoaXY][KSTSQIWzxvrkd^WKJJ@>KRPQSWXZ[ZOWUKA:Ms~p]URUXZZYZ[USQQPRRQKKGEHLJD6)2DA62079=CHHDA?=96579;??;2$! $()-.+""###%*,/758:4#    + +*660+!!"$'+./469<>???AAA@@@???@CEEEDCDDEFGIKLKJGDA?>=??ABDEGGIGFDDEGHIGDA?=<<@ADILLGB;;=CKRTUVTRNHHKMNOQSVX\]^]^YWRMKJKJLNPRSUOMORQKF;&%FOFC<=HeR  1fŃG!$#!#$$$# #%#"8LXQIA:79>PW]^[WUTUUUUTTTSJGFFGGCAA==:77477642,*3C[qpaXSM@94)# + +   + +   ).2==HSqqZOLasjVdúZ4&Elk\jxhvlrrfghbewj_F&'0-& J9 +5/,,*" #*19=AF^vʼkWD71369<>@@<721.,)&&#"!%''&SRUTTRONJHHNV\ZUQICBCC>:53/-.159?=:51.,+0+),,)'&*-5;?@><4,0Iespjd[V[]XTUUSRQOOPPSUXXYXXXdt{tjpun_RMOWLSMKRRczj_Z[[\SIU_VWUSSSTTTSUND??Vwl]XQTXZZZZ[VTRRQSSSJKFEHLJE4)5IE71.68>GNLB:9865679;FFA5& $%&(04) +#     +-640.!!#%(+-/469<>???@@@??>>>?@CEFEDCEEFHIJKLKIFC@?>>>?@BDFGHJHFEDFHIIGDA><<<>?CIMLFA6327ALQTWWSNIFIMPNQSWY^_[\\ZWROLLMMORTVYZTRUYTH>;)&DKCEE<A@>;87474;=9,'8Om}{iN>52/#  +  +  #29O͑U84Hi{dCS³®rYM^wûnxmi}xvg`ŧxq|taT>%#-/&!)) VN% Cjwj\W_eR@GC8>>3,(%  %9nxvutphfcc]]ZVOGDC=5/(&'&  !%.39@CHg~ػqZJ=1*,0244746/,+*((&'$##%&'&QPSSTSOKFFGKRY]\SMHFGGFE@BCA=:;=DB=82-*((+/.+''%&-59?B;1(*:Wnrmhaa^ZTSVXSTTPNMOQRUXXXX[^n}qejkaXSKEL\UOCC]fxksd[XWY`cZXSMNV]ZUOLID>E^|yl_VRQVZZVSUXWTRRQQQONMIINPG;.-6DA2-3>?BGJF<31465249?FGE=/""$&+-/.-,   + +'381'$$$%'*-/569<>>>>>>===>??BCDEFGFFBCEHJKLLLIEA>==>??@ACDEEGFEEGGFEEB?;:;=>CABGKKE?1+)08BMVSROIFFHIIKOQUY]`a``^ZURPSTUY[\]\\UPNSOC9B3FTDKJB?@0 ?4#%* !##$$&&"%#!$(>MNIE>1' ")=IV_`[TONOPQQPOMHGGD><>?@=?=:636<==8-*EfulrjUF-&  !FnT1<:?xtKLzǹ½ý{klcju¸{sjWYAQW0%2#&/,*, =E%WF@afQ7+(' &FGF>2% "$&*,0112   + + +)382)$$$%'*-/579<=>>>>>===>?@BCDEFGFFCDFIKLLLKHD@>===??@ABDEEGEEFGHGEDA>;:;=>BACGKJC<.(%+3:89;;<==;745:;>>:#%;2!'  +*;"0RH*  +2NQ;)& %$+>C=?6)  !AywiaZWTOJGFCCAA?<841+(&#!"! !$%$139<@DRbzȶeJ:0(! #$&%'(./00/0.---,,+***]\\\[XTPEB@@CFHF?977:<==@CEGGGIKFB:1*%"!###! (28<=826EYdaZ]dceaUHFO[PQRQNMNPTWZXXVY\twmgiga]WOG\h^PAEk}|fSWhhj~{aVTRUVXWTOJHEBFVstf[SQRUYYVTTVUSQPPPPOLLHHMND8*,274.4?GGD?7323037:;;=>CEE@5)  $&)+-/246$  +  "+372*%$%%(*-/579<=>>=>====>?@BCDEFGFFDFHJLLLKIFC?=<<=>?@ABCDEFEEFHIHFB@=::;=?BCEIKH@9+&!%-6?HRSQPMJHGGIMOSW]`deeeb^ZYXXY[]^][[WSQQLE><) 9MIPPA1! )_ޜO!$'$!##$$$$$&" &:KNG985/%.6?GMPSUVUSQNKIHC?<843578:;<;846:;=CIOd||mhXG>20.#  + +  +  4[p;126DPpiSh¾ƺq_MhkM?BCDDEE?:2*#  &19<;97?PadYOQY`dcWHBKVOPRQONNOUXZYWVX[wtkojhb`\TK`qi[LNx|i\ttZ]XYWVTTTJEEDL_}sdYSPRUXXVTTUSQOOOPONKKGHLLA5+.33/0:EMF<3/0363469======>?@ABCDEFGFFFHJLMLKJFD@=;;<=>??ABCDDEDEGIJHF?>;99;>@CEHKKE<5+$")08@LOPPNLHHFGKMQTZ^^``a`]\XXWWY[ZYXVY\XQIHG7 1HLSRC(  !=uv=!&#"%!!##$$$##"   3EPLA4540)!%)-29BLSSTUVSOJGA=71/./237;==968@ABKVbqxf]KB:+   +  +",:NayԜZ%$<75Kw\Mǹph]oN4cmA&:mqN,*31>OH6' + +"BeJ + +-=@>3& +"%(:?E>54+#' $Hηp`NB<7630..-.-*+*)*)(#"! !"$(&#$%*0389>CKWj}˼lS;-*&"!%.///258;::===>>>a`___\[VTOFA==<:767789;<==>?>=:8.*$"-45336ER][QHHJX^b[MEHKMPQQONOOUXZYWVX[yuoxrlgd_YSfzxoaawktjZVW[ZUTULHGGTjrcXROPRTUTSRRQOMNMONMJJFGKJ?1-351/5?GNA1*.5::8535=7-" $---,,./1-" &'!  +(-/0.*'''(*-0278:<===<<<<=>?@ABCDEFGFFGIKMMKIHCA>;::;<>>?@ACCDDDDGIIFD=;989;?AEGJLIB82*$!%(-39FJPRPNMKFHLNQSWZ[[\^^\\YVUUVYXWTT^hdXMMQ.*EPVS?"  %+VR-(* "#!!###!+GEJPUUQJF?;6/+*+,.37:<;9:DBEF;6* Oh 03/&&0/2<;950,!"$-1-(+3HRXUNJGEPV\]UNFCLOQQPOOORWZXXVY\||z}tnh`]]mzysr̳̾YQU_`XQQQMJM^wwg[TQQRSTTSRQONLLLNNMIIFFIH<.07833;BCF9+*4=@>:403?ABBCDEFGFFHILMMJGEA?<:99;<=>?@ABCDCCDFHGC@;9778;?BFHJID<3.*%#(*+/3>CJOPPPOHHLLNPSVYY]^a`^\WVVWYXWWXfpl_TPT' &APSK7 ++9sŀ2).*"!!#!!%7DJI>1./231,$!!+38?HPSQKG?;4-+''%),0688:>GFIYprYD.%%%(*(  + + /-##-5PrҌ7$'121Ffsnan~hyxY^sĤf4Mrm8-bQ/7d{jYRSL>5(,%%" Ll%  4EE;252)5U]NB0  !),+,*)&%%/_ŵ}bNB7-&" !%',+-+(*,29>CMYdrʽpO9'#$!&+-,-/5:>>>gec``\ZVLF;5/.-**+/1247:><974/'""*/0-,-33*!%/IRWSONLIJLQY\VH>KNQRQOMOQVYXXWZ]~si`aesz¸ͱn_Z_`UOPTRPUj}l_WTQQRSTSRPNLKLLMMLHHEFHG:,19:57AA:72/3=CB>82.3>GIG:99971("")-0/./0//50((/41% + &241000+++,.14679;<==<;<<<=>@ABBCDEFGFFGILMLIEB?=:888:;==>@ABCCCCDEFD@=98668<@BEFGD>5-))%%*.-+-06?FHKNMIILKLMQSVW[]aa_][YYZ]\[[^fnmeVJE!>OP>( %2'Jߞ[0.' !!!$3DJIA7-)),//*&!)/8@EECC>92,'%!"%)/379?HIM^zybN7$"*))+,,%%$""  +     *-).<;9=dۚ># )*+;AI\niJ\ecbMmeJRvͤe6]c9;ZsZGH]le[RLNJ?;6;9>?0?y[% + +vhK+ "+22555321,PÿƴpTB;0($"%)/,00/04:@DLXgu³z^C0##$"'+,,/137;>?@BDFGHljec_]XTH@7.+))% $)-.159<9641+"#,6<=:87<7*#.HSYTPPQOHEIT]ZK60.5AIHD;::::5-' $(35310/++0.) ++472# )673222---.035789;<==<;;;<<>@ABBCDEFGFFGIKMKHCA><:878:;==>?ABCCCCCEEC>:87668<@CDED@90)%&#&*.*)*&+5EMV]l|ξmR<,"$$#(,.02589<@CGLQVZ\gfdec`ZUL@5...,&++-0379:A@=83.*'"""!""#$',028@ED>AG@2&(1P\\QKQWTG?>IW\QDKLMNQPPOTUVZYU[awldivs`\WIIS[WZjseZTPRSTX[VMHHIIJJKKEJJEHJ>+3557>B7) .>GF?85./4>GJHC547@ABBBDEDDDGIIKLLJGCA;975579;;<=?ACDEEEEECA>=433369=?DDC>5,&"!$()***+ "2AHIHHLOLFDINQUZ[^`ba[`bbclpolcVOSN5 5M>* +!47'(UK)#($!##%""" 2ELC:1+0.-+,+)$! "(+.2+"$ %('.8@HP\m§scJ/! ',0-(&%$+('%%#  + +  + + + -117@=0=Zl,!"&AVuF#PWP|VSZzqdn}w^^d\PRZb`XUZUZ]\anwtvyw|tJ*59.31  + !! +JknQ1  +*8AEGIBG\zþzTG4)&# !$'*,.10//13128<>CLU\amyͻ`G1+% "&)/389?@FEB?:51./.-,++,,1589=CEBDGKG9-0:W`^QJQWUJ?9>KSPJOOPPPOOOPRWYYW[aynhgse{j]YUKEG`_bsre]XQSSSVYVLIIIHHHHHDIIEHJ>-+168;;1%(4BIF=40/17@HIE?545:A?7- %((-../010.3560% + "/64+ .851341,-.13689;;;;;;;;<==?@ABCCDEEDEGIJKLLJFB@:86558:<<<>?ABDDDDCB@=;932246:>@BBA;3*$! "&())++*:CHJHEEEFGHHINV[^bgi]befiquumaRLLD$ 7R<(83*5e͒<('%""$$$!!5BC:5/+10/,,+&! %/.%*"#&+27>HQawƭrgN5&$'.283.,,+'%$""   29:48AC<=OٚH  !4]D8HS}NBTlzn\UPFILQXbm{~z}wYA=+*/ +   "02;P^U4&5AILOKTkɸjF;.%#! + + !$(-04787788868?ELQ[gryʷzZD1+# "$,06:@FMPZeq{eeeeb]XSKFB@@CHIGEEFFFFFIHFD@;74653111237<>=?CB=AFLH=38B^d_RKPVVNB63GJC9/*14;CIGB;4249@?8/  '))---.010/3674+  !.:<2 &163253,../1368:;;;;;;;;=>?@ABCCCEFEEEHJJKKJHEA?876569<><=>?ABCDCBA?<96511247;?AAA>80'" !$')+,,%3DOTKCCIOQORW]^\\``fhjlnrsreZMGD79X8 +$$,943N١_.!(*%!!##"  +,@Pijbotz}xnggm^]hjnsr~f[^\XN>0$,0 ++=PZUE3($AJV_YA !#'6AEKNa~ĿîpY=4.'" $&),048;?>?ADECEPXbhtǵtS<0+%  #,16>JV`er~edeec_WQLLKIJKPTMKLHIEFDEBC><642--.-00448:>:<;;5:?JH>48B`b]SMPTSPD7/3>LUTROLMMNORQTVZZclyz~gd~su}p`XUUVURPRUSJKHFDA>=;:>?>@?6+*3:70-04DGIE=3,)05=FJG@95337>=7. +  #*++--,-01102463,# !# -=C6,352482(//01369:<<<<<<<?ABCCCB@=:64201258<@BA@=6-&"  "&*,,,$  ;O[QHEJQUVX]a`[Y]`qqqookheXRJD<) 8V0 &)2<;Bnz7'('*#! ""! 3??4-3/-11/.,*$  + &*(3Mkz~tmY=)%+,2860..,%##  "$!    + +/;=;=?>;:7833..-+,0279>=AAB;965.5;98:<>>@?7/144/')5BOLF=5.++/5?HKG@:7425;;5-  "%'-.-..,-/1102452,$!!!-@G8 1552593&1111369;<<<<<<<@=>>?ABBCDC@<953201369=@BB@<5,%"!!%*,,*& +=KMOOOOPQPV]`bfmsvqpnle]YRPJ?. 3J(#)/:DDR]#&+#'"  "!!  "4>;1/71,/1/-+*%   &+@^otsxxq^@($)+3860/-+('&##  $'*#   $3;=BIMXrr/4-& $,.,:9Ms}ypQ 2@TTKYhekhgpysY@$!$6A3-2) +93&'$*EqѼh,)"*?^zy\3 &*-Dhþ̹_F72.'#.237;BJNTZ`goty~ǶqN:2+& %08EWlaacec`WRLIIGGFFFA>>984300--*,+/06:>CGJKLMMH?851+5>IKD;@HXXYUOMLIHB=75:CINMMLMNQRWSRTW\jwpe|xy{yfWPNOQROMORNGECA?<976;;:6678:<>?>>?@@ABBDB?;85331247:=?@B@;2*$!!  $*,+(!!3@R\ZSONRU[ahov{rmllj_VROJA4 + .9%!)-1;GQM_јD),"'! ""! '58611:4,/0/,*)$  "2Mmuslgp~yq_?%!).7<:41/++)(%%#!  &+)" +   )26,#%*0/27Ii~~u~X/$':DQNCLTNKRa~ȢuĬU5%#'#"+/8?*1RVM?MMMMNNNNPNORUYertkekuqy{scWQOPNPONPSNEA>=;975478;??<851+(*-2>JJD;3.--.4:CIHC=92/-19<93% +"(+-.21/21.,-./.122/)# !%$!0FI6 +$4872594(542247:=========DDDDEEEFFHIHHHKMLJHEA=:86789:<=>>>?@@ABBB@=964332358;=>?A>8/'! " $*,*&  2IX\YXY__`elrvtogfhh^SOK?-  **+(&3===EOVTjp,((#*  !""" /841.092+220/,+%    +.Keyzunq~yo^@%",17>=60.+,'%%&%%#  + '.'!  +   $  )5DTdpufgqodS;9:::9MNNNONMLIHLQTXbkwkjgpufnmsttopploy~{zm_UPOOLNONQSNE?<;:8755447;<8530)(08EIG@;7/,+/9=<7' +%+.0031/42.,-..--..+&! $#0FH4 +%3883494*643247;=========DEEEEEFFGHIIHIKMLJHD@<987889;<==>??@@AABA?;853323469;=>>@<6-$# $)+)%% +"4CNU]bb`_dnuwvphejg\PKF3  1("*2ALIELSW\uT&##.  !##" %5<10+.70,4421-*#   '?Uqyxttvn]?##/18>;3-,'(%!!#$&&   */+&  - $3DTamwr\Y^PAAC>95,+/67+5?Ki~z{~{{q\PMB?B>=GD95>H[v̿lH6+;A7&*f}xL'0Oxw/'*D\V9  $)C~ſνhO;.% #'08AFO_rƹqP@3*%)3@Yy^^_becZTNG@>AB<4966543328768;>?AJIJJID>9/-'  # '@b\TOLHE?==??>951GLPKGFFFGGKQU]l|us}ucU_fstnc^Z\_jpvxyxxqg[SNMMPONNMJEA=:86433399:>@:/%$%+9GLF?51/10/04??>>>?@@FFFGGHHHIIIIJJLLJHEA=;989:;=>?@@???BDDB@=<:86421359>@:0' "!"%**($ + *C[ca_agpx|zwkia[Z[PD6&57,,:GLEBEHET{!'++$+"  """ 0@B1&%/4+*-00.+)&""!'*&#$&>`mn}yj^E+(037<:521,&&%%"!    #-1,*  ) '0@TequtgUKNKA<;+$-1.183,38@_~zy|}thb]RE><;;>@BECHKOWdwйWA>7I^C :[/!C{Ǯs$%""'37, 4l¿νfI5'!!%(1=GPatǶtS?2*$ "%-8HgbaacdaXRG?6342.''%'%(&(&*'))/.0//00/.+&"  +#=f^WQNJFA>>@@?951DIMHEEEDGDHPW^js{wusw}|{~~ti^XWkorkaYUSRXbkrvvvqkbYRNNNPNMMLID?:986443379<@@9-##'0@MNE;/,-02026?DIID;4/+*+.69:7' "()..-//024343100001/*%!$8B>-  + )6:94131+66557:=???>>??@AFFFGGHHHIIIIJJKLJHD@=:989:<=??@@??@BDDB?=<:8542246:=??>=>8/&"!"&**'#  +3M]bjknqssolid\QOME8&25-26:>=>?CEmj'/",#("  """ #5BB.$#,.)&)++*+*'$#%$"! !""$$##&*()*+-"') -Uuylkpzuj^E)&106::8641,,-+*%!  !,3721'  + $ (2BS`db]SJFIG;65$ +20171(049W~{{~~uia[QE9798;;>?AEGJQYepԶP<;1)" $'05*%&,8FPNC8*()/2259CFIHA71,++,/5897)&./..-/.014343211222/*$'?@@@@?@BDDA?<;97543357;>??=<;5,$#"#&**'" + !:Rcoruurnjic^UKF>1$01+31/4>EDIVլP'2&+!$"  """ (:C>'$&" %#$'')'&%)*('(*-.,,-0220+'&**,*()''! (Lgokkjo{qi[B(&0-4:::<;977963/+("%+4:=:91# +   ")1?MSRKDBADG?325" -40/4-$.00Ky~~~|{|ujaYOD56:9769=?CEHIPU]]ct׻V>9E\kC.dkR2!7bͷ|)84($#AzʻeL7*&#"$*.8IXh}ǵpQ;0(! $)4@[zgeccdb\WKB7112321/1/1020/++(' .EUga]VRMJFDCDC?951>BDBCEEACBISXXSSq|m^\gs|}qcWW]\QEFKQROJGEKNW_db_]VSOKIHIJKIGFEC?:8654333338>@<5.).3?@???@ABCFFFGGHHHIJJJKJJJGEA>;:::;<>?@@@@@@@BCCA>;:86444469<:82*!#"#'**%  #=Vgmssme`]YVPH?/  .+(32*2ITQXkǂ9&1'*"""  !###!!*;?7  !"%$$$%%$%(-14112441,&   %'!)9N^elurq~shfZ@('0+2:<=ACBB@CB@:63-+()+/10../369=@><8+   !'%,08><=DLOMGB>AFB9-1:)'25-,.(,-*?k~}}~}|sibXKA59<:5358BACDGIOSQX_foȣw[LUfn@#G?1'0Tƴ})<8*- ! )\¿ɹeL9-((%# $',19M]rǵpP;/%!!'+8Fbdaabeea]SLEACINPPNOKLHIGEAA<;4/++'$"!#!&#)/2**)3467;IYbea]WRMKFEDCA>963;?DCDFC@<CFHGGHPQVXWPIGMLIGFFFGIGDCB@=87543334459==:50.47;?@=950*')-19ADEEA:2.,+,.04687-$#+23..-.-./22432233351+$5IF8+'#$%  (2765541//7789;=>?@@@@ABDEFFFGGHHHIJKKKJIIFD@<:9:;=>?@AAA@A@@BCC@>:96434458:>AA>;85/' $#$(+)$  &?V_jokc[UXNE8+ &313>B8A[e\bzX+$,#&%#"  !###!!)77, "%)+&&'()'" 1>8 4OZ`_izzx{ypfadX?('1+/7:>CGEDEHHHEBB@>=@AAA@A?==<<=@><8-  /:9;CKOSVRNIGHHGE?CD<0(0=6288+%'$(,+9Z|}}~}unf_SF=:=?<6227A?<>BGLPUXVKABP`zu|wF!.$&4Ntw'73(7,# # $&D¾ɺfM:0,+(%"$&),3=Qf~ȳnM:-&  $)-9<;><@;BHJ>;;FHJHMV_a`^\WRMKIGDB><887:?EFHHB<556/-+*-/135781*##)-11..-.-..13432112240*# !;OG5**($% -685576101789:<>??@@@ABCEFFFFGGHHHIJKLLJIGEB>:99:<>?@AAAAAAAABCC@=985334569962.&$$%)+)#  #6BR`ggc`Q@/ *4ABGU\OUilbkݖ9%$'"$'#"  "$$$"" '2/#  !FVO( 7Ubd]cu{x~zwncbg[@('-*.69>><91% >NNQTUVWTRI>64455;??8-(-5;8=7'!# $*,3Ee}|~wpid\OD:=>>;7546?<99?DJLLIDCGJMU]k}źM',/9Srp(0,+62-'%'&'kʻgK;31.,)$!%(+.4>ZodzmK9-%#')0ASseaabehge^ZVVZcmsqpnkhecb`_]^__]][XVRUUWUXQU[\PMOXYVRV_c`]\[WQOMMHD?;98898>CFJI@725C\yqc_luzvolf^chkd\W]dlga_ahmrywpi_SJEMNMKIGEDFC@>=;9532222355668:80$&1750+)2.-158>EIHD<3+)(*-01347860++/010./-.--.0343100001-&  ">RH4***$$ 299659721378:;=>??@@AACDFGFFFGGHHHIJLLLJHGDA=989;851-% $$&),)" + $3COSQM6' *5CCDDEGHLOPVTTROF<5>==;::==>=<6, +$I\\YUQNJEA;3-(''&06<:60-+66;8( !! '004Qu~~vkec[MB:<;987989A?=>BEFENHDFJLGIBM\mưQ(CW`vl,)(..//+# '""&1O˼gK:441.+&#")*+.6@_wƳmL7-$$)+3FXwfcabehgga^ZZ`gpuutroliedgdddeeddb_\[\]``ha`ge\Z`fe_XZchcYY\XSPRRJE?9779;6=CIKK@58@Surmnv~ygf`WTU[bgfedglquv}ulaVNIRRPNLGFEEB?>><:875534556568:9- .87/'#.,/6:<@FMJD;1)&%*-1133787301320/./-..--05431/////+$ "@UI2(**%$ #5;:66:931578:<>???@@ABCEFHFFHGIHJHKJNMNJJFE@>998==B@CBDBCABAABCB?=86422468<=BCB>841,%!%%&*,)" +  + ")*$    +  -54633=B=CQW^{]##+##$%("  "$$" (/' +   .BdkF(*9CUge`jtw}{~yvvokkqbA&"%',146<@ABBBEFJOPOPONG9ERMFC?AIf|mkrsnt|zlkZMOSYeV]gjloxufZSPZWSROGB;4=79C?1.8;5384% +/60&"",-038>DILD:1+''%)*++.168;631.,**0241.,.0796216630,% JRH7',,/#,9>;64775498;>@@@BCDEFGGGGFIIJILKNMOMOLMJJGFB@;<;?>DACACBEDBCCCB?<942135888<=AAA=72+&"&(**(%       +  )19>>:54@AGZhkցN*,*%"&&"#! ! !""###! ,3)  +   %)'!7+''*( $/,&3Nyxmic[SKC;:8769>EJQOPXZTI@?KEAG?9FLPRPQVfrƾQ)%=r^-%!*-&!!NýĪqU<)')% !&&'3EaŲyY@.*(&##" #((,7GWn`dgfilmi_URW\^fppomkhgecdgjkljigedb`bbbccddefdbaccb`\^`c_]\XSOPQRPKGA>;9=:FMMLKCIRrt\N[`mfjotz{yv}|jSOMKKQWaejo|uh\XTUUVVRNJH7;?BCDB?;:?FA3*,7;<5* (45,$!#-/149>DHHA6,'$%$*+++.0567420.,**1332--/4696247950,&  IRJ9(..1& /9?;64775469<>@@@BDDEFGGGGFKKKKLMNOOOONMLJIFD@>=>?ADDCCDEEDDCCCA>;:43236898=>@CA=73+%!'(***%  +   +#.##(.28=HPRRQSZ]eu[7 +-+&$'(##! !  !#$$$!#38- +   "),+'>TYYX]hijfimroillg_^fmadxE*" (.26=@A><<=?DFE=61)4>NVWVVT]hsr`J6+' (BUXUKEA?=<;;;;79?CD@;8?DD=0&#$** ':cyyrmbWQI@:9:<=BBDFMRSUSQRRMI?=>?ACA>92//=E:)-262)$%)0025:?DGC;0&"!$$+,,,-/23410.-,++2210,-0557514872-*$!! EPJ:*0/1'"09><74764469?@BEDDDDEFEDBCB@>;:54347999=>@BA=72)# "'(**)% +  + +$.7-&,6<>AEJSZ]_dhhmrB'&,.,'$'($#! !  "###!-;:899<<==<5-'"*5FPTRPN\jxxfO:.6,&*ATUSLGDB=76434467;=A@>?EIHA;8/$#%%/0%"*Pi}yo_SKB;759BKYbkqotpeTJIIUKGD>DLJ@CIOVWXX]jź_+;}|Y.%*(!%7zȳüǮvY>)%'%  #$)3Dcƴ}^D1+*('$#!"&*),3>M^vchlmnppk\QMT[^hqoonkjhighhjllkkjjihghgffdb_\]]_a^_`cab``\[[XSQOPSSTTNGA=9>EDGTS?FinNJ[_q~wvtqnwoaipeZQRUX\blr~|xnbWPI_WMFB;64CBEEA<=@LH>69AC@-4@D6$"233/)(,112376+" $&+,-,--000.-,,-,,10.,*-05342/3750*&!"DQK=+/.0'%29><7478437:@B@<61(" $'(**)$    &25,'0>CHNKB;90$.--3H[n{~mZLB:54CHSbuiTNRSPMXS88LO@?EMVWVS]fuf9'GFFRP+.),$&2;>=8678657:=@AABCEEFGHHHHGLLLLMNOPOOOMLJHFCBBAABCDFFEEFGHFDBA@>=;:76569;<;??AB?;4/% "%')*)(#   +%.2+*3>BCBHGGFHINT\mu}q3()+)$"%&!" !! ####%%%# #.3-#  +     +,<>IVXU_rxuqtwrnnabgha^jryb5&.()01//3433799764----//.)%/ADDE@DRdh]TSZM>6520.@IIHNOCPiW]RDh{~}wonrjdrwwxqnmmkhd`XWVUWUQMA@FT_c\SA?@B>67C@JTVQF<3K5.88'%21/-*)*,-01594-$!&(*+,,,+,,+)*+-/12-+)*+.0332/-03.&!CQO?++(*# )5=@=8688556:=@AABDEFFGHIIHHLLLLMNPPPOOMKIGFBBBBCDEFGGFFGGHGEBA?=<;:9768:===AABB>92,##%')*)(#  +  %+.*,5<==>A?=:;FIIC@@@=B??<=>@BA@?ABDBA@TpuZC82-&-9RogPE@98<7=GLJA709Vy^SIGF@AA8C?AELQQOMPXbqöeF=>R|fI2 %*)#  N­{s~ʳ{]B-(+($#(*2=VjʺeK3,+)'$#!#%&')*,1OizR82IE=3($(21.)'(*,--05>DC:3.(!!&'(*,,,+,+)()+.135.,*,.223650.14-$CRPC--'%  ,8=?>8689657;=@BBBDEFGHHIIHHMLLMMOPQPOOMKHFEBBBCDEFFHGGGGHIHEB@>=<;::878;=>=CCCB>8/)!!$&()*)("    $)-..4;=;:;B?<866=CC^lsp?4!.)+)$!%%!!!!!!$$$#%$$"",2,"    $  ,?9D_meev~|yxphluj_[\VZx^B1!!+*-/33112534667520-148AFB9-! -4>?9,"#+3/*(18FHHA=?@>>=<::9:;DDA@AGLSkvvbNIJKC=1'-8>:/7Ldvz~z_IA?:;>AFPVTJ?;JX_^h}reODIG>9A?BEHLLLLKOT[m|G.4C]lQ;'*(" 4kæ{}¿˴|^B-*,($%*+/:M]oz~˺fL4-+(&#!!#$%%''%*0446778<;:;:9764ehgeflonZMIR^ckrqpnkgddcbbdgkmqpkiihifcb_bfkqstrlhcceeb_XX[ZWUTTWWYZWRMKIDJOILZb~_as]Bi}|{xr__~ħqv|h]ZPSdtuzsjTLD@CJQTWPD64@XmzN>Jię^@?@QR7!!**0+%#&,/1,.6?EC9/*% %&')++,+,+)'),/246.,,/2444972/35.# ARRD//)#!-:?@>9689657;=@BBBDFFGHIIIIHMMMMNOPQPONMKHFEABBCEFGGHHGGGHIHEB@><;;;:989<>>>DDCB=7.(#%&()*)'"   !(.146>DB==AOLFA;;>CJdruN6D*)*,*%"&&"!!!!!###"$##!#-3* +   !&'%! *;2>awqkw{{ywlahus_TRS[~N2&$6(,.3443583355631/269@DC><=;:999BCCAAHZho8 ) +=GD:?LZejxpU@;:57>=@FILKHIGWTD@Y|jQOG>H?ACFHIGHFCEJQ`{o8'6MksWC&'*&"###((Lɮxv̵}^E.*,*$ &)).6DS_iu~{xtqkfafc``erͻiM4-,)'#"!"%$%$!#())*+++..00/.--+beecgmnk^ROZipnjnmlifbaa^_bdgkmmdba`cdfghgjs||xrhd`^bded[YZXWWYYXXVURPMLMIIENKM{`WwlRlxyxyv\]izԮcgsstoc_hyuu{xpZQFBDHIILD=9@N\ewmÝjP>HL>(%/3,$#',..(2>DB<51&$! %''()*---+*()-25660//3564357421/& +3PTG6+#"!2=879=?AAAACEGHIJJJJINNNNNNNNQPOMKHEDCCEFGHHGJIIIIJKJFB@=<;;;;;<=?@AADDC@92+'!#%&,+)('"  (25<=BGGBBEY^`[X\adlt{|̉:$E?%++++('&#$!   !"#&&&$ "33" + + !&<5Bctlix|qvvc`kiidWKXurC$'('-13004894321012315=CGD=75887/' %(%(/7FLQMGCBA@<:9=ABDFB@??Jo^?<:(!02/)+3:;1;LZeow{ZLBAD?<;89AMZcm{hC>@D7&%03.(&(,/018AD@7/*%$"!!"&'&')*-..,*(*.3654///34533352/,* 3OTG8.'""2=97:=?AAABDFGHIJJJJINNNNNNNNPPNLJGEDEEGHIIIIJIIIJJKJFB@=<;;<;<<>?@AADDC?81+' #%'(,+)('! + (26==@DEABFYagikooloyh1'?9.+,,-*)'$%"! ""#$&&&$ !32"  + + +$):08]un`brorrjgc[ZSILhW1")***.31/59:32100146<=ADHGCA?BB@8."  $$"$.6ELPKFFFC39AGIIED>??>Kc~bL:30)&'2450.4::4>KWclx}sRC:9=;=?;;;=??BCFBGWXF::VT9JRDABDIJFCD;;@DGUki_nv[8#&),)!"6wжý˺`F1*('$#')-.59>BGIJDDCBCBAACB@=;85544459@IPaxѾoR80,('#! !##%#"! #$$&%#"`dgfhmpmd[Ycprmiggfda^]]]]__abdb^\\]adfhoqty~|ul\UQVahjgd^YX[\[WWUSPNKJIG>CGRITiDLmw}spv}{leff]knXkKSonqlijs~}pjmlnsuqjb\UPJHHGCAOJDBGS`hgei{Ťe`]?3A>(#321.+*,048=BB<3)$######&&%&(*-..,('*/3531//033422674/+% 1KRG9.*"#4=@@>;;>?;::>?ABBBDFHHIJJJJJNNNNNNNNOOMKHFDCGHIJKKKJIJJJKKKJFC@><;<<<<=>?AABDDB>71+' "%')*,+)'&!  +   ++9?D?>?@=<@Waluyvmchp~߅D*-937+-.0-,*&&#"!""""$$$%'''%!!1.    $-5,2Ulk^\kqjhoi\TYPJTzf8#*--'+1/.48:2100258:BAAACDDEGLMLE;1* #.6FLOJFGHGJMOMGC@B94:Zt?>?9/*,.+).41/058;?IVcn{dE:338:>ACBBABABD@HQWSIDE9KZIRIEADFIJFAA95;@AIWɽlH# (.,%"I|ľͼbG1('&#!$'('+-/1211.0//000/1/-,+)((*)**.26;K`пpU:2-)'$ ""$#  ! ! ]cgghlolf`_hqpkhggfca^^[[[]_``b`][[]aehjmpstwtkaSKJSclnid]WW[^]YZWSQMKIIJ=BJQFRjDFlwqnrupc[ZX`ʼnqcj}wsqnqtpdWLGFFEGIIEAFEEFMYfoh^Xg͒_IETU1/1((20230,-28<>@?90(# !"#$#$#$&')-..,&%(-230-00233212794,% + + .GME8.+"&6?@?>;;>@<;=@@BCBCEGHIJJKKJJOOOOOOOOONLIGFDDHIJKKKKKIJJKKLKIGC@><<<<<=>?@ABCDCA=60*' !!#%()*,+)'&     0BMOE=97315O]joogZOSXmg4*1709-.120.,('$#"$$$$''&&((((%#" !/+   #-.)3Leigihug[ihZVUTUa}sI &*+,'-0-,156000158=<=>>?7;>=;51.("# %08DIKHFKONNMJHECBAFGSmc79<;60++)")331138>BKVfs}yX:3116:<@CCDCDCDCHMOHDFNQ41tsgTJHCEFJJFB?538==@HfҾ}[6!*($)YģſͽbE0(&#  ##!"%&%$#$')))))++,,+'&%$$&'(*.113BUrsX;4-)&" ! "#!Y`fgilmkgcfmqmhggffca_^^\\_`adgc^\\^behjjoqnmjbVJCGRdnnjbZTU[_`]\XTQMLJJK=AIPEQqFO||snihe^VPP>Rʰlg{~|vwvn_OC>=>?BCCAA@CHMR\gnf\YkʌGBF@Zvm=%%-.,/363//5;A@>;5-&! """"!%&'),--+""&+/0-+12453213683)  +   + -@IB5+)!&8?@?>;=A@=>>AACDCDFHHIJKKKKJOOOOOOOOOMKIGFEEHIJKKKJJIJKLMLLIGCA>=<<==>?@ABCDDC@<4.*' ! #%')*,+)'%  + + +!3HTVG920--/FWfg_TNIGMgĈO3,2:2501231/-*)&%$&&''+*('(()))(&$""".'     .+$)Fhvplcqg]f_SVLYiszrS0$++*)*/1,),///01488)"'*0995239?@IYlzgI34879;;<=<>=>=>>KID85=BD4SnrS<- +!8mͽaD1&#"!"###$&&,*)'%" ""&*03145.)&#  " T]efhjjigdgmniffgiffcba_^^acfgihc^^^bdfhhnngdb[OA?EUgonh^XTTY]`_^ZURMLKKH>BEPGRm9Jxpkc\TLGGICMnģnbtuw~}zxsj]PFC??<<::;=?GMSUY_ci[Q[xӍ>D[UWUlmH(&23(/155338=FC=81*" ! "!&&(),,,)! #(-0.-357732149:6)! +    *:C>3*)!):@@>=;>AA=??BBDDDEGHIIJKLLKKPPPPPPPPPNKIGFGGJJKKKKJJIJLMNMLIGDA?====>??ABCDDDB?:3-)' !!#&(*+-+)'%   + + 2FPTA/'('*-6K]`ZXY[^b{S84/1>4034330/.+*''&(()*.,*())**++)'&%#!#.%  +#($+(AtlhjfccXOQXjvS0$)-+(',11+&())+-159<@A;74.+$"&))*&$!"&,)$"&*!#1=CDHLLPUURUNJJS^imq{yU47MG<8=8("(24772,+2;=FVoyU;28==;:;:;;=<==?=?>;8:?@A:DHmQELFGILLGA91-/578FA:40*$  !##'(()++*(" #(-11147:94225785' $&2=;2*+"*=;>AC@?@BBDEEEGIIJKKLLKKPPPPPPPPQOLIHGHILLMMMMLKIJLNNMLIHDB?====??@ABDDECB>92-)&"##%(*,--+)&$   0CML6 !);PZ_gns|8+555>1*7642.--++)((**++0.,)***+,,,+)(&$%-%+36.*%  $>t|g\]WPRThmyz_5 "'+//,),00*$&''%)/5;==<84.(%!$,//'$),'7CKHKOORUTNNR[am~yM9=B?:DA>81+)(0--0,''099?PldF43<@>::<:;;=>?>@>427=@@EICC,ZeEMGHKNKGA72,+069?JKbûZ@ )[۳bD0%   (,,-4CWt®v\A7-'%#"R]ghghkigefiicbfhheecbbagfgfgfgeeb`_^^_`_hf[TVQD8=KZhllg[ZXTTU[^^ZVPMJJKPJG@HFGwvqiaTGBDHLHNL_̛ؠh]na^tyzrgZSKGDGB;314:?A<611/+' !$%(())+*)&%!%(.35479;;7226.2,! +$! #!-9:2,-"+=BA>=;@@CCEEEEGIIJKLLLLKPPPPPPPPQOLIHHIJNNOOONMMIJLNONLIHDB?>==>??@ACDEEA?>71,(&$%%'),-0,+)&" +   +0DOE/ "2FUcr{~ܴ[3&79:;-&:741-,--,++**+..2/,***+,--++*('''/&! &07762,# :gbLOEDRU]RRT= "%).0/,*01+&'('!&/5:;:895/,,+**9COUVL?6,! ,;HOLORQSTQLj}rjg`ZK96@@8AJE5*.0+/*)./,.6768Je~vQ;45;A<8:>?;;<;;:;9837:94:F?G1]{bNIJIKIGA62,),18>GDT|Ⱥe=  )dԹ}{½©dE0%  (.,-8DWq°y]C8/(&#$! cdfjmmljifcbeeffjifebbdbcdghhec_f`[WXY[\ae`TRUN>-0OpqhhdZYWQPOVYb\UNKKKMRMF@=ER^yqf[PRVLJ[T[\_wxѦ]az_ilqecZKBD>@D=5;;:?EJPRSPQQJPUWY^fpNKέZbH94+(/0--26:<>>97646521&"!%''#&**&%&)&#'+4<><1% 0>BB@?>=>>>@>=@DFGGIJJJJJJJJJRRRQQPPPNNLKKLNNNNNNNNNNPPPONMLIIFECAA@@@@@ADFIKF@:1*&$$'''(*-020-("   9LIG, + +0%'=IF?KRPS[[TwaI=<>CCBA>>EC?;60,'/121/038510AYrvYB978<=;;?BA@;76;>?==;889;88==CYd||KMLFGIC8/..,,*(.F8Ku¿rT4+uvyſĭfJ0& %*,04ATlǸfL7,//% !"  !""!! !!#$%oooonkiggdcdfhijkjfbba``bbddedd`_]YY]`bc`_WNOUN<-0PopggbZYVSPORUZYURQOOOHC<;>FMT\p|vpa[RQRNZy}xh^imסc}f[JSMQOD>?9=FD>B@=@EIMPNMLLKNTWY]dk\gҸ{`H81('/./048::;:75544455.'!!$%%!$('$#%((&',28:965330,'&)" !$+,&!+8><0$"1?BB@@?>=????=@DFGGIJJJJJJJJJRRRQQPPPONMLLMNONNNNNNNNPPPONMLIIFECBAAAAAABCFHID@91+'%$''()+.020-("  + 8IE>'  + + + 0K\kv{M2(*.55/-0951.-.../0000/.--..,*(('''+*)(('/=6!  +'.55.# 6\qWH?(0.6+"!"%),-..+))*-/0.+-14789878:;;:89EJOWaege_WJ:%,@JGLIGAAOufTRSMGCCCC@@?@EC?;73-+03344335634>Tk}`K<89;:<:;@CA?:77;>?=>978;=859;CPTzJLLHGF@5111.,'&,:?NeŽ»hO;3@Һ~îgI/%!!%+-/4BUm˺kR=123-%(#"##%'**)'(()*++))())+,-usplhdbbcbegiijkmkfb`_]]__`_bbdb^\[]bdee^XNHLRK8.3SnoggaZZXWTQQQRRVVUTROC>:=BFJLNKIHGKLRVZ]`df{ɹ[E5,"&0.458;;9853221248:61)$"##$ #%#!!%(*&%).20.+*('%" !$*-&"-9@;/& %4@CCBA@?>@@AA>AEGGHIJJJJJJJJJQQQQPPPPONMMMMNONNNNNNNNOPPPONLJJGFDCBBBCBBBCEFGD@91+'&&(()*,/120-(# 4C<. +6M\gnͅ4#&*05412694.,-/.-/0000/.--..,*(('')**)'('1A='   !" 7[myT8.5!!$+' ()+,,,+*'&&(+.//++.1344488:::97:8::=FNW[__YI. 4CJJECFM^ojI9?IJGIHEC@@@BED@<94/-/259:83178:>K^{fI;6:?>;:8?<;659@@93;@ED?uHKMJHE>4421.+((,0GTSmȼk[`׾v|űlM."!%*-/9GZpξqU@202+()$$%&()-+*))*++,,++++,-./nkf_[Y[]efjkkkljmifa^][[]\\\]aedfdbcb_\YVROILNG518Xpohha\\[[XURPKMSVWSOJGDABDGHLZet|xwtrola\QKO]ΰ{WؕfS~ŵYJC@>DC76=4+5@AGKMNNJGEEJJNRWYYZhTA2'%2/99<=;7400/0/04;@=80($"""!"$# "'*+'%'+,'$#" !%),%#/;@<0&"!(6ACCCAA@?AABB?BEGHHIJKKKKKKKKQPPPPPPPOONNNNOOOOOOOOOOOPPPONMKKHFEDDDDEDDDDDDEC?81,('')*+,.012/-)#1<2 + 8FRa]$%,156313772,*-//-/0000/.--..,*(('))**(''&3FF/!    7Xeڞb367 %/&$++'/2220.+*&%%'+.0-+-/12333789:;;:<2/+))/5:?EG@1"""9GLJ@DQk~ZHMQMGACEFEFCAA@BED@>:720.26=@=4/5:>>@KfpN925>D@<:8=DC=7446;??<9439BB92?HK=/lMMNLIC<3764/,((.-JRH]¹ټ|wsu}¼ʶtS1"! "(+-1=Nby®{^I820-)('&&&*,//+),+-,/-0.0/2154][UPNPX\lorqojijige`]\ZZ\[[Z\_dfljfe`[TONPSOLF@55?^tqjhb_^]]YVTPIKPTRNIDJIE?;=DPdv|xvspmlid[MISkֳwSɆ`بW{è\MHKP^\I;@4-=MNMRTUQKGEDFHLPTVSTev~gJ=0"&51<;<;83/,--.-.3W~y5*6::6212440-,.//-/0000/.--..,*((')),,*(&%5JL9'  +     +5V]q49>.8)!'0366542/,*&%$'*.////0223334569;<=@;7/$!'./.'(>HJGJOg_B6<81*%##!#&%$&*-)$"#$" + "%"&5@C=0'%$,8@ABC@@??ABCD@CGHHHHILLLLLLLLOOOOPPPPOPQQQQPOPPPPPPPPOOPPPPOMLIHGGGGGHHHHHGFEB>82-+**,-.01222/-)%  *. /VO1<>930220/0000////0000/.--..,*(())),+)'%&5KP?-       +8USӂ>=?+')13("(49577641.,)(')-0101111222201369;=@DA7+ + (+"-?HICLYP?PI8-3JWTH?BFGDBAADDA@><871//8AB:428?=62=?>@C@95358=@>;558=@>84:IC53[k]PJHD<8;850,,.38>?IWb~ӯ|ohhoxímG1 $$  !""$&''((&&$"  $&),19H\tȼ~lUD<82-.//258:;99;845EZmzyz}zvrlfbXTLKYrӬrVб~_Ɖ`^vbECGJN_dVIYXNV_ZT__]VPHBAEIOQQPSYVT\irjQ>52,,>5520,)%$#%'*(&)28:;:5.(%$"&'$%)+&" !#!  "!&5@C<1'%%,8??AC??>>ABCCADGIHHHILLLLLLLLNNNOOPPPOPQRRQPOPPPPPPPPOOPQQPPMLJIHHHHIIIJKJIHGA>82-+++,.013332/-)%!"""! &' (\-!4::3,.44.+0551//1/0000/.--..,*(())+,+)''%2HNA1 + + +     ;ROyJ=;671)$%+.1122332/-,+*)*-00011000000002368:FG>Kgc<8LL?7=OVN@EFHHDBBBDDBA@>:93.+2=C>967;<615>Qe}tY@;CBAB?9547:?@=:58<>=976;J=6>OwgPFED@<=851./26889GVO_մĪxka^elt½ʸ~X=("('# !"$%%&#$##""###%%'')+,,/.+)&$$$(*-049AKYnķiUMJC<=;=AEJLNNMQRWW[[_]_^bbfeYUQKMVgsz{{tleee_\\[Z\\]]\^^acfd___acc`^VMD>92*$6Eftnih^bYSQSVWUPLFDBCGIA;65AUn~yz|~{wtle_PSOPXnԭvYȢfôrY^_Y[b_PURPA7ETN]qn\[dhida^WPGB@FKRRPPT\YT_keZPG-/*/@7/-*&# !$'&#%-379:70*&%!&%%%(*%! !## + + !"&5@C<0'%%-8>>@B>>>>@ABCADHIHHHILLLLLLLLNNNOOPPPPPRSSRPPPPPPPPPPOOPQQQPNMJIHHHIIIJKLLKIHA=82.,+,-.023332.-)%! ###"! $$  (cm%164,'-66/(0782./2/0000/.--..,*(())+,+)'&'2ELA3        =SLvU<79=5$%24+#./010/-,.,+,/11110/.....00124689EGG?3%%',-% +27;EF=[y{YDKI7=ENI@;@FKKJGBACDDDBB@?;:5.'.;CA;98998349:Jc~zZB55=HNI>79>EDB@=8658;@A=949>>;766?N98BD^{mOCDDA><971/04:675BPDJsѻؼp\UX[`iwľ§bH.&,.*%#"$'(*)((&&%%#$$&(*+---177421/--57;=BHS\j~ʿlc_XQPQSV[_defgjmpsvw~~~`[SLMYgqwvtmga_`_]]\Z[[YX]_]afheccehie]WKC<:4-(%8Wmnmh``_ZWSSVYZPJA:58@E79AL]ovryxslaVTQQTZu׮v\qt_^qpa\TO[tzd`pcdkeZVSOLFA@DHNSSTTW]YccOOVN=' .9;,%!" &)&(-68:;71*%"$#%'&&& "%)'" +  !!%4?@;1("&/9?A@=>>>?AABBBDGHHHIJKKKKKKKKNNNOOPPPQQQQQQQQQQQQQQQQPQQQQPOLMKJIIIJJLKKLMLIG@=72../0013566550,&"!  ###$#!!$"  + #D*$01.+-3775&-573//0.//00//.+,--,*)'**,,+)%#,FIH9 + +  + + + + +   =LQx?.0.1% %,)$$*-/12221.11/274-.-,,.12358;<;999?AD@91,*.&)+''%$<:;FF9WrFFB82@PVICHF;=@FGECCDFFCB@?<;80&(3=?=853379986=J^umUIC<>BFHD@;;=BC?:755:>>?A?:9:>?:35;?RD;wxQBFHD>;<8.0992+7AB=@EKؿ«q\[]UY_dkwþҺv\B2-**,&&&'(**+*)**+)))*,.159;?EHGEDEGJMOSTV`lx¶{tpooprx|aZSMNWelsrpke`a`]]\\[ZYZY[\[`fighged`YOHA<9872,+=[nonibba\WWXZYVME<626;A8ARaoy|wz}xpi^SPLHKXwݱrHOqxmYO]v~tuk^[rõvqmaUQOLIE@?CGORSPPOb^`^SPUQD%7@>3-%!""!"# !&/37970,)!"!"!""!! !'++%"# + %5@A;/&#'0:@A@>>>??BBBBBDGHHHIKKKKKKKKKNNNOOPPPQQQQQQQQQQQQQQQQPQQQQPOLMJJIIJJKLLLMNLIF?;61/./0235666540,'#"!  "##"!%%%&%""!&$  + 6Z*/,0,21/27:74%+241/02//00//..,,--,*)()*,,+)'#/KON? +  +'BPVϙY.(090$ $)-+*))*+,--//.152+,+,*//3278==?>@B@<9675,/.&&' )@=;DD9Yp=<:99=EHCDHG<>ADFEEDEGFCBA?<<:3))08<=8554765379>FUmnS?:9@?AABA?<:9646;@??@=8:=>=878;;A>9;>Bzijİs^Z[Y[[Z[bnv¹ȱsWD;3./++-0023333556553:=?BFIMQ[`a_^_`bikmoqyľ\XRMLUbholkic```^^]]\[[\\\\[_ehfgc`ZTJ@97579:523Fbqnojbdc]Y[^]WOIA8202465F`s||}~|{{~tkcZQIHGKXw԰uH?Vnxwsf^qû}phe]PQKJHGC@?AFNQQMJJabYRUROQO- +5;5/+&$&''%# !##!#',49850,+##!!  ! !(//(! ##!!   &6@A9-%%)3@EFGGJKFHIGFDCB701.!!%!.A>B=78??8:@@=I:3gyRKOHA><@?99=;2*4;:668;jȷdzw^YW[ZVQNPV\kr¿»ȪxdVH?=;;==@CEFFEGHJJKKVVY^bfkpzžUSPMPWcipmjgb___^]]\[\\]^^^[^caZVSQKF>94769<:558Nfsmmibb_ZX[_\RF;6326897>Rl|}xy|zz|}|rjaYSLJDDSzӵ^Thü|fYQU]]\UNJIHFCA?BFLOPMLKW\OJVRIOT;%3842/-.000.(&&%$$',16;;4/*+(%$!"!"""!!(/0'  +'7AB9,%$+5>BBBA@@AADDDDCEHIHIJKLLLLLLLLOPPPPPPPPPQQQQRRQQQQQQQQPQQQQPOLLJIIIJKLMMMNOLHD9742123599:98642/,'$##"!!#%')*))'&&''% "#&'  +1rψ3)-.34346630*,/0//24110/....--,,+*))++,++)&$;bphI +  + +  #!&7GTeڭl@46>?5+('$%##!#$'(*+.-0//-),-.15;?FHKMMNPRQPROLFA>3/1*"#1B@>AD?an33?<4,')19=;732121;83/2?UdkcUA4/6=<:<>===@=82.-8?E@;986?C>26CB67=D>?47kyPLSJ?:>AB>==92,496446:Z˺v\USSUTRONQT\`ht|îyi_\TTVVZ\`_ddehikjjvw{~¾ROMMR[gmsnifa_^\]]]\[]\\]_`]_]VK>=>=<:;9<<>?946:Shrkje``\WVWZVJ?/016=AEEVew~~zuu}{unh_XRE@86Jyœåzk]RPYa_\XVOVJDIPRUYLKIIGEBACDJKLLNQOUJGVRFLOG=5348:999::986/.,'$$%'.5772.**(&%##""#""#(/.' + &6@A9.'$-8@BBBBBBBBEEFFCFHIIIJLLLLLLLLLQPPPPPPPPPPQQRRRQQQQQQQQPQQQQPOLKIIIIJKLMMMNNKFA76433578;<<;:753.*&##$#"#$&)***)''''(&# !#&' Bi2 $-320/////0111001311/..../--,+**))*+,,+)%$?qyR!  +  "$$".DHJMNNNOPSQSPKD930,-&!%#1@<=7:>=69CGC??CEEDGGDDCB@@@@9/&$+3>;720/24577;?BFGA@@:6379<;<;=><=A>?:4.-,:BF?7567?B;25CB66943995259./2246>7239;F?<:?AHPMMLKHCCABDIIKLPRLNIIRQIFLPPH8,)**-39=?A@==:1,*)')-.130-*#!!" !$',/+% + + + + $+7=?7-($-9@BABBCCCDFFGGCFIJIIKLMMMMMMMMQQQQPPPPOOPQQRSSQQQQQQQQPQQQQPOLKIIIJKLMLLMNMIC>655568:<==>=;964.+'%%%%%%&(*++*)(('())&#!!!&( + WD&!#)$+11/,+,-/3322211110.--.01.-,+*)****,,*(%$Ayb/ +    """%7BCY{զp:58BE=0#"!'*-),00110/29?IMQSRQQQSQRPLD:1+)+%'-,07;ABA>[c*2A@8=;=@;58AECA@BCDCGGEDDCAA?A<3(#%+8874203404;:979:<>?<;A=;60.01;CG=316:@@836??78:IA:7Et~`OOKA5;?CDA<:89<9314;=LoǺҹiOJIGLPSTPMMSPQT[^flx{ĶPNMMT_nvsmfa`]XUXZYZZZ[\[ZYXYTG9,-0/02:>CA?7-+6CVipihd][[XUUTOIDKLJDADQ[vy~}}z{{{wvwyqlh`RJFdrd^YWUPPQ;?DA>=<8AGIFEDC@<<:7;BJPNPMLHCA?ADGHIIKNQKKLHJJBJNSOA0##-6<@CDEGE<763/,-.0650*! $(/00+%!  + +  +%+(,08<;4+%$-9@A?ABDDDDGGHHDFIJJJKLMMMMMMMMRRRQQPPPOOPQQRSSQQQQQQQQPQQQQPOLKHHIJKLMKKLMLGA;55679<>?>>>><:860-)'())()*+,,+*)+**+,,)'#"!"#$(* #n`$$(/'0/210/../00123210/.-,-/13.-,*))**++,+*(&#ByyF*    +  $" &)DHE^֭\D;JTH1%"'*%*0142-((.4DIOSSRPPRMKGEA:4)%(&-56228A@=8]i.4CC:889;<;<>?@BB@@ACHGEEEDBB>@>6+#!#-27862/.26=AA=746:?CCA?;:;:;:;;:>:71.06;=DG;/.7>?;667::9=7FB@AIjsWHFE=9=ACB=::>=70.5;@KcοֹcLHHHHLMLKHHSRTX\[\]acimv{~~RQMLQ^ktoib^^[VSUWVWWXZ[ZXTQSOD72431.18:C@<4)*7ETgmggd\[][ZWTOKIEGFDEShz~~|{yvy{vnie]NEATqi_qydWDNO@:>>4>;4./7;:@?>:?A?947402>=?CD=;<;77316<;3+""!%,361*%%(-)/3:<82)%#-;BB@ACDDGGGHJHFFKJLJMMOMOMOMOOPPROQNPNOMPOQPSQQOQOQOQOPOQOQNOLHHHIJKLMJJKLKF?:5568;=@A>>?>=;972/+**+,++,-..,+*/,+,..,*%!%##'(++ )}J)(,*8.255310/--.13320.-,,-034/-,*))*+*+++*(&#CwY3   + $&  &2JLGbʗe;@CFFECECCB8.$$,6;93-*8<><636:9:;<;<<;>;::89::;83..2@?989>;4-,3:BJ^Ѿڽ\E@@BCBBCCEFLMSZ\WQPUXZ^bhopls|{wv{RRPJLXekh`\][TQPSUWYZWUTRRRUTMA9630/..6>CC90'"5RX^gc]ZZW^YXZZVMD;8:EYmz~~}{{w|}|zrhbcZG;9EXhihcWF;DQUPKHHME?=?@=:::88878;==><=:99543357:457:>>=:730,)((*,,--..///,-/010-,%" #$"$)*%#,)  +Vؿy4$ ))-0/01220/.0/-,-/132.*),0100.+(''(+,*)**)'$BeC  +    (7OVI_W.&J[;61-'!!&1/-)('%'.39<:::C@6,%#")39;84266566777767:==:471/39>=;986324:>CCD7)/720,-4769?>>BGDER_xWCG>C9:<=:865971*)18>KbƾħV802,037::;=BFLOQPPOQRVX[]_^badkqy~{wlhisRSOIITcgd\XYXSOOQSVXXWTRSSTWVOD=:41-..6?AC:0)%6SZ_ca\\[[d_XVURJC:=FUjy~~}|{x{|z}{uj`[\UF==;HPMIJC9<@A>;5.+67:<>AFIKKG>2)(&/*# &(*,00.-  + +  !!,9962,*(2?FHFFHJJJJLLLLJKMNPPQQQQQQQQQOOMMMMMMMLLLMMNNNMMMMMMMMLLLLLLLLKKKLLMMMLLLJGC?=568:=?ABA@>>>=:731-*))+,--..///0./0111.-&#!$$"#)/* &+)! (lE+#!&+++-./01110/0/-,-/123/+*,.///.+(''()+*))*)'$@{qO& +  + + +)AWYLfŊP3DVH=:4+  )))()%%#$(,.---/3-'&)*'$ ! #/73/,/;?BA:1)%!&.6::85654334566668::633104;?>;863248=AFHHR]qYBE=A;;98654474/)*19>J`ħ~U5*-&&*-2458>ADGJJJIJLOPRSTRLMNTX_cfopnonmih_ZZdrSSPIHSaec[VXVROOQSWYYVRPRSUYYSHA<50**+5>?>6.(&8S_ceb^^\[c\QICA??DM\l{~}{{zzzxzzwyyun`WRSOE?A=AB;9??;FFB=9;679;=@ABBA?>>=:732/,++-..////0000112220/($"$%"#)/+!&+)" +9t $+-*()-./01111//---.0130,*+,--/-+)((()*)))**&$=tb:   +   !1P[WTw往N?EKA@;2& #&)%#  #.50..1;FGCbm+0;;=;757768=>>>???????>>===<=?AB@8.'!"(09=<:65322356877887411027>@>;62017?=?EJLRXeZ=?:@>;74336453/)+3:?I^ǪY8+-#%&(),.09;=>ABDDFFHGFEFC?=>@BHKNRSTUTTTRLGEM^sUUQJHR`dbZVWVSPQQTWYXUQNPQTXYTIC?70)))3<<:.'')=Xdfgd_\TMPMB5*,8D[es~{~}{yyyyyy{yuutoh[SMLIBAAFIG@>AEEIKONJEGHF>733689:::;;;::::987766443210/.@BCCA@?>=:7431.../00000011123233311*&#&%""(.,#&+'"  JU',,)(),-./0111/..--./020-+***+.-+)((((*)))**'%8jtU  +   + + ++:YSPbشP7=>>>???>>==<;;;??@CD?4+" "*6>?=7531124677776531025;@A>;40-1:AB@9;>5'-5.((.1448:?<>BINQQX]9;8?@;40026632/*,4;AI[~˭Z8*,"!! #&)245589;?@A@@A?>74;KdVVRJHS`dcZVWVTRTRTVXWTQNQRSWXSJDA93,+*1::4'!&+@\ihe_UK;/,0,"#>Wpwyu}|ywxxyz{}zurpjbXQJGD@@?GJIECCDADJQQNIDB>96456789:;;;:9888776544565530.,7:@DFFFGCDDEFGGHGFFDEEDEIDFKNFHPYVL<*!"&+.232111.-+'" "#$&%&$%)'().016 +   -:<74/+*4AHJHHJLLLLNNNNMMOPPQPPPPPPPPPNNLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLKKKLLMMMNMJGC?<:::<>@ACDDB@??=97542100122222211144333433-)%'&""'.+$$*'$ +X_4&!')(')+++,,./00/..---..00.+)()).-,*)((')('(**'%1\o+ +  + + 9FYFJu|A36A=855435:<==>>???>==<;:99@>>BFC:1%! %0:>?9742123456665333359>@@<92.-34'-5.(+123488?>@BHKJGL]576>A:2./37623.*.6=BHXwͯ[9*)#,../1122:<;=<<;;:9755467441222313+(.BDGHFA?>?@DEC@?=8765456789:;:97676654333667751.+138BHKIJJQUXQ?)).0123+($! "%&$%''&''+(('(+/14 !-9<74/++5BIJIIKMMMMOOOONNOPQQPPOOOOOOOMMKKKKKKKLLLLKKKKKKKKKKKKLLLLLLLLKKKLLMMMMKIFB?<;;<=?ABCDECA@?=97654333334333322254333434/+'(&"!&/-% $*(% ""-p3(#'&%(++****+,-.....----...,)'()--,+)('')('(+*($+P¯= +  + +&IPPASh<8;>DE>1$ !$((!$,' !(3<>:861]m#'8>A=9676348<<<=>>??>>=<;:98><<@DD=7+&!#*3:>;:854211134433568;>@@=:70/052%+5.*/543376>AABCFADIToͯZ7'&%'())*)+//11222466532110-+*))))((##/HiQRNGEP^aaXSTUSSUTTUUVVVUURONNJC?C?<94..21-&(49H_^P8# +#1Hbtzyxz}zzxursuvxwxuokh_WTPHB??=;>?CEECCB>>?==?AA<:731257789::86465543221467751-*,-05@BINNGHP[]Q:" )045-)%(()*)&&)+)('&),/2  +  + + !-9<850++6BIKIJKNNNNPPPPNOPQQQPPOOOOOOOMMKKKKKKKLLLKKJJJKKKKKKKKLLLLLLLLKKKLLMMMKJGDA?=<==>@ACDEFDA@?=967665555555443332542223341,()&"!%-,%!$*(# %'#Gg!" &(%%*+)*)((()*+....--,++-.,('(*-,,+*('&&%'(**($*Eö^1   + +/UWCIhѣgG@;>DB:1" + + !$" + 07/"!0?B:53.Ym!'8>@>9897447;;<=>>????><;:98<;;=AB?<1,%!$,5;=<;9630.-023347:>@BA>:750148<>@@=<DD@>>81=~X,35:=4,*/6::01.+09?EHSi̮Y5#  "#&&$#$!"$%''')04442..+''%##$%&$(?`|NOKDCN\`_VQSSRRUTTTTTVWWRNIGEB<7D@?<70./,+).:=I\R=(=Shx{wtw~zxvrpqruvuvsmif]UPLFA??>9;<>ABADHAABCDDEGA>82./37679:975355432211346751,)**,18?DGFECBAABBCCCBB@AA@EDAHQQDAIT\XI7*".431)$(---,'%(+*&$$&*./   + + + + .9<850,,6CJKIJLNNNNPPPPOOPQQQPPOOOOOOOMMKKKKKKKLLLKKJJJKKKKKKKKLLLLLLLLKKKLLMMMJIFCA?>==>?@BCDEFDB@?=967776666665544333442123242-))'" %-,& "''$ (**[;|>!'(%',+&*)'&&'()....-,++*,-,(&(*,,,+*)'&&%'(**&$+>Ľ|M   +  + 6^Z8*!  "! !!  %;D8'.@D;30,Wk!&8>?=:9:9436:;<<=>??@?>=;:99:::<>@@?50(! '19>>=;83/,+.12249=BCDB=853/37:;<>@=<:,%0,/7<73343>CF@<92+8|V*15;;2*)07::00.,09@CIPdˮV2 "#""(,-.,*'%$#" #"&%$&;]xROLHEJ[e`VQTUSSWZVRRVXURQJB=<9417?FC;2/0,'-9CDHKC +":AM`p{}{ustywputrpqqrssnifb\SKGEB><<=<:;=>>@CENF??BCC@940048989987543311111111334420.-(*+-06>CCB@@AAA@AACCDCA@BACDFHKJDDFLPME>3$*.*& &-.,+)%&&)()('&'+-!   +  .9=960*+8GMLHIMMNOPRRRQOPQSSRQPPPPPPPPNLJJKKLLLMLKJJJKKJJJKKLLLLLLLLLLLIIKLLLLLJHEB?>==>@CEFEDCDCCA>;756778877655666666765445340-))$$./( #++&  !*!+}۽G#&!%(+,*(*,((())))*,++-//,('*,,)(*,)**+*)'&%%%%%&((,8vk1 +  + + +  !GdYCpˑ\:;<;><-% +  +#%% !-@KA+ +79664.Wg#';;B;<<<;742579<>>>>BA?=;:99<98:>AA@=7-%#'-2:?CC>7310//16;>>FEB>:74238=>==?B>@>+-*35974035???<93-+9zV(0@970*+5;;7/.//05?@@A@@>=@@CCFGIH?<;?ELQS;$ !!"%**)(%%$&)''&&'+/&   .9=950++8GLLHJMMNOPRRRQOPRSSRPPPPPPPPPNLJJKKLLLNMLKKKKLJJJKKKLLLLLLLLLLIJKKLLLKIHEB?>>>?@CEFEDCCCBA>;866788887677777777775555441.+*% %/0) $,,' "#&.%?ʳq.&()(%%')())*****))+.0/*&&)--+)))))*+*)'&&%%%%&'&$1s®V' +  + +  5R]OM~ܿW@0/9>2'   + " %+-*,3>KF6'!(256874W_ 46><<==;74268:<>???BA?=<::9;98:>AA@?90($$(+6;BDA<862125:?BCHEA<742149=?=<>A??<(''13653036=>@>83,)7V$/?85/+-7>>:+*,.06>GJM\tȫQ)"#$#!! !$4UtPNKGGP_ebZWXXVSTVTSUXWSND<3,)'$$3>KLE7+$-.6=@:74 +.Mgpyyrmov|ysnpummmmpppqnkd_YRHAE@;6458;;=@AA>?@@;77863023444468::98654400000000000/.,+**)'&(.8?>???>>=<<=<=<<<<>>A@CDFGC?;:;AIOB:(   &&%#!&&'&##$#*(((()-/*  !-:=840,-9FLLIJMNNOPRRRRPQRSSRPOPPPPPPPNLJKKKKLLNMLKKKKLJJJJKKKLKKKKKKKKIJJKLKKKHGDA?????ACDEEDCCBA@=;8777899877888888888866665541-,("!'/0,#'/.) +&%(3Hնνπ5!$&&%#!!$'()*,,,+*'(+./-)%%),.,*('()*+*)('$$%%%&%&)lìD  +  'JZRK_{O10>E4'  + + '2;=<76;FK?/$$*07<=8[|[##68A<===;74278:<>???A@?><;:9:98:=@@@B=5,&###/5>CDB?>767:@DGGHD>831006:??=<=??>9$ !#03652258:;=;61*'6W$0@51.,0:BB=))*-07?HHJWnç~P) "3SoOMJFIUbeb]ZZZXTSWVVWWSMH@9/($"!".9FID6,%./6981.-" 1BZhpx}xqlipvzunimrkkllmlkjkga]VPGBA=60/2699<@?><;9976342.*159:868:88765432////////...-+*)(((''(,38;=@@?=<<;;<;;:::<=>>@BECAAA>:8:=CH=&+-+'('&&$"$$*'&&')-/)  + .<>730-/:FKLIJMNOPPSSRRPQRSRQPOOOOOOOOMMKKKKKKKLLKJIIJJIIJJJKKKJJJJJJJJIJJKKKJJGECA@@@AAACDDDDCBA@>=;9888999988:::::9999876675663/.*$#'.2.&)21*$#%0&^ĮT('%$" "%'')+-.-,+(()*+*)'()++*)((()*++*('%$%%%&%#!bh!   + +3XXNXw̥vMAB?-'""   + #3?CB>745>FC6*! #(5;<8ShN#(7:B==>=;842678:;=>>@@?>=;:98889<>?@C?:3,&" '.7@EFDC===?CFGFD@:400138<@@=;<>>;7" $1354349<<;:72-++;n}Q/3=3/..5=@?:*+,/29@IGJUgϿzM)3UrMLHEKZfeb^\ZZZVSZ\[ZVOGA=7/'#!!!*1;><5/),052+''(!Q`nlrvxsqpqstspmjjkjkkkkgdbc`\WQMFC=92-,-1447;<:65564433/+)15::878:65432100////////--,*)(('&(***+.08>><<<:;;::<;<<>@B@7:<<989;>IH1 $*+*+)&$"#%&(&%&'*-0&     0=>840.2;EKLJKLNOPQSSSRQQRSRQONOOOOOOOMMKKKKKKKJIHGGGGGIIIJJJKKJJJJJJJJIJJKKJIIEDBA@ABBBBCCDDCCA@?=<;::99::::99<<;;::99987667569510+%$(.0/),32+!"-WѺn; ! (2,%$##$')*')*,---,+*(&%'*,-+(&&')*'(*++*)(%%$###$# WM  +   -DXQSrԲcL4)('(! +  0BLMD:114:BB:2% %2775:G6%16<<=>=<96444578:;<:97789:<>@BA=82+&"!&0:BFGFCBBCDEDB>;50/1469=A@=;<>;85#  )455558QUH=981//37==:4//1349?GHKTb˻yL' 5\{LLGEM_iea_\XX[XT^]\XQH@;73,&! )-3563/-,23+!!#,cpvtussppqsrpmlljhehijihd_\ZYUPLFA@83.+(+,/2477433434441/,+0256655644320/..........-,+)('''%'*+*)))4:@CA??@??==;;:;;:<;>>@>;854358<:DH@8. !!(%%#"$&'%##"&(+.'%    !1>>830/4>??><:957899:=@BA?<6/)%#*4>DGGGFEEEDA?:73//2589=AA><=?865&"-765469?AB<3*&',1>;9AC<4//16:=:6/233569>CILR_ʺyJ' !!!  ;fKKFDNblea_[VV[ZV]]ZUMD=930,'" !),0232/-.56+ +-fsvwupnmmmmnmlkkhecdegggb]ZXVSMHB==40,*''*+1322211233320/..2113565444321/..---------,*(''''%'((&$%%.6>BA??A@?=<:;:;:9;:==?=?9301356;?CDC8!"$%%"! $'),++! + "2??72226=;:;;<::;<<;::=<<;:98877555544;731,%%(,00+/53++nǸûU '234002675/*((''(+-/-,)%#%+10+&#%'((&')*+*))&#$####"CQ  + +  $FVLOrýʥSD4*"   +!:MRK?1./04>EA7& %-.262+ &06<8:<==<:8333468:<=>?@?=:9469989=@BA@=70)%!#'0;CFGHGFFFEB?963002578<@A>=>@756( ,963359=@A;2*&&*/865=A;3,.29=@=6.123569>CLOS]ʺyK( !"#"!AkKKFCOdne`^ZTT[[W[[YSKC=:21.*&##$*,0232.+/7:,+gw|yuoooomjjlmlifdd`befgb]ZZYUNHA<:2.+''&()121101242321/./053137975554310//--------.,*(''''&&&$!!"$*3?@@?=<9:9::9;:=<><62/26985><;:;<<:;;<<;;:<<;:998776544534;731,%$(+/0,053+! -lɺԤQ &/,4579=>9/()'%%&)-0,,+(%&+0.*&%'('%&')*+**'&$$####!=v\  +  !EWJS|ýĨlR6("   #=;:444469;=<=?@?=;9469989<@BB@<6/($$$'/9BFGHGGGHGDA974101358<@A?=?A756* *962138<>?:2+'')-29=<;83+.2;@D?8/002457=CNQT[˺yK( !$##! $Eo \ No newline at end of file diff --git a/buildroot-overlay/package/face_detect/anchors_320.cc b/buildroot-overlay/package/face_detect/anchors_320.cc new file mode 100755 index 0000000..91e4a47 --- /dev/null +++ b/buildroot-overlay/package/face_detect/anchors_320.cc @@ -0,0 +1 @@ +float anchors320[4200][4] = {{0.012500,0.012500,0.050000,0.050000},{0.012500,0.012500,0.100000,0.100000},{0.037500,0.012500,0.050000,0.050000},{0.037500,0.012500,0.100000,0.100000},{0.062500,0.012500,0.050000,0.050000},{0.062500,0.012500,0.100000,0.100000},{0.087500,0.012500,0.050000,0.050000},{0.087500,0.012500,0.100000,0.100000},{0.112500,0.012500,0.050000,0.050000},{0.112500,0.012500,0.100000,0.100000},{0.137500,0.012500,0.050000,0.050000},{0.137500,0.012500,0.100000,0.100000},{0.162500,0.012500,0.050000,0.050000},{0.162500,0.012500,0.100000,0.100000},{0.187500,0.012500,0.050000,0.050000},{0.187500,0.012500,0.100000,0.100000},{0.212500,0.012500,0.050000,0.050000},{0.212500,0.012500,0.100000,0.100000},{0.237500,0.012500,0.050000,0.050000},{0.237500,0.012500,0.100000,0.100000},{0.262500,0.012500,0.050000,0.050000},{0.262500,0.012500,0.100000,0.100000},{0.287500,0.012500,0.050000,0.050000},{0.287500,0.012500,0.100000,0.100000},{0.312500,0.012500,0.050000,0.050000},{0.312500,0.012500,0.100000,0.100000},{0.337500,0.012500,0.050000,0.050000},{0.337500,0.012500,0.100000,0.100000},{0.362500,0.012500,0.050000,0.050000},{0.362500,0.012500,0.100000,0.100000},{0.387500,0.012500,0.050000,0.050000},{0.387500,0.012500,0.100000,0.100000},{0.412500,0.012500,0.050000,0.050000},{0.412500,0.012500,0.100000,0.100000},{0.437500,0.012500,0.050000,0.050000},{0.437500,0.012500,0.100000,0.100000},{0.462500,0.012500,0.050000,0.050000},{0.462500,0.012500,0.100000,0.100000},{0.487500,0.012500,0.050000,0.050000},{0.487500,0.012500,0.100000,0.100000},{0.512500,0.012500,0.050000,0.050000},{0.512500,0.012500,0.100000,0.100000},{0.537500,0.012500,0.050000,0.050000},{0.537500,0.012500,0.100000,0.100000},{0.562500,0.012500,0.050000,0.050000},{0.562500,0.012500,0.100000,0.100000},{0.587500,0.012500,0.050000,0.050000},{0.587500,0.012500,0.100000,0.100000},{0.612500,0.012500,0.050000,0.050000},{0.612500,0.012500,0.100000,0.100000},{0.637500,0.012500,0.050000,0.050000},{0.637500,0.012500,0.100000,0.100000},{0.662500,0.012500,0.050000,0.050000},{0.662500,0.012500,0.100000,0.100000},{0.687500,0.012500,0.050000,0.050000},{0.687500,0.012500,0.100000,0.100000},{0.712500,0.012500,0.050000,0.050000},{0.712500,0.012500,0.100000,0.100000},{0.737500,0.012500,0.050000,0.050000},{0.737500,0.012500,0.100000,0.100000},{0.762500,0.012500,0.050000,0.050000},{0.762500,0.012500,0.100000,0.100000},{0.787500,0.012500,0.050000,0.050000},{0.787500,0.012500,0.100000,0.100000},{0.812500,0.012500,0.050000,0.050000},{0.812500,0.012500,0.100000,0.100000},{0.837500,0.012500,0.050000,0.050000},{0.837500,0.012500,0.100000,0.100000},{0.862500,0.012500,0.050000,0.050000},{0.862500,0.012500,0.100000,0.100000},{0.887500,0.012500,0.050000,0.050000},{0.887500,0.012500,0.100000,0.100000},{0.912500,0.012500,0.050000,0.050000},{0.912500,0.012500,0.100000,0.100000},{0.937500,0.012500,0.050000,0.050000},{0.937500,0.012500,0.100000,0.100000},{0.962500,0.012500,0.050000,0.050000},{0.962500,0.012500,0.100000,0.100000},{0.987500,0.012500,0.050000,0.050000},{0.987500,0.012500,0.100000,0.100000},{0.012500,0.037500,0.050000,0.050000},{0.012500,0.037500,0.100000,0.100000},{0.037500,0.037500,0.050000,0.050000},{0.037500,0.037500,0.100000,0.100000},{0.062500,0.037500,0.050000,0.050000},{0.062500,0.037500,0.100000,0.100000},{0.087500,0.037500,0.050000,0.050000},{0.087500,0.037500,0.100000,0.100000},{0.112500,0.037500,0.050000,0.050000},{0.112500,0.037500,0.100000,0.100000},{0.137500,0.037500,0.050000,0.050000},{0.137500,0.037500,0.100000,0.100000},{0.162500,0.037500,0.050000,0.050000},{0.162500,0.037500,0.100000,0.100000},{0.187500,0.037500,0.050000,0.050000},{0.187500,0.037500,0.100000,0.100000},{0.212500,0.037500,0.050000,0.050000},{0.212500,0.037500,0.100000,0.100000},{0.237500,0.037500,0.050000,0.050000},{0.237500,0.037500,0.100000,0.100000},{0.262500,0.037500,0.050000,0.050000},{0.262500,0.037500,0.100000,0.100000},{0.287500,0.037500,0.050000,0.050000},{0.287500,0.037500,0.100000,0.100000},{0.312500,0.037500,0.050000,0.050000},{0.312500,0.037500,0.100000,0.100000},{0.337500,0.037500,0.050000,0.050000},{0.337500,0.037500,0.100000,0.100000},{0.362500,0.037500,0.050000,0.050000},{0.362500,0.037500,0.100000,0.100000},{0.387500,0.037500,0.050000,0.050000},{0.387500,0.037500,0.100000,0.100000},{0.412500,0.037500,0.050000,0.050000},{0.412500,0.037500,0.100000,0.100000},{0.437500,0.037500,0.050000,0.050000},{0.437500,0.037500,0.100000,0.100000},{0.462500,0.037500,0.050000,0.050000},{0.462500,0.037500,0.100000,0.100000},{0.487500,0.037500,0.050000,0.050000},{0.487500,0.037500,0.100000,0.100000},{0.512500,0.037500,0.050000,0.050000},{0.512500,0.037500,0.100000,0.100000},{0.537500,0.037500,0.050000,0.050000},{0.537500,0.037500,0.100000,0.100000},{0.562500,0.037500,0.050000,0.050000},{0.562500,0.037500,0.100000,0.100000},{0.587500,0.037500,0.050000,0.050000},{0.587500,0.037500,0.100000,0.100000},{0.612500,0.037500,0.050000,0.050000},{0.612500,0.037500,0.100000,0.100000},{0.637500,0.037500,0.050000,0.050000},{0.637500,0.037500,0.100000,0.100000},{0.662500,0.037500,0.050000,0.050000},{0.662500,0.037500,0.100000,0.100000},{0.687500,0.037500,0.050000,0.050000},{0.687500,0.037500,0.100000,0.100000},{0.712500,0.037500,0.050000,0.050000},{0.712500,0.037500,0.100000,0.100000},{0.737500,0.037500,0.050000,0.050000},{0.737500,0.037500,0.100000,0.100000},{0.762500,0.037500,0.050000,0.050000},{0.762500,0.037500,0.100000,0.100000},{0.787500,0.037500,0.050000,0.050000},{0.787500,0.037500,0.100000,0.100000},{0.812500,0.037500,0.050000,0.050000},{0.812500,0.037500,0.100000,0.100000},{0.837500,0.037500,0.050000,0.050000},{0.837500,0.037500,0.100000,0.100000},{0.862500,0.037500,0.050000,0.050000},{0.862500,0.037500,0.100000,0.100000},{0.887500,0.037500,0.050000,0.050000},{0.887500,0.037500,0.100000,0.100000},{0.912500,0.037500,0.050000,0.050000},{0.912500,0.037500,0.100000,0.100000},{0.937500,0.037500,0.050000,0.050000},{0.937500,0.037500,0.100000,0.100000},{0.962500,0.037500,0.050000,0.050000},{0.962500,0.037500,0.100000,0.100000},{0.987500,0.037500,0.050000,0.050000},{0.987500,0.037500,0.100000,0.100000},{0.012500,0.062500,0.050000,0.050000},{0.012500,0.062500,0.100000,0.100000},{0.037500,0.062500,0.050000,0.050000},{0.037500,0.062500,0.100000,0.100000},{0.062500,0.062500,0.050000,0.050000},{0.062500,0.062500,0.100000,0.100000},{0.087500,0.062500,0.050000,0.050000},{0.087500,0.062500,0.100000,0.100000},{0.112500,0.062500,0.050000,0.050000},{0.112500,0.062500,0.100000,0.100000},{0.137500,0.062500,0.050000,0.050000},{0.137500,0.062500,0.100000,0.100000},{0.162500,0.062500,0.050000,0.050000},{0.162500,0.062500,0.100000,0.100000},{0.187500,0.062500,0.050000,0.050000},{0.187500,0.062500,0.100000,0.100000},{0.212500,0.062500,0.050000,0.050000},{0.212500,0.062500,0.100000,0.100000},{0.237500,0.062500,0.050000,0.050000},{0.237500,0.062500,0.100000,0.100000},{0.262500,0.062500,0.050000,0.050000},{0.262500,0.062500,0.100000,0.100000},{0.287500,0.062500,0.050000,0.050000},{0.287500,0.062500,0.100000,0.100000},{0.312500,0.062500,0.050000,0.050000},{0.312500,0.062500,0.100000,0.100000},{0.337500,0.062500,0.050000,0.050000},{0.337500,0.062500,0.100000,0.100000},{0.362500,0.062500,0.050000,0.050000},{0.362500,0.062500,0.100000,0.100000},{0.387500,0.062500,0.050000,0.050000},{0.387500,0.062500,0.100000,0.100000},{0.412500,0.062500,0.050000,0.050000},{0.412500,0.062500,0.100000,0.100000},{0.437500,0.062500,0.050000,0.050000},{0.437500,0.062500,0.100000,0.100000},{0.462500,0.062500,0.050000,0.050000},{0.462500,0.062500,0.100000,0.100000},{0.487500,0.062500,0.050000,0.050000},{0.487500,0.062500,0.100000,0.100000},{0.512500,0.062500,0.050000,0.050000},{0.512500,0.062500,0.100000,0.100000},{0.537500,0.062500,0.050000,0.050000},{0.537500,0.062500,0.100000,0.100000},{0.562500,0.062500,0.050000,0.050000},{0.562500,0.062500,0.100000,0.100000},{0.587500,0.062500,0.050000,0.050000},{0.587500,0.062500,0.100000,0.100000},{0.612500,0.062500,0.050000,0.050000},{0.612500,0.062500,0.100000,0.100000},{0.637500,0.062500,0.050000,0.050000},{0.637500,0.062500,0.100000,0.100000},{0.662500,0.062500,0.050000,0.050000},{0.662500,0.062500,0.100000,0.100000},{0.687500,0.062500,0.050000,0.050000},{0.687500,0.062500,0.100000,0.100000},{0.712500,0.062500,0.050000,0.050000},{0.712500,0.062500,0.100000,0.100000},{0.737500,0.062500,0.050000,0.050000},{0.737500,0.062500,0.100000,0.100000},{0.762500,0.062500,0.050000,0.050000},{0.762500,0.062500,0.100000,0.100000},{0.787500,0.062500,0.050000,0.050000},{0.787500,0.062500,0.100000,0.100000},{0.812500,0.062500,0.050000,0.050000},{0.812500,0.062500,0.100000,0.100000},{0.837500,0.062500,0.050000,0.050000},{0.837500,0.062500,0.100000,0.100000},{0.862500,0.062500,0.050000,0.050000},{0.862500,0.062500,0.100000,0.100000},{0.887500,0.062500,0.050000,0.050000},{0.887500,0.062500,0.100000,0.100000},{0.912500,0.062500,0.050000,0.050000},{0.912500,0.062500,0.100000,0.100000},{0.937500,0.062500,0.050000,0.050000},{0.937500,0.062500,0.100000,0.100000},{0.962500,0.062500,0.050000,0.050000},{0.962500,0.062500,0.100000,0.100000},{0.987500,0.062500,0.050000,0.050000},{0.987500,0.062500,0.100000,0.100000},{0.012500,0.087500,0.050000,0.050000},{0.012500,0.087500,0.100000,0.100000},{0.037500,0.087500,0.050000,0.050000},{0.037500,0.087500,0.100000,0.100000},{0.062500,0.087500,0.050000,0.050000},{0.062500,0.087500,0.100000,0.100000},{0.087500,0.087500,0.050000,0.050000},{0.087500,0.087500,0.100000,0.100000},{0.112500,0.087500,0.050000,0.050000},{0.112500,0.087500,0.100000,0.100000},{0.137500,0.087500,0.050000,0.050000},{0.137500,0.087500,0.100000,0.100000},{0.162500,0.087500,0.050000,0.050000},{0.162500,0.087500,0.100000,0.100000},{0.187500,0.087500,0.050000,0.050000},{0.187500,0.087500,0.100000,0.100000},{0.212500,0.087500,0.050000,0.050000},{0.212500,0.087500,0.100000,0.100000},{0.237500,0.087500,0.050000,0.050000},{0.237500,0.087500,0.100000,0.100000},{0.262500,0.087500,0.050000,0.050000},{0.262500,0.087500,0.100000,0.100000},{0.287500,0.087500,0.050000,0.050000},{0.287500,0.087500,0.100000,0.100000},{0.312500,0.087500,0.050000,0.050000},{0.312500,0.087500,0.100000,0.100000},{0.337500,0.087500,0.050000,0.050000},{0.337500,0.087500,0.100000,0.100000},{0.362500,0.087500,0.050000,0.050000},{0.362500,0.087500,0.100000,0.100000},{0.387500,0.087500,0.050000,0.050000},{0.387500,0.087500,0.100000,0.100000},{0.412500,0.087500,0.050000,0.050000},{0.412500,0.087500,0.100000,0.100000},{0.437500,0.087500,0.050000,0.050000},{0.437500,0.087500,0.100000,0.100000},{0.462500,0.087500,0.050000,0.050000},{0.462500,0.087500,0.100000,0.100000},{0.487500,0.087500,0.050000,0.050000},{0.487500,0.087500,0.100000,0.100000},{0.512500,0.087500,0.050000,0.050000},{0.512500,0.087500,0.100000,0.100000},{0.537500,0.087500,0.050000,0.050000},{0.537500,0.087500,0.100000,0.100000},{0.562500,0.087500,0.050000,0.050000},{0.562500,0.087500,0.100000,0.100000},{0.587500,0.087500,0.050000,0.050000},{0.587500,0.087500,0.100000,0.100000},{0.612500,0.087500,0.050000,0.050000},{0.612500,0.087500,0.100000,0.100000},{0.637500,0.087500,0.050000,0.050000},{0.637500,0.087500,0.100000,0.100000},{0.662500,0.087500,0.050000,0.050000},{0.662500,0.087500,0.100000,0.100000},{0.687500,0.087500,0.050000,0.050000},{0.687500,0.087500,0.100000,0.100000},{0.712500,0.087500,0.050000,0.050000},{0.712500,0.087500,0.100000,0.100000},{0.737500,0.087500,0.050000,0.050000},{0.737500,0.087500,0.100000,0.100000},{0.762500,0.087500,0.050000,0.050000},{0.762500,0.087500,0.100000,0.100000},{0.787500,0.087500,0.050000,0.050000},{0.787500,0.087500,0.100000,0.100000},{0.812500,0.087500,0.050000,0.050000},{0.812500,0.087500,0.100000,0.100000},{0.837500,0.087500,0.050000,0.050000},{0.837500,0.087500,0.100000,0.100000},{0.862500,0.087500,0.050000,0.050000},{0.862500,0.087500,0.100000,0.100000},{0.887500,0.087500,0.050000,0.050000},{0.887500,0.087500,0.100000,0.100000},{0.912500,0.087500,0.050000,0.050000},{0.912500,0.087500,0.100000,0.100000},{0.937500,0.087500,0.050000,0.050000},{0.937500,0.087500,0.100000,0.100000},{0.962500,0.087500,0.050000,0.050000},{0.962500,0.087500,0.100000,0.100000},{0.987500,0.087500,0.050000,0.050000},{0.987500,0.087500,0.100000,0.100000},{0.012500,0.112500,0.050000,0.050000},{0.012500,0.112500,0.100000,0.100000},{0.037500,0.112500,0.050000,0.050000},{0.037500,0.112500,0.100000,0.100000},{0.062500,0.112500,0.050000,0.050000},{0.062500,0.112500,0.100000,0.100000},{0.087500,0.112500,0.050000,0.050000},{0.087500,0.112500,0.100000,0.100000},{0.112500,0.112500,0.050000,0.050000},{0.112500,0.112500,0.100000,0.100000},{0.137500,0.112500,0.050000,0.050000},{0.137500,0.112500,0.100000,0.100000},{0.162500,0.112500,0.050000,0.050000},{0.162500,0.112500,0.100000,0.100000},{0.187500,0.112500,0.050000,0.050000},{0.187500,0.112500,0.100000,0.100000},{0.212500,0.112500,0.050000,0.050000},{0.212500,0.112500,0.100000,0.100000},{0.237500,0.112500,0.050000,0.050000},{0.237500,0.112500,0.100000,0.100000},{0.262500,0.112500,0.050000,0.050000},{0.262500,0.112500,0.100000,0.100000},{0.287500,0.112500,0.050000,0.050000},{0.287500,0.112500,0.100000,0.100000},{0.312500,0.112500,0.050000,0.050000},{0.312500,0.112500,0.100000,0.100000},{0.337500,0.112500,0.050000,0.050000},{0.337500,0.112500,0.100000,0.100000},{0.362500,0.112500,0.050000,0.050000},{0.362500,0.112500,0.100000,0.100000},{0.387500,0.112500,0.050000,0.050000},{0.387500,0.112500,0.100000,0.100000},{0.412500,0.112500,0.050000,0.050000},{0.412500,0.112500,0.100000,0.100000},{0.437500,0.112500,0.050000,0.050000},{0.437500,0.112500,0.100000,0.100000},{0.462500,0.112500,0.050000,0.050000},{0.462500,0.112500,0.100000,0.100000},{0.487500,0.112500,0.050000,0.050000},{0.487500,0.112500,0.100000,0.100000},{0.512500,0.112500,0.050000,0.050000},{0.512500,0.112500,0.100000,0.100000},{0.537500,0.112500,0.050000,0.050000},{0.537500,0.112500,0.100000,0.100000},{0.562500,0.112500,0.050000,0.050000},{0.562500,0.112500,0.100000,0.100000},{0.587500,0.112500,0.050000,0.050000},{0.587500,0.112500,0.100000,0.100000},{0.612500,0.112500,0.050000,0.050000},{0.612500,0.112500,0.100000,0.100000},{0.637500,0.112500,0.050000,0.050000},{0.637500,0.112500,0.100000,0.100000},{0.662500,0.112500,0.050000,0.050000},{0.662500,0.112500,0.100000,0.100000},{0.687500,0.112500,0.050000,0.050000},{0.687500,0.112500,0.100000,0.100000},{0.712500,0.112500,0.050000,0.050000},{0.712500,0.112500,0.100000,0.100000},{0.737500,0.112500,0.050000,0.050000},{0.737500,0.112500,0.100000,0.100000},{0.762500,0.112500,0.050000,0.050000},{0.762500,0.112500,0.100000,0.100000},{0.787500,0.112500,0.050000,0.050000},{0.787500,0.112500,0.100000,0.100000},{0.812500,0.112500,0.050000,0.050000},{0.812500,0.112500,0.100000,0.100000},{0.837500,0.112500,0.050000,0.050000},{0.837500,0.112500,0.100000,0.100000},{0.862500,0.112500,0.050000,0.050000},{0.862500,0.112500,0.100000,0.100000},{0.887500,0.112500,0.050000,0.050000},{0.887500,0.112500,0.100000,0.100000},{0.912500,0.112500,0.050000,0.050000},{0.912500,0.112500,0.100000,0.100000},{0.937500,0.112500,0.050000,0.050000},{0.937500,0.112500,0.100000,0.100000},{0.962500,0.112500,0.050000,0.050000},{0.962500,0.112500,0.100000,0.100000},{0.987500,0.112500,0.050000,0.050000},{0.987500,0.112500,0.100000,0.100000},{0.012500,0.137500,0.050000,0.050000},{0.012500,0.137500,0.100000,0.100000},{0.037500,0.137500,0.050000,0.050000},{0.037500,0.137500,0.100000,0.100000},{0.062500,0.137500,0.050000,0.050000},{0.062500,0.137500,0.100000,0.100000},{0.087500,0.137500,0.050000,0.050000},{0.087500,0.137500,0.100000,0.100000},{0.112500,0.137500,0.050000,0.050000},{0.112500,0.137500,0.100000,0.100000},{0.137500,0.137500,0.050000,0.050000},{0.137500,0.137500,0.100000,0.100000},{0.162500,0.137500,0.050000,0.050000},{0.162500,0.137500,0.100000,0.100000},{0.187500,0.137500,0.050000,0.050000},{0.187500,0.137500,0.100000,0.100000},{0.212500,0.137500,0.050000,0.050000},{0.212500,0.137500,0.100000,0.100000},{0.237500,0.137500,0.050000,0.050000},{0.237500,0.137500,0.100000,0.100000},{0.262500,0.137500,0.050000,0.050000},{0.262500,0.137500,0.100000,0.100000},{0.287500,0.137500,0.050000,0.050000},{0.287500,0.137500,0.100000,0.100000},{0.312500,0.137500,0.050000,0.050000},{0.312500,0.137500,0.100000,0.100000},{0.337500,0.137500,0.050000,0.050000},{0.337500,0.137500,0.100000,0.100000},{0.362500,0.137500,0.050000,0.050000},{0.362500,0.137500,0.100000,0.100000},{0.387500,0.137500,0.050000,0.050000},{0.387500,0.137500,0.100000,0.100000},{0.412500,0.137500,0.050000,0.050000},{0.412500,0.137500,0.100000,0.100000},{0.437500,0.137500,0.050000,0.050000},{0.437500,0.137500,0.100000,0.100000},{0.462500,0.137500,0.050000,0.050000},{0.462500,0.137500,0.100000,0.100000},{0.487500,0.137500,0.050000,0.050000},{0.487500,0.137500,0.100000,0.100000},{0.512500,0.137500,0.050000,0.050000},{0.512500,0.137500,0.100000,0.100000},{0.537500,0.137500,0.050000,0.050000},{0.537500,0.137500,0.100000,0.100000},{0.562500,0.137500,0.050000,0.050000},{0.562500,0.137500,0.100000,0.100000},{0.587500,0.137500,0.050000,0.050000},{0.587500,0.137500,0.100000,0.100000},{0.612500,0.137500,0.050000,0.050000},{0.612500,0.137500,0.100000,0.100000},{0.637500,0.137500,0.050000,0.050000},{0.637500,0.137500,0.100000,0.100000},{0.662500,0.137500,0.050000,0.050000},{0.662500,0.137500,0.100000,0.100000},{0.687500,0.137500,0.050000,0.050000},{0.687500,0.137500,0.100000,0.100000},{0.712500,0.137500,0.050000,0.050000},{0.712500,0.137500,0.100000,0.100000},{0.737500,0.137500,0.050000,0.050000},{0.737500,0.137500,0.100000,0.100000},{0.762500,0.137500,0.050000,0.050000},{0.762500,0.137500,0.100000,0.100000},{0.787500,0.137500,0.050000,0.050000},{0.787500,0.137500,0.100000,0.100000},{0.812500,0.137500,0.050000,0.050000},{0.812500,0.137500,0.100000,0.100000},{0.837500,0.137500,0.050000,0.050000},{0.837500,0.137500,0.100000,0.100000},{0.862500,0.137500,0.050000,0.050000},{0.862500,0.137500,0.100000,0.100000},{0.887500,0.137500,0.050000,0.050000},{0.887500,0.137500,0.100000,0.100000},{0.912500,0.137500,0.050000,0.050000},{0.912500,0.137500,0.100000,0.100000},{0.937500,0.137500,0.050000,0.050000},{0.937500,0.137500,0.100000,0.100000},{0.962500,0.137500,0.050000,0.050000},{0.962500,0.137500,0.100000,0.100000},{0.987500,0.137500,0.050000,0.050000},{0.987500,0.137500,0.100000,0.100000},{0.012500,0.162500,0.050000,0.050000},{0.012500,0.162500,0.100000,0.100000},{0.037500,0.162500,0.050000,0.050000},{0.037500,0.162500,0.100000,0.100000},{0.062500,0.162500,0.050000,0.050000},{0.062500,0.162500,0.100000,0.100000},{0.087500,0.162500,0.050000,0.050000},{0.087500,0.162500,0.100000,0.100000},{0.112500,0.162500,0.050000,0.050000},{0.112500,0.162500,0.100000,0.100000},{0.137500,0.162500,0.050000,0.050000},{0.137500,0.162500,0.100000,0.100000},{0.162500,0.162500,0.050000,0.050000},{0.162500,0.162500,0.100000,0.100000},{0.187500,0.162500,0.050000,0.050000},{0.187500,0.162500,0.100000,0.100000},{0.212500,0.162500,0.050000,0.050000},{0.212500,0.162500,0.100000,0.100000},{0.237500,0.162500,0.050000,0.050000},{0.237500,0.162500,0.100000,0.100000},{0.262500,0.162500,0.050000,0.050000},{0.262500,0.162500,0.100000,0.100000},{0.287500,0.162500,0.050000,0.050000},{0.287500,0.162500,0.100000,0.100000},{0.312500,0.162500,0.050000,0.050000},{0.312500,0.162500,0.100000,0.100000},{0.337500,0.162500,0.050000,0.050000},{0.337500,0.162500,0.100000,0.100000},{0.362500,0.162500,0.050000,0.050000},{0.362500,0.162500,0.100000,0.100000},{0.387500,0.162500,0.050000,0.050000},{0.387500,0.162500,0.100000,0.100000},{0.412500,0.162500,0.050000,0.050000},{0.412500,0.162500,0.100000,0.100000},{0.437500,0.162500,0.050000,0.050000},{0.437500,0.162500,0.100000,0.100000},{0.462500,0.162500,0.050000,0.050000},{0.462500,0.162500,0.100000,0.100000},{0.487500,0.162500,0.050000,0.050000},{0.487500,0.162500,0.100000,0.100000},{0.512500,0.162500,0.050000,0.050000},{0.512500,0.162500,0.100000,0.100000},{0.537500,0.162500,0.050000,0.050000},{0.537500,0.162500,0.100000,0.100000},{0.562500,0.162500,0.050000,0.050000},{0.562500,0.162500,0.100000,0.100000},{0.587500,0.162500,0.050000,0.050000},{0.587500,0.162500,0.100000,0.100000},{0.612500,0.162500,0.050000,0.050000},{0.612500,0.162500,0.100000,0.100000},{0.637500,0.162500,0.050000,0.050000},{0.637500,0.162500,0.100000,0.100000},{0.662500,0.162500,0.050000,0.050000},{0.662500,0.162500,0.100000,0.100000},{0.687500,0.162500,0.050000,0.050000},{0.687500,0.162500,0.100000,0.100000},{0.712500,0.162500,0.050000,0.050000},{0.712500,0.162500,0.100000,0.100000},{0.737500,0.162500,0.050000,0.050000},{0.737500,0.162500,0.100000,0.100000},{0.762500,0.162500,0.050000,0.050000},{0.762500,0.162500,0.100000,0.100000},{0.787500,0.162500,0.050000,0.050000},{0.787500,0.162500,0.100000,0.100000},{0.812500,0.162500,0.050000,0.050000},{0.812500,0.162500,0.100000,0.100000},{0.837500,0.162500,0.050000,0.050000},{0.837500,0.162500,0.100000,0.100000},{0.862500,0.162500,0.050000,0.050000},{0.862500,0.162500,0.100000,0.100000},{0.887500,0.162500,0.050000,0.050000},{0.887500,0.162500,0.100000,0.100000},{0.912500,0.162500,0.050000,0.050000},{0.912500,0.162500,0.100000,0.100000},{0.937500,0.162500,0.050000,0.050000},{0.937500,0.162500,0.100000,0.100000},{0.962500,0.162500,0.050000,0.050000},{0.962500,0.162500,0.100000,0.100000},{0.987500,0.162500,0.050000,0.050000},{0.987500,0.162500,0.100000,0.100000},{0.012500,0.187500,0.050000,0.050000},{0.012500,0.187500,0.100000,0.100000},{0.037500,0.187500,0.050000,0.050000},{0.037500,0.187500,0.100000,0.100000},{0.062500,0.187500,0.050000,0.050000},{0.062500,0.187500,0.100000,0.100000},{0.087500,0.187500,0.050000,0.050000},{0.087500,0.187500,0.100000,0.100000},{0.112500,0.187500,0.050000,0.050000},{0.112500,0.187500,0.100000,0.100000},{0.137500,0.187500,0.050000,0.050000},{0.137500,0.187500,0.100000,0.100000},{0.162500,0.187500,0.050000,0.050000},{0.162500,0.187500,0.100000,0.100000},{0.187500,0.187500,0.050000,0.050000},{0.187500,0.187500,0.100000,0.100000},{0.212500,0.187500,0.050000,0.050000},{0.212500,0.187500,0.100000,0.100000},{0.237500,0.187500,0.050000,0.050000},{0.237500,0.187500,0.100000,0.100000},{0.262500,0.187500,0.050000,0.050000},{0.262500,0.187500,0.100000,0.100000},{0.287500,0.187500,0.050000,0.050000},{0.287500,0.187500,0.100000,0.100000},{0.312500,0.187500,0.050000,0.050000},{0.312500,0.187500,0.100000,0.100000},{0.337500,0.187500,0.050000,0.050000},{0.337500,0.187500,0.100000,0.100000},{0.362500,0.187500,0.050000,0.050000},{0.362500,0.187500,0.100000,0.100000},{0.387500,0.187500,0.050000,0.050000},{0.387500,0.187500,0.100000,0.100000},{0.412500,0.187500,0.050000,0.050000},{0.412500,0.187500,0.100000,0.100000},{0.437500,0.187500,0.050000,0.050000},{0.437500,0.187500,0.100000,0.100000},{0.462500,0.187500,0.050000,0.050000},{0.462500,0.187500,0.100000,0.100000},{0.487500,0.187500,0.050000,0.050000},{0.487500,0.187500,0.100000,0.100000},{0.512500,0.187500,0.050000,0.050000},{0.512500,0.187500,0.100000,0.100000},{0.537500,0.187500,0.050000,0.050000},{0.537500,0.187500,0.100000,0.100000},{0.562500,0.187500,0.050000,0.050000},{0.562500,0.187500,0.100000,0.100000},{0.587500,0.187500,0.050000,0.050000},{0.587500,0.187500,0.100000,0.100000},{0.612500,0.187500,0.050000,0.050000},{0.612500,0.187500,0.100000,0.100000},{0.637500,0.187500,0.050000,0.050000},{0.637500,0.187500,0.100000,0.100000},{0.662500,0.187500,0.050000,0.050000},{0.662500,0.187500,0.100000,0.100000},{0.687500,0.187500,0.050000,0.050000},{0.687500,0.187500,0.100000,0.100000},{0.712500,0.187500,0.050000,0.050000},{0.712500,0.187500,0.100000,0.100000},{0.737500,0.187500,0.050000,0.050000},{0.737500,0.187500,0.100000,0.100000},{0.762500,0.187500,0.050000,0.050000},{0.762500,0.187500,0.100000,0.100000},{0.787500,0.187500,0.050000,0.050000},{0.787500,0.187500,0.100000,0.100000},{0.812500,0.187500,0.050000,0.050000},{0.812500,0.187500,0.100000,0.100000},{0.837500,0.187500,0.050000,0.050000},{0.837500,0.187500,0.100000,0.100000},{0.862500,0.187500,0.050000,0.050000},{0.862500,0.187500,0.100000,0.100000},{0.887500,0.187500,0.050000,0.050000},{0.887500,0.187500,0.100000,0.100000},{0.912500,0.187500,0.050000,0.050000},{0.912500,0.187500,0.100000,0.100000},{0.937500,0.187500,0.050000,0.050000},{0.937500,0.187500,0.100000,0.100000},{0.962500,0.187500,0.050000,0.050000},{0.962500,0.187500,0.100000,0.100000},{0.987500,0.187500,0.050000,0.050000},{0.987500,0.187500,0.100000,0.100000},{0.012500,0.212500,0.050000,0.050000},{0.012500,0.212500,0.100000,0.100000},{0.037500,0.212500,0.050000,0.050000},{0.037500,0.212500,0.100000,0.100000},{0.062500,0.212500,0.050000,0.050000},{0.062500,0.212500,0.100000,0.100000},{0.087500,0.212500,0.050000,0.050000},{0.087500,0.212500,0.100000,0.100000},{0.112500,0.212500,0.050000,0.050000},{0.112500,0.212500,0.100000,0.100000},{0.137500,0.212500,0.050000,0.050000},{0.137500,0.212500,0.100000,0.100000},{0.162500,0.212500,0.050000,0.050000},{0.162500,0.212500,0.100000,0.100000},{0.187500,0.212500,0.050000,0.050000},{0.187500,0.212500,0.100000,0.100000},{0.212500,0.212500,0.050000,0.050000},{0.212500,0.212500,0.100000,0.100000},{0.237500,0.212500,0.050000,0.050000},{0.237500,0.212500,0.100000,0.100000},{0.262500,0.212500,0.050000,0.050000},{0.262500,0.212500,0.100000,0.100000},{0.287500,0.212500,0.050000,0.050000},{0.287500,0.212500,0.100000,0.100000},{0.312500,0.212500,0.050000,0.050000},{0.312500,0.212500,0.100000,0.100000},{0.337500,0.212500,0.050000,0.050000},{0.337500,0.212500,0.100000,0.100000},{0.362500,0.212500,0.050000,0.050000},{0.362500,0.212500,0.100000,0.100000},{0.387500,0.212500,0.050000,0.050000},{0.387500,0.212500,0.100000,0.100000},{0.412500,0.212500,0.050000,0.050000},{0.412500,0.212500,0.100000,0.100000},{0.437500,0.212500,0.050000,0.050000},{0.437500,0.212500,0.100000,0.100000},{0.462500,0.212500,0.050000,0.050000},{0.462500,0.212500,0.100000,0.100000},{0.487500,0.212500,0.050000,0.050000},{0.487500,0.212500,0.100000,0.100000},{0.512500,0.212500,0.050000,0.050000},{0.512500,0.212500,0.100000,0.100000},{0.537500,0.212500,0.050000,0.050000},{0.537500,0.212500,0.100000,0.100000},{0.562500,0.212500,0.050000,0.050000},{0.562500,0.212500,0.100000,0.100000},{0.587500,0.212500,0.050000,0.050000},{0.587500,0.212500,0.100000,0.100000},{0.612500,0.212500,0.050000,0.050000},{0.612500,0.212500,0.100000,0.100000},{0.637500,0.212500,0.050000,0.050000},{0.637500,0.212500,0.100000,0.100000},{0.662500,0.212500,0.050000,0.050000},{0.662500,0.212500,0.100000,0.100000},{0.687500,0.212500,0.050000,0.050000},{0.687500,0.212500,0.100000,0.100000},{0.712500,0.212500,0.050000,0.050000},{0.712500,0.212500,0.100000,0.100000},{0.737500,0.212500,0.050000,0.050000},{0.737500,0.212500,0.100000,0.100000},{0.762500,0.212500,0.050000,0.050000},{0.762500,0.212500,0.100000,0.100000},{0.787500,0.212500,0.050000,0.050000},{0.787500,0.212500,0.100000,0.100000},{0.812500,0.212500,0.050000,0.050000},{0.812500,0.212500,0.100000,0.100000},{0.837500,0.212500,0.050000,0.050000},{0.837500,0.212500,0.100000,0.100000},{0.862500,0.212500,0.050000,0.050000},{0.862500,0.212500,0.100000,0.100000},{0.887500,0.212500,0.050000,0.050000},{0.887500,0.212500,0.100000,0.100000},{0.912500,0.212500,0.050000,0.050000},{0.912500,0.212500,0.100000,0.100000},{0.937500,0.212500,0.050000,0.050000},{0.937500,0.212500,0.100000,0.100000},{0.962500,0.212500,0.050000,0.050000},{0.962500,0.212500,0.100000,0.100000},{0.987500,0.212500,0.050000,0.050000},{0.987500,0.212500,0.100000,0.100000},{0.012500,0.237500,0.050000,0.050000},{0.012500,0.237500,0.100000,0.100000},{0.037500,0.237500,0.050000,0.050000},{0.037500,0.237500,0.100000,0.100000},{0.062500,0.237500,0.050000,0.050000},{0.062500,0.237500,0.100000,0.100000},{0.087500,0.237500,0.050000,0.050000},{0.087500,0.237500,0.100000,0.100000},{0.112500,0.237500,0.050000,0.050000},{0.112500,0.237500,0.100000,0.100000},{0.137500,0.237500,0.050000,0.050000},{0.137500,0.237500,0.100000,0.100000},{0.162500,0.237500,0.050000,0.050000},{0.162500,0.237500,0.100000,0.100000},{0.187500,0.237500,0.050000,0.050000},{0.187500,0.237500,0.100000,0.100000},{0.212500,0.237500,0.050000,0.050000},{0.212500,0.237500,0.100000,0.100000},{0.237500,0.237500,0.050000,0.050000},{0.237500,0.237500,0.100000,0.100000},{0.262500,0.237500,0.050000,0.050000},{0.262500,0.237500,0.100000,0.100000},{0.287500,0.237500,0.050000,0.050000},{0.287500,0.237500,0.100000,0.100000},{0.312500,0.237500,0.050000,0.050000},{0.312500,0.237500,0.100000,0.100000},{0.337500,0.237500,0.050000,0.050000},{0.337500,0.237500,0.100000,0.100000},{0.362500,0.237500,0.050000,0.050000},{0.362500,0.237500,0.100000,0.100000},{0.387500,0.237500,0.050000,0.050000},{0.387500,0.237500,0.100000,0.100000},{0.412500,0.237500,0.050000,0.050000},{0.412500,0.237500,0.100000,0.100000},{0.437500,0.237500,0.050000,0.050000},{0.437500,0.237500,0.100000,0.100000},{0.462500,0.237500,0.050000,0.050000},{0.462500,0.237500,0.100000,0.100000},{0.487500,0.237500,0.050000,0.050000},{0.487500,0.237500,0.100000,0.100000},{0.512500,0.237500,0.050000,0.050000},{0.512500,0.237500,0.100000,0.100000},{0.537500,0.237500,0.050000,0.050000},{0.537500,0.237500,0.100000,0.100000},{0.562500,0.237500,0.050000,0.050000},{0.562500,0.237500,0.100000,0.100000},{0.587500,0.237500,0.050000,0.050000},{0.587500,0.237500,0.100000,0.100000},{0.612500,0.237500,0.050000,0.050000},{0.612500,0.237500,0.100000,0.100000},{0.637500,0.237500,0.050000,0.050000},{0.637500,0.237500,0.100000,0.100000},{0.662500,0.237500,0.050000,0.050000},{0.662500,0.237500,0.100000,0.100000},{0.687500,0.237500,0.050000,0.050000},{0.687500,0.237500,0.100000,0.100000},{0.712500,0.237500,0.050000,0.050000},{0.712500,0.237500,0.100000,0.100000},{0.737500,0.237500,0.050000,0.050000},{0.737500,0.237500,0.100000,0.100000},{0.762500,0.237500,0.050000,0.050000},{0.762500,0.237500,0.100000,0.100000},{0.787500,0.237500,0.050000,0.050000},{0.787500,0.237500,0.100000,0.100000},{0.812500,0.237500,0.050000,0.050000},{0.812500,0.237500,0.100000,0.100000},{0.837500,0.237500,0.050000,0.050000},{0.837500,0.237500,0.100000,0.100000},{0.862500,0.237500,0.050000,0.050000},{0.862500,0.237500,0.100000,0.100000},{0.887500,0.237500,0.050000,0.050000},{0.887500,0.237500,0.100000,0.100000},{0.912500,0.237500,0.050000,0.050000},{0.912500,0.237500,0.100000,0.100000},{0.937500,0.237500,0.050000,0.050000},{0.937500,0.237500,0.100000,0.100000},{0.962500,0.237500,0.050000,0.050000},{0.962500,0.237500,0.100000,0.100000},{0.987500,0.237500,0.050000,0.050000},{0.987500,0.237500,0.100000,0.100000},{0.012500,0.262500,0.050000,0.050000},{0.012500,0.262500,0.100000,0.100000},{0.037500,0.262500,0.050000,0.050000},{0.037500,0.262500,0.100000,0.100000},{0.062500,0.262500,0.050000,0.050000},{0.062500,0.262500,0.100000,0.100000},{0.087500,0.262500,0.050000,0.050000},{0.087500,0.262500,0.100000,0.100000},{0.112500,0.262500,0.050000,0.050000},{0.112500,0.262500,0.100000,0.100000},{0.137500,0.262500,0.050000,0.050000},{0.137500,0.262500,0.100000,0.100000},{0.162500,0.262500,0.050000,0.050000},{0.162500,0.262500,0.100000,0.100000},{0.187500,0.262500,0.050000,0.050000},{0.187500,0.262500,0.100000,0.100000},{0.212500,0.262500,0.050000,0.050000},{0.212500,0.262500,0.100000,0.100000},{0.237500,0.262500,0.050000,0.050000},{0.237500,0.262500,0.100000,0.100000},{0.262500,0.262500,0.050000,0.050000},{0.262500,0.262500,0.100000,0.100000},{0.287500,0.262500,0.050000,0.050000},{0.287500,0.262500,0.100000,0.100000},{0.312500,0.262500,0.050000,0.050000},{0.312500,0.262500,0.100000,0.100000},{0.337500,0.262500,0.050000,0.050000},{0.337500,0.262500,0.100000,0.100000},{0.362500,0.262500,0.050000,0.050000},{0.362500,0.262500,0.100000,0.100000},{0.387500,0.262500,0.050000,0.050000},{0.387500,0.262500,0.100000,0.100000},{0.412500,0.262500,0.050000,0.050000},{0.412500,0.262500,0.100000,0.100000},{0.437500,0.262500,0.050000,0.050000},{0.437500,0.262500,0.100000,0.100000},{0.462500,0.262500,0.050000,0.050000},{0.462500,0.262500,0.100000,0.100000},{0.487500,0.262500,0.050000,0.050000},{0.487500,0.262500,0.100000,0.100000},{0.512500,0.262500,0.050000,0.050000},{0.512500,0.262500,0.100000,0.100000},{0.537500,0.262500,0.050000,0.050000},{0.537500,0.262500,0.100000,0.100000},{0.562500,0.262500,0.050000,0.050000},{0.562500,0.262500,0.100000,0.100000},{0.587500,0.262500,0.050000,0.050000},{0.587500,0.262500,0.100000,0.100000},{0.612500,0.262500,0.050000,0.050000},{0.612500,0.262500,0.100000,0.100000},{0.637500,0.262500,0.050000,0.050000},{0.637500,0.262500,0.100000,0.100000},{0.662500,0.262500,0.050000,0.050000},{0.662500,0.262500,0.100000,0.100000},{0.687500,0.262500,0.050000,0.050000},{0.687500,0.262500,0.100000,0.100000},{0.712500,0.262500,0.050000,0.050000},{0.712500,0.262500,0.100000,0.100000},{0.737500,0.262500,0.050000,0.050000},{0.737500,0.262500,0.100000,0.100000},{0.762500,0.262500,0.050000,0.050000},{0.762500,0.262500,0.100000,0.100000},{0.787500,0.262500,0.050000,0.050000},{0.787500,0.262500,0.100000,0.100000},{0.812500,0.262500,0.050000,0.050000},{0.812500,0.262500,0.100000,0.100000},{0.837500,0.262500,0.050000,0.050000},{0.837500,0.262500,0.100000,0.100000},{0.862500,0.262500,0.050000,0.050000},{0.862500,0.262500,0.100000,0.100000},{0.887500,0.262500,0.050000,0.050000},{0.887500,0.262500,0.100000,0.100000},{0.912500,0.262500,0.050000,0.050000},{0.912500,0.262500,0.100000,0.100000},{0.937500,0.262500,0.050000,0.050000},{0.937500,0.262500,0.100000,0.100000},{0.962500,0.262500,0.050000,0.050000},{0.962500,0.262500,0.100000,0.100000},{0.987500,0.262500,0.050000,0.050000},{0.987500,0.262500,0.100000,0.100000},{0.012500,0.287500,0.050000,0.050000},{0.012500,0.287500,0.100000,0.100000},{0.037500,0.287500,0.050000,0.050000},{0.037500,0.287500,0.100000,0.100000},{0.062500,0.287500,0.050000,0.050000},{0.062500,0.287500,0.100000,0.100000},{0.087500,0.287500,0.050000,0.050000},{0.087500,0.287500,0.100000,0.100000},{0.112500,0.287500,0.050000,0.050000},{0.112500,0.287500,0.100000,0.100000},{0.137500,0.287500,0.050000,0.050000},{0.137500,0.287500,0.100000,0.100000},{0.162500,0.287500,0.050000,0.050000},{0.162500,0.287500,0.100000,0.100000},{0.187500,0.287500,0.050000,0.050000},{0.187500,0.287500,0.100000,0.100000},{0.212500,0.287500,0.050000,0.050000},{0.212500,0.287500,0.100000,0.100000},{0.237500,0.287500,0.050000,0.050000},{0.237500,0.287500,0.100000,0.100000},{0.262500,0.287500,0.050000,0.050000},{0.262500,0.287500,0.100000,0.100000},{0.287500,0.287500,0.050000,0.050000},{0.287500,0.287500,0.100000,0.100000},{0.312500,0.287500,0.050000,0.050000},{0.312500,0.287500,0.100000,0.100000},{0.337500,0.287500,0.050000,0.050000},{0.337500,0.287500,0.100000,0.100000},{0.362500,0.287500,0.050000,0.050000},{0.362500,0.287500,0.100000,0.100000},{0.387500,0.287500,0.050000,0.050000},{0.387500,0.287500,0.100000,0.100000},{0.412500,0.287500,0.050000,0.050000},{0.412500,0.287500,0.100000,0.100000},{0.437500,0.287500,0.050000,0.050000},{0.437500,0.287500,0.100000,0.100000},{0.462500,0.287500,0.050000,0.050000},{0.462500,0.287500,0.100000,0.100000},{0.487500,0.287500,0.050000,0.050000},{0.487500,0.287500,0.100000,0.100000},{0.512500,0.287500,0.050000,0.050000},{0.512500,0.287500,0.100000,0.100000},{0.537500,0.287500,0.050000,0.050000},{0.537500,0.287500,0.100000,0.100000},{0.562500,0.287500,0.050000,0.050000},{0.562500,0.287500,0.100000,0.100000},{0.587500,0.287500,0.050000,0.050000},{0.587500,0.287500,0.100000,0.100000},{0.612500,0.287500,0.050000,0.050000},{0.612500,0.287500,0.100000,0.100000},{0.637500,0.287500,0.050000,0.050000},{0.637500,0.287500,0.100000,0.100000},{0.662500,0.287500,0.050000,0.050000},{0.662500,0.287500,0.100000,0.100000},{0.687500,0.287500,0.050000,0.050000},{0.687500,0.287500,0.100000,0.100000},{0.712500,0.287500,0.050000,0.050000},{0.712500,0.287500,0.100000,0.100000},{0.737500,0.287500,0.050000,0.050000},{0.737500,0.287500,0.100000,0.100000},{0.762500,0.287500,0.050000,0.050000},{0.762500,0.287500,0.100000,0.100000},{0.787500,0.287500,0.050000,0.050000},{0.787500,0.287500,0.100000,0.100000},{0.812500,0.287500,0.050000,0.050000},{0.812500,0.287500,0.100000,0.100000},{0.837500,0.287500,0.050000,0.050000},{0.837500,0.287500,0.100000,0.100000},{0.862500,0.287500,0.050000,0.050000},{0.862500,0.287500,0.100000,0.100000},{0.887500,0.287500,0.050000,0.050000},{0.887500,0.287500,0.100000,0.100000},{0.912500,0.287500,0.050000,0.050000},{0.912500,0.287500,0.100000,0.100000},{0.937500,0.287500,0.050000,0.050000},{0.937500,0.287500,0.100000,0.100000},{0.962500,0.287500,0.050000,0.050000},{0.962500,0.287500,0.100000,0.100000},{0.987500,0.287500,0.050000,0.050000},{0.987500,0.287500,0.100000,0.100000},{0.012500,0.312500,0.050000,0.050000},{0.012500,0.312500,0.100000,0.100000},{0.037500,0.312500,0.050000,0.050000},{0.037500,0.312500,0.100000,0.100000},{0.062500,0.312500,0.050000,0.050000},{0.062500,0.312500,0.100000,0.100000},{0.087500,0.312500,0.050000,0.050000},{0.087500,0.312500,0.100000,0.100000},{0.112500,0.312500,0.050000,0.050000},{0.112500,0.312500,0.100000,0.100000},{0.137500,0.312500,0.050000,0.050000},{0.137500,0.312500,0.100000,0.100000},{0.162500,0.312500,0.050000,0.050000},{0.162500,0.312500,0.100000,0.100000},{0.187500,0.312500,0.050000,0.050000},{0.187500,0.312500,0.100000,0.100000},{0.212500,0.312500,0.050000,0.050000},{0.212500,0.312500,0.100000,0.100000},{0.237500,0.312500,0.050000,0.050000},{0.237500,0.312500,0.100000,0.100000},{0.262500,0.312500,0.050000,0.050000},{0.262500,0.312500,0.100000,0.100000},{0.287500,0.312500,0.050000,0.050000},{0.287500,0.312500,0.100000,0.100000},{0.312500,0.312500,0.050000,0.050000},{0.312500,0.312500,0.100000,0.100000},{0.337500,0.312500,0.050000,0.050000},{0.337500,0.312500,0.100000,0.100000},{0.362500,0.312500,0.050000,0.050000},{0.362500,0.312500,0.100000,0.100000},{0.387500,0.312500,0.050000,0.050000},{0.387500,0.312500,0.100000,0.100000},{0.412500,0.312500,0.050000,0.050000},{0.412500,0.312500,0.100000,0.100000},{0.437500,0.312500,0.050000,0.050000},{0.437500,0.312500,0.100000,0.100000},{0.462500,0.312500,0.050000,0.050000},{0.462500,0.312500,0.100000,0.100000},{0.487500,0.312500,0.050000,0.050000},{0.487500,0.312500,0.100000,0.100000},{0.512500,0.312500,0.050000,0.050000},{0.512500,0.312500,0.100000,0.100000},{0.537500,0.312500,0.050000,0.050000},{0.537500,0.312500,0.100000,0.100000},{0.562500,0.312500,0.050000,0.050000},{0.562500,0.312500,0.100000,0.100000},{0.587500,0.312500,0.050000,0.050000},{0.587500,0.312500,0.100000,0.100000},{0.612500,0.312500,0.050000,0.050000},{0.612500,0.312500,0.100000,0.100000},{0.637500,0.312500,0.050000,0.050000},{0.637500,0.312500,0.100000,0.100000},{0.662500,0.312500,0.050000,0.050000},{0.662500,0.312500,0.100000,0.100000},{0.687500,0.312500,0.050000,0.050000},{0.687500,0.312500,0.100000,0.100000},{0.712500,0.312500,0.050000,0.050000},{0.712500,0.312500,0.100000,0.100000},{0.737500,0.312500,0.050000,0.050000},{0.737500,0.312500,0.100000,0.100000},{0.762500,0.312500,0.050000,0.050000},{0.762500,0.312500,0.100000,0.100000},{0.787500,0.312500,0.050000,0.050000},{0.787500,0.312500,0.100000,0.100000},{0.812500,0.312500,0.050000,0.050000},{0.812500,0.312500,0.100000,0.100000},{0.837500,0.312500,0.050000,0.050000},{0.837500,0.312500,0.100000,0.100000},{0.862500,0.312500,0.050000,0.050000},{0.862500,0.312500,0.100000,0.100000},{0.887500,0.312500,0.050000,0.050000},{0.887500,0.312500,0.100000,0.100000},{0.912500,0.312500,0.050000,0.050000},{0.912500,0.312500,0.100000,0.100000},{0.937500,0.312500,0.050000,0.050000},{0.937500,0.312500,0.100000,0.100000},{0.962500,0.312500,0.050000,0.050000},{0.962500,0.312500,0.100000,0.100000},{0.987500,0.312500,0.050000,0.050000},{0.987500,0.312500,0.100000,0.100000},{0.012500,0.337500,0.050000,0.050000},{0.012500,0.337500,0.100000,0.100000},{0.037500,0.337500,0.050000,0.050000},{0.037500,0.337500,0.100000,0.100000},{0.062500,0.337500,0.050000,0.050000},{0.062500,0.337500,0.100000,0.100000},{0.087500,0.337500,0.050000,0.050000},{0.087500,0.337500,0.100000,0.100000},{0.112500,0.337500,0.050000,0.050000},{0.112500,0.337500,0.100000,0.100000},{0.137500,0.337500,0.050000,0.050000},{0.137500,0.337500,0.100000,0.100000},{0.162500,0.337500,0.050000,0.050000},{0.162500,0.337500,0.100000,0.100000},{0.187500,0.337500,0.050000,0.050000},{0.187500,0.337500,0.100000,0.100000},{0.212500,0.337500,0.050000,0.050000},{0.212500,0.337500,0.100000,0.100000},{0.237500,0.337500,0.050000,0.050000},{0.237500,0.337500,0.100000,0.100000},{0.262500,0.337500,0.050000,0.050000},{0.262500,0.337500,0.100000,0.100000},{0.287500,0.337500,0.050000,0.050000},{0.287500,0.337500,0.100000,0.100000},{0.312500,0.337500,0.050000,0.050000},{0.312500,0.337500,0.100000,0.100000},{0.337500,0.337500,0.050000,0.050000},{0.337500,0.337500,0.100000,0.100000},{0.362500,0.337500,0.050000,0.050000},{0.362500,0.337500,0.100000,0.100000},{0.387500,0.337500,0.050000,0.050000},{0.387500,0.337500,0.100000,0.100000},{0.412500,0.337500,0.050000,0.050000},{0.412500,0.337500,0.100000,0.100000},{0.437500,0.337500,0.050000,0.050000},{0.437500,0.337500,0.100000,0.100000},{0.462500,0.337500,0.050000,0.050000},{0.462500,0.337500,0.100000,0.100000},{0.487500,0.337500,0.050000,0.050000},{0.487500,0.337500,0.100000,0.100000},{0.512500,0.337500,0.050000,0.050000},{0.512500,0.337500,0.100000,0.100000},{0.537500,0.337500,0.050000,0.050000},{0.537500,0.337500,0.100000,0.100000},{0.562500,0.337500,0.050000,0.050000},{0.562500,0.337500,0.100000,0.100000},{0.587500,0.337500,0.050000,0.050000},{0.587500,0.337500,0.100000,0.100000},{0.612500,0.337500,0.050000,0.050000},{0.612500,0.337500,0.100000,0.100000},{0.637500,0.337500,0.050000,0.050000},{0.637500,0.337500,0.100000,0.100000},{0.662500,0.337500,0.050000,0.050000},{0.662500,0.337500,0.100000,0.100000},{0.687500,0.337500,0.050000,0.050000},{0.687500,0.337500,0.100000,0.100000},{0.712500,0.337500,0.050000,0.050000},{0.712500,0.337500,0.100000,0.100000},{0.737500,0.337500,0.050000,0.050000},{0.737500,0.337500,0.100000,0.100000},{0.762500,0.337500,0.050000,0.050000},{0.762500,0.337500,0.100000,0.100000},{0.787500,0.337500,0.050000,0.050000},{0.787500,0.337500,0.100000,0.100000},{0.812500,0.337500,0.050000,0.050000},{0.812500,0.337500,0.100000,0.100000},{0.837500,0.337500,0.050000,0.050000},{0.837500,0.337500,0.100000,0.100000},{0.862500,0.337500,0.050000,0.050000},{0.862500,0.337500,0.100000,0.100000},{0.887500,0.337500,0.050000,0.050000},{0.887500,0.337500,0.100000,0.100000},{0.912500,0.337500,0.050000,0.050000},{0.912500,0.337500,0.100000,0.100000},{0.937500,0.337500,0.050000,0.050000},{0.937500,0.337500,0.100000,0.100000},{0.962500,0.337500,0.050000,0.050000},{0.962500,0.337500,0.100000,0.100000},{0.987500,0.337500,0.050000,0.050000},{0.987500,0.337500,0.100000,0.100000},{0.012500,0.362500,0.050000,0.050000},{0.012500,0.362500,0.100000,0.100000},{0.037500,0.362500,0.050000,0.050000},{0.037500,0.362500,0.100000,0.100000},{0.062500,0.362500,0.050000,0.050000},{0.062500,0.362500,0.100000,0.100000},{0.087500,0.362500,0.050000,0.050000},{0.087500,0.362500,0.100000,0.100000},{0.112500,0.362500,0.050000,0.050000},{0.112500,0.362500,0.100000,0.100000},{0.137500,0.362500,0.050000,0.050000},{0.137500,0.362500,0.100000,0.100000},{0.162500,0.362500,0.050000,0.050000},{0.162500,0.362500,0.100000,0.100000},{0.187500,0.362500,0.050000,0.050000},{0.187500,0.362500,0.100000,0.100000},{0.212500,0.362500,0.050000,0.050000},{0.212500,0.362500,0.100000,0.100000},{0.237500,0.362500,0.050000,0.050000},{0.237500,0.362500,0.100000,0.100000},{0.262500,0.362500,0.050000,0.050000},{0.262500,0.362500,0.100000,0.100000},{0.287500,0.362500,0.050000,0.050000},{0.287500,0.362500,0.100000,0.100000},{0.312500,0.362500,0.050000,0.050000},{0.312500,0.362500,0.100000,0.100000},{0.337500,0.362500,0.050000,0.050000},{0.337500,0.362500,0.100000,0.100000},{0.362500,0.362500,0.050000,0.050000},{0.362500,0.362500,0.100000,0.100000},{0.387500,0.362500,0.050000,0.050000},{0.387500,0.362500,0.100000,0.100000},{0.412500,0.362500,0.050000,0.050000},{0.412500,0.362500,0.100000,0.100000},{0.437500,0.362500,0.050000,0.050000},{0.437500,0.362500,0.100000,0.100000},{0.462500,0.362500,0.050000,0.050000},{0.462500,0.362500,0.100000,0.100000},{0.487500,0.362500,0.050000,0.050000},{0.487500,0.362500,0.100000,0.100000},{0.512500,0.362500,0.050000,0.050000},{0.512500,0.362500,0.100000,0.100000},{0.537500,0.362500,0.050000,0.050000},{0.537500,0.362500,0.100000,0.100000},{0.562500,0.362500,0.050000,0.050000},{0.562500,0.362500,0.100000,0.100000},{0.587500,0.362500,0.050000,0.050000},{0.587500,0.362500,0.100000,0.100000},{0.612500,0.362500,0.050000,0.050000},{0.612500,0.362500,0.100000,0.100000},{0.637500,0.362500,0.050000,0.050000},{0.637500,0.362500,0.100000,0.100000},{0.662500,0.362500,0.050000,0.050000},{0.662500,0.362500,0.100000,0.100000},{0.687500,0.362500,0.050000,0.050000},{0.687500,0.362500,0.100000,0.100000},{0.712500,0.362500,0.050000,0.050000},{0.712500,0.362500,0.100000,0.100000},{0.737500,0.362500,0.050000,0.050000},{0.737500,0.362500,0.100000,0.100000},{0.762500,0.362500,0.050000,0.050000},{0.762500,0.362500,0.100000,0.100000},{0.787500,0.362500,0.050000,0.050000},{0.787500,0.362500,0.100000,0.100000},{0.812500,0.362500,0.050000,0.050000},{0.812500,0.362500,0.100000,0.100000},{0.837500,0.362500,0.050000,0.050000},{0.837500,0.362500,0.100000,0.100000},{0.862500,0.362500,0.050000,0.050000},{0.862500,0.362500,0.100000,0.100000},{0.887500,0.362500,0.050000,0.050000},{0.887500,0.362500,0.100000,0.100000},{0.912500,0.362500,0.050000,0.050000},{0.912500,0.362500,0.100000,0.100000},{0.937500,0.362500,0.050000,0.050000},{0.937500,0.362500,0.100000,0.100000},{0.962500,0.362500,0.050000,0.050000},{0.962500,0.362500,0.100000,0.100000},{0.987500,0.362500,0.050000,0.050000},{0.987500,0.362500,0.100000,0.100000},{0.012500,0.387500,0.050000,0.050000},{0.012500,0.387500,0.100000,0.100000},{0.037500,0.387500,0.050000,0.050000},{0.037500,0.387500,0.100000,0.100000},{0.062500,0.387500,0.050000,0.050000},{0.062500,0.387500,0.100000,0.100000},{0.087500,0.387500,0.050000,0.050000},{0.087500,0.387500,0.100000,0.100000},{0.112500,0.387500,0.050000,0.050000},{0.112500,0.387500,0.100000,0.100000},{0.137500,0.387500,0.050000,0.050000},{0.137500,0.387500,0.100000,0.100000},{0.162500,0.387500,0.050000,0.050000},{0.162500,0.387500,0.100000,0.100000},{0.187500,0.387500,0.050000,0.050000},{0.187500,0.387500,0.100000,0.100000},{0.212500,0.387500,0.050000,0.050000},{0.212500,0.387500,0.100000,0.100000},{0.237500,0.387500,0.050000,0.050000},{0.237500,0.387500,0.100000,0.100000},{0.262500,0.387500,0.050000,0.050000},{0.262500,0.387500,0.100000,0.100000},{0.287500,0.387500,0.050000,0.050000},{0.287500,0.387500,0.100000,0.100000},{0.312500,0.387500,0.050000,0.050000},{0.312500,0.387500,0.100000,0.100000},{0.337500,0.387500,0.050000,0.050000},{0.337500,0.387500,0.100000,0.100000},{0.362500,0.387500,0.050000,0.050000},{0.362500,0.387500,0.100000,0.100000},{0.387500,0.387500,0.050000,0.050000},{0.387500,0.387500,0.100000,0.100000},{0.412500,0.387500,0.050000,0.050000},{0.412500,0.387500,0.100000,0.100000},{0.437500,0.387500,0.050000,0.050000},{0.437500,0.387500,0.100000,0.100000},{0.462500,0.387500,0.050000,0.050000},{0.462500,0.387500,0.100000,0.100000},{0.487500,0.387500,0.050000,0.050000},{0.487500,0.387500,0.100000,0.100000},{0.512500,0.387500,0.050000,0.050000},{0.512500,0.387500,0.100000,0.100000},{0.537500,0.387500,0.050000,0.050000},{0.537500,0.387500,0.100000,0.100000},{0.562500,0.387500,0.050000,0.050000},{0.562500,0.387500,0.100000,0.100000},{0.587500,0.387500,0.050000,0.050000},{0.587500,0.387500,0.100000,0.100000},{0.612500,0.387500,0.050000,0.050000},{0.612500,0.387500,0.100000,0.100000},{0.637500,0.387500,0.050000,0.050000},{0.637500,0.387500,0.100000,0.100000},{0.662500,0.387500,0.050000,0.050000},{0.662500,0.387500,0.100000,0.100000},{0.687500,0.387500,0.050000,0.050000},{0.687500,0.387500,0.100000,0.100000},{0.712500,0.387500,0.050000,0.050000},{0.712500,0.387500,0.100000,0.100000},{0.737500,0.387500,0.050000,0.050000},{0.737500,0.387500,0.100000,0.100000},{0.762500,0.387500,0.050000,0.050000},{0.762500,0.387500,0.100000,0.100000},{0.787500,0.387500,0.050000,0.050000},{0.787500,0.387500,0.100000,0.100000},{0.812500,0.387500,0.050000,0.050000},{0.812500,0.387500,0.100000,0.100000},{0.837500,0.387500,0.050000,0.050000},{0.837500,0.387500,0.100000,0.100000},{0.862500,0.387500,0.050000,0.050000},{0.862500,0.387500,0.100000,0.100000},{0.887500,0.387500,0.050000,0.050000},{0.887500,0.387500,0.100000,0.100000},{0.912500,0.387500,0.050000,0.050000},{0.912500,0.387500,0.100000,0.100000},{0.937500,0.387500,0.050000,0.050000},{0.937500,0.387500,0.100000,0.100000},{0.962500,0.387500,0.050000,0.050000},{0.962500,0.387500,0.100000,0.100000},{0.987500,0.387500,0.050000,0.050000},{0.987500,0.387500,0.100000,0.100000},{0.012500,0.412500,0.050000,0.050000},{0.012500,0.412500,0.100000,0.100000},{0.037500,0.412500,0.050000,0.050000},{0.037500,0.412500,0.100000,0.100000},{0.062500,0.412500,0.050000,0.050000},{0.062500,0.412500,0.100000,0.100000},{0.087500,0.412500,0.050000,0.050000},{0.087500,0.412500,0.100000,0.100000},{0.112500,0.412500,0.050000,0.050000},{0.112500,0.412500,0.100000,0.100000},{0.137500,0.412500,0.050000,0.050000},{0.137500,0.412500,0.100000,0.100000},{0.162500,0.412500,0.050000,0.050000},{0.162500,0.412500,0.100000,0.100000},{0.187500,0.412500,0.050000,0.050000},{0.187500,0.412500,0.100000,0.100000},{0.212500,0.412500,0.050000,0.050000},{0.212500,0.412500,0.100000,0.100000},{0.237500,0.412500,0.050000,0.050000},{0.237500,0.412500,0.100000,0.100000},{0.262500,0.412500,0.050000,0.050000},{0.262500,0.412500,0.100000,0.100000},{0.287500,0.412500,0.050000,0.050000},{0.287500,0.412500,0.100000,0.100000},{0.312500,0.412500,0.050000,0.050000},{0.312500,0.412500,0.100000,0.100000},{0.337500,0.412500,0.050000,0.050000},{0.337500,0.412500,0.100000,0.100000},{0.362500,0.412500,0.050000,0.050000},{0.362500,0.412500,0.100000,0.100000},{0.387500,0.412500,0.050000,0.050000},{0.387500,0.412500,0.100000,0.100000},{0.412500,0.412500,0.050000,0.050000},{0.412500,0.412500,0.100000,0.100000},{0.437500,0.412500,0.050000,0.050000},{0.437500,0.412500,0.100000,0.100000},{0.462500,0.412500,0.050000,0.050000},{0.462500,0.412500,0.100000,0.100000},{0.487500,0.412500,0.050000,0.050000},{0.487500,0.412500,0.100000,0.100000},{0.512500,0.412500,0.050000,0.050000},{0.512500,0.412500,0.100000,0.100000},{0.537500,0.412500,0.050000,0.050000},{0.537500,0.412500,0.100000,0.100000},{0.562500,0.412500,0.050000,0.050000},{0.562500,0.412500,0.100000,0.100000},{0.587500,0.412500,0.050000,0.050000},{0.587500,0.412500,0.100000,0.100000},{0.612500,0.412500,0.050000,0.050000},{0.612500,0.412500,0.100000,0.100000},{0.637500,0.412500,0.050000,0.050000},{0.637500,0.412500,0.100000,0.100000},{0.662500,0.412500,0.050000,0.050000},{0.662500,0.412500,0.100000,0.100000},{0.687500,0.412500,0.050000,0.050000},{0.687500,0.412500,0.100000,0.100000},{0.712500,0.412500,0.050000,0.050000},{0.712500,0.412500,0.100000,0.100000},{0.737500,0.412500,0.050000,0.050000},{0.737500,0.412500,0.100000,0.100000},{0.762500,0.412500,0.050000,0.050000},{0.762500,0.412500,0.100000,0.100000},{0.787500,0.412500,0.050000,0.050000},{0.787500,0.412500,0.100000,0.100000},{0.812500,0.412500,0.050000,0.050000},{0.812500,0.412500,0.100000,0.100000},{0.837500,0.412500,0.050000,0.050000},{0.837500,0.412500,0.100000,0.100000},{0.862500,0.412500,0.050000,0.050000},{0.862500,0.412500,0.100000,0.100000},{0.887500,0.412500,0.050000,0.050000},{0.887500,0.412500,0.100000,0.100000},{0.912500,0.412500,0.050000,0.050000},{0.912500,0.412500,0.100000,0.100000},{0.937500,0.412500,0.050000,0.050000},{0.937500,0.412500,0.100000,0.100000},{0.962500,0.412500,0.050000,0.050000},{0.962500,0.412500,0.100000,0.100000},{0.987500,0.412500,0.050000,0.050000},{0.987500,0.412500,0.100000,0.100000},{0.012500,0.437500,0.050000,0.050000},{0.012500,0.437500,0.100000,0.100000},{0.037500,0.437500,0.050000,0.050000},{0.037500,0.437500,0.100000,0.100000},{0.062500,0.437500,0.050000,0.050000},{0.062500,0.437500,0.100000,0.100000},{0.087500,0.437500,0.050000,0.050000},{0.087500,0.437500,0.100000,0.100000},{0.112500,0.437500,0.050000,0.050000},{0.112500,0.437500,0.100000,0.100000},{0.137500,0.437500,0.050000,0.050000},{0.137500,0.437500,0.100000,0.100000},{0.162500,0.437500,0.050000,0.050000},{0.162500,0.437500,0.100000,0.100000},{0.187500,0.437500,0.050000,0.050000},{0.187500,0.437500,0.100000,0.100000},{0.212500,0.437500,0.050000,0.050000},{0.212500,0.437500,0.100000,0.100000},{0.237500,0.437500,0.050000,0.050000},{0.237500,0.437500,0.100000,0.100000},{0.262500,0.437500,0.050000,0.050000},{0.262500,0.437500,0.100000,0.100000},{0.287500,0.437500,0.050000,0.050000},{0.287500,0.437500,0.100000,0.100000},{0.312500,0.437500,0.050000,0.050000},{0.312500,0.437500,0.100000,0.100000},{0.337500,0.437500,0.050000,0.050000},{0.337500,0.437500,0.100000,0.100000},{0.362500,0.437500,0.050000,0.050000},{0.362500,0.437500,0.100000,0.100000},{0.387500,0.437500,0.050000,0.050000},{0.387500,0.437500,0.100000,0.100000},{0.412500,0.437500,0.050000,0.050000},{0.412500,0.437500,0.100000,0.100000},{0.437500,0.437500,0.050000,0.050000},{0.437500,0.437500,0.100000,0.100000},{0.462500,0.437500,0.050000,0.050000},{0.462500,0.437500,0.100000,0.100000},{0.487500,0.437500,0.050000,0.050000},{0.487500,0.437500,0.100000,0.100000},{0.512500,0.437500,0.050000,0.050000},{0.512500,0.437500,0.100000,0.100000},{0.537500,0.437500,0.050000,0.050000},{0.537500,0.437500,0.100000,0.100000},{0.562500,0.437500,0.050000,0.050000},{0.562500,0.437500,0.100000,0.100000},{0.587500,0.437500,0.050000,0.050000},{0.587500,0.437500,0.100000,0.100000},{0.612500,0.437500,0.050000,0.050000},{0.612500,0.437500,0.100000,0.100000},{0.637500,0.437500,0.050000,0.050000},{0.637500,0.437500,0.100000,0.100000},{0.662500,0.437500,0.050000,0.050000},{0.662500,0.437500,0.100000,0.100000},{0.687500,0.437500,0.050000,0.050000},{0.687500,0.437500,0.100000,0.100000},{0.712500,0.437500,0.050000,0.050000},{0.712500,0.437500,0.100000,0.100000},{0.737500,0.437500,0.050000,0.050000},{0.737500,0.437500,0.100000,0.100000},{0.762500,0.437500,0.050000,0.050000},{0.762500,0.437500,0.100000,0.100000},{0.787500,0.437500,0.050000,0.050000},{0.787500,0.437500,0.100000,0.100000},{0.812500,0.437500,0.050000,0.050000},{0.812500,0.437500,0.100000,0.100000},{0.837500,0.437500,0.050000,0.050000},{0.837500,0.437500,0.100000,0.100000},{0.862500,0.437500,0.050000,0.050000},{0.862500,0.437500,0.100000,0.100000},{0.887500,0.437500,0.050000,0.050000},{0.887500,0.437500,0.100000,0.100000},{0.912500,0.437500,0.050000,0.050000},{0.912500,0.437500,0.100000,0.100000},{0.937500,0.437500,0.050000,0.050000},{0.937500,0.437500,0.100000,0.100000},{0.962500,0.437500,0.050000,0.050000},{0.962500,0.437500,0.100000,0.100000},{0.987500,0.437500,0.050000,0.050000},{0.987500,0.437500,0.100000,0.100000},{0.012500,0.462500,0.050000,0.050000},{0.012500,0.462500,0.100000,0.100000},{0.037500,0.462500,0.050000,0.050000},{0.037500,0.462500,0.100000,0.100000},{0.062500,0.462500,0.050000,0.050000},{0.062500,0.462500,0.100000,0.100000},{0.087500,0.462500,0.050000,0.050000},{0.087500,0.462500,0.100000,0.100000},{0.112500,0.462500,0.050000,0.050000},{0.112500,0.462500,0.100000,0.100000},{0.137500,0.462500,0.050000,0.050000},{0.137500,0.462500,0.100000,0.100000},{0.162500,0.462500,0.050000,0.050000},{0.162500,0.462500,0.100000,0.100000},{0.187500,0.462500,0.050000,0.050000},{0.187500,0.462500,0.100000,0.100000},{0.212500,0.462500,0.050000,0.050000},{0.212500,0.462500,0.100000,0.100000},{0.237500,0.462500,0.050000,0.050000},{0.237500,0.462500,0.100000,0.100000},{0.262500,0.462500,0.050000,0.050000},{0.262500,0.462500,0.100000,0.100000},{0.287500,0.462500,0.050000,0.050000},{0.287500,0.462500,0.100000,0.100000},{0.312500,0.462500,0.050000,0.050000},{0.312500,0.462500,0.100000,0.100000},{0.337500,0.462500,0.050000,0.050000},{0.337500,0.462500,0.100000,0.100000},{0.362500,0.462500,0.050000,0.050000},{0.362500,0.462500,0.100000,0.100000},{0.387500,0.462500,0.050000,0.050000},{0.387500,0.462500,0.100000,0.100000},{0.412500,0.462500,0.050000,0.050000},{0.412500,0.462500,0.100000,0.100000},{0.437500,0.462500,0.050000,0.050000},{0.437500,0.462500,0.100000,0.100000},{0.462500,0.462500,0.050000,0.050000},{0.462500,0.462500,0.100000,0.100000},{0.487500,0.462500,0.050000,0.050000},{0.487500,0.462500,0.100000,0.100000},{0.512500,0.462500,0.050000,0.050000},{0.512500,0.462500,0.100000,0.100000},{0.537500,0.462500,0.050000,0.050000},{0.537500,0.462500,0.100000,0.100000},{0.562500,0.462500,0.050000,0.050000},{0.562500,0.462500,0.100000,0.100000},{0.587500,0.462500,0.050000,0.050000},{0.587500,0.462500,0.100000,0.100000},{0.612500,0.462500,0.050000,0.050000},{0.612500,0.462500,0.100000,0.100000},{0.637500,0.462500,0.050000,0.050000},{0.637500,0.462500,0.100000,0.100000},{0.662500,0.462500,0.050000,0.050000},{0.662500,0.462500,0.100000,0.100000},{0.687500,0.462500,0.050000,0.050000},{0.687500,0.462500,0.100000,0.100000},{0.712500,0.462500,0.050000,0.050000},{0.712500,0.462500,0.100000,0.100000},{0.737500,0.462500,0.050000,0.050000},{0.737500,0.462500,0.100000,0.100000},{0.762500,0.462500,0.050000,0.050000},{0.762500,0.462500,0.100000,0.100000},{0.787500,0.462500,0.050000,0.050000},{0.787500,0.462500,0.100000,0.100000},{0.812500,0.462500,0.050000,0.050000},{0.812500,0.462500,0.100000,0.100000},{0.837500,0.462500,0.050000,0.050000},{0.837500,0.462500,0.100000,0.100000},{0.862500,0.462500,0.050000,0.050000},{0.862500,0.462500,0.100000,0.100000},{0.887500,0.462500,0.050000,0.050000},{0.887500,0.462500,0.100000,0.100000},{0.912500,0.462500,0.050000,0.050000},{0.912500,0.462500,0.100000,0.100000},{0.937500,0.462500,0.050000,0.050000},{0.937500,0.462500,0.100000,0.100000},{0.962500,0.462500,0.050000,0.050000},{0.962500,0.462500,0.100000,0.100000},{0.987500,0.462500,0.050000,0.050000},{0.987500,0.462500,0.100000,0.100000},{0.012500,0.487500,0.050000,0.050000},{0.012500,0.487500,0.100000,0.100000},{0.037500,0.487500,0.050000,0.050000},{0.037500,0.487500,0.100000,0.100000},{0.062500,0.487500,0.050000,0.050000},{0.062500,0.487500,0.100000,0.100000},{0.087500,0.487500,0.050000,0.050000},{0.087500,0.487500,0.100000,0.100000},{0.112500,0.487500,0.050000,0.050000},{0.112500,0.487500,0.100000,0.100000},{0.137500,0.487500,0.050000,0.050000},{0.137500,0.487500,0.100000,0.100000},{0.162500,0.487500,0.050000,0.050000},{0.162500,0.487500,0.100000,0.100000},{0.187500,0.487500,0.050000,0.050000},{0.187500,0.487500,0.100000,0.100000},{0.212500,0.487500,0.050000,0.050000},{0.212500,0.487500,0.100000,0.100000},{0.237500,0.487500,0.050000,0.050000},{0.237500,0.487500,0.100000,0.100000},{0.262500,0.487500,0.050000,0.050000},{0.262500,0.487500,0.100000,0.100000},{0.287500,0.487500,0.050000,0.050000},{0.287500,0.487500,0.100000,0.100000},{0.312500,0.487500,0.050000,0.050000},{0.312500,0.487500,0.100000,0.100000},{0.337500,0.487500,0.050000,0.050000},{0.337500,0.487500,0.100000,0.100000},{0.362500,0.487500,0.050000,0.050000},{0.362500,0.487500,0.100000,0.100000},{0.387500,0.487500,0.050000,0.050000},{0.387500,0.487500,0.100000,0.100000},{0.412500,0.487500,0.050000,0.050000},{0.412500,0.487500,0.100000,0.100000},{0.437500,0.487500,0.050000,0.050000},{0.437500,0.487500,0.100000,0.100000},{0.462500,0.487500,0.050000,0.050000},{0.462500,0.487500,0.100000,0.100000},{0.487500,0.487500,0.050000,0.050000},{0.487500,0.487500,0.100000,0.100000},{0.512500,0.487500,0.050000,0.050000},{0.512500,0.487500,0.100000,0.100000},{0.537500,0.487500,0.050000,0.050000},{0.537500,0.487500,0.100000,0.100000},{0.562500,0.487500,0.050000,0.050000},{0.562500,0.487500,0.100000,0.100000},{0.587500,0.487500,0.050000,0.050000},{0.587500,0.487500,0.100000,0.100000},{0.612500,0.487500,0.050000,0.050000},{0.612500,0.487500,0.100000,0.100000},{0.637500,0.487500,0.050000,0.050000},{0.637500,0.487500,0.100000,0.100000},{0.662500,0.487500,0.050000,0.050000},{0.662500,0.487500,0.100000,0.100000},{0.687500,0.487500,0.050000,0.050000},{0.687500,0.487500,0.100000,0.100000},{0.712500,0.487500,0.050000,0.050000},{0.712500,0.487500,0.100000,0.100000},{0.737500,0.487500,0.050000,0.050000},{0.737500,0.487500,0.100000,0.100000},{0.762500,0.487500,0.050000,0.050000},{0.762500,0.487500,0.100000,0.100000},{0.787500,0.487500,0.050000,0.050000},{0.787500,0.487500,0.100000,0.100000},{0.812500,0.487500,0.050000,0.050000},{0.812500,0.487500,0.100000,0.100000},{0.837500,0.487500,0.050000,0.050000},{0.837500,0.487500,0.100000,0.100000},{0.862500,0.487500,0.050000,0.050000},{0.862500,0.487500,0.100000,0.100000},{0.887500,0.487500,0.050000,0.050000},{0.887500,0.487500,0.100000,0.100000},{0.912500,0.487500,0.050000,0.050000},{0.912500,0.487500,0.100000,0.100000},{0.937500,0.487500,0.050000,0.050000},{0.937500,0.487500,0.100000,0.100000},{0.962500,0.487500,0.050000,0.050000},{0.962500,0.487500,0.100000,0.100000},{0.987500,0.487500,0.050000,0.050000},{0.987500,0.487500,0.100000,0.100000},{0.012500,0.512500,0.050000,0.050000},{0.012500,0.512500,0.100000,0.100000},{0.037500,0.512500,0.050000,0.050000},{0.037500,0.512500,0.100000,0.100000},{0.062500,0.512500,0.050000,0.050000},{0.062500,0.512500,0.100000,0.100000},{0.087500,0.512500,0.050000,0.050000},{0.087500,0.512500,0.100000,0.100000},{0.112500,0.512500,0.050000,0.050000},{0.112500,0.512500,0.100000,0.100000},{0.137500,0.512500,0.050000,0.050000},{0.137500,0.512500,0.100000,0.100000},{0.162500,0.512500,0.050000,0.050000},{0.162500,0.512500,0.100000,0.100000},{0.187500,0.512500,0.050000,0.050000},{0.187500,0.512500,0.100000,0.100000},{0.212500,0.512500,0.050000,0.050000},{0.212500,0.512500,0.100000,0.100000},{0.237500,0.512500,0.050000,0.050000},{0.237500,0.512500,0.100000,0.100000},{0.262500,0.512500,0.050000,0.050000},{0.262500,0.512500,0.100000,0.100000},{0.287500,0.512500,0.050000,0.050000},{0.287500,0.512500,0.100000,0.100000},{0.312500,0.512500,0.050000,0.050000},{0.312500,0.512500,0.100000,0.100000},{0.337500,0.512500,0.050000,0.050000},{0.337500,0.512500,0.100000,0.100000},{0.362500,0.512500,0.050000,0.050000},{0.362500,0.512500,0.100000,0.100000},{0.387500,0.512500,0.050000,0.050000},{0.387500,0.512500,0.100000,0.100000},{0.412500,0.512500,0.050000,0.050000},{0.412500,0.512500,0.100000,0.100000},{0.437500,0.512500,0.050000,0.050000},{0.437500,0.512500,0.100000,0.100000},{0.462500,0.512500,0.050000,0.050000},{0.462500,0.512500,0.100000,0.100000},{0.487500,0.512500,0.050000,0.050000},{0.487500,0.512500,0.100000,0.100000},{0.512500,0.512500,0.050000,0.050000},{0.512500,0.512500,0.100000,0.100000},{0.537500,0.512500,0.050000,0.050000},{0.537500,0.512500,0.100000,0.100000},{0.562500,0.512500,0.050000,0.050000},{0.562500,0.512500,0.100000,0.100000},{0.587500,0.512500,0.050000,0.050000},{0.587500,0.512500,0.100000,0.100000},{0.612500,0.512500,0.050000,0.050000},{0.612500,0.512500,0.100000,0.100000},{0.637500,0.512500,0.050000,0.050000},{0.637500,0.512500,0.100000,0.100000},{0.662500,0.512500,0.050000,0.050000},{0.662500,0.512500,0.100000,0.100000},{0.687500,0.512500,0.050000,0.050000},{0.687500,0.512500,0.100000,0.100000},{0.712500,0.512500,0.050000,0.050000},{0.712500,0.512500,0.100000,0.100000},{0.737500,0.512500,0.050000,0.050000},{0.737500,0.512500,0.100000,0.100000},{0.762500,0.512500,0.050000,0.050000},{0.762500,0.512500,0.100000,0.100000},{0.787500,0.512500,0.050000,0.050000},{0.787500,0.512500,0.100000,0.100000},{0.812500,0.512500,0.050000,0.050000},{0.812500,0.512500,0.100000,0.100000},{0.837500,0.512500,0.050000,0.050000},{0.837500,0.512500,0.100000,0.100000},{0.862500,0.512500,0.050000,0.050000},{0.862500,0.512500,0.100000,0.100000},{0.887500,0.512500,0.050000,0.050000},{0.887500,0.512500,0.100000,0.100000},{0.912500,0.512500,0.050000,0.050000},{0.912500,0.512500,0.100000,0.100000},{0.937500,0.512500,0.050000,0.050000},{0.937500,0.512500,0.100000,0.100000},{0.962500,0.512500,0.050000,0.050000},{0.962500,0.512500,0.100000,0.100000},{0.987500,0.512500,0.050000,0.050000},{0.987500,0.512500,0.100000,0.100000},{0.012500,0.537500,0.050000,0.050000},{0.012500,0.537500,0.100000,0.100000},{0.037500,0.537500,0.050000,0.050000},{0.037500,0.537500,0.100000,0.100000},{0.062500,0.537500,0.050000,0.050000},{0.062500,0.537500,0.100000,0.100000},{0.087500,0.537500,0.050000,0.050000},{0.087500,0.537500,0.100000,0.100000},{0.112500,0.537500,0.050000,0.050000},{0.112500,0.537500,0.100000,0.100000},{0.137500,0.537500,0.050000,0.050000},{0.137500,0.537500,0.100000,0.100000},{0.162500,0.537500,0.050000,0.050000},{0.162500,0.537500,0.100000,0.100000},{0.187500,0.537500,0.050000,0.050000},{0.187500,0.537500,0.100000,0.100000},{0.212500,0.537500,0.050000,0.050000},{0.212500,0.537500,0.100000,0.100000},{0.237500,0.537500,0.050000,0.050000},{0.237500,0.537500,0.100000,0.100000},{0.262500,0.537500,0.050000,0.050000},{0.262500,0.537500,0.100000,0.100000},{0.287500,0.537500,0.050000,0.050000},{0.287500,0.537500,0.100000,0.100000},{0.312500,0.537500,0.050000,0.050000},{0.312500,0.537500,0.100000,0.100000},{0.337500,0.537500,0.050000,0.050000},{0.337500,0.537500,0.100000,0.100000},{0.362500,0.537500,0.050000,0.050000},{0.362500,0.537500,0.100000,0.100000},{0.387500,0.537500,0.050000,0.050000},{0.387500,0.537500,0.100000,0.100000},{0.412500,0.537500,0.050000,0.050000},{0.412500,0.537500,0.100000,0.100000},{0.437500,0.537500,0.050000,0.050000},{0.437500,0.537500,0.100000,0.100000},{0.462500,0.537500,0.050000,0.050000},{0.462500,0.537500,0.100000,0.100000},{0.487500,0.537500,0.050000,0.050000},{0.487500,0.537500,0.100000,0.100000},{0.512500,0.537500,0.050000,0.050000},{0.512500,0.537500,0.100000,0.100000},{0.537500,0.537500,0.050000,0.050000},{0.537500,0.537500,0.100000,0.100000},{0.562500,0.537500,0.050000,0.050000},{0.562500,0.537500,0.100000,0.100000},{0.587500,0.537500,0.050000,0.050000},{0.587500,0.537500,0.100000,0.100000},{0.612500,0.537500,0.050000,0.050000},{0.612500,0.537500,0.100000,0.100000},{0.637500,0.537500,0.050000,0.050000},{0.637500,0.537500,0.100000,0.100000},{0.662500,0.537500,0.050000,0.050000},{0.662500,0.537500,0.100000,0.100000},{0.687500,0.537500,0.050000,0.050000},{0.687500,0.537500,0.100000,0.100000},{0.712500,0.537500,0.050000,0.050000},{0.712500,0.537500,0.100000,0.100000},{0.737500,0.537500,0.050000,0.050000},{0.737500,0.537500,0.100000,0.100000},{0.762500,0.537500,0.050000,0.050000},{0.762500,0.537500,0.100000,0.100000},{0.787500,0.537500,0.050000,0.050000},{0.787500,0.537500,0.100000,0.100000},{0.812500,0.537500,0.050000,0.050000},{0.812500,0.537500,0.100000,0.100000},{0.837500,0.537500,0.050000,0.050000},{0.837500,0.537500,0.100000,0.100000},{0.862500,0.537500,0.050000,0.050000},{0.862500,0.537500,0.100000,0.100000},{0.887500,0.537500,0.050000,0.050000},{0.887500,0.537500,0.100000,0.100000},{0.912500,0.537500,0.050000,0.050000},{0.912500,0.537500,0.100000,0.100000},{0.937500,0.537500,0.050000,0.050000},{0.937500,0.537500,0.100000,0.100000},{0.962500,0.537500,0.050000,0.050000},{0.962500,0.537500,0.100000,0.100000},{0.987500,0.537500,0.050000,0.050000},{0.987500,0.537500,0.100000,0.100000},{0.012500,0.562500,0.050000,0.050000},{0.012500,0.562500,0.100000,0.100000},{0.037500,0.562500,0.050000,0.050000},{0.037500,0.562500,0.100000,0.100000},{0.062500,0.562500,0.050000,0.050000},{0.062500,0.562500,0.100000,0.100000},{0.087500,0.562500,0.050000,0.050000},{0.087500,0.562500,0.100000,0.100000},{0.112500,0.562500,0.050000,0.050000},{0.112500,0.562500,0.100000,0.100000},{0.137500,0.562500,0.050000,0.050000},{0.137500,0.562500,0.100000,0.100000},{0.162500,0.562500,0.050000,0.050000},{0.162500,0.562500,0.100000,0.100000},{0.187500,0.562500,0.050000,0.050000},{0.187500,0.562500,0.100000,0.100000},{0.212500,0.562500,0.050000,0.050000},{0.212500,0.562500,0.100000,0.100000},{0.237500,0.562500,0.050000,0.050000},{0.237500,0.562500,0.100000,0.100000},{0.262500,0.562500,0.050000,0.050000},{0.262500,0.562500,0.100000,0.100000},{0.287500,0.562500,0.050000,0.050000},{0.287500,0.562500,0.100000,0.100000},{0.312500,0.562500,0.050000,0.050000},{0.312500,0.562500,0.100000,0.100000},{0.337500,0.562500,0.050000,0.050000},{0.337500,0.562500,0.100000,0.100000},{0.362500,0.562500,0.050000,0.050000},{0.362500,0.562500,0.100000,0.100000},{0.387500,0.562500,0.050000,0.050000},{0.387500,0.562500,0.100000,0.100000},{0.412500,0.562500,0.050000,0.050000},{0.412500,0.562500,0.100000,0.100000},{0.437500,0.562500,0.050000,0.050000},{0.437500,0.562500,0.100000,0.100000},{0.462500,0.562500,0.050000,0.050000},{0.462500,0.562500,0.100000,0.100000},{0.487500,0.562500,0.050000,0.050000},{0.487500,0.562500,0.100000,0.100000},{0.512500,0.562500,0.050000,0.050000},{0.512500,0.562500,0.100000,0.100000},{0.537500,0.562500,0.050000,0.050000},{0.537500,0.562500,0.100000,0.100000},{0.562500,0.562500,0.050000,0.050000},{0.562500,0.562500,0.100000,0.100000},{0.587500,0.562500,0.050000,0.050000},{0.587500,0.562500,0.100000,0.100000},{0.612500,0.562500,0.050000,0.050000},{0.612500,0.562500,0.100000,0.100000},{0.637500,0.562500,0.050000,0.050000},{0.637500,0.562500,0.100000,0.100000},{0.662500,0.562500,0.050000,0.050000},{0.662500,0.562500,0.100000,0.100000},{0.687500,0.562500,0.050000,0.050000},{0.687500,0.562500,0.100000,0.100000},{0.712500,0.562500,0.050000,0.050000},{0.712500,0.562500,0.100000,0.100000},{0.737500,0.562500,0.050000,0.050000},{0.737500,0.562500,0.100000,0.100000},{0.762500,0.562500,0.050000,0.050000},{0.762500,0.562500,0.100000,0.100000},{0.787500,0.562500,0.050000,0.050000},{0.787500,0.562500,0.100000,0.100000},{0.812500,0.562500,0.050000,0.050000},{0.812500,0.562500,0.100000,0.100000},{0.837500,0.562500,0.050000,0.050000},{0.837500,0.562500,0.100000,0.100000},{0.862500,0.562500,0.050000,0.050000},{0.862500,0.562500,0.100000,0.100000},{0.887500,0.562500,0.050000,0.050000},{0.887500,0.562500,0.100000,0.100000},{0.912500,0.562500,0.050000,0.050000},{0.912500,0.562500,0.100000,0.100000},{0.937500,0.562500,0.050000,0.050000},{0.937500,0.562500,0.100000,0.100000},{0.962500,0.562500,0.050000,0.050000},{0.962500,0.562500,0.100000,0.100000},{0.987500,0.562500,0.050000,0.050000},{0.987500,0.562500,0.100000,0.100000},{0.012500,0.587500,0.050000,0.050000},{0.012500,0.587500,0.100000,0.100000},{0.037500,0.587500,0.050000,0.050000},{0.037500,0.587500,0.100000,0.100000},{0.062500,0.587500,0.050000,0.050000},{0.062500,0.587500,0.100000,0.100000},{0.087500,0.587500,0.050000,0.050000},{0.087500,0.587500,0.100000,0.100000},{0.112500,0.587500,0.050000,0.050000},{0.112500,0.587500,0.100000,0.100000},{0.137500,0.587500,0.050000,0.050000},{0.137500,0.587500,0.100000,0.100000},{0.162500,0.587500,0.050000,0.050000},{0.162500,0.587500,0.100000,0.100000},{0.187500,0.587500,0.050000,0.050000},{0.187500,0.587500,0.100000,0.100000},{0.212500,0.587500,0.050000,0.050000},{0.212500,0.587500,0.100000,0.100000},{0.237500,0.587500,0.050000,0.050000},{0.237500,0.587500,0.100000,0.100000},{0.262500,0.587500,0.050000,0.050000},{0.262500,0.587500,0.100000,0.100000},{0.287500,0.587500,0.050000,0.050000},{0.287500,0.587500,0.100000,0.100000},{0.312500,0.587500,0.050000,0.050000},{0.312500,0.587500,0.100000,0.100000},{0.337500,0.587500,0.050000,0.050000},{0.337500,0.587500,0.100000,0.100000},{0.362500,0.587500,0.050000,0.050000},{0.362500,0.587500,0.100000,0.100000},{0.387500,0.587500,0.050000,0.050000},{0.387500,0.587500,0.100000,0.100000},{0.412500,0.587500,0.050000,0.050000},{0.412500,0.587500,0.100000,0.100000},{0.437500,0.587500,0.050000,0.050000},{0.437500,0.587500,0.100000,0.100000},{0.462500,0.587500,0.050000,0.050000},{0.462500,0.587500,0.100000,0.100000},{0.487500,0.587500,0.050000,0.050000},{0.487500,0.587500,0.100000,0.100000},{0.512500,0.587500,0.050000,0.050000},{0.512500,0.587500,0.100000,0.100000},{0.537500,0.587500,0.050000,0.050000},{0.537500,0.587500,0.100000,0.100000},{0.562500,0.587500,0.050000,0.050000},{0.562500,0.587500,0.100000,0.100000},{0.587500,0.587500,0.050000,0.050000},{0.587500,0.587500,0.100000,0.100000},{0.612500,0.587500,0.050000,0.050000},{0.612500,0.587500,0.100000,0.100000},{0.637500,0.587500,0.050000,0.050000},{0.637500,0.587500,0.100000,0.100000},{0.662500,0.587500,0.050000,0.050000},{0.662500,0.587500,0.100000,0.100000},{0.687500,0.587500,0.050000,0.050000},{0.687500,0.587500,0.100000,0.100000},{0.712500,0.587500,0.050000,0.050000},{0.712500,0.587500,0.100000,0.100000},{0.737500,0.587500,0.050000,0.050000},{0.737500,0.587500,0.100000,0.100000},{0.762500,0.587500,0.050000,0.050000},{0.762500,0.587500,0.100000,0.100000},{0.787500,0.587500,0.050000,0.050000},{0.787500,0.587500,0.100000,0.100000},{0.812500,0.587500,0.050000,0.050000},{0.812500,0.587500,0.100000,0.100000},{0.837500,0.587500,0.050000,0.050000},{0.837500,0.587500,0.100000,0.100000},{0.862500,0.587500,0.050000,0.050000},{0.862500,0.587500,0.100000,0.100000},{0.887500,0.587500,0.050000,0.050000},{0.887500,0.587500,0.100000,0.100000},{0.912500,0.587500,0.050000,0.050000},{0.912500,0.587500,0.100000,0.100000},{0.937500,0.587500,0.050000,0.050000},{0.937500,0.587500,0.100000,0.100000},{0.962500,0.587500,0.050000,0.050000},{0.962500,0.587500,0.100000,0.100000},{0.987500,0.587500,0.050000,0.050000},{0.987500,0.587500,0.100000,0.100000},{0.012500,0.612500,0.050000,0.050000},{0.012500,0.612500,0.100000,0.100000},{0.037500,0.612500,0.050000,0.050000},{0.037500,0.612500,0.100000,0.100000},{0.062500,0.612500,0.050000,0.050000},{0.062500,0.612500,0.100000,0.100000},{0.087500,0.612500,0.050000,0.050000},{0.087500,0.612500,0.100000,0.100000},{0.112500,0.612500,0.050000,0.050000},{0.112500,0.612500,0.100000,0.100000},{0.137500,0.612500,0.050000,0.050000},{0.137500,0.612500,0.100000,0.100000},{0.162500,0.612500,0.050000,0.050000},{0.162500,0.612500,0.100000,0.100000},{0.187500,0.612500,0.050000,0.050000},{0.187500,0.612500,0.100000,0.100000},{0.212500,0.612500,0.050000,0.050000},{0.212500,0.612500,0.100000,0.100000},{0.237500,0.612500,0.050000,0.050000},{0.237500,0.612500,0.100000,0.100000},{0.262500,0.612500,0.050000,0.050000},{0.262500,0.612500,0.100000,0.100000},{0.287500,0.612500,0.050000,0.050000},{0.287500,0.612500,0.100000,0.100000},{0.312500,0.612500,0.050000,0.050000},{0.312500,0.612500,0.100000,0.100000},{0.337500,0.612500,0.050000,0.050000},{0.337500,0.612500,0.100000,0.100000},{0.362500,0.612500,0.050000,0.050000},{0.362500,0.612500,0.100000,0.100000},{0.387500,0.612500,0.050000,0.050000},{0.387500,0.612500,0.100000,0.100000},{0.412500,0.612500,0.050000,0.050000},{0.412500,0.612500,0.100000,0.100000},{0.437500,0.612500,0.050000,0.050000},{0.437500,0.612500,0.100000,0.100000},{0.462500,0.612500,0.050000,0.050000},{0.462500,0.612500,0.100000,0.100000},{0.487500,0.612500,0.050000,0.050000},{0.487500,0.612500,0.100000,0.100000},{0.512500,0.612500,0.050000,0.050000},{0.512500,0.612500,0.100000,0.100000},{0.537500,0.612500,0.050000,0.050000},{0.537500,0.612500,0.100000,0.100000},{0.562500,0.612500,0.050000,0.050000},{0.562500,0.612500,0.100000,0.100000},{0.587500,0.612500,0.050000,0.050000},{0.587500,0.612500,0.100000,0.100000},{0.612500,0.612500,0.050000,0.050000},{0.612500,0.612500,0.100000,0.100000},{0.637500,0.612500,0.050000,0.050000},{0.637500,0.612500,0.100000,0.100000},{0.662500,0.612500,0.050000,0.050000},{0.662500,0.612500,0.100000,0.100000},{0.687500,0.612500,0.050000,0.050000},{0.687500,0.612500,0.100000,0.100000},{0.712500,0.612500,0.050000,0.050000},{0.712500,0.612500,0.100000,0.100000},{0.737500,0.612500,0.050000,0.050000},{0.737500,0.612500,0.100000,0.100000},{0.762500,0.612500,0.050000,0.050000},{0.762500,0.612500,0.100000,0.100000},{0.787500,0.612500,0.050000,0.050000},{0.787500,0.612500,0.100000,0.100000},{0.812500,0.612500,0.050000,0.050000},{0.812500,0.612500,0.100000,0.100000},{0.837500,0.612500,0.050000,0.050000},{0.837500,0.612500,0.100000,0.100000},{0.862500,0.612500,0.050000,0.050000},{0.862500,0.612500,0.100000,0.100000},{0.887500,0.612500,0.050000,0.050000},{0.887500,0.612500,0.100000,0.100000},{0.912500,0.612500,0.050000,0.050000},{0.912500,0.612500,0.100000,0.100000},{0.937500,0.612500,0.050000,0.050000},{0.937500,0.612500,0.100000,0.100000},{0.962500,0.612500,0.050000,0.050000},{0.962500,0.612500,0.100000,0.100000},{0.987500,0.612500,0.050000,0.050000},{0.987500,0.612500,0.100000,0.100000},{0.012500,0.637500,0.050000,0.050000},{0.012500,0.637500,0.100000,0.100000},{0.037500,0.637500,0.050000,0.050000},{0.037500,0.637500,0.100000,0.100000},{0.062500,0.637500,0.050000,0.050000},{0.062500,0.637500,0.100000,0.100000},{0.087500,0.637500,0.050000,0.050000},{0.087500,0.637500,0.100000,0.100000},{0.112500,0.637500,0.050000,0.050000},{0.112500,0.637500,0.100000,0.100000},{0.137500,0.637500,0.050000,0.050000},{0.137500,0.637500,0.100000,0.100000},{0.162500,0.637500,0.050000,0.050000},{0.162500,0.637500,0.100000,0.100000},{0.187500,0.637500,0.050000,0.050000},{0.187500,0.637500,0.100000,0.100000},{0.212500,0.637500,0.050000,0.050000},{0.212500,0.637500,0.100000,0.100000},{0.237500,0.637500,0.050000,0.050000},{0.237500,0.637500,0.100000,0.100000},{0.262500,0.637500,0.050000,0.050000},{0.262500,0.637500,0.100000,0.100000},{0.287500,0.637500,0.050000,0.050000},{0.287500,0.637500,0.100000,0.100000},{0.312500,0.637500,0.050000,0.050000},{0.312500,0.637500,0.100000,0.100000},{0.337500,0.637500,0.050000,0.050000},{0.337500,0.637500,0.100000,0.100000},{0.362500,0.637500,0.050000,0.050000},{0.362500,0.637500,0.100000,0.100000},{0.387500,0.637500,0.050000,0.050000},{0.387500,0.637500,0.100000,0.100000},{0.412500,0.637500,0.050000,0.050000},{0.412500,0.637500,0.100000,0.100000},{0.437500,0.637500,0.050000,0.050000},{0.437500,0.637500,0.100000,0.100000},{0.462500,0.637500,0.050000,0.050000},{0.462500,0.637500,0.100000,0.100000},{0.487500,0.637500,0.050000,0.050000},{0.487500,0.637500,0.100000,0.100000},{0.512500,0.637500,0.050000,0.050000},{0.512500,0.637500,0.100000,0.100000},{0.537500,0.637500,0.050000,0.050000},{0.537500,0.637500,0.100000,0.100000},{0.562500,0.637500,0.050000,0.050000},{0.562500,0.637500,0.100000,0.100000},{0.587500,0.637500,0.050000,0.050000},{0.587500,0.637500,0.100000,0.100000},{0.612500,0.637500,0.050000,0.050000},{0.612500,0.637500,0.100000,0.100000},{0.637500,0.637500,0.050000,0.050000},{0.637500,0.637500,0.100000,0.100000},{0.662500,0.637500,0.050000,0.050000},{0.662500,0.637500,0.100000,0.100000},{0.687500,0.637500,0.050000,0.050000},{0.687500,0.637500,0.100000,0.100000},{0.712500,0.637500,0.050000,0.050000},{0.712500,0.637500,0.100000,0.100000},{0.737500,0.637500,0.050000,0.050000},{0.737500,0.637500,0.100000,0.100000},{0.762500,0.637500,0.050000,0.050000},{0.762500,0.637500,0.100000,0.100000},{0.787500,0.637500,0.050000,0.050000},{0.787500,0.637500,0.100000,0.100000},{0.812500,0.637500,0.050000,0.050000},{0.812500,0.637500,0.100000,0.100000},{0.837500,0.637500,0.050000,0.050000},{0.837500,0.637500,0.100000,0.100000},{0.862500,0.637500,0.050000,0.050000},{0.862500,0.637500,0.100000,0.100000},{0.887500,0.637500,0.050000,0.050000},{0.887500,0.637500,0.100000,0.100000},{0.912500,0.637500,0.050000,0.050000},{0.912500,0.637500,0.100000,0.100000},{0.937500,0.637500,0.050000,0.050000},{0.937500,0.637500,0.100000,0.100000},{0.962500,0.637500,0.050000,0.050000},{0.962500,0.637500,0.100000,0.100000},{0.987500,0.637500,0.050000,0.050000},{0.987500,0.637500,0.100000,0.100000},{0.012500,0.662500,0.050000,0.050000},{0.012500,0.662500,0.100000,0.100000},{0.037500,0.662500,0.050000,0.050000},{0.037500,0.662500,0.100000,0.100000},{0.062500,0.662500,0.050000,0.050000},{0.062500,0.662500,0.100000,0.100000},{0.087500,0.662500,0.050000,0.050000},{0.087500,0.662500,0.100000,0.100000},{0.112500,0.662500,0.050000,0.050000},{0.112500,0.662500,0.100000,0.100000},{0.137500,0.662500,0.050000,0.050000},{0.137500,0.662500,0.100000,0.100000},{0.162500,0.662500,0.050000,0.050000},{0.162500,0.662500,0.100000,0.100000},{0.187500,0.662500,0.050000,0.050000},{0.187500,0.662500,0.100000,0.100000},{0.212500,0.662500,0.050000,0.050000},{0.212500,0.662500,0.100000,0.100000},{0.237500,0.662500,0.050000,0.050000},{0.237500,0.662500,0.100000,0.100000},{0.262500,0.662500,0.050000,0.050000},{0.262500,0.662500,0.100000,0.100000},{0.287500,0.662500,0.050000,0.050000},{0.287500,0.662500,0.100000,0.100000},{0.312500,0.662500,0.050000,0.050000},{0.312500,0.662500,0.100000,0.100000},{0.337500,0.662500,0.050000,0.050000},{0.337500,0.662500,0.100000,0.100000},{0.362500,0.662500,0.050000,0.050000},{0.362500,0.662500,0.100000,0.100000},{0.387500,0.662500,0.050000,0.050000},{0.387500,0.662500,0.100000,0.100000},{0.412500,0.662500,0.050000,0.050000},{0.412500,0.662500,0.100000,0.100000},{0.437500,0.662500,0.050000,0.050000},{0.437500,0.662500,0.100000,0.100000},{0.462500,0.662500,0.050000,0.050000},{0.462500,0.662500,0.100000,0.100000},{0.487500,0.662500,0.050000,0.050000},{0.487500,0.662500,0.100000,0.100000},{0.512500,0.662500,0.050000,0.050000},{0.512500,0.662500,0.100000,0.100000},{0.537500,0.662500,0.050000,0.050000},{0.537500,0.662500,0.100000,0.100000},{0.562500,0.662500,0.050000,0.050000},{0.562500,0.662500,0.100000,0.100000},{0.587500,0.662500,0.050000,0.050000},{0.587500,0.662500,0.100000,0.100000},{0.612500,0.662500,0.050000,0.050000},{0.612500,0.662500,0.100000,0.100000},{0.637500,0.662500,0.050000,0.050000},{0.637500,0.662500,0.100000,0.100000},{0.662500,0.662500,0.050000,0.050000},{0.662500,0.662500,0.100000,0.100000},{0.687500,0.662500,0.050000,0.050000},{0.687500,0.662500,0.100000,0.100000},{0.712500,0.662500,0.050000,0.050000},{0.712500,0.662500,0.100000,0.100000},{0.737500,0.662500,0.050000,0.050000},{0.737500,0.662500,0.100000,0.100000},{0.762500,0.662500,0.050000,0.050000},{0.762500,0.662500,0.100000,0.100000},{0.787500,0.662500,0.050000,0.050000},{0.787500,0.662500,0.100000,0.100000},{0.812500,0.662500,0.050000,0.050000},{0.812500,0.662500,0.100000,0.100000},{0.837500,0.662500,0.050000,0.050000},{0.837500,0.662500,0.100000,0.100000},{0.862500,0.662500,0.050000,0.050000},{0.862500,0.662500,0.100000,0.100000},{0.887500,0.662500,0.050000,0.050000},{0.887500,0.662500,0.100000,0.100000},{0.912500,0.662500,0.050000,0.050000},{0.912500,0.662500,0.100000,0.100000},{0.937500,0.662500,0.050000,0.050000},{0.937500,0.662500,0.100000,0.100000},{0.962500,0.662500,0.050000,0.050000},{0.962500,0.662500,0.100000,0.100000},{0.987500,0.662500,0.050000,0.050000},{0.987500,0.662500,0.100000,0.100000},{0.012500,0.687500,0.050000,0.050000},{0.012500,0.687500,0.100000,0.100000},{0.037500,0.687500,0.050000,0.050000},{0.037500,0.687500,0.100000,0.100000},{0.062500,0.687500,0.050000,0.050000},{0.062500,0.687500,0.100000,0.100000},{0.087500,0.687500,0.050000,0.050000},{0.087500,0.687500,0.100000,0.100000},{0.112500,0.687500,0.050000,0.050000},{0.112500,0.687500,0.100000,0.100000},{0.137500,0.687500,0.050000,0.050000},{0.137500,0.687500,0.100000,0.100000},{0.162500,0.687500,0.050000,0.050000},{0.162500,0.687500,0.100000,0.100000},{0.187500,0.687500,0.050000,0.050000},{0.187500,0.687500,0.100000,0.100000},{0.212500,0.687500,0.050000,0.050000},{0.212500,0.687500,0.100000,0.100000},{0.237500,0.687500,0.050000,0.050000},{0.237500,0.687500,0.100000,0.100000},{0.262500,0.687500,0.050000,0.050000},{0.262500,0.687500,0.100000,0.100000},{0.287500,0.687500,0.050000,0.050000},{0.287500,0.687500,0.100000,0.100000},{0.312500,0.687500,0.050000,0.050000},{0.312500,0.687500,0.100000,0.100000},{0.337500,0.687500,0.050000,0.050000},{0.337500,0.687500,0.100000,0.100000},{0.362500,0.687500,0.050000,0.050000},{0.362500,0.687500,0.100000,0.100000},{0.387500,0.687500,0.050000,0.050000},{0.387500,0.687500,0.100000,0.100000},{0.412500,0.687500,0.050000,0.050000},{0.412500,0.687500,0.100000,0.100000},{0.437500,0.687500,0.050000,0.050000},{0.437500,0.687500,0.100000,0.100000},{0.462500,0.687500,0.050000,0.050000},{0.462500,0.687500,0.100000,0.100000},{0.487500,0.687500,0.050000,0.050000},{0.487500,0.687500,0.100000,0.100000},{0.512500,0.687500,0.050000,0.050000},{0.512500,0.687500,0.100000,0.100000},{0.537500,0.687500,0.050000,0.050000},{0.537500,0.687500,0.100000,0.100000},{0.562500,0.687500,0.050000,0.050000},{0.562500,0.687500,0.100000,0.100000},{0.587500,0.687500,0.050000,0.050000},{0.587500,0.687500,0.100000,0.100000},{0.612500,0.687500,0.050000,0.050000},{0.612500,0.687500,0.100000,0.100000},{0.637500,0.687500,0.050000,0.050000},{0.637500,0.687500,0.100000,0.100000},{0.662500,0.687500,0.050000,0.050000},{0.662500,0.687500,0.100000,0.100000},{0.687500,0.687500,0.050000,0.050000},{0.687500,0.687500,0.100000,0.100000},{0.712500,0.687500,0.050000,0.050000},{0.712500,0.687500,0.100000,0.100000},{0.737500,0.687500,0.050000,0.050000},{0.737500,0.687500,0.100000,0.100000},{0.762500,0.687500,0.050000,0.050000},{0.762500,0.687500,0.100000,0.100000},{0.787500,0.687500,0.050000,0.050000},{0.787500,0.687500,0.100000,0.100000},{0.812500,0.687500,0.050000,0.050000},{0.812500,0.687500,0.100000,0.100000},{0.837500,0.687500,0.050000,0.050000},{0.837500,0.687500,0.100000,0.100000},{0.862500,0.687500,0.050000,0.050000},{0.862500,0.687500,0.100000,0.100000},{0.887500,0.687500,0.050000,0.050000},{0.887500,0.687500,0.100000,0.100000},{0.912500,0.687500,0.050000,0.050000},{0.912500,0.687500,0.100000,0.100000},{0.937500,0.687500,0.050000,0.050000},{0.937500,0.687500,0.100000,0.100000},{0.962500,0.687500,0.050000,0.050000},{0.962500,0.687500,0.100000,0.100000},{0.987500,0.687500,0.050000,0.050000},{0.987500,0.687500,0.100000,0.100000},{0.012500,0.712500,0.050000,0.050000},{0.012500,0.712500,0.100000,0.100000},{0.037500,0.712500,0.050000,0.050000},{0.037500,0.712500,0.100000,0.100000},{0.062500,0.712500,0.050000,0.050000},{0.062500,0.712500,0.100000,0.100000},{0.087500,0.712500,0.050000,0.050000},{0.087500,0.712500,0.100000,0.100000},{0.112500,0.712500,0.050000,0.050000},{0.112500,0.712500,0.100000,0.100000},{0.137500,0.712500,0.050000,0.050000},{0.137500,0.712500,0.100000,0.100000},{0.162500,0.712500,0.050000,0.050000},{0.162500,0.712500,0.100000,0.100000},{0.187500,0.712500,0.050000,0.050000},{0.187500,0.712500,0.100000,0.100000},{0.212500,0.712500,0.050000,0.050000},{0.212500,0.712500,0.100000,0.100000},{0.237500,0.712500,0.050000,0.050000},{0.237500,0.712500,0.100000,0.100000},{0.262500,0.712500,0.050000,0.050000},{0.262500,0.712500,0.100000,0.100000},{0.287500,0.712500,0.050000,0.050000},{0.287500,0.712500,0.100000,0.100000},{0.312500,0.712500,0.050000,0.050000},{0.312500,0.712500,0.100000,0.100000},{0.337500,0.712500,0.050000,0.050000},{0.337500,0.712500,0.100000,0.100000},{0.362500,0.712500,0.050000,0.050000},{0.362500,0.712500,0.100000,0.100000},{0.387500,0.712500,0.050000,0.050000},{0.387500,0.712500,0.100000,0.100000},{0.412500,0.712500,0.050000,0.050000},{0.412500,0.712500,0.100000,0.100000},{0.437500,0.712500,0.050000,0.050000},{0.437500,0.712500,0.100000,0.100000},{0.462500,0.712500,0.050000,0.050000},{0.462500,0.712500,0.100000,0.100000},{0.487500,0.712500,0.050000,0.050000},{0.487500,0.712500,0.100000,0.100000},{0.512500,0.712500,0.050000,0.050000},{0.512500,0.712500,0.100000,0.100000},{0.537500,0.712500,0.050000,0.050000},{0.537500,0.712500,0.100000,0.100000},{0.562500,0.712500,0.050000,0.050000},{0.562500,0.712500,0.100000,0.100000},{0.587500,0.712500,0.050000,0.050000},{0.587500,0.712500,0.100000,0.100000},{0.612500,0.712500,0.050000,0.050000},{0.612500,0.712500,0.100000,0.100000},{0.637500,0.712500,0.050000,0.050000},{0.637500,0.712500,0.100000,0.100000},{0.662500,0.712500,0.050000,0.050000},{0.662500,0.712500,0.100000,0.100000},{0.687500,0.712500,0.050000,0.050000},{0.687500,0.712500,0.100000,0.100000},{0.712500,0.712500,0.050000,0.050000},{0.712500,0.712500,0.100000,0.100000},{0.737500,0.712500,0.050000,0.050000},{0.737500,0.712500,0.100000,0.100000},{0.762500,0.712500,0.050000,0.050000},{0.762500,0.712500,0.100000,0.100000},{0.787500,0.712500,0.050000,0.050000},{0.787500,0.712500,0.100000,0.100000},{0.812500,0.712500,0.050000,0.050000},{0.812500,0.712500,0.100000,0.100000},{0.837500,0.712500,0.050000,0.050000},{0.837500,0.712500,0.100000,0.100000},{0.862500,0.712500,0.050000,0.050000},{0.862500,0.712500,0.100000,0.100000},{0.887500,0.712500,0.050000,0.050000},{0.887500,0.712500,0.100000,0.100000},{0.912500,0.712500,0.050000,0.050000},{0.912500,0.712500,0.100000,0.100000},{0.937500,0.712500,0.050000,0.050000},{0.937500,0.712500,0.100000,0.100000},{0.962500,0.712500,0.050000,0.050000},{0.962500,0.712500,0.100000,0.100000},{0.987500,0.712500,0.050000,0.050000},{0.987500,0.712500,0.100000,0.100000},{0.012500,0.737500,0.050000,0.050000},{0.012500,0.737500,0.100000,0.100000},{0.037500,0.737500,0.050000,0.050000},{0.037500,0.737500,0.100000,0.100000},{0.062500,0.737500,0.050000,0.050000},{0.062500,0.737500,0.100000,0.100000},{0.087500,0.737500,0.050000,0.050000},{0.087500,0.737500,0.100000,0.100000},{0.112500,0.737500,0.050000,0.050000},{0.112500,0.737500,0.100000,0.100000},{0.137500,0.737500,0.050000,0.050000},{0.137500,0.737500,0.100000,0.100000},{0.162500,0.737500,0.050000,0.050000},{0.162500,0.737500,0.100000,0.100000},{0.187500,0.737500,0.050000,0.050000},{0.187500,0.737500,0.100000,0.100000},{0.212500,0.737500,0.050000,0.050000},{0.212500,0.737500,0.100000,0.100000},{0.237500,0.737500,0.050000,0.050000},{0.237500,0.737500,0.100000,0.100000},{0.262500,0.737500,0.050000,0.050000},{0.262500,0.737500,0.100000,0.100000},{0.287500,0.737500,0.050000,0.050000},{0.287500,0.737500,0.100000,0.100000},{0.312500,0.737500,0.050000,0.050000},{0.312500,0.737500,0.100000,0.100000},{0.337500,0.737500,0.050000,0.050000},{0.337500,0.737500,0.100000,0.100000},{0.362500,0.737500,0.050000,0.050000},{0.362500,0.737500,0.100000,0.100000},{0.387500,0.737500,0.050000,0.050000},{0.387500,0.737500,0.100000,0.100000},{0.412500,0.737500,0.050000,0.050000},{0.412500,0.737500,0.100000,0.100000},{0.437500,0.737500,0.050000,0.050000},{0.437500,0.737500,0.100000,0.100000},{0.462500,0.737500,0.050000,0.050000},{0.462500,0.737500,0.100000,0.100000},{0.487500,0.737500,0.050000,0.050000},{0.487500,0.737500,0.100000,0.100000},{0.512500,0.737500,0.050000,0.050000},{0.512500,0.737500,0.100000,0.100000},{0.537500,0.737500,0.050000,0.050000},{0.537500,0.737500,0.100000,0.100000},{0.562500,0.737500,0.050000,0.050000},{0.562500,0.737500,0.100000,0.100000},{0.587500,0.737500,0.050000,0.050000},{0.587500,0.737500,0.100000,0.100000},{0.612500,0.737500,0.050000,0.050000},{0.612500,0.737500,0.100000,0.100000},{0.637500,0.737500,0.050000,0.050000},{0.637500,0.737500,0.100000,0.100000},{0.662500,0.737500,0.050000,0.050000},{0.662500,0.737500,0.100000,0.100000},{0.687500,0.737500,0.050000,0.050000},{0.687500,0.737500,0.100000,0.100000},{0.712500,0.737500,0.050000,0.050000},{0.712500,0.737500,0.100000,0.100000},{0.737500,0.737500,0.050000,0.050000},{0.737500,0.737500,0.100000,0.100000},{0.762500,0.737500,0.050000,0.050000},{0.762500,0.737500,0.100000,0.100000},{0.787500,0.737500,0.050000,0.050000},{0.787500,0.737500,0.100000,0.100000},{0.812500,0.737500,0.050000,0.050000},{0.812500,0.737500,0.100000,0.100000},{0.837500,0.737500,0.050000,0.050000},{0.837500,0.737500,0.100000,0.100000},{0.862500,0.737500,0.050000,0.050000},{0.862500,0.737500,0.100000,0.100000},{0.887500,0.737500,0.050000,0.050000},{0.887500,0.737500,0.100000,0.100000},{0.912500,0.737500,0.050000,0.050000},{0.912500,0.737500,0.100000,0.100000},{0.937500,0.737500,0.050000,0.050000},{0.937500,0.737500,0.100000,0.100000},{0.962500,0.737500,0.050000,0.050000},{0.962500,0.737500,0.100000,0.100000},{0.987500,0.737500,0.050000,0.050000},{0.987500,0.737500,0.100000,0.100000},{0.012500,0.762500,0.050000,0.050000},{0.012500,0.762500,0.100000,0.100000},{0.037500,0.762500,0.050000,0.050000},{0.037500,0.762500,0.100000,0.100000},{0.062500,0.762500,0.050000,0.050000},{0.062500,0.762500,0.100000,0.100000},{0.087500,0.762500,0.050000,0.050000},{0.087500,0.762500,0.100000,0.100000},{0.112500,0.762500,0.050000,0.050000},{0.112500,0.762500,0.100000,0.100000},{0.137500,0.762500,0.050000,0.050000},{0.137500,0.762500,0.100000,0.100000},{0.162500,0.762500,0.050000,0.050000},{0.162500,0.762500,0.100000,0.100000},{0.187500,0.762500,0.050000,0.050000},{0.187500,0.762500,0.100000,0.100000},{0.212500,0.762500,0.050000,0.050000},{0.212500,0.762500,0.100000,0.100000},{0.237500,0.762500,0.050000,0.050000},{0.237500,0.762500,0.100000,0.100000},{0.262500,0.762500,0.050000,0.050000},{0.262500,0.762500,0.100000,0.100000},{0.287500,0.762500,0.050000,0.050000},{0.287500,0.762500,0.100000,0.100000},{0.312500,0.762500,0.050000,0.050000},{0.312500,0.762500,0.100000,0.100000},{0.337500,0.762500,0.050000,0.050000},{0.337500,0.762500,0.100000,0.100000},{0.362500,0.762500,0.050000,0.050000},{0.362500,0.762500,0.100000,0.100000},{0.387500,0.762500,0.050000,0.050000},{0.387500,0.762500,0.100000,0.100000},{0.412500,0.762500,0.050000,0.050000},{0.412500,0.762500,0.100000,0.100000},{0.437500,0.762500,0.050000,0.050000},{0.437500,0.762500,0.100000,0.100000},{0.462500,0.762500,0.050000,0.050000},{0.462500,0.762500,0.100000,0.100000},{0.487500,0.762500,0.050000,0.050000},{0.487500,0.762500,0.100000,0.100000},{0.512500,0.762500,0.050000,0.050000},{0.512500,0.762500,0.100000,0.100000},{0.537500,0.762500,0.050000,0.050000},{0.537500,0.762500,0.100000,0.100000},{0.562500,0.762500,0.050000,0.050000},{0.562500,0.762500,0.100000,0.100000},{0.587500,0.762500,0.050000,0.050000},{0.587500,0.762500,0.100000,0.100000},{0.612500,0.762500,0.050000,0.050000},{0.612500,0.762500,0.100000,0.100000},{0.637500,0.762500,0.050000,0.050000},{0.637500,0.762500,0.100000,0.100000},{0.662500,0.762500,0.050000,0.050000},{0.662500,0.762500,0.100000,0.100000},{0.687500,0.762500,0.050000,0.050000},{0.687500,0.762500,0.100000,0.100000},{0.712500,0.762500,0.050000,0.050000},{0.712500,0.762500,0.100000,0.100000},{0.737500,0.762500,0.050000,0.050000},{0.737500,0.762500,0.100000,0.100000},{0.762500,0.762500,0.050000,0.050000},{0.762500,0.762500,0.100000,0.100000},{0.787500,0.762500,0.050000,0.050000},{0.787500,0.762500,0.100000,0.100000},{0.812500,0.762500,0.050000,0.050000},{0.812500,0.762500,0.100000,0.100000},{0.837500,0.762500,0.050000,0.050000},{0.837500,0.762500,0.100000,0.100000},{0.862500,0.762500,0.050000,0.050000},{0.862500,0.762500,0.100000,0.100000},{0.887500,0.762500,0.050000,0.050000},{0.887500,0.762500,0.100000,0.100000},{0.912500,0.762500,0.050000,0.050000},{0.912500,0.762500,0.100000,0.100000},{0.937500,0.762500,0.050000,0.050000},{0.937500,0.762500,0.100000,0.100000},{0.962500,0.762500,0.050000,0.050000},{0.962500,0.762500,0.100000,0.100000},{0.987500,0.762500,0.050000,0.050000},{0.987500,0.762500,0.100000,0.100000},{0.012500,0.787500,0.050000,0.050000},{0.012500,0.787500,0.100000,0.100000},{0.037500,0.787500,0.050000,0.050000},{0.037500,0.787500,0.100000,0.100000},{0.062500,0.787500,0.050000,0.050000},{0.062500,0.787500,0.100000,0.100000},{0.087500,0.787500,0.050000,0.050000},{0.087500,0.787500,0.100000,0.100000},{0.112500,0.787500,0.050000,0.050000},{0.112500,0.787500,0.100000,0.100000},{0.137500,0.787500,0.050000,0.050000},{0.137500,0.787500,0.100000,0.100000},{0.162500,0.787500,0.050000,0.050000},{0.162500,0.787500,0.100000,0.100000},{0.187500,0.787500,0.050000,0.050000},{0.187500,0.787500,0.100000,0.100000},{0.212500,0.787500,0.050000,0.050000},{0.212500,0.787500,0.100000,0.100000},{0.237500,0.787500,0.050000,0.050000},{0.237500,0.787500,0.100000,0.100000},{0.262500,0.787500,0.050000,0.050000},{0.262500,0.787500,0.100000,0.100000},{0.287500,0.787500,0.050000,0.050000},{0.287500,0.787500,0.100000,0.100000},{0.312500,0.787500,0.050000,0.050000},{0.312500,0.787500,0.100000,0.100000},{0.337500,0.787500,0.050000,0.050000},{0.337500,0.787500,0.100000,0.100000},{0.362500,0.787500,0.050000,0.050000},{0.362500,0.787500,0.100000,0.100000},{0.387500,0.787500,0.050000,0.050000},{0.387500,0.787500,0.100000,0.100000},{0.412500,0.787500,0.050000,0.050000},{0.412500,0.787500,0.100000,0.100000},{0.437500,0.787500,0.050000,0.050000},{0.437500,0.787500,0.100000,0.100000},{0.462500,0.787500,0.050000,0.050000},{0.462500,0.787500,0.100000,0.100000},{0.487500,0.787500,0.050000,0.050000},{0.487500,0.787500,0.100000,0.100000},{0.512500,0.787500,0.050000,0.050000},{0.512500,0.787500,0.100000,0.100000},{0.537500,0.787500,0.050000,0.050000},{0.537500,0.787500,0.100000,0.100000},{0.562500,0.787500,0.050000,0.050000},{0.562500,0.787500,0.100000,0.100000},{0.587500,0.787500,0.050000,0.050000},{0.587500,0.787500,0.100000,0.100000},{0.612500,0.787500,0.050000,0.050000},{0.612500,0.787500,0.100000,0.100000},{0.637500,0.787500,0.050000,0.050000},{0.637500,0.787500,0.100000,0.100000},{0.662500,0.787500,0.050000,0.050000},{0.662500,0.787500,0.100000,0.100000},{0.687500,0.787500,0.050000,0.050000},{0.687500,0.787500,0.100000,0.100000},{0.712500,0.787500,0.050000,0.050000},{0.712500,0.787500,0.100000,0.100000},{0.737500,0.787500,0.050000,0.050000},{0.737500,0.787500,0.100000,0.100000},{0.762500,0.787500,0.050000,0.050000},{0.762500,0.787500,0.100000,0.100000},{0.787500,0.787500,0.050000,0.050000},{0.787500,0.787500,0.100000,0.100000},{0.812500,0.787500,0.050000,0.050000},{0.812500,0.787500,0.100000,0.100000},{0.837500,0.787500,0.050000,0.050000},{0.837500,0.787500,0.100000,0.100000},{0.862500,0.787500,0.050000,0.050000},{0.862500,0.787500,0.100000,0.100000},{0.887500,0.787500,0.050000,0.050000},{0.887500,0.787500,0.100000,0.100000},{0.912500,0.787500,0.050000,0.050000},{0.912500,0.787500,0.100000,0.100000},{0.937500,0.787500,0.050000,0.050000},{0.937500,0.787500,0.100000,0.100000},{0.962500,0.787500,0.050000,0.050000},{0.962500,0.787500,0.100000,0.100000},{0.987500,0.787500,0.050000,0.050000},{0.987500,0.787500,0.100000,0.100000},{0.012500,0.812500,0.050000,0.050000},{0.012500,0.812500,0.100000,0.100000},{0.037500,0.812500,0.050000,0.050000},{0.037500,0.812500,0.100000,0.100000},{0.062500,0.812500,0.050000,0.050000},{0.062500,0.812500,0.100000,0.100000},{0.087500,0.812500,0.050000,0.050000},{0.087500,0.812500,0.100000,0.100000},{0.112500,0.812500,0.050000,0.050000},{0.112500,0.812500,0.100000,0.100000},{0.137500,0.812500,0.050000,0.050000},{0.137500,0.812500,0.100000,0.100000},{0.162500,0.812500,0.050000,0.050000},{0.162500,0.812500,0.100000,0.100000},{0.187500,0.812500,0.050000,0.050000},{0.187500,0.812500,0.100000,0.100000},{0.212500,0.812500,0.050000,0.050000},{0.212500,0.812500,0.100000,0.100000},{0.237500,0.812500,0.050000,0.050000},{0.237500,0.812500,0.100000,0.100000},{0.262500,0.812500,0.050000,0.050000},{0.262500,0.812500,0.100000,0.100000},{0.287500,0.812500,0.050000,0.050000},{0.287500,0.812500,0.100000,0.100000},{0.312500,0.812500,0.050000,0.050000},{0.312500,0.812500,0.100000,0.100000},{0.337500,0.812500,0.050000,0.050000},{0.337500,0.812500,0.100000,0.100000},{0.362500,0.812500,0.050000,0.050000},{0.362500,0.812500,0.100000,0.100000},{0.387500,0.812500,0.050000,0.050000},{0.387500,0.812500,0.100000,0.100000},{0.412500,0.812500,0.050000,0.050000},{0.412500,0.812500,0.100000,0.100000},{0.437500,0.812500,0.050000,0.050000},{0.437500,0.812500,0.100000,0.100000},{0.462500,0.812500,0.050000,0.050000},{0.462500,0.812500,0.100000,0.100000},{0.487500,0.812500,0.050000,0.050000},{0.487500,0.812500,0.100000,0.100000},{0.512500,0.812500,0.050000,0.050000},{0.512500,0.812500,0.100000,0.100000},{0.537500,0.812500,0.050000,0.050000},{0.537500,0.812500,0.100000,0.100000},{0.562500,0.812500,0.050000,0.050000},{0.562500,0.812500,0.100000,0.100000},{0.587500,0.812500,0.050000,0.050000},{0.587500,0.812500,0.100000,0.100000},{0.612500,0.812500,0.050000,0.050000},{0.612500,0.812500,0.100000,0.100000},{0.637500,0.812500,0.050000,0.050000},{0.637500,0.812500,0.100000,0.100000},{0.662500,0.812500,0.050000,0.050000},{0.662500,0.812500,0.100000,0.100000},{0.687500,0.812500,0.050000,0.050000},{0.687500,0.812500,0.100000,0.100000},{0.712500,0.812500,0.050000,0.050000},{0.712500,0.812500,0.100000,0.100000},{0.737500,0.812500,0.050000,0.050000},{0.737500,0.812500,0.100000,0.100000},{0.762500,0.812500,0.050000,0.050000},{0.762500,0.812500,0.100000,0.100000},{0.787500,0.812500,0.050000,0.050000},{0.787500,0.812500,0.100000,0.100000},{0.812500,0.812500,0.050000,0.050000},{0.812500,0.812500,0.100000,0.100000},{0.837500,0.812500,0.050000,0.050000},{0.837500,0.812500,0.100000,0.100000},{0.862500,0.812500,0.050000,0.050000},{0.862500,0.812500,0.100000,0.100000},{0.887500,0.812500,0.050000,0.050000},{0.887500,0.812500,0.100000,0.100000},{0.912500,0.812500,0.050000,0.050000},{0.912500,0.812500,0.100000,0.100000},{0.937500,0.812500,0.050000,0.050000},{0.937500,0.812500,0.100000,0.100000},{0.962500,0.812500,0.050000,0.050000},{0.962500,0.812500,0.100000,0.100000},{0.987500,0.812500,0.050000,0.050000},{0.987500,0.812500,0.100000,0.100000},{0.012500,0.837500,0.050000,0.050000},{0.012500,0.837500,0.100000,0.100000},{0.037500,0.837500,0.050000,0.050000},{0.037500,0.837500,0.100000,0.100000},{0.062500,0.837500,0.050000,0.050000},{0.062500,0.837500,0.100000,0.100000},{0.087500,0.837500,0.050000,0.050000},{0.087500,0.837500,0.100000,0.100000},{0.112500,0.837500,0.050000,0.050000},{0.112500,0.837500,0.100000,0.100000},{0.137500,0.837500,0.050000,0.050000},{0.137500,0.837500,0.100000,0.100000},{0.162500,0.837500,0.050000,0.050000},{0.162500,0.837500,0.100000,0.100000},{0.187500,0.837500,0.050000,0.050000},{0.187500,0.837500,0.100000,0.100000},{0.212500,0.837500,0.050000,0.050000},{0.212500,0.837500,0.100000,0.100000},{0.237500,0.837500,0.050000,0.050000},{0.237500,0.837500,0.100000,0.100000},{0.262500,0.837500,0.050000,0.050000},{0.262500,0.837500,0.100000,0.100000},{0.287500,0.837500,0.050000,0.050000},{0.287500,0.837500,0.100000,0.100000},{0.312500,0.837500,0.050000,0.050000},{0.312500,0.837500,0.100000,0.100000},{0.337500,0.837500,0.050000,0.050000},{0.337500,0.837500,0.100000,0.100000},{0.362500,0.837500,0.050000,0.050000},{0.362500,0.837500,0.100000,0.100000},{0.387500,0.837500,0.050000,0.050000},{0.387500,0.837500,0.100000,0.100000},{0.412500,0.837500,0.050000,0.050000},{0.412500,0.837500,0.100000,0.100000},{0.437500,0.837500,0.050000,0.050000},{0.437500,0.837500,0.100000,0.100000},{0.462500,0.837500,0.050000,0.050000},{0.462500,0.837500,0.100000,0.100000},{0.487500,0.837500,0.050000,0.050000},{0.487500,0.837500,0.100000,0.100000},{0.512500,0.837500,0.050000,0.050000},{0.512500,0.837500,0.100000,0.100000},{0.537500,0.837500,0.050000,0.050000},{0.537500,0.837500,0.100000,0.100000},{0.562500,0.837500,0.050000,0.050000},{0.562500,0.837500,0.100000,0.100000},{0.587500,0.837500,0.050000,0.050000},{0.587500,0.837500,0.100000,0.100000},{0.612500,0.837500,0.050000,0.050000},{0.612500,0.837500,0.100000,0.100000},{0.637500,0.837500,0.050000,0.050000},{0.637500,0.837500,0.100000,0.100000},{0.662500,0.837500,0.050000,0.050000},{0.662500,0.837500,0.100000,0.100000},{0.687500,0.837500,0.050000,0.050000},{0.687500,0.837500,0.100000,0.100000},{0.712500,0.837500,0.050000,0.050000},{0.712500,0.837500,0.100000,0.100000},{0.737500,0.837500,0.050000,0.050000},{0.737500,0.837500,0.100000,0.100000},{0.762500,0.837500,0.050000,0.050000},{0.762500,0.837500,0.100000,0.100000},{0.787500,0.837500,0.050000,0.050000},{0.787500,0.837500,0.100000,0.100000},{0.812500,0.837500,0.050000,0.050000},{0.812500,0.837500,0.100000,0.100000},{0.837500,0.837500,0.050000,0.050000},{0.837500,0.837500,0.100000,0.100000},{0.862500,0.837500,0.050000,0.050000},{0.862500,0.837500,0.100000,0.100000},{0.887500,0.837500,0.050000,0.050000},{0.887500,0.837500,0.100000,0.100000},{0.912500,0.837500,0.050000,0.050000},{0.912500,0.837500,0.100000,0.100000},{0.937500,0.837500,0.050000,0.050000},{0.937500,0.837500,0.100000,0.100000},{0.962500,0.837500,0.050000,0.050000},{0.962500,0.837500,0.100000,0.100000},{0.987500,0.837500,0.050000,0.050000},{0.987500,0.837500,0.100000,0.100000},{0.012500,0.862500,0.050000,0.050000},{0.012500,0.862500,0.100000,0.100000},{0.037500,0.862500,0.050000,0.050000},{0.037500,0.862500,0.100000,0.100000},{0.062500,0.862500,0.050000,0.050000},{0.062500,0.862500,0.100000,0.100000},{0.087500,0.862500,0.050000,0.050000},{0.087500,0.862500,0.100000,0.100000},{0.112500,0.862500,0.050000,0.050000},{0.112500,0.862500,0.100000,0.100000},{0.137500,0.862500,0.050000,0.050000},{0.137500,0.862500,0.100000,0.100000},{0.162500,0.862500,0.050000,0.050000},{0.162500,0.862500,0.100000,0.100000},{0.187500,0.862500,0.050000,0.050000},{0.187500,0.862500,0.100000,0.100000},{0.212500,0.862500,0.050000,0.050000},{0.212500,0.862500,0.100000,0.100000},{0.237500,0.862500,0.050000,0.050000},{0.237500,0.862500,0.100000,0.100000},{0.262500,0.862500,0.050000,0.050000},{0.262500,0.862500,0.100000,0.100000},{0.287500,0.862500,0.050000,0.050000},{0.287500,0.862500,0.100000,0.100000},{0.312500,0.862500,0.050000,0.050000},{0.312500,0.862500,0.100000,0.100000},{0.337500,0.862500,0.050000,0.050000},{0.337500,0.862500,0.100000,0.100000},{0.362500,0.862500,0.050000,0.050000},{0.362500,0.862500,0.100000,0.100000},{0.387500,0.862500,0.050000,0.050000},{0.387500,0.862500,0.100000,0.100000},{0.412500,0.862500,0.050000,0.050000},{0.412500,0.862500,0.100000,0.100000},{0.437500,0.862500,0.050000,0.050000},{0.437500,0.862500,0.100000,0.100000},{0.462500,0.862500,0.050000,0.050000},{0.462500,0.862500,0.100000,0.100000},{0.487500,0.862500,0.050000,0.050000},{0.487500,0.862500,0.100000,0.100000},{0.512500,0.862500,0.050000,0.050000},{0.512500,0.862500,0.100000,0.100000},{0.537500,0.862500,0.050000,0.050000},{0.537500,0.862500,0.100000,0.100000},{0.562500,0.862500,0.050000,0.050000},{0.562500,0.862500,0.100000,0.100000},{0.587500,0.862500,0.050000,0.050000},{0.587500,0.862500,0.100000,0.100000},{0.612500,0.862500,0.050000,0.050000},{0.612500,0.862500,0.100000,0.100000},{0.637500,0.862500,0.050000,0.050000},{0.637500,0.862500,0.100000,0.100000},{0.662500,0.862500,0.050000,0.050000},{0.662500,0.862500,0.100000,0.100000},{0.687500,0.862500,0.050000,0.050000},{0.687500,0.862500,0.100000,0.100000},{0.712500,0.862500,0.050000,0.050000},{0.712500,0.862500,0.100000,0.100000},{0.737500,0.862500,0.050000,0.050000},{0.737500,0.862500,0.100000,0.100000},{0.762500,0.862500,0.050000,0.050000},{0.762500,0.862500,0.100000,0.100000},{0.787500,0.862500,0.050000,0.050000},{0.787500,0.862500,0.100000,0.100000},{0.812500,0.862500,0.050000,0.050000},{0.812500,0.862500,0.100000,0.100000},{0.837500,0.862500,0.050000,0.050000},{0.837500,0.862500,0.100000,0.100000},{0.862500,0.862500,0.050000,0.050000},{0.862500,0.862500,0.100000,0.100000},{0.887500,0.862500,0.050000,0.050000},{0.887500,0.862500,0.100000,0.100000},{0.912500,0.862500,0.050000,0.050000},{0.912500,0.862500,0.100000,0.100000},{0.937500,0.862500,0.050000,0.050000},{0.937500,0.862500,0.100000,0.100000},{0.962500,0.862500,0.050000,0.050000},{0.962500,0.862500,0.100000,0.100000},{0.987500,0.862500,0.050000,0.050000},{0.987500,0.862500,0.100000,0.100000},{0.012500,0.887500,0.050000,0.050000},{0.012500,0.887500,0.100000,0.100000},{0.037500,0.887500,0.050000,0.050000},{0.037500,0.887500,0.100000,0.100000},{0.062500,0.887500,0.050000,0.050000},{0.062500,0.887500,0.100000,0.100000},{0.087500,0.887500,0.050000,0.050000},{0.087500,0.887500,0.100000,0.100000},{0.112500,0.887500,0.050000,0.050000},{0.112500,0.887500,0.100000,0.100000},{0.137500,0.887500,0.050000,0.050000},{0.137500,0.887500,0.100000,0.100000},{0.162500,0.887500,0.050000,0.050000},{0.162500,0.887500,0.100000,0.100000},{0.187500,0.887500,0.050000,0.050000},{0.187500,0.887500,0.100000,0.100000},{0.212500,0.887500,0.050000,0.050000},{0.212500,0.887500,0.100000,0.100000},{0.237500,0.887500,0.050000,0.050000},{0.237500,0.887500,0.100000,0.100000},{0.262500,0.887500,0.050000,0.050000},{0.262500,0.887500,0.100000,0.100000},{0.287500,0.887500,0.050000,0.050000},{0.287500,0.887500,0.100000,0.100000},{0.312500,0.887500,0.050000,0.050000},{0.312500,0.887500,0.100000,0.100000},{0.337500,0.887500,0.050000,0.050000},{0.337500,0.887500,0.100000,0.100000},{0.362500,0.887500,0.050000,0.050000},{0.362500,0.887500,0.100000,0.100000},{0.387500,0.887500,0.050000,0.050000},{0.387500,0.887500,0.100000,0.100000},{0.412500,0.887500,0.050000,0.050000},{0.412500,0.887500,0.100000,0.100000},{0.437500,0.887500,0.050000,0.050000},{0.437500,0.887500,0.100000,0.100000},{0.462500,0.887500,0.050000,0.050000},{0.462500,0.887500,0.100000,0.100000},{0.487500,0.887500,0.050000,0.050000},{0.487500,0.887500,0.100000,0.100000},{0.512500,0.887500,0.050000,0.050000},{0.512500,0.887500,0.100000,0.100000},{0.537500,0.887500,0.050000,0.050000},{0.537500,0.887500,0.100000,0.100000},{0.562500,0.887500,0.050000,0.050000},{0.562500,0.887500,0.100000,0.100000},{0.587500,0.887500,0.050000,0.050000},{0.587500,0.887500,0.100000,0.100000},{0.612500,0.887500,0.050000,0.050000},{0.612500,0.887500,0.100000,0.100000},{0.637500,0.887500,0.050000,0.050000},{0.637500,0.887500,0.100000,0.100000},{0.662500,0.887500,0.050000,0.050000},{0.662500,0.887500,0.100000,0.100000},{0.687500,0.887500,0.050000,0.050000},{0.687500,0.887500,0.100000,0.100000},{0.712500,0.887500,0.050000,0.050000},{0.712500,0.887500,0.100000,0.100000},{0.737500,0.887500,0.050000,0.050000},{0.737500,0.887500,0.100000,0.100000},{0.762500,0.887500,0.050000,0.050000},{0.762500,0.887500,0.100000,0.100000},{0.787500,0.887500,0.050000,0.050000},{0.787500,0.887500,0.100000,0.100000},{0.812500,0.887500,0.050000,0.050000},{0.812500,0.887500,0.100000,0.100000},{0.837500,0.887500,0.050000,0.050000},{0.837500,0.887500,0.100000,0.100000},{0.862500,0.887500,0.050000,0.050000},{0.862500,0.887500,0.100000,0.100000},{0.887500,0.887500,0.050000,0.050000},{0.887500,0.887500,0.100000,0.100000},{0.912500,0.887500,0.050000,0.050000},{0.912500,0.887500,0.100000,0.100000},{0.937500,0.887500,0.050000,0.050000},{0.937500,0.887500,0.100000,0.100000},{0.962500,0.887500,0.050000,0.050000},{0.962500,0.887500,0.100000,0.100000},{0.987500,0.887500,0.050000,0.050000},{0.987500,0.887500,0.100000,0.100000},{0.012500,0.912500,0.050000,0.050000},{0.012500,0.912500,0.100000,0.100000},{0.037500,0.912500,0.050000,0.050000},{0.037500,0.912500,0.100000,0.100000},{0.062500,0.912500,0.050000,0.050000},{0.062500,0.912500,0.100000,0.100000},{0.087500,0.912500,0.050000,0.050000},{0.087500,0.912500,0.100000,0.100000},{0.112500,0.912500,0.050000,0.050000},{0.112500,0.912500,0.100000,0.100000},{0.137500,0.912500,0.050000,0.050000},{0.137500,0.912500,0.100000,0.100000},{0.162500,0.912500,0.050000,0.050000},{0.162500,0.912500,0.100000,0.100000},{0.187500,0.912500,0.050000,0.050000},{0.187500,0.912500,0.100000,0.100000},{0.212500,0.912500,0.050000,0.050000},{0.212500,0.912500,0.100000,0.100000},{0.237500,0.912500,0.050000,0.050000},{0.237500,0.912500,0.100000,0.100000},{0.262500,0.912500,0.050000,0.050000},{0.262500,0.912500,0.100000,0.100000},{0.287500,0.912500,0.050000,0.050000},{0.287500,0.912500,0.100000,0.100000},{0.312500,0.912500,0.050000,0.050000},{0.312500,0.912500,0.100000,0.100000},{0.337500,0.912500,0.050000,0.050000},{0.337500,0.912500,0.100000,0.100000},{0.362500,0.912500,0.050000,0.050000},{0.362500,0.912500,0.100000,0.100000},{0.387500,0.912500,0.050000,0.050000},{0.387500,0.912500,0.100000,0.100000},{0.412500,0.912500,0.050000,0.050000},{0.412500,0.912500,0.100000,0.100000},{0.437500,0.912500,0.050000,0.050000},{0.437500,0.912500,0.100000,0.100000},{0.462500,0.912500,0.050000,0.050000},{0.462500,0.912500,0.100000,0.100000},{0.487500,0.912500,0.050000,0.050000},{0.487500,0.912500,0.100000,0.100000},{0.512500,0.912500,0.050000,0.050000},{0.512500,0.912500,0.100000,0.100000},{0.537500,0.912500,0.050000,0.050000},{0.537500,0.912500,0.100000,0.100000},{0.562500,0.912500,0.050000,0.050000},{0.562500,0.912500,0.100000,0.100000},{0.587500,0.912500,0.050000,0.050000},{0.587500,0.912500,0.100000,0.100000},{0.612500,0.912500,0.050000,0.050000},{0.612500,0.912500,0.100000,0.100000},{0.637500,0.912500,0.050000,0.050000},{0.637500,0.912500,0.100000,0.100000},{0.662500,0.912500,0.050000,0.050000},{0.662500,0.912500,0.100000,0.100000},{0.687500,0.912500,0.050000,0.050000},{0.687500,0.912500,0.100000,0.100000},{0.712500,0.912500,0.050000,0.050000},{0.712500,0.912500,0.100000,0.100000},{0.737500,0.912500,0.050000,0.050000},{0.737500,0.912500,0.100000,0.100000},{0.762500,0.912500,0.050000,0.050000},{0.762500,0.912500,0.100000,0.100000},{0.787500,0.912500,0.050000,0.050000},{0.787500,0.912500,0.100000,0.100000},{0.812500,0.912500,0.050000,0.050000},{0.812500,0.912500,0.100000,0.100000},{0.837500,0.912500,0.050000,0.050000},{0.837500,0.912500,0.100000,0.100000},{0.862500,0.912500,0.050000,0.050000},{0.862500,0.912500,0.100000,0.100000},{0.887500,0.912500,0.050000,0.050000},{0.887500,0.912500,0.100000,0.100000},{0.912500,0.912500,0.050000,0.050000},{0.912500,0.912500,0.100000,0.100000},{0.937500,0.912500,0.050000,0.050000},{0.937500,0.912500,0.100000,0.100000},{0.962500,0.912500,0.050000,0.050000},{0.962500,0.912500,0.100000,0.100000},{0.987500,0.912500,0.050000,0.050000},{0.987500,0.912500,0.100000,0.100000},{0.012500,0.937500,0.050000,0.050000},{0.012500,0.937500,0.100000,0.100000},{0.037500,0.937500,0.050000,0.050000},{0.037500,0.937500,0.100000,0.100000},{0.062500,0.937500,0.050000,0.050000},{0.062500,0.937500,0.100000,0.100000},{0.087500,0.937500,0.050000,0.050000},{0.087500,0.937500,0.100000,0.100000},{0.112500,0.937500,0.050000,0.050000},{0.112500,0.937500,0.100000,0.100000},{0.137500,0.937500,0.050000,0.050000},{0.137500,0.937500,0.100000,0.100000},{0.162500,0.937500,0.050000,0.050000},{0.162500,0.937500,0.100000,0.100000},{0.187500,0.937500,0.050000,0.050000},{0.187500,0.937500,0.100000,0.100000},{0.212500,0.937500,0.050000,0.050000},{0.212500,0.937500,0.100000,0.100000},{0.237500,0.937500,0.050000,0.050000},{0.237500,0.937500,0.100000,0.100000},{0.262500,0.937500,0.050000,0.050000},{0.262500,0.937500,0.100000,0.100000},{0.287500,0.937500,0.050000,0.050000},{0.287500,0.937500,0.100000,0.100000},{0.312500,0.937500,0.050000,0.050000},{0.312500,0.937500,0.100000,0.100000},{0.337500,0.937500,0.050000,0.050000},{0.337500,0.937500,0.100000,0.100000},{0.362500,0.937500,0.050000,0.050000},{0.362500,0.937500,0.100000,0.100000},{0.387500,0.937500,0.050000,0.050000},{0.387500,0.937500,0.100000,0.100000},{0.412500,0.937500,0.050000,0.050000},{0.412500,0.937500,0.100000,0.100000},{0.437500,0.937500,0.050000,0.050000},{0.437500,0.937500,0.100000,0.100000},{0.462500,0.937500,0.050000,0.050000},{0.462500,0.937500,0.100000,0.100000},{0.487500,0.937500,0.050000,0.050000},{0.487500,0.937500,0.100000,0.100000},{0.512500,0.937500,0.050000,0.050000},{0.512500,0.937500,0.100000,0.100000},{0.537500,0.937500,0.050000,0.050000},{0.537500,0.937500,0.100000,0.100000},{0.562500,0.937500,0.050000,0.050000},{0.562500,0.937500,0.100000,0.100000},{0.587500,0.937500,0.050000,0.050000},{0.587500,0.937500,0.100000,0.100000},{0.612500,0.937500,0.050000,0.050000},{0.612500,0.937500,0.100000,0.100000},{0.637500,0.937500,0.050000,0.050000},{0.637500,0.937500,0.100000,0.100000},{0.662500,0.937500,0.050000,0.050000},{0.662500,0.937500,0.100000,0.100000},{0.687500,0.937500,0.050000,0.050000},{0.687500,0.937500,0.100000,0.100000},{0.712500,0.937500,0.050000,0.050000},{0.712500,0.937500,0.100000,0.100000},{0.737500,0.937500,0.050000,0.050000},{0.737500,0.937500,0.100000,0.100000},{0.762500,0.937500,0.050000,0.050000},{0.762500,0.937500,0.100000,0.100000},{0.787500,0.937500,0.050000,0.050000},{0.787500,0.937500,0.100000,0.100000},{0.812500,0.937500,0.050000,0.050000},{0.812500,0.937500,0.100000,0.100000},{0.837500,0.937500,0.050000,0.050000},{0.837500,0.937500,0.100000,0.100000},{0.862500,0.937500,0.050000,0.050000},{0.862500,0.937500,0.100000,0.100000},{0.887500,0.937500,0.050000,0.050000},{0.887500,0.937500,0.100000,0.100000},{0.912500,0.937500,0.050000,0.050000},{0.912500,0.937500,0.100000,0.100000},{0.937500,0.937500,0.050000,0.050000},{0.937500,0.937500,0.100000,0.100000},{0.962500,0.937500,0.050000,0.050000},{0.962500,0.937500,0.100000,0.100000},{0.987500,0.937500,0.050000,0.050000},{0.987500,0.937500,0.100000,0.100000},{0.012500,0.962500,0.050000,0.050000},{0.012500,0.962500,0.100000,0.100000},{0.037500,0.962500,0.050000,0.050000},{0.037500,0.962500,0.100000,0.100000},{0.062500,0.962500,0.050000,0.050000},{0.062500,0.962500,0.100000,0.100000},{0.087500,0.962500,0.050000,0.050000},{0.087500,0.962500,0.100000,0.100000},{0.112500,0.962500,0.050000,0.050000},{0.112500,0.962500,0.100000,0.100000},{0.137500,0.962500,0.050000,0.050000},{0.137500,0.962500,0.100000,0.100000},{0.162500,0.962500,0.050000,0.050000},{0.162500,0.962500,0.100000,0.100000},{0.187500,0.962500,0.050000,0.050000},{0.187500,0.962500,0.100000,0.100000},{0.212500,0.962500,0.050000,0.050000},{0.212500,0.962500,0.100000,0.100000},{0.237500,0.962500,0.050000,0.050000},{0.237500,0.962500,0.100000,0.100000},{0.262500,0.962500,0.050000,0.050000},{0.262500,0.962500,0.100000,0.100000},{0.287500,0.962500,0.050000,0.050000},{0.287500,0.962500,0.100000,0.100000},{0.312500,0.962500,0.050000,0.050000},{0.312500,0.962500,0.100000,0.100000},{0.337500,0.962500,0.050000,0.050000},{0.337500,0.962500,0.100000,0.100000},{0.362500,0.962500,0.050000,0.050000},{0.362500,0.962500,0.100000,0.100000},{0.387500,0.962500,0.050000,0.050000},{0.387500,0.962500,0.100000,0.100000},{0.412500,0.962500,0.050000,0.050000},{0.412500,0.962500,0.100000,0.100000},{0.437500,0.962500,0.050000,0.050000},{0.437500,0.962500,0.100000,0.100000},{0.462500,0.962500,0.050000,0.050000},{0.462500,0.962500,0.100000,0.100000},{0.487500,0.962500,0.050000,0.050000},{0.487500,0.962500,0.100000,0.100000},{0.512500,0.962500,0.050000,0.050000},{0.512500,0.962500,0.100000,0.100000},{0.537500,0.962500,0.050000,0.050000},{0.537500,0.962500,0.100000,0.100000},{0.562500,0.962500,0.050000,0.050000},{0.562500,0.962500,0.100000,0.100000},{0.587500,0.962500,0.050000,0.050000},{0.587500,0.962500,0.100000,0.100000},{0.612500,0.962500,0.050000,0.050000},{0.612500,0.962500,0.100000,0.100000},{0.637500,0.962500,0.050000,0.050000},{0.637500,0.962500,0.100000,0.100000},{0.662500,0.962500,0.050000,0.050000},{0.662500,0.962500,0.100000,0.100000},{0.687500,0.962500,0.050000,0.050000},{0.687500,0.962500,0.100000,0.100000},{0.712500,0.962500,0.050000,0.050000},{0.712500,0.962500,0.100000,0.100000},{0.737500,0.962500,0.050000,0.050000},{0.737500,0.962500,0.100000,0.100000},{0.762500,0.962500,0.050000,0.050000},{0.762500,0.962500,0.100000,0.100000},{0.787500,0.962500,0.050000,0.050000},{0.787500,0.962500,0.100000,0.100000},{0.812500,0.962500,0.050000,0.050000},{0.812500,0.962500,0.100000,0.100000},{0.837500,0.962500,0.050000,0.050000},{0.837500,0.962500,0.100000,0.100000},{0.862500,0.962500,0.050000,0.050000},{0.862500,0.962500,0.100000,0.100000},{0.887500,0.962500,0.050000,0.050000},{0.887500,0.962500,0.100000,0.100000},{0.912500,0.962500,0.050000,0.050000},{0.912500,0.962500,0.100000,0.100000},{0.937500,0.962500,0.050000,0.050000},{0.937500,0.962500,0.100000,0.100000},{0.962500,0.962500,0.050000,0.050000},{0.962500,0.962500,0.100000,0.100000},{0.987500,0.962500,0.050000,0.050000},{0.987500,0.962500,0.100000,0.100000},{0.012500,0.987500,0.050000,0.050000},{0.012500,0.987500,0.100000,0.100000},{0.037500,0.987500,0.050000,0.050000},{0.037500,0.987500,0.100000,0.100000},{0.062500,0.987500,0.050000,0.050000},{0.062500,0.987500,0.100000,0.100000},{0.087500,0.987500,0.050000,0.050000},{0.087500,0.987500,0.100000,0.100000},{0.112500,0.987500,0.050000,0.050000},{0.112500,0.987500,0.100000,0.100000},{0.137500,0.987500,0.050000,0.050000},{0.137500,0.987500,0.100000,0.100000},{0.162500,0.987500,0.050000,0.050000},{0.162500,0.987500,0.100000,0.100000},{0.187500,0.987500,0.050000,0.050000},{0.187500,0.987500,0.100000,0.100000},{0.212500,0.987500,0.050000,0.050000},{0.212500,0.987500,0.100000,0.100000},{0.237500,0.987500,0.050000,0.050000},{0.237500,0.987500,0.100000,0.100000},{0.262500,0.987500,0.050000,0.050000},{0.262500,0.987500,0.100000,0.100000},{0.287500,0.987500,0.050000,0.050000},{0.287500,0.987500,0.100000,0.100000},{0.312500,0.987500,0.050000,0.050000},{0.312500,0.987500,0.100000,0.100000},{0.337500,0.987500,0.050000,0.050000},{0.337500,0.987500,0.100000,0.100000},{0.362500,0.987500,0.050000,0.050000},{0.362500,0.987500,0.100000,0.100000},{0.387500,0.987500,0.050000,0.050000},{0.387500,0.987500,0.100000,0.100000},{0.412500,0.987500,0.050000,0.050000},{0.412500,0.987500,0.100000,0.100000},{0.437500,0.987500,0.050000,0.050000},{0.437500,0.987500,0.100000,0.100000},{0.462500,0.987500,0.050000,0.050000},{0.462500,0.987500,0.100000,0.100000},{0.487500,0.987500,0.050000,0.050000},{0.487500,0.987500,0.100000,0.100000},{0.512500,0.987500,0.050000,0.050000},{0.512500,0.987500,0.100000,0.100000},{0.537500,0.987500,0.050000,0.050000},{0.537500,0.987500,0.100000,0.100000},{0.562500,0.987500,0.050000,0.050000},{0.562500,0.987500,0.100000,0.100000},{0.587500,0.987500,0.050000,0.050000},{0.587500,0.987500,0.100000,0.100000},{0.612500,0.987500,0.050000,0.050000},{0.612500,0.987500,0.100000,0.100000},{0.637500,0.987500,0.050000,0.050000},{0.637500,0.987500,0.100000,0.100000},{0.662500,0.987500,0.050000,0.050000},{0.662500,0.987500,0.100000,0.100000},{0.687500,0.987500,0.050000,0.050000},{0.687500,0.987500,0.100000,0.100000},{0.712500,0.987500,0.050000,0.050000},{0.712500,0.987500,0.100000,0.100000},{0.737500,0.987500,0.050000,0.050000},{0.737500,0.987500,0.100000,0.100000},{0.762500,0.987500,0.050000,0.050000},{0.762500,0.987500,0.100000,0.100000},{0.787500,0.987500,0.050000,0.050000},{0.787500,0.987500,0.100000,0.100000},{0.812500,0.987500,0.050000,0.050000},{0.812500,0.987500,0.100000,0.100000},{0.837500,0.987500,0.050000,0.050000},{0.837500,0.987500,0.100000,0.100000},{0.862500,0.987500,0.050000,0.050000},{0.862500,0.987500,0.100000,0.100000},{0.887500,0.987500,0.050000,0.050000},{0.887500,0.987500,0.100000,0.100000},{0.912500,0.987500,0.050000,0.050000},{0.912500,0.987500,0.100000,0.100000},{0.937500,0.987500,0.050000,0.050000},{0.937500,0.987500,0.100000,0.100000},{0.962500,0.987500,0.050000,0.050000},{0.962500,0.987500,0.100000,0.100000},{0.987500,0.987500,0.050000,0.050000},{0.987500,0.987500,0.100000,0.100000},{0.025000,0.025000,0.200000,0.200000},{0.025000,0.025000,0.400000,0.400000},{0.075000,0.025000,0.200000,0.200000},{0.075000,0.025000,0.400000,0.400000},{0.125000,0.025000,0.200000,0.200000},{0.125000,0.025000,0.400000,0.400000},{0.175000,0.025000,0.200000,0.200000},{0.175000,0.025000,0.400000,0.400000},{0.225000,0.025000,0.200000,0.200000},{0.225000,0.025000,0.400000,0.400000},{0.275000,0.025000,0.200000,0.200000},{0.275000,0.025000,0.400000,0.400000},{0.325000,0.025000,0.200000,0.200000},{0.325000,0.025000,0.400000,0.400000},{0.375000,0.025000,0.200000,0.200000},{0.375000,0.025000,0.400000,0.400000},{0.425000,0.025000,0.200000,0.200000},{0.425000,0.025000,0.400000,0.400000},{0.475000,0.025000,0.200000,0.200000},{0.475000,0.025000,0.400000,0.400000},{0.525000,0.025000,0.200000,0.200000},{0.525000,0.025000,0.400000,0.400000},{0.575000,0.025000,0.200000,0.200000},{0.575000,0.025000,0.400000,0.400000},{0.625000,0.025000,0.200000,0.200000},{0.625000,0.025000,0.400000,0.400000},{0.675000,0.025000,0.200000,0.200000},{0.675000,0.025000,0.400000,0.400000},{0.725000,0.025000,0.200000,0.200000},{0.725000,0.025000,0.400000,0.400000},{0.775000,0.025000,0.200000,0.200000},{0.775000,0.025000,0.400000,0.400000},{0.825000,0.025000,0.200000,0.200000},{0.825000,0.025000,0.400000,0.400000},{0.875000,0.025000,0.200000,0.200000},{0.875000,0.025000,0.400000,0.400000},{0.925000,0.025000,0.200000,0.200000},{0.925000,0.025000,0.400000,0.400000},{0.975000,0.025000,0.200000,0.200000},{0.975000,0.025000,0.400000,0.400000},{0.025000,0.075000,0.200000,0.200000},{0.025000,0.075000,0.400000,0.400000},{0.075000,0.075000,0.200000,0.200000},{0.075000,0.075000,0.400000,0.400000},{0.125000,0.075000,0.200000,0.200000},{0.125000,0.075000,0.400000,0.400000},{0.175000,0.075000,0.200000,0.200000},{0.175000,0.075000,0.400000,0.400000},{0.225000,0.075000,0.200000,0.200000},{0.225000,0.075000,0.400000,0.400000},{0.275000,0.075000,0.200000,0.200000},{0.275000,0.075000,0.400000,0.400000},{0.325000,0.075000,0.200000,0.200000},{0.325000,0.075000,0.400000,0.400000},{0.375000,0.075000,0.200000,0.200000},{0.375000,0.075000,0.400000,0.400000},{0.425000,0.075000,0.200000,0.200000},{0.425000,0.075000,0.400000,0.400000},{0.475000,0.075000,0.200000,0.200000},{0.475000,0.075000,0.400000,0.400000},{0.525000,0.075000,0.200000,0.200000},{0.525000,0.075000,0.400000,0.400000},{0.575000,0.075000,0.200000,0.200000},{0.575000,0.075000,0.400000,0.400000},{0.625000,0.075000,0.200000,0.200000},{0.625000,0.075000,0.400000,0.400000},{0.675000,0.075000,0.200000,0.200000},{0.675000,0.075000,0.400000,0.400000},{0.725000,0.075000,0.200000,0.200000},{0.725000,0.075000,0.400000,0.400000},{0.775000,0.075000,0.200000,0.200000},{0.775000,0.075000,0.400000,0.400000},{0.825000,0.075000,0.200000,0.200000},{0.825000,0.075000,0.400000,0.400000},{0.875000,0.075000,0.200000,0.200000},{0.875000,0.075000,0.400000,0.400000},{0.925000,0.075000,0.200000,0.200000},{0.925000,0.075000,0.400000,0.400000},{0.975000,0.075000,0.200000,0.200000},{0.975000,0.075000,0.400000,0.400000},{0.025000,0.125000,0.200000,0.200000},{0.025000,0.125000,0.400000,0.400000},{0.075000,0.125000,0.200000,0.200000},{0.075000,0.125000,0.400000,0.400000},{0.125000,0.125000,0.200000,0.200000},{0.125000,0.125000,0.400000,0.400000},{0.175000,0.125000,0.200000,0.200000},{0.175000,0.125000,0.400000,0.400000},{0.225000,0.125000,0.200000,0.200000},{0.225000,0.125000,0.400000,0.400000},{0.275000,0.125000,0.200000,0.200000},{0.275000,0.125000,0.400000,0.400000},{0.325000,0.125000,0.200000,0.200000},{0.325000,0.125000,0.400000,0.400000},{0.375000,0.125000,0.200000,0.200000},{0.375000,0.125000,0.400000,0.400000},{0.425000,0.125000,0.200000,0.200000},{0.425000,0.125000,0.400000,0.400000},{0.475000,0.125000,0.200000,0.200000},{0.475000,0.125000,0.400000,0.400000},{0.525000,0.125000,0.200000,0.200000},{0.525000,0.125000,0.400000,0.400000},{0.575000,0.125000,0.200000,0.200000},{0.575000,0.125000,0.400000,0.400000},{0.625000,0.125000,0.200000,0.200000},{0.625000,0.125000,0.400000,0.400000},{0.675000,0.125000,0.200000,0.200000},{0.675000,0.125000,0.400000,0.400000},{0.725000,0.125000,0.200000,0.200000},{0.725000,0.125000,0.400000,0.400000},{0.775000,0.125000,0.200000,0.200000},{0.775000,0.125000,0.400000,0.400000},{0.825000,0.125000,0.200000,0.200000},{0.825000,0.125000,0.400000,0.400000},{0.875000,0.125000,0.200000,0.200000},{0.875000,0.125000,0.400000,0.400000},{0.925000,0.125000,0.200000,0.200000},{0.925000,0.125000,0.400000,0.400000},{0.975000,0.125000,0.200000,0.200000},{0.975000,0.125000,0.400000,0.400000},{0.025000,0.175000,0.200000,0.200000},{0.025000,0.175000,0.400000,0.400000},{0.075000,0.175000,0.200000,0.200000},{0.075000,0.175000,0.400000,0.400000},{0.125000,0.175000,0.200000,0.200000},{0.125000,0.175000,0.400000,0.400000},{0.175000,0.175000,0.200000,0.200000},{0.175000,0.175000,0.400000,0.400000},{0.225000,0.175000,0.200000,0.200000},{0.225000,0.175000,0.400000,0.400000},{0.275000,0.175000,0.200000,0.200000},{0.275000,0.175000,0.400000,0.400000},{0.325000,0.175000,0.200000,0.200000},{0.325000,0.175000,0.400000,0.400000},{0.375000,0.175000,0.200000,0.200000},{0.375000,0.175000,0.400000,0.400000},{0.425000,0.175000,0.200000,0.200000},{0.425000,0.175000,0.400000,0.400000},{0.475000,0.175000,0.200000,0.200000},{0.475000,0.175000,0.400000,0.400000},{0.525000,0.175000,0.200000,0.200000},{0.525000,0.175000,0.400000,0.400000},{0.575000,0.175000,0.200000,0.200000},{0.575000,0.175000,0.400000,0.400000},{0.625000,0.175000,0.200000,0.200000},{0.625000,0.175000,0.400000,0.400000},{0.675000,0.175000,0.200000,0.200000},{0.675000,0.175000,0.400000,0.400000},{0.725000,0.175000,0.200000,0.200000},{0.725000,0.175000,0.400000,0.400000},{0.775000,0.175000,0.200000,0.200000},{0.775000,0.175000,0.400000,0.400000},{0.825000,0.175000,0.200000,0.200000},{0.825000,0.175000,0.400000,0.400000},{0.875000,0.175000,0.200000,0.200000},{0.875000,0.175000,0.400000,0.400000},{0.925000,0.175000,0.200000,0.200000},{0.925000,0.175000,0.400000,0.400000},{0.975000,0.175000,0.200000,0.200000},{0.975000,0.175000,0.400000,0.400000},{0.025000,0.225000,0.200000,0.200000},{0.025000,0.225000,0.400000,0.400000},{0.075000,0.225000,0.200000,0.200000},{0.075000,0.225000,0.400000,0.400000},{0.125000,0.225000,0.200000,0.200000},{0.125000,0.225000,0.400000,0.400000},{0.175000,0.225000,0.200000,0.200000},{0.175000,0.225000,0.400000,0.400000},{0.225000,0.225000,0.200000,0.200000},{0.225000,0.225000,0.400000,0.400000},{0.275000,0.225000,0.200000,0.200000},{0.275000,0.225000,0.400000,0.400000},{0.325000,0.225000,0.200000,0.200000},{0.325000,0.225000,0.400000,0.400000},{0.375000,0.225000,0.200000,0.200000},{0.375000,0.225000,0.400000,0.400000},{0.425000,0.225000,0.200000,0.200000},{0.425000,0.225000,0.400000,0.400000},{0.475000,0.225000,0.200000,0.200000},{0.475000,0.225000,0.400000,0.400000},{0.525000,0.225000,0.200000,0.200000},{0.525000,0.225000,0.400000,0.400000},{0.575000,0.225000,0.200000,0.200000},{0.575000,0.225000,0.400000,0.400000},{0.625000,0.225000,0.200000,0.200000},{0.625000,0.225000,0.400000,0.400000},{0.675000,0.225000,0.200000,0.200000},{0.675000,0.225000,0.400000,0.400000},{0.725000,0.225000,0.200000,0.200000},{0.725000,0.225000,0.400000,0.400000},{0.775000,0.225000,0.200000,0.200000},{0.775000,0.225000,0.400000,0.400000},{0.825000,0.225000,0.200000,0.200000},{0.825000,0.225000,0.400000,0.400000},{0.875000,0.225000,0.200000,0.200000},{0.875000,0.225000,0.400000,0.400000},{0.925000,0.225000,0.200000,0.200000},{0.925000,0.225000,0.400000,0.400000},{0.975000,0.225000,0.200000,0.200000},{0.975000,0.225000,0.400000,0.400000},{0.025000,0.275000,0.200000,0.200000},{0.025000,0.275000,0.400000,0.400000},{0.075000,0.275000,0.200000,0.200000},{0.075000,0.275000,0.400000,0.400000},{0.125000,0.275000,0.200000,0.200000},{0.125000,0.275000,0.400000,0.400000},{0.175000,0.275000,0.200000,0.200000},{0.175000,0.275000,0.400000,0.400000},{0.225000,0.275000,0.200000,0.200000},{0.225000,0.275000,0.400000,0.400000},{0.275000,0.275000,0.200000,0.200000},{0.275000,0.275000,0.400000,0.400000},{0.325000,0.275000,0.200000,0.200000},{0.325000,0.275000,0.400000,0.400000},{0.375000,0.275000,0.200000,0.200000},{0.375000,0.275000,0.400000,0.400000},{0.425000,0.275000,0.200000,0.200000},{0.425000,0.275000,0.400000,0.400000},{0.475000,0.275000,0.200000,0.200000},{0.475000,0.275000,0.400000,0.400000},{0.525000,0.275000,0.200000,0.200000},{0.525000,0.275000,0.400000,0.400000},{0.575000,0.275000,0.200000,0.200000},{0.575000,0.275000,0.400000,0.400000},{0.625000,0.275000,0.200000,0.200000},{0.625000,0.275000,0.400000,0.400000},{0.675000,0.275000,0.200000,0.200000},{0.675000,0.275000,0.400000,0.400000},{0.725000,0.275000,0.200000,0.200000},{0.725000,0.275000,0.400000,0.400000},{0.775000,0.275000,0.200000,0.200000},{0.775000,0.275000,0.400000,0.400000},{0.825000,0.275000,0.200000,0.200000},{0.825000,0.275000,0.400000,0.400000},{0.875000,0.275000,0.200000,0.200000},{0.875000,0.275000,0.400000,0.400000},{0.925000,0.275000,0.200000,0.200000},{0.925000,0.275000,0.400000,0.400000},{0.975000,0.275000,0.200000,0.200000},{0.975000,0.275000,0.400000,0.400000},{0.025000,0.325000,0.200000,0.200000},{0.025000,0.325000,0.400000,0.400000},{0.075000,0.325000,0.200000,0.200000},{0.075000,0.325000,0.400000,0.400000},{0.125000,0.325000,0.200000,0.200000},{0.125000,0.325000,0.400000,0.400000},{0.175000,0.325000,0.200000,0.200000},{0.175000,0.325000,0.400000,0.400000},{0.225000,0.325000,0.200000,0.200000},{0.225000,0.325000,0.400000,0.400000},{0.275000,0.325000,0.200000,0.200000},{0.275000,0.325000,0.400000,0.400000},{0.325000,0.325000,0.200000,0.200000},{0.325000,0.325000,0.400000,0.400000},{0.375000,0.325000,0.200000,0.200000},{0.375000,0.325000,0.400000,0.400000},{0.425000,0.325000,0.200000,0.200000},{0.425000,0.325000,0.400000,0.400000},{0.475000,0.325000,0.200000,0.200000},{0.475000,0.325000,0.400000,0.400000},{0.525000,0.325000,0.200000,0.200000},{0.525000,0.325000,0.400000,0.400000},{0.575000,0.325000,0.200000,0.200000},{0.575000,0.325000,0.400000,0.400000},{0.625000,0.325000,0.200000,0.200000},{0.625000,0.325000,0.400000,0.400000},{0.675000,0.325000,0.200000,0.200000},{0.675000,0.325000,0.400000,0.400000},{0.725000,0.325000,0.200000,0.200000},{0.725000,0.325000,0.400000,0.400000},{0.775000,0.325000,0.200000,0.200000},{0.775000,0.325000,0.400000,0.400000},{0.825000,0.325000,0.200000,0.200000},{0.825000,0.325000,0.400000,0.400000},{0.875000,0.325000,0.200000,0.200000},{0.875000,0.325000,0.400000,0.400000},{0.925000,0.325000,0.200000,0.200000},{0.925000,0.325000,0.400000,0.400000},{0.975000,0.325000,0.200000,0.200000},{0.975000,0.325000,0.400000,0.400000},{0.025000,0.375000,0.200000,0.200000},{0.025000,0.375000,0.400000,0.400000},{0.075000,0.375000,0.200000,0.200000},{0.075000,0.375000,0.400000,0.400000},{0.125000,0.375000,0.200000,0.200000},{0.125000,0.375000,0.400000,0.400000},{0.175000,0.375000,0.200000,0.200000},{0.175000,0.375000,0.400000,0.400000},{0.225000,0.375000,0.200000,0.200000},{0.225000,0.375000,0.400000,0.400000},{0.275000,0.375000,0.200000,0.200000},{0.275000,0.375000,0.400000,0.400000},{0.325000,0.375000,0.200000,0.200000},{0.325000,0.375000,0.400000,0.400000},{0.375000,0.375000,0.200000,0.200000},{0.375000,0.375000,0.400000,0.400000},{0.425000,0.375000,0.200000,0.200000},{0.425000,0.375000,0.400000,0.400000},{0.475000,0.375000,0.200000,0.200000},{0.475000,0.375000,0.400000,0.400000},{0.525000,0.375000,0.200000,0.200000},{0.525000,0.375000,0.400000,0.400000},{0.575000,0.375000,0.200000,0.200000},{0.575000,0.375000,0.400000,0.400000},{0.625000,0.375000,0.200000,0.200000},{0.625000,0.375000,0.400000,0.400000},{0.675000,0.375000,0.200000,0.200000},{0.675000,0.375000,0.400000,0.400000},{0.725000,0.375000,0.200000,0.200000},{0.725000,0.375000,0.400000,0.400000},{0.775000,0.375000,0.200000,0.200000},{0.775000,0.375000,0.400000,0.400000},{0.825000,0.375000,0.200000,0.200000},{0.825000,0.375000,0.400000,0.400000},{0.875000,0.375000,0.200000,0.200000},{0.875000,0.375000,0.400000,0.400000},{0.925000,0.375000,0.200000,0.200000},{0.925000,0.375000,0.400000,0.400000},{0.975000,0.375000,0.200000,0.200000},{0.975000,0.375000,0.400000,0.400000},{0.025000,0.425000,0.200000,0.200000},{0.025000,0.425000,0.400000,0.400000},{0.075000,0.425000,0.200000,0.200000},{0.075000,0.425000,0.400000,0.400000},{0.125000,0.425000,0.200000,0.200000},{0.125000,0.425000,0.400000,0.400000},{0.175000,0.425000,0.200000,0.200000},{0.175000,0.425000,0.400000,0.400000},{0.225000,0.425000,0.200000,0.200000},{0.225000,0.425000,0.400000,0.400000},{0.275000,0.425000,0.200000,0.200000},{0.275000,0.425000,0.400000,0.400000},{0.325000,0.425000,0.200000,0.200000},{0.325000,0.425000,0.400000,0.400000},{0.375000,0.425000,0.200000,0.200000},{0.375000,0.425000,0.400000,0.400000},{0.425000,0.425000,0.200000,0.200000},{0.425000,0.425000,0.400000,0.400000},{0.475000,0.425000,0.200000,0.200000},{0.475000,0.425000,0.400000,0.400000},{0.525000,0.425000,0.200000,0.200000},{0.525000,0.425000,0.400000,0.400000},{0.575000,0.425000,0.200000,0.200000},{0.575000,0.425000,0.400000,0.400000},{0.625000,0.425000,0.200000,0.200000},{0.625000,0.425000,0.400000,0.400000},{0.675000,0.425000,0.200000,0.200000},{0.675000,0.425000,0.400000,0.400000},{0.725000,0.425000,0.200000,0.200000},{0.725000,0.425000,0.400000,0.400000},{0.775000,0.425000,0.200000,0.200000},{0.775000,0.425000,0.400000,0.400000},{0.825000,0.425000,0.200000,0.200000},{0.825000,0.425000,0.400000,0.400000},{0.875000,0.425000,0.200000,0.200000},{0.875000,0.425000,0.400000,0.400000},{0.925000,0.425000,0.200000,0.200000},{0.925000,0.425000,0.400000,0.400000},{0.975000,0.425000,0.200000,0.200000},{0.975000,0.425000,0.400000,0.400000},{0.025000,0.475000,0.200000,0.200000},{0.025000,0.475000,0.400000,0.400000},{0.075000,0.475000,0.200000,0.200000},{0.075000,0.475000,0.400000,0.400000},{0.125000,0.475000,0.200000,0.200000},{0.125000,0.475000,0.400000,0.400000},{0.175000,0.475000,0.200000,0.200000},{0.175000,0.475000,0.400000,0.400000},{0.225000,0.475000,0.200000,0.200000},{0.225000,0.475000,0.400000,0.400000},{0.275000,0.475000,0.200000,0.200000},{0.275000,0.475000,0.400000,0.400000},{0.325000,0.475000,0.200000,0.200000},{0.325000,0.475000,0.400000,0.400000},{0.375000,0.475000,0.200000,0.200000},{0.375000,0.475000,0.400000,0.400000},{0.425000,0.475000,0.200000,0.200000},{0.425000,0.475000,0.400000,0.400000},{0.475000,0.475000,0.200000,0.200000},{0.475000,0.475000,0.400000,0.400000},{0.525000,0.475000,0.200000,0.200000},{0.525000,0.475000,0.400000,0.400000},{0.575000,0.475000,0.200000,0.200000},{0.575000,0.475000,0.400000,0.400000},{0.625000,0.475000,0.200000,0.200000},{0.625000,0.475000,0.400000,0.400000},{0.675000,0.475000,0.200000,0.200000},{0.675000,0.475000,0.400000,0.400000},{0.725000,0.475000,0.200000,0.200000},{0.725000,0.475000,0.400000,0.400000},{0.775000,0.475000,0.200000,0.200000},{0.775000,0.475000,0.400000,0.400000},{0.825000,0.475000,0.200000,0.200000},{0.825000,0.475000,0.400000,0.400000},{0.875000,0.475000,0.200000,0.200000},{0.875000,0.475000,0.400000,0.400000},{0.925000,0.475000,0.200000,0.200000},{0.925000,0.475000,0.400000,0.400000},{0.975000,0.475000,0.200000,0.200000},{0.975000,0.475000,0.400000,0.400000},{0.025000,0.525000,0.200000,0.200000},{0.025000,0.525000,0.400000,0.400000},{0.075000,0.525000,0.200000,0.200000},{0.075000,0.525000,0.400000,0.400000},{0.125000,0.525000,0.200000,0.200000},{0.125000,0.525000,0.400000,0.400000},{0.175000,0.525000,0.200000,0.200000},{0.175000,0.525000,0.400000,0.400000},{0.225000,0.525000,0.200000,0.200000},{0.225000,0.525000,0.400000,0.400000},{0.275000,0.525000,0.200000,0.200000},{0.275000,0.525000,0.400000,0.400000},{0.325000,0.525000,0.200000,0.200000},{0.325000,0.525000,0.400000,0.400000},{0.375000,0.525000,0.200000,0.200000},{0.375000,0.525000,0.400000,0.400000},{0.425000,0.525000,0.200000,0.200000},{0.425000,0.525000,0.400000,0.400000},{0.475000,0.525000,0.200000,0.200000},{0.475000,0.525000,0.400000,0.400000},{0.525000,0.525000,0.200000,0.200000},{0.525000,0.525000,0.400000,0.400000},{0.575000,0.525000,0.200000,0.200000},{0.575000,0.525000,0.400000,0.400000},{0.625000,0.525000,0.200000,0.200000},{0.625000,0.525000,0.400000,0.400000},{0.675000,0.525000,0.200000,0.200000},{0.675000,0.525000,0.400000,0.400000},{0.725000,0.525000,0.200000,0.200000},{0.725000,0.525000,0.400000,0.400000},{0.775000,0.525000,0.200000,0.200000},{0.775000,0.525000,0.400000,0.400000},{0.825000,0.525000,0.200000,0.200000},{0.825000,0.525000,0.400000,0.400000},{0.875000,0.525000,0.200000,0.200000},{0.875000,0.525000,0.400000,0.400000},{0.925000,0.525000,0.200000,0.200000},{0.925000,0.525000,0.400000,0.400000},{0.975000,0.525000,0.200000,0.200000},{0.975000,0.525000,0.400000,0.400000},{0.025000,0.575000,0.200000,0.200000},{0.025000,0.575000,0.400000,0.400000},{0.075000,0.575000,0.200000,0.200000},{0.075000,0.575000,0.400000,0.400000},{0.125000,0.575000,0.200000,0.200000},{0.125000,0.575000,0.400000,0.400000},{0.175000,0.575000,0.200000,0.200000},{0.175000,0.575000,0.400000,0.400000},{0.225000,0.575000,0.200000,0.200000},{0.225000,0.575000,0.400000,0.400000},{0.275000,0.575000,0.200000,0.200000},{0.275000,0.575000,0.400000,0.400000},{0.325000,0.575000,0.200000,0.200000},{0.325000,0.575000,0.400000,0.400000},{0.375000,0.575000,0.200000,0.200000},{0.375000,0.575000,0.400000,0.400000},{0.425000,0.575000,0.200000,0.200000},{0.425000,0.575000,0.400000,0.400000},{0.475000,0.575000,0.200000,0.200000},{0.475000,0.575000,0.400000,0.400000},{0.525000,0.575000,0.200000,0.200000},{0.525000,0.575000,0.400000,0.400000},{0.575000,0.575000,0.200000,0.200000},{0.575000,0.575000,0.400000,0.400000},{0.625000,0.575000,0.200000,0.200000},{0.625000,0.575000,0.400000,0.400000},{0.675000,0.575000,0.200000,0.200000},{0.675000,0.575000,0.400000,0.400000},{0.725000,0.575000,0.200000,0.200000},{0.725000,0.575000,0.400000,0.400000},{0.775000,0.575000,0.200000,0.200000},{0.775000,0.575000,0.400000,0.400000},{0.825000,0.575000,0.200000,0.200000},{0.825000,0.575000,0.400000,0.400000},{0.875000,0.575000,0.200000,0.200000},{0.875000,0.575000,0.400000,0.400000},{0.925000,0.575000,0.200000,0.200000},{0.925000,0.575000,0.400000,0.400000},{0.975000,0.575000,0.200000,0.200000},{0.975000,0.575000,0.400000,0.400000},{0.025000,0.625000,0.200000,0.200000},{0.025000,0.625000,0.400000,0.400000},{0.075000,0.625000,0.200000,0.200000},{0.075000,0.625000,0.400000,0.400000},{0.125000,0.625000,0.200000,0.200000},{0.125000,0.625000,0.400000,0.400000},{0.175000,0.625000,0.200000,0.200000},{0.175000,0.625000,0.400000,0.400000},{0.225000,0.625000,0.200000,0.200000},{0.225000,0.625000,0.400000,0.400000},{0.275000,0.625000,0.200000,0.200000},{0.275000,0.625000,0.400000,0.400000},{0.325000,0.625000,0.200000,0.200000},{0.325000,0.625000,0.400000,0.400000},{0.375000,0.625000,0.200000,0.200000},{0.375000,0.625000,0.400000,0.400000},{0.425000,0.625000,0.200000,0.200000},{0.425000,0.625000,0.400000,0.400000},{0.475000,0.625000,0.200000,0.200000},{0.475000,0.625000,0.400000,0.400000},{0.525000,0.625000,0.200000,0.200000},{0.525000,0.625000,0.400000,0.400000},{0.575000,0.625000,0.200000,0.200000},{0.575000,0.625000,0.400000,0.400000},{0.625000,0.625000,0.200000,0.200000},{0.625000,0.625000,0.400000,0.400000},{0.675000,0.625000,0.200000,0.200000},{0.675000,0.625000,0.400000,0.400000},{0.725000,0.625000,0.200000,0.200000},{0.725000,0.625000,0.400000,0.400000},{0.775000,0.625000,0.200000,0.200000},{0.775000,0.625000,0.400000,0.400000},{0.825000,0.625000,0.200000,0.200000},{0.825000,0.625000,0.400000,0.400000},{0.875000,0.625000,0.200000,0.200000},{0.875000,0.625000,0.400000,0.400000},{0.925000,0.625000,0.200000,0.200000},{0.925000,0.625000,0.400000,0.400000},{0.975000,0.625000,0.200000,0.200000},{0.975000,0.625000,0.400000,0.400000},{0.025000,0.675000,0.200000,0.200000},{0.025000,0.675000,0.400000,0.400000},{0.075000,0.675000,0.200000,0.200000},{0.075000,0.675000,0.400000,0.400000},{0.125000,0.675000,0.200000,0.200000},{0.125000,0.675000,0.400000,0.400000},{0.175000,0.675000,0.200000,0.200000},{0.175000,0.675000,0.400000,0.400000},{0.225000,0.675000,0.200000,0.200000},{0.225000,0.675000,0.400000,0.400000},{0.275000,0.675000,0.200000,0.200000},{0.275000,0.675000,0.400000,0.400000},{0.325000,0.675000,0.200000,0.200000},{0.325000,0.675000,0.400000,0.400000},{0.375000,0.675000,0.200000,0.200000},{0.375000,0.675000,0.400000,0.400000},{0.425000,0.675000,0.200000,0.200000},{0.425000,0.675000,0.400000,0.400000},{0.475000,0.675000,0.200000,0.200000},{0.475000,0.675000,0.400000,0.400000},{0.525000,0.675000,0.200000,0.200000},{0.525000,0.675000,0.400000,0.400000},{0.575000,0.675000,0.200000,0.200000},{0.575000,0.675000,0.400000,0.400000},{0.625000,0.675000,0.200000,0.200000},{0.625000,0.675000,0.400000,0.400000},{0.675000,0.675000,0.200000,0.200000},{0.675000,0.675000,0.400000,0.400000},{0.725000,0.675000,0.200000,0.200000},{0.725000,0.675000,0.400000,0.400000},{0.775000,0.675000,0.200000,0.200000},{0.775000,0.675000,0.400000,0.400000},{0.825000,0.675000,0.200000,0.200000},{0.825000,0.675000,0.400000,0.400000},{0.875000,0.675000,0.200000,0.200000},{0.875000,0.675000,0.400000,0.400000},{0.925000,0.675000,0.200000,0.200000},{0.925000,0.675000,0.400000,0.400000},{0.975000,0.675000,0.200000,0.200000},{0.975000,0.675000,0.400000,0.400000},{0.025000,0.725000,0.200000,0.200000},{0.025000,0.725000,0.400000,0.400000},{0.075000,0.725000,0.200000,0.200000},{0.075000,0.725000,0.400000,0.400000},{0.125000,0.725000,0.200000,0.200000},{0.125000,0.725000,0.400000,0.400000},{0.175000,0.725000,0.200000,0.200000},{0.175000,0.725000,0.400000,0.400000},{0.225000,0.725000,0.200000,0.200000},{0.225000,0.725000,0.400000,0.400000},{0.275000,0.725000,0.200000,0.200000},{0.275000,0.725000,0.400000,0.400000},{0.325000,0.725000,0.200000,0.200000},{0.325000,0.725000,0.400000,0.400000},{0.375000,0.725000,0.200000,0.200000},{0.375000,0.725000,0.400000,0.400000},{0.425000,0.725000,0.200000,0.200000},{0.425000,0.725000,0.400000,0.400000},{0.475000,0.725000,0.200000,0.200000},{0.475000,0.725000,0.400000,0.400000},{0.525000,0.725000,0.200000,0.200000},{0.525000,0.725000,0.400000,0.400000},{0.575000,0.725000,0.200000,0.200000},{0.575000,0.725000,0.400000,0.400000},{0.625000,0.725000,0.200000,0.200000},{0.625000,0.725000,0.400000,0.400000},{0.675000,0.725000,0.200000,0.200000},{0.675000,0.725000,0.400000,0.400000},{0.725000,0.725000,0.200000,0.200000},{0.725000,0.725000,0.400000,0.400000},{0.775000,0.725000,0.200000,0.200000},{0.775000,0.725000,0.400000,0.400000},{0.825000,0.725000,0.200000,0.200000},{0.825000,0.725000,0.400000,0.400000},{0.875000,0.725000,0.200000,0.200000},{0.875000,0.725000,0.400000,0.400000},{0.925000,0.725000,0.200000,0.200000},{0.925000,0.725000,0.400000,0.400000},{0.975000,0.725000,0.200000,0.200000},{0.975000,0.725000,0.400000,0.400000},{0.025000,0.775000,0.200000,0.200000},{0.025000,0.775000,0.400000,0.400000},{0.075000,0.775000,0.200000,0.200000},{0.075000,0.775000,0.400000,0.400000},{0.125000,0.775000,0.200000,0.200000},{0.125000,0.775000,0.400000,0.400000},{0.175000,0.775000,0.200000,0.200000},{0.175000,0.775000,0.400000,0.400000},{0.225000,0.775000,0.200000,0.200000},{0.225000,0.775000,0.400000,0.400000},{0.275000,0.775000,0.200000,0.200000},{0.275000,0.775000,0.400000,0.400000},{0.325000,0.775000,0.200000,0.200000},{0.325000,0.775000,0.400000,0.400000},{0.375000,0.775000,0.200000,0.200000},{0.375000,0.775000,0.400000,0.400000},{0.425000,0.775000,0.200000,0.200000},{0.425000,0.775000,0.400000,0.400000},{0.475000,0.775000,0.200000,0.200000},{0.475000,0.775000,0.400000,0.400000},{0.525000,0.775000,0.200000,0.200000},{0.525000,0.775000,0.400000,0.400000},{0.575000,0.775000,0.200000,0.200000},{0.575000,0.775000,0.400000,0.400000},{0.625000,0.775000,0.200000,0.200000},{0.625000,0.775000,0.400000,0.400000},{0.675000,0.775000,0.200000,0.200000},{0.675000,0.775000,0.400000,0.400000},{0.725000,0.775000,0.200000,0.200000},{0.725000,0.775000,0.400000,0.400000},{0.775000,0.775000,0.200000,0.200000},{0.775000,0.775000,0.400000,0.400000},{0.825000,0.775000,0.200000,0.200000},{0.825000,0.775000,0.400000,0.400000},{0.875000,0.775000,0.200000,0.200000},{0.875000,0.775000,0.400000,0.400000},{0.925000,0.775000,0.200000,0.200000},{0.925000,0.775000,0.400000,0.400000},{0.975000,0.775000,0.200000,0.200000},{0.975000,0.775000,0.400000,0.400000},{0.025000,0.825000,0.200000,0.200000},{0.025000,0.825000,0.400000,0.400000},{0.075000,0.825000,0.200000,0.200000},{0.075000,0.825000,0.400000,0.400000},{0.125000,0.825000,0.200000,0.200000},{0.125000,0.825000,0.400000,0.400000},{0.175000,0.825000,0.200000,0.200000},{0.175000,0.825000,0.400000,0.400000},{0.225000,0.825000,0.200000,0.200000},{0.225000,0.825000,0.400000,0.400000},{0.275000,0.825000,0.200000,0.200000},{0.275000,0.825000,0.400000,0.400000},{0.325000,0.825000,0.200000,0.200000},{0.325000,0.825000,0.400000,0.400000},{0.375000,0.825000,0.200000,0.200000},{0.375000,0.825000,0.400000,0.400000},{0.425000,0.825000,0.200000,0.200000},{0.425000,0.825000,0.400000,0.400000},{0.475000,0.825000,0.200000,0.200000},{0.475000,0.825000,0.400000,0.400000},{0.525000,0.825000,0.200000,0.200000},{0.525000,0.825000,0.400000,0.400000},{0.575000,0.825000,0.200000,0.200000},{0.575000,0.825000,0.400000,0.400000},{0.625000,0.825000,0.200000,0.200000},{0.625000,0.825000,0.400000,0.400000},{0.675000,0.825000,0.200000,0.200000},{0.675000,0.825000,0.400000,0.400000},{0.725000,0.825000,0.200000,0.200000},{0.725000,0.825000,0.400000,0.400000},{0.775000,0.825000,0.200000,0.200000},{0.775000,0.825000,0.400000,0.400000},{0.825000,0.825000,0.200000,0.200000},{0.825000,0.825000,0.400000,0.400000},{0.875000,0.825000,0.200000,0.200000},{0.875000,0.825000,0.400000,0.400000},{0.925000,0.825000,0.200000,0.200000},{0.925000,0.825000,0.400000,0.400000},{0.975000,0.825000,0.200000,0.200000},{0.975000,0.825000,0.400000,0.400000},{0.025000,0.875000,0.200000,0.200000},{0.025000,0.875000,0.400000,0.400000},{0.075000,0.875000,0.200000,0.200000},{0.075000,0.875000,0.400000,0.400000},{0.125000,0.875000,0.200000,0.200000},{0.125000,0.875000,0.400000,0.400000},{0.175000,0.875000,0.200000,0.200000},{0.175000,0.875000,0.400000,0.400000},{0.225000,0.875000,0.200000,0.200000},{0.225000,0.875000,0.400000,0.400000},{0.275000,0.875000,0.200000,0.200000},{0.275000,0.875000,0.400000,0.400000},{0.325000,0.875000,0.200000,0.200000},{0.325000,0.875000,0.400000,0.400000},{0.375000,0.875000,0.200000,0.200000},{0.375000,0.875000,0.400000,0.400000},{0.425000,0.875000,0.200000,0.200000},{0.425000,0.875000,0.400000,0.400000},{0.475000,0.875000,0.200000,0.200000},{0.475000,0.875000,0.400000,0.400000},{0.525000,0.875000,0.200000,0.200000},{0.525000,0.875000,0.400000,0.400000},{0.575000,0.875000,0.200000,0.200000},{0.575000,0.875000,0.400000,0.400000},{0.625000,0.875000,0.200000,0.200000},{0.625000,0.875000,0.400000,0.400000},{0.675000,0.875000,0.200000,0.200000},{0.675000,0.875000,0.400000,0.400000},{0.725000,0.875000,0.200000,0.200000},{0.725000,0.875000,0.400000,0.400000},{0.775000,0.875000,0.200000,0.200000},{0.775000,0.875000,0.400000,0.400000},{0.825000,0.875000,0.200000,0.200000},{0.825000,0.875000,0.400000,0.400000},{0.875000,0.875000,0.200000,0.200000},{0.875000,0.875000,0.400000,0.400000},{0.925000,0.875000,0.200000,0.200000},{0.925000,0.875000,0.400000,0.400000},{0.975000,0.875000,0.200000,0.200000},{0.975000,0.875000,0.400000,0.400000},{0.025000,0.925000,0.200000,0.200000},{0.025000,0.925000,0.400000,0.400000},{0.075000,0.925000,0.200000,0.200000},{0.075000,0.925000,0.400000,0.400000},{0.125000,0.925000,0.200000,0.200000},{0.125000,0.925000,0.400000,0.400000},{0.175000,0.925000,0.200000,0.200000},{0.175000,0.925000,0.400000,0.400000},{0.225000,0.925000,0.200000,0.200000},{0.225000,0.925000,0.400000,0.400000},{0.275000,0.925000,0.200000,0.200000},{0.275000,0.925000,0.400000,0.400000},{0.325000,0.925000,0.200000,0.200000},{0.325000,0.925000,0.400000,0.400000},{0.375000,0.925000,0.200000,0.200000},{0.375000,0.925000,0.400000,0.400000},{0.425000,0.925000,0.200000,0.200000},{0.425000,0.925000,0.400000,0.400000},{0.475000,0.925000,0.200000,0.200000},{0.475000,0.925000,0.400000,0.400000},{0.525000,0.925000,0.200000,0.200000},{0.525000,0.925000,0.400000,0.400000},{0.575000,0.925000,0.200000,0.200000},{0.575000,0.925000,0.400000,0.400000},{0.625000,0.925000,0.200000,0.200000},{0.625000,0.925000,0.400000,0.400000},{0.675000,0.925000,0.200000,0.200000},{0.675000,0.925000,0.400000,0.400000},{0.725000,0.925000,0.200000,0.200000},{0.725000,0.925000,0.400000,0.400000},{0.775000,0.925000,0.200000,0.200000},{0.775000,0.925000,0.400000,0.400000},{0.825000,0.925000,0.200000,0.200000},{0.825000,0.925000,0.400000,0.400000},{0.875000,0.925000,0.200000,0.200000},{0.875000,0.925000,0.400000,0.400000},{0.925000,0.925000,0.200000,0.200000},{0.925000,0.925000,0.400000,0.400000},{0.975000,0.925000,0.200000,0.200000},{0.975000,0.925000,0.400000,0.400000},{0.025000,0.975000,0.200000,0.200000},{0.025000,0.975000,0.400000,0.400000},{0.075000,0.975000,0.200000,0.200000},{0.075000,0.975000,0.400000,0.400000},{0.125000,0.975000,0.200000,0.200000},{0.125000,0.975000,0.400000,0.400000},{0.175000,0.975000,0.200000,0.200000},{0.175000,0.975000,0.400000,0.400000},{0.225000,0.975000,0.200000,0.200000},{0.225000,0.975000,0.400000,0.400000},{0.275000,0.975000,0.200000,0.200000},{0.275000,0.975000,0.400000,0.400000},{0.325000,0.975000,0.200000,0.200000},{0.325000,0.975000,0.400000,0.400000},{0.375000,0.975000,0.200000,0.200000},{0.375000,0.975000,0.400000,0.400000},{0.425000,0.975000,0.200000,0.200000},{0.425000,0.975000,0.400000,0.400000},{0.475000,0.975000,0.200000,0.200000},{0.475000,0.975000,0.400000,0.400000},{0.525000,0.975000,0.200000,0.200000},{0.525000,0.975000,0.400000,0.400000},{0.575000,0.975000,0.200000,0.200000},{0.575000,0.975000,0.400000,0.400000},{0.625000,0.975000,0.200000,0.200000},{0.625000,0.975000,0.400000,0.400000},{0.675000,0.975000,0.200000,0.200000},{0.675000,0.975000,0.400000,0.400000},{0.725000,0.975000,0.200000,0.200000},{0.725000,0.975000,0.400000,0.400000},{0.775000,0.975000,0.200000,0.200000},{0.775000,0.975000,0.400000,0.400000},{0.825000,0.975000,0.200000,0.200000},{0.825000,0.975000,0.400000,0.400000},{0.875000,0.975000,0.200000,0.200000},{0.875000,0.975000,0.400000,0.400000},{0.925000,0.975000,0.200000,0.200000},{0.925000,0.975000,0.400000,0.400000},{0.975000,0.975000,0.200000,0.200000},{0.975000,0.975000,0.400000,0.400000},{0.050000,0.050000,0.800000,0.800000},{0.050000,0.050000,1.600000,1.600000},{0.150000,0.050000,0.800000,0.800000},{0.150000,0.050000,1.600000,1.600000},{0.250000,0.050000,0.800000,0.800000},{0.250000,0.050000,1.600000,1.600000},{0.350000,0.050000,0.800000,0.800000},{0.350000,0.050000,1.600000,1.600000},{0.450000,0.050000,0.800000,0.800000},{0.450000,0.050000,1.600000,1.600000},{0.550000,0.050000,0.800000,0.800000},{0.550000,0.050000,1.600000,1.600000},{0.650000,0.050000,0.800000,0.800000},{0.650000,0.050000,1.600000,1.600000},{0.750000,0.050000,0.800000,0.800000},{0.750000,0.050000,1.600000,1.600000},{0.850000,0.050000,0.800000,0.800000},{0.850000,0.050000,1.600000,1.600000},{0.950000,0.050000,0.800000,0.800000},{0.950000,0.050000,1.600000,1.600000},{0.050000,0.150000,0.800000,0.800000},{0.050000,0.150000,1.600000,1.600000},{0.150000,0.150000,0.800000,0.800000},{0.150000,0.150000,1.600000,1.600000},{0.250000,0.150000,0.800000,0.800000},{0.250000,0.150000,1.600000,1.600000},{0.350000,0.150000,0.800000,0.800000},{0.350000,0.150000,1.600000,1.600000},{0.450000,0.150000,0.800000,0.800000},{0.450000,0.150000,1.600000,1.600000},{0.550000,0.150000,0.800000,0.800000},{0.550000,0.150000,1.600000,1.600000},{0.650000,0.150000,0.800000,0.800000},{0.650000,0.150000,1.600000,1.600000},{0.750000,0.150000,0.800000,0.800000},{0.750000,0.150000,1.600000,1.600000},{0.850000,0.150000,0.800000,0.800000},{0.850000,0.150000,1.600000,1.600000},{0.950000,0.150000,0.800000,0.800000},{0.950000,0.150000,1.600000,1.600000},{0.050000,0.250000,0.800000,0.800000},{0.050000,0.250000,1.600000,1.600000},{0.150000,0.250000,0.800000,0.800000},{0.150000,0.250000,1.600000,1.600000},{0.250000,0.250000,0.800000,0.800000},{0.250000,0.250000,1.600000,1.600000},{0.350000,0.250000,0.800000,0.800000},{0.350000,0.250000,1.600000,1.600000},{0.450000,0.250000,0.800000,0.800000},{0.450000,0.250000,1.600000,1.600000},{0.550000,0.250000,0.800000,0.800000},{0.550000,0.250000,1.600000,1.600000},{0.650000,0.250000,0.800000,0.800000},{0.650000,0.250000,1.600000,1.600000},{0.750000,0.250000,0.800000,0.800000},{0.750000,0.250000,1.600000,1.600000},{0.850000,0.250000,0.800000,0.800000},{0.850000,0.250000,1.600000,1.600000},{0.950000,0.250000,0.800000,0.800000},{0.950000,0.250000,1.600000,1.600000},{0.050000,0.350000,0.800000,0.800000},{0.050000,0.350000,1.600000,1.600000},{0.150000,0.350000,0.800000,0.800000},{0.150000,0.350000,1.600000,1.600000},{0.250000,0.350000,0.800000,0.800000},{0.250000,0.350000,1.600000,1.600000},{0.350000,0.350000,0.800000,0.800000},{0.350000,0.350000,1.600000,1.600000},{0.450000,0.350000,0.800000,0.800000},{0.450000,0.350000,1.600000,1.600000},{0.550000,0.350000,0.800000,0.800000},{0.550000,0.350000,1.600000,1.600000},{0.650000,0.350000,0.800000,0.800000},{0.650000,0.350000,1.600000,1.600000},{0.750000,0.350000,0.800000,0.800000},{0.750000,0.350000,1.600000,1.600000},{0.850000,0.350000,0.800000,0.800000},{0.850000,0.350000,1.600000,1.600000},{0.950000,0.350000,0.800000,0.800000},{0.950000,0.350000,1.600000,1.600000},{0.050000,0.450000,0.800000,0.800000},{0.050000,0.450000,1.600000,1.600000},{0.150000,0.450000,0.800000,0.800000},{0.150000,0.450000,1.600000,1.600000},{0.250000,0.450000,0.800000,0.800000},{0.250000,0.450000,1.600000,1.600000},{0.350000,0.450000,0.800000,0.800000},{0.350000,0.450000,1.600000,1.600000},{0.450000,0.450000,0.800000,0.800000},{0.450000,0.450000,1.600000,1.600000},{0.550000,0.450000,0.800000,0.800000},{0.550000,0.450000,1.600000,1.600000},{0.650000,0.450000,0.800000,0.800000},{0.650000,0.450000,1.600000,1.600000},{0.750000,0.450000,0.800000,0.800000},{0.750000,0.450000,1.600000,1.600000},{0.850000,0.450000,0.800000,0.800000},{0.850000,0.450000,1.600000,1.600000},{0.950000,0.450000,0.800000,0.800000},{0.950000,0.450000,1.600000,1.600000},{0.050000,0.550000,0.800000,0.800000},{0.050000,0.550000,1.600000,1.600000},{0.150000,0.550000,0.800000,0.800000},{0.150000,0.550000,1.600000,1.600000},{0.250000,0.550000,0.800000,0.800000},{0.250000,0.550000,1.600000,1.600000},{0.350000,0.550000,0.800000,0.800000},{0.350000,0.550000,1.600000,1.600000},{0.450000,0.550000,0.800000,0.800000},{0.450000,0.550000,1.600000,1.600000},{0.550000,0.550000,0.800000,0.800000},{0.550000,0.550000,1.600000,1.600000},{0.650000,0.550000,0.800000,0.800000},{0.650000,0.550000,1.600000,1.600000},{0.750000,0.550000,0.800000,0.800000},{0.750000,0.550000,1.600000,1.600000},{0.850000,0.550000,0.800000,0.800000},{0.850000,0.550000,1.600000,1.600000},{0.950000,0.550000,0.800000,0.800000},{0.950000,0.550000,1.600000,1.600000},{0.050000,0.650000,0.800000,0.800000},{0.050000,0.650000,1.600000,1.600000},{0.150000,0.650000,0.800000,0.800000},{0.150000,0.650000,1.600000,1.600000},{0.250000,0.650000,0.800000,0.800000},{0.250000,0.650000,1.600000,1.600000},{0.350000,0.650000,0.800000,0.800000},{0.350000,0.650000,1.600000,1.600000},{0.450000,0.650000,0.800000,0.800000},{0.450000,0.650000,1.600000,1.600000},{0.550000,0.650000,0.800000,0.800000},{0.550000,0.650000,1.600000,1.600000},{0.650000,0.650000,0.800000,0.800000},{0.650000,0.650000,1.600000,1.600000},{0.750000,0.650000,0.800000,0.800000},{0.750000,0.650000,1.600000,1.600000},{0.850000,0.650000,0.800000,0.800000},{0.850000,0.650000,1.600000,1.600000},{0.950000,0.650000,0.800000,0.800000},{0.950000,0.650000,1.600000,1.600000},{0.050000,0.750000,0.800000,0.800000},{0.050000,0.750000,1.600000,1.600000},{0.150000,0.750000,0.800000,0.800000},{0.150000,0.750000,1.600000,1.600000},{0.250000,0.750000,0.800000,0.800000},{0.250000,0.750000,1.600000,1.600000},{0.350000,0.750000,0.800000,0.800000},{0.350000,0.750000,1.600000,1.600000},{0.450000,0.750000,0.800000,0.800000},{0.450000,0.750000,1.600000,1.600000},{0.550000,0.750000,0.800000,0.800000},{0.550000,0.750000,1.600000,1.600000},{0.650000,0.750000,0.800000,0.800000},{0.650000,0.750000,1.600000,1.600000},{0.750000,0.750000,0.800000,0.800000},{0.750000,0.750000,1.600000,1.600000},{0.850000,0.750000,0.800000,0.800000},{0.850000,0.750000,1.600000,1.600000},{0.950000,0.750000,0.800000,0.800000},{0.950000,0.750000,1.600000,1.600000},{0.050000,0.850000,0.800000,0.800000},{0.050000,0.850000,1.600000,1.600000},{0.150000,0.850000,0.800000,0.800000},{0.150000,0.850000,1.600000,1.600000},{0.250000,0.850000,0.800000,0.800000},{0.250000,0.850000,1.600000,1.600000},{0.350000,0.850000,0.800000,0.800000},{0.350000,0.850000,1.600000,1.600000},{0.450000,0.850000,0.800000,0.800000},{0.450000,0.850000,1.600000,1.600000},{0.550000,0.850000,0.800000,0.800000},{0.550000,0.850000,1.600000,1.600000},{0.650000,0.850000,0.800000,0.800000},{0.650000,0.850000,1.600000,1.600000},{0.750000,0.850000,0.800000,0.800000},{0.750000,0.850000,1.600000,1.600000},{0.850000,0.850000,0.800000,0.800000},{0.850000,0.850000,1.600000,1.600000},{0.950000,0.850000,0.800000,0.800000},{0.950000,0.850000,1.600000,1.600000},{0.050000,0.950000,0.800000,0.800000},{0.050000,0.950000,1.600000,1.600000},{0.150000,0.950000,0.800000,0.800000},{0.150000,0.950000,1.600000,1.600000},{0.250000,0.950000,0.800000,0.800000},{0.250000,0.950000,1.600000,1.600000},{0.350000,0.950000,0.800000,0.800000},{0.350000,0.950000,1.600000,1.600000},{0.450000,0.950000,0.800000,0.800000},{0.450000,0.950000,1.600000,1.600000},{0.550000,0.950000,0.800000,0.800000},{0.550000,0.950000,1.600000,1.600000},{0.650000,0.950000,0.800000,0.800000},{0.650000,0.950000,1.600000,1.600000},{0.750000,0.950000,0.800000,0.800000},{0.750000,0.950000,1.600000,1.600000},{0.850000,0.950000,0.800000,0.800000},{0.850000,0.950000,1.600000,1.600000},{0.950000,0.950000,0.800000,0.800000},{0.950000,0.950000,1.600000,1.600000}}; \ No newline at end of file diff --git a/buildroot-overlay/package/face_detect/face_detect.mk b/buildroot-overlay/package/face_detect/face_detect.mk new file mode 100644 index 0000000..e6d82b2 --- /dev/null +++ b/buildroot-overlay/package/face_detect/face_detect.mk @@ -0,0 +1,18 @@ +FACE_DETECT_SITE = $(realpath $(TOPDIR))"/package/face_detect" +FACE_DETECT_SITE_METHOD = local +FACE_DETECT_DEPENDENCIES += libmmz libnncase + + +define FACE_DETECT_BUILD_CMDS + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CXX)" -C $(@D) +endef + +define FACE_DETECT_INSTALL_TARGET_CMDS + mkdir -p $(TARGET_DIR)/app/face_detect + $(INSTALL) -m 0755 $(@D)/face_detect.elf $(TARGET_DIR)/app/face_detect + $(INSTALL) -m 0755 $(@D)/ai2d_input.bin $(TARGET_DIR)/app/face_detect + $(INSTALL) -m 0755 $(@D)/face_detection_320.kmodel $(TARGET_DIR)/app/face_detect + $(INSTALL) -m 0755 $(@D)/run.sh $(TARGET_DIR)/app/face_detect +endef + +$(eval $(generic-package)) diff --git a/buildroot-overlay/package/face_detect/face_detection_320.kmodel b/buildroot-overlay/package/face_detect/face_detection_320.kmodel new file mode 100755 index 0000000..b80096e Binary files /dev/null and b/buildroot-overlay/package/face_detect/face_detection_320.kmodel differ diff --git a/buildroot-overlay/package/face_detect/gsl/gsl-lite.hpp b/buildroot-overlay/package/face_detect/gsl/gsl-lite.hpp new file mode 100644 index 0000000..859f9cc --- /dev/null +++ b/buildroot-overlay/package/face_detect/gsl/gsl-lite.hpp @@ -0,0 +1,4156 @@ +// +// gsl-lite is based on GSL: Guidelines Support Library. +// For more information see https://github.com/gsl-lite/gsl-lite +// +// Copyright (c) 2015-2018 Martin Moene +// Copyright (c) 2015-2018 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_GSL_LITE_HPP_INCLUDED +#define GSL_GSL_LITE_HPP_INCLUDED + +#include // for swap() [pre-C++11], equal(), lexicographical_compare() +#include // for exception, terminate(), uncaught_exceptions() +#include // for data(), size(), reverse_iterator<>, iterator_traits<> +#include +#include // for addressof(), unique_ptr<>, shared_ptr<> +#include // for basic_ostream<> +#include // for ios_base, streamsize +#include // for logic_error +#include +#include // for move(), forward<>(), swap() +#include // for size_t, ptrdiff_t, nullptr_t + +#define gsl_lite_MAJOR 0 +#define gsl_lite_MINOR 37 +#define gsl_lite_PATCH 0 + +#define gsl_lite_VERSION gsl_STRINGIFY(gsl_lite_MAJOR) "." gsl_STRINGIFY(gsl_lite_MINOR) "." gsl_STRINGIFY(gsl_lite_PATCH) + +// gsl-lite backward compatibility: + +#if !defined( gsl_CONFIG_DEFAULTS_VERSION ) +# define gsl_CONFIG_DEFAULTS_VERSION gsl_lite_MAJOR +#endif + +#ifdef gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +# define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR +# pragma message ("gsl_CONFIG_ALLOWS_SPAN_CONTAINER_CTOR is deprecated since gsl-lite 0.7; replace with gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR, or consider span(with_container, cont).") +#endif + +#if defined( gsl_CONFIG_CONTRACT_LEVEL_ON ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_ON is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_ON.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +#endif +#if defined( gsl_CONFIG_CONTRACT_LEVEL_OFF ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_OFF is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_OFF +#endif +#if defined( gsl_CONFIG_CONTRACT_LEVEL_EXPECTS_ONLY ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_EXPECTS_ONLY is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +# define gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF +#elif defined( gsl_CONFIG_CONTRACT_LEVEL_ENSURES_ONLY ) +# pragma message ("gsl_CONFIG_CONTRACT_LEVEL_ENSURES_ONLY is deprecated since gsl-lite 0.36; replace with gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF.") +# define gsl_CONFIG_CONTRACT_CHECKING_ON +# define gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF +#endif + +// M-GSL compatibility: + +#if defined( GSL_THROW_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_VIOLATION_THROWS +#endif + +#if defined( GSL_TERMINATE_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES +#endif + +#if defined( GSL_UNENFORCED_ON_CONTRACT_VIOLATION ) +# define gsl_CONFIG_CONTRACT_CHECKING_OFF +#endif + +// Configuration: Features + +#ifndef gsl_FEATURE_WITH_CONTAINER_TO_STD +# define gsl_FEATURE_WITH_CONTAINER_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_MAKE_SPAN_TO_STD +# define gsl_FEATURE_MAKE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_BYTE_SPAN_TO_STD +# define gsl_FEATURE_BYTE_SPAN_TO_STD 99 +#endif + +#ifndef gsl_FEATURE_IMPLICIT_MACRO +# define gsl_FEATURE_IMPLICIT_MACRO 0 +#endif + +#ifndef gsl_FEATURE_OWNER_MACRO +# define gsl_FEATURE_OWNER_MACRO (gsl_CONFIG_DEFAULTS_VERSION == 0) +#endif + +#ifndef gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD +# define gsl_FEATURE_EXPERIMENTAL_RETURN_GUARD 0 +#endif + +#ifndef gsl_FEATURE_GSL_LITE_NAMESPACE +# define gsl_FEATURE_GSL_LITE_NAMESPACE (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +// Configuration: Other + +#if defined( gsl_CONFIG_TRANSPARENT_NOT_NULL ) && gsl_CONFIG_TRANSPARENT_NOT_NULL && defined( gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF ) +# error configuration option gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF is meaningless if gsl_CONFIG_TRANSPARENT_NOT_NULL=1 +#endif + +#ifndef gsl_CONFIG_DEPRECATE_TO_LEVEL +# if gsl_CONFIG_DEFAULTS_VERSION >= 1 +# define gsl_CONFIG_DEPRECATE_TO_LEVEL 6 +# else +# define gsl_CONFIG_DEPRECATE_TO_LEVEL 0 +# endif +#endif + +#ifndef gsl_CONFIG_SPAN_INDEX_TYPE +# define gsl_CONFIG_SPAN_INDEX_TYPE std::size_t +#endif + +#ifndef gsl_CONFIG_INDEX_TYPE +# if gsl_CONFIG_DEFAULTS_VERSION >= 1 +// p0122r3 uses std::ptrdiff_t +# define gsl_CONFIG_INDEX_TYPE std::ptrdiff_t +# else +# define gsl_CONFIG_INDEX_TYPE gsl_CONFIG_SPAN_INDEX_TYPE +# endif +#endif + +#ifndef gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR +# define gsl_CONFIG_NOT_NULL_EXPLICIT_CTOR (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#ifndef gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF +# define gsl_CONFIG_NOT_NULL_GET_BY_CONST_REF 0 +#endif + +#ifndef gsl_CONFIG_TRANSPARENT_NOT_NULL +# define gsl_CONFIG_TRANSPARENT_NOT_NULL (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#ifndef gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS +# define gsl_CONFIG_CONFIRMS_COMPILATION_ERRORS 0 +#endif + +#ifndef gsl_CONFIG_ALLOWS_SPAN_COMPARISON +# define gsl_CONFIG_ALLOWS_SPAN_COMPARISON (gsl_CONFIG_DEFAULTS_VERSION == 0) +#endif + +#ifndef gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON +# define gsl_CONFIG_ALLOWS_NONSTRICT_SPAN_COMPARISON 1 +#endif + +#ifndef gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR +# define gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR 0 +#endif + +#ifndef gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION +# define gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION (gsl_CONFIG_DEFAULTS_VERSION >= 1) +#endif + +#if 1 < defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) + defined( gsl_CONFIG_CONTRACT_CHECKING_ON ) + defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) +# error only one of gsl_CONFIG_CONTRACT_CHECKING_AUDIT, gsl_CONFIG_CONTRACT_CHECKING_ON, and gsl_CONFIG_CONTRACT_CHECKING_OFF may be defined +#endif +#if 1 < defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) + defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) +# error only one of gsl_CONFIG_CONTRACT_VIOLATION_THROWS, gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES, and gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER may be defined +#endif +#if 1 < defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) + defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) +# error only one of gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME and gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE may be defined +#endif + +// C++ language version detection (C++20 is speculative): +// Note: VC14.0/1900 (VS2015) lacks too much from C++14. + +#ifndef gsl_CPLUSPLUS +# if defined(_MSVC_LANG ) && !defined(__clang__) +# define gsl_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG ) +# else +# define gsl_CPLUSPLUS __cplusplus +# endif +#endif + +#define gsl_CPP98_OR_GREATER ( gsl_CPLUSPLUS >= 199711L ) +#define gsl_CPP11_OR_GREATER ( gsl_CPLUSPLUS >= 201103L ) +#define gsl_CPP14_OR_GREATER ( gsl_CPLUSPLUS >= 201402L ) +#define gsl_CPP17_OR_GREATER ( gsl_CPLUSPLUS >= 201703L ) +#define gsl_CPP20_OR_GREATER ( gsl_CPLUSPLUS >= 202000L ) + +// C++ language version (represent 98 as 3): + +#define gsl_CPLUSPLUS_V ( gsl_CPLUSPLUS / 100 - (gsl_CPLUSPLUS > 200000 ? 2000 : 1994) ) + +// half-open range [lo..hi): +#define gsl_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) + +// Compiler versions: + +// MSVC++ 6.0 _MSC_VER == 1200 gsl_COMPILER_MSVC_VERSION == 60 (Visual Studio 6.0) +// MSVC++ 7.0 _MSC_VER == 1300 gsl_COMPILER_MSVC_VERSION == 70 (Visual Studio .NET 2002) +// MSVC++ 7.1 _MSC_VER == 1310 gsl_COMPILER_MSVC_VERSION == 71 (Visual Studio .NET 2003) +// MSVC++ 8.0 _MSC_VER == 1400 gsl_COMPILER_MSVC_VERSION == 80 (Visual Studio 2005) +// MSVC++ 9.0 _MSC_VER == 1500 gsl_COMPILER_MSVC_VERSION == 90 (Visual Studio 2008) +// MSVC++ 10.0 _MSC_VER == 1600 gsl_COMPILER_MSVC_VERSION == 100 (Visual Studio 2010) +// MSVC++ 11.0 _MSC_VER == 1700 gsl_COMPILER_MSVC_VERSION == 110 (Visual Studio 2012) +// MSVC++ 12.0 _MSC_VER == 1800 gsl_COMPILER_MSVC_VERSION == 120 (Visual Studio 2013) +// MSVC++ 14.0 _MSC_VER == 1900 gsl_COMPILER_MSVC_VERSION == 140 (Visual Studio 2015) +// MSVC++ 14.1 _MSC_VER >= 1910 gsl_COMPILER_MSVC_VERSION == 141 (Visual Studio 2017) +// MSVC++ 14.2 _MSC_VER >= 1920 gsl_COMPILER_MSVC_VERSION == 142 (Visual Studio 2019) + +#if defined(_MSC_VER ) && !defined(__clang__) +# define gsl_COMPILER_MSVC_VER (_MSC_VER ) +# define gsl_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) ) +# define gsl_COMPILER_MSVC_VERSION_FULL (_MSC_VER - 100 * ( 5 + (_MSC_VER < 1900 ) ) ) +#else +# define gsl_COMPILER_MSVC_VER 0 +# define gsl_COMPILER_MSVC_VERSION 0 +# define gsl_COMPILER_MSVC_VERSION_FULL 0 +#endif + +#define gsl_COMPILER_VERSION( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) ) + +// AppleClang 7.0.0 __apple_build_version__ == 7000172 gsl_COMPILER_APPLECLANG_VERSION == 700 (Xcode 7.0, 7.0.1) (LLVM 3.7.0) +// AppleClang 7.0.0 __apple_build_version__ == 7000176 gsl_COMPILER_APPLECLANG_VERSION == 700 (Xcode 7.1) (LLVM 3.7.0) +// AppleClang 7.0.2 __apple_build_version__ == 7000181 gsl_COMPILER_APPLECLANG_VERSION == 702 (Xcode 7.2, 7.2.1) (LLVM 3.7.0) +// AppleClang 7.3.0 __apple_build_version__ == 7030029 gsl_COMPILER_APPLECLANG_VERSION == 730 (Xcode 7.3) (LLVM 3.8.0) +// AppleClang 7.3.0 __apple_build_version__ == 7030031 gsl_COMPILER_APPLECLANG_VERSION == 730 (Xcode 7.3.1) (LLVM 3.8.0) +// AppleClang 8.0.0 __apple_build_version__ == 8000038 gsl_COMPILER_APPLECLANG_VERSION == 800 (Xcode 8.0) (LLVM 3.9.0) +// AppleClang 8.0.0 __apple_build_version__ == 8000042 gsl_COMPILER_APPLECLANG_VERSION == 800 (Xcode 8.1, 8.2, 8.2.1) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020038 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020041 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3.1) (LLVM 3.9.0) +// AppleClang 8.1.0 __apple_build_version__ == 8020042 gsl_COMPILER_APPLECLANG_VERSION == 810 (Xcode 8.3.2, 8.3.3) (LLVM 3.9.0) +// AppleClang 9.0.0 __apple_build_version__ == 9000037 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.0) (LLVM 4.0.0?) +// AppleClang 9.0.0 __apple_build_version__ == 9000038 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.1) (LLVM 4.0.0?) +// AppleClang 9.0.0 __apple_build_version__ == 9000039 gsl_COMPILER_APPLECLANG_VERSION == 900 (Xcode 9.2) (LLVM 4.0.0?) +// AppleClang 9.1.0 __apple_build_version__ == 9020039 gsl_COMPILER_APPLECLANG_VERSION == 910 (Xcode 9.3, 9.3.1) (LLVM 5.0.2?) +// AppleClang 9.1.0 __apple_build_version__ == 9020039 gsl_COMPILER_APPLECLANG_VERSION == 910 (Xcode 9.4, 9.4.1) (LLVM 5.0.2?) +// AppleClang 10.0.0 __apple_build_version__ == 10001145 gsl_COMPILER_APPLECLANG_VERSION == 1000 (Xcode 10.0, 10.1) (LLVM 6.0.1?) +// AppleClang 10.0.1 __apple_build_version__ == 10010046 gsl_COMPILER_APPLECLANG_VERSION == 1001 (Xcode 10.2, 10.2.1, 10.3) (LLVM 7.0.0?) +// AppleClang 11.0.0 __apple_build_version__ == 11000033 gsl_COMPILER_APPLECLANG_VERSION == 1100 (Xcode 11.1, 11.2, 11.3) (LLVM 8.0.0?) + +#if defined( __apple_build_version__ ) +# define gsl_COMPILER_APPLECLANG_VERSION gsl_COMPILER_VERSION( __clang_major__, __clang_minor__, __clang_patchlevel__ ) +# define gsl_COMPILER_CLANG_VERSION 0 +#elif defined( __clang__ ) +# define gsl_COMPILER_APPLECLANG_VERSION 0 +# define gsl_COMPILER_CLANG_VERSION gsl_COMPILER_VERSION( __clang_major__, __clang_minor__, __clang_patchlevel__ ) +#else +# define gsl_COMPILER_APPLECLANG_VERSION 0 +# define gsl_COMPILER_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# define gsl_COMPILER_GNUC_VERSION gsl_COMPILER_VERSION( __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ ) +#else +# define gsl_COMPILER_GNUC_VERSION 0 +#endif + +// Compiler non-strict aliasing: + +#if defined(__clang__) || defined(__GNUC__) +# define gsl_may_alias __attribute__((__may_alias__)) +#else +# define gsl_may_alias +#endif + +// Presence of gsl, language and library features: + +#define gsl_IN_STD( v ) ( ((v) == 98 ? 3 : (v)) >= gsl_CPLUSPLUS_V ) + +#define gsl_DEPRECATE_TO_LEVEL( level ) ( level <= gsl_CONFIG_DEPRECATE_TO_LEVEL ) +#define gsl_FEATURE_TO_STD( feature ) ( gsl_IN_STD( gsl_FEATURE( feature##_TO_STD ) ) ) +#define gsl_FEATURE( feature ) ( gsl_FEATURE_##feature ) +#define gsl_CONFIG( feature ) ( gsl_CONFIG_##feature ) +#define gsl_HAVE( feature ) ( gsl_HAVE_##feature ) + +// Presence of wide character support: + +#ifdef __DJGPP__ +# define gsl_HAVE_WCHAR 0 +#else +# define gsl_HAVE_WCHAR 1 +#endif + +// Presence of language & library features: + +#if gsl_BETWEEN(gsl_COMPILER_GNUC_VERSION, 1, 500) || gsl_BETWEEN(gsl_COMPILER_CLANG_VERSION, 1, 360) || gsl_COMPILER_APPLECLANG_VERSION +# ifdef __EXCEPTIONS +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // __EXCEPTIONS +#elif gsl_COMPILER_GNUC_VERSION >= 500 || gsl_COMPILER_CLANG_VERSION >= 500 +# ifdef __cpp_exceptions +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // __cpp_exceptions +#elif gsl_COMPILER_MSVC_VERSION +# ifdef _CPPUNWIND +# define gsl_HAVE_EXCEPTIONS 1 +# else +# define gsl_HAVE_EXCEPTIONS 0 +# endif // _CPPUNWIND +#else +// For all other compilers, assume exceptions are always enabled. +# define gsl_HAVE_EXCEPTIONS 1 +#endif + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) && !gsl_HAVE( EXCEPTIONS ) +# error Cannot use gsl_CONFIG_CONTRACT_VIOLATION_THROWS if exceptions are disabled. +#endif // defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) && !gsl_HAVE( EXCEPTIONS ) + +#ifdef _HAS_CPP0X +# define gsl_HAS_CPP0X _HAS_CPP0X +#else +# define gsl_HAS_CPP0X 0 +#endif + +#define gsl_CPP11_100 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1600) +#define gsl_CPP11_110 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1700) +#define gsl_CPP11_120 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP11_140 (gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP14_000 (gsl_CPP14_OR_GREATER) +#define gsl_CPP14_120 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1800) +#define gsl_CPP14_140 (gsl_CPP14_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP17_000 (gsl_CPP17_OR_GREATER) +#define gsl_CPP17_140 (gsl_CPP17_OR_GREATER || gsl_COMPILER_MSVC_VER >= 1900) + +#define gsl_CPP11_140_CPP0X_90 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1500 && gsl_HAS_CPP0X)) +#define gsl_CPP11_140_CPP0X_100 (gsl_CPP11_140 || (gsl_COMPILER_MSVC_VER >= 1600 && gsl_HAS_CPP0X)) + +// Presence of C++11 language features: + +#define gsl_HAVE_AUTO gsl_CPP11_100 +#define gsl_HAVE_NULLPTR gsl_CPP11_100 +#define gsl_HAVE_RVALUE_REFERENCE gsl_CPP11_100 +#define gsl_HAVE_FUNCTION_REF_QUALIFIER ( gsl_CPP14_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 481 ) ) + +#define gsl_HAVE_ENUM_CLASS gsl_CPP11_110 + +#define gsl_HAVE_ALIAS_TEMPLATE gsl_CPP11_120 +#define gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG gsl_CPP11_120 +#define gsl_HAVE_EXPLICIT gsl_CPP11_120 +#define gsl_HAVE_INITIALIZER_LIST gsl_CPP11_120 +#define gsl_HAVE_VARIADIC_TEMPLATE gsl_CPP11_120 +#define gsl_HAVE_IS_DELETE gsl_CPP11_120 + +#define gsl_HAVE_CONSTEXPR_11 gsl_CPP11_140 +#define gsl_HAVE_IS_DEFAULT gsl_CPP11_140 +#define gsl_HAVE_NOEXCEPT gsl_CPP11_140 +#define gsl_HAVE_NORETURN ( gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 480 ) ) + +#define gsl_HAVE_EXPRESSION_SFINAE gsl_CPP11_140 + +#if gsl_CPP11_OR_GREATER +// see above +#endif + +// Presence of C++14 language features: + +#define gsl_HAVE_CONSTEXPR_14 ( gsl_CPP14_000 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 600 ) ) +#define gsl_HAVE_DECLTYPE_AUTO gsl_CPP14_140 +#define gsl_HAVE_DEPRECATED ( gsl_CPP14_140 && ! gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 142 ) ) + +// Presence of C++17 language features: +// MSVC: template parameter deduction guides since Visual Studio 2017 v15.7 + +#define gsl_HAVE_ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE gsl_CPP17_000 +#define gsl_HAVE_DEDUCTION_GUIDES ( gsl_CPP17_000 && ! gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION_FULL, 1, 1414 ) ) +#define gsl_HAVE_NODISCARD gsl_CPP17_000 +#define gsl_HAVE_CONSTEXPR_17 gsl_CPP17_OR_GREATER + +// Presence of C++20 language features: + +#define gsl_HAVE_CONSTEXPR_20 gsl_CPP20_OR_GREATER + +// Presence of C++ library features: + +#define gsl_HAVE_ADDRESSOF gsl_CPP17_000 +#define gsl_HAVE_ARRAY gsl_CPP11_110 +#define gsl_HAVE_TYPE_TRAITS gsl_CPP11_110 +#define gsl_HAVE_TR1_TYPE_TRAITS gsl_CPP11_110 + +#define gsl_HAVE_CONTAINER_DATA_METHOD gsl_CPP11_140_CPP0X_90 +#define gsl_HAVE_STD_DATA gsl_CPP17_000 +#ifdef __cpp_lib_ssize +# define gsl_HAVE_STD_SSIZE 1 +#else +# define gsl_HAVE_STD_SSIZE ( gsl_COMPILER_GNUC_VERSION >= 1000 && __cplusplus > 201703L ) +#endif + +#define gsl_HAVE_SIZED_TYPES gsl_CPP11_140 + +#define gsl_HAVE_MAKE_SHARED gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_SHARED_PTR gsl_CPP11_140_CPP0X_100 +#define gsl_HAVE_UNIQUE_PTR gsl_CPP11_140_CPP0X_100 + +#define gsl_HAVE_MAKE_UNIQUE gsl_CPP14_120 + +#define gsl_HAVE_UNCAUGHT_EXCEPTIONS gsl_CPP17_140 + +#define gsl_HAVE_ADD_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_INTEGRAL_CONSTANT gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_CONST gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_REFERENCE gsl_HAVE_TYPE_TRAITS +#define gsl_HAVE_REMOVE_CVREF gsl_CPP20_OR_GREATER + +#define gsl_HAVE_TR1_ADD_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_INTEGRAL_CONSTANT gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_CONST gsl_HAVE_TR1_TYPE_TRAITS +#define gsl_HAVE_TR1_REMOVE_REFERENCE gsl_HAVE_TR1_TYPE_TRAITS + +// C++ feature usage: + +#if gsl_HAVE( ADDRESSOF ) +# define gsl_ADDRESSOF(x) std::addressof(x) +#else +# define gsl_ADDRESSOF(x) (&x) +#endif + +#if gsl_HAVE( CONSTEXPR_11 ) +# define gsl_constexpr constexpr +#else +# define gsl_constexpr /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_14 ) +# define gsl_constexpr14 constexpr +#else +# define gsl_constexpr14 /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_17 ) +# define gsl_constexpr17 constexpr +#else +# define gsl_constexpr17 /*constexpr*/ +#endif + +#if gsl_HAVE( CONSTEXPR_20 ) +# define gsl_constexpr20 constexpr +#else +# define gsl_constexpr20 /*constexpr*/ +#endif + +#if gsl_HAVE( EXPLICIT ) +# define gsl_explicit explicit +#else +# define gsl_explicit /*explicit*/ +#endif + +#if gsl_FEATURE( IMPLICIT_MACRO ) +# define implicit /*implicit*/ +#endif + +#if gsl_HAVE( IS_DELETE ) +# define gsl_is_delete = delete +#else +# define gsl_is_delete +#endif + +#if gsl_HAVE( IS_DELETE ) +# define gsl_is_delete_access public +#else +# define gsl_is_delete_access private +#endif + +#if !gsl_HAVE( NOEXCEPT ) || defined( gsl_TESTING_ ) +# define gsl_noexcept /*noexcept*/ +#else +# define gsl_noexcept noexcept +#endif + +#if gsl_HAVE( NULLPTR ) +# define gsl_nullptr nullptr +#else +# define gsl_nullptr NULL +#endif + +#if gsl_HAVE( NODISCARD ) +# define gsl_NODISCARD [[nodiscard]] +#else +# define gsl_NODISCARD +#endif + +#if gsl_HAVE( NORETURN ) +# define gsl_NORETURN [[noreturn]] +#elif defined(_MSC_VER) +# define gsl_NORETURN __declspec(noreturn) +#else +# define gsl_NORETURN +#endif + +#if gsl_HAVE( DEPRECATED ) && !defined( gsl_TESTING_ ) +# define gsl_DEPRECATED [[deprecated]] +# define gsl_DEPRECATED_MSG( msg ) [[deprecated( msg )]] +#else +# define gsl_DEPRECATED +# define gsl_DEPRECATED_MSG( msg ) +#endif + +#if gsl_HAVE( TYPE_TRAITS ) + +#define gsl_DEFINE_ENUM_BITMASK_OPERATORS_( ENUM ) \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator~( ENUM val ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( ~U( val ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator|( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) | U( rhs ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator&( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) & U( rhs ) ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr ENUM \ + operator^( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return ENUM( U( lhs ) ^ U( rhs ) ); \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator|=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs | rhs; \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator&=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs & rhs; \ + } \ + gsl_api inline gsl_constexpr14 ENUM & \ + operator^=( ENUM & lhs, ENUM rhs ) gsl_noexcept \ + { \ + return lhs = lhs ^ rhs; \ + } + +#define gsl_DEFINE_ENUM_RELATIONAL_OPERATORS_( ENUM ) \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator<( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) < U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator>( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) > U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator<=( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) <= U( rhs ); \ + } \ + gsl_NODISCARD gsl_api inline gsl_constexpr bool \ + operator>=( ENUM lhs, ENUM rhs ) gsl_noexcept \ + { \ + typedef typename ::gsl::std11::underlying_type::type U; \ + return U( lhs ) >= U( rhs ); \ + } + + // + // Defines bitmask operators `|`, `&`, `^`, `~`, `|=`, `&=`, and `^=` for the given enum type. + //ᅟ + //ᅟ enum class Vegetables { + //ᅟ tomato = 0b001, + //ᅟ onion = 0b010, + //ᅟ eggplant = 0b100 + //ᅟ }; + //ᅟ gsl_DEFINE_ENUM_BITMASK_OPERATORS( Vegetables ) + // +#define gsl_DEFINE_ENUM_BITMASK_OPERATORS( ENUM ) gsl_DEFINE_ENUM_BITMASK_OPERATORS_( ENUM ) + + // + // Defines relational operators `<`, `>`, `<=`, `>=` for the given enum type. + //ᅟ + //ᅟ enum class OperatorPrecedence { + //ᅟ additive = 0, + //ᅟ multiplicative = 1, + //ᅟ power = 2 + //ᅟ }; + //ᅟ gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( OperatorPrecedence ) + // +#define gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( ENUM ) gsl_DEFINE_ENUM_RELATIONAL_OPERATORS_( ENUM ) + +#endif // gsl_HAVE( TYPE_TRAITS ) + +#define gsl_DIMENSION_OF( a ) ( sizeof(a) / sizeof(0[a]) ) + + +// Method enabling (C++98, VC120 (VS2013) cannot use __VA_ARGS__) + +#if gsl_HAVE( EXPRESSION_SFINAE ) +# define gsl_DECLTYPE_(T, EXPR) decltype( EXPR ) +#else +# define gsl_DECLTYPE_(T, EXPR) T +#endif + +// NOTE: When using SFINAE in gsl-lite, please note that overloads of function templates must always use SFINAE with non-type default arguments +// as explained in https://en.cppreference.com/w/cpp/types/enable_if#Notes. `gsl_ENABLE_IF_()` implements graceful fallback to default +// type arguments (for compilers that don't support non-type default arguments); please verify that this is appropriate in the given +// situation, and add additional checks if necessary. +// +// Also, please note that `gsl_ENABLE_IF_()` doesn't enforce the constraint at all if no compiler/library support is available (i.e. pre-C++11). + +#if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) +# if !gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) // VS 2013 seems to have trouble with SFINAE for default non-type arguments +# define gsl_ENABLE_IF_(VA) , typename std::enable_if< ( VA ), int >::type = 0 +# else +# define gsl_ENABLE_IF_(VA) , typename = typename std::enable_if< ( VA ), ::gsl::detail::enabler >::type +# endif +#else +# define gsl_ENABLE_IF_(VA) +#endif + + +// Other features: + +#define gsl_HAVE_CONSTRAINED_SPAN_CONTAINER_CTOR \ + ( gsl_HAVE_DEFAULT_FUNCTION_TEMPLATE_ARG && gsl_HAVE_CONTAINER_DATA_METHOD ) + +// Note: !defined(__NVCC__) doesn't work with nvcc here: +#define gsl_HAVE_UNCONSTRAINED_SPAN_CONTAINER_CTOR \ + ( gsl_CONFIG_ALLOWS_UNCONSTRAINED_SPAN_CONTAINER_CTOR && (__NVCC__== 0) ) + +// GSL API (e.g. for CUDA platform): + +// Guidelines for using `gsl_api`: +// +// NVCC imposes the restriction that a function annotated `__host__ __device__` cannot call host-only or device-only functions. +// This makes `gsl_api` inappropriate for generic functions that call unknown code, e.g. the template constructors of `span<>` +// or functions like `finally()` which accept an arbitrary function object. +// It is often preferable to annotate functions only with `gsl_constexpr` or `gsl_constexpr14`. The "extended constexpr" mode +// of NVCC (currently an experimental feature) will implicitly consider constexpr functions `__host__ __device__` functions +// but tolerates calls to host-only or device-only functions. + +#ifndef gsl_api +# ifdef __CUDACC__ +# define gsl_api __host__ __device__ +# else +# define gsl_api /*gsl_api*/ +# endif +#endif + +// Additional includes: + +#if gsl_HAVE( ARRAY ) +# include +#endif + +#if !gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) || !gsl_HAVE( AUTO ) +# include +#endif + +#if gsl_HAVE( INITIALIZER_LIST ) +# include +#endif + +#if gsl_HAVE( TYPE_TRAITS ) +# include // for enable_if<>, + // add_const<>, add_pointer<>, common_type<>, make_signed<>, remove_cv<>, remove_const<>, remove_volatile<>, remove_reference<>, remove_cvref<>, remove_pointer<>, underlying_type<>, + // is_assignable<>, is_constructible<>, is_const<>, is_convertible<>, is_integral<>, is_pointer<>, is_signed<>, + // integral_constant<>, declval() +#elif gsl_HAVE( TR1_TYPE_TRAITS ) +# include // for add_const<>, remove_cv<>, remove_const<>, remove_volatile<>, remove_reference<>, integral_constant<> +#endif + +// MSVC warning suppression macros: + +#if gsl_COMPILER_MSVC_VERSION >= 140 && !defined(__NVCC__) +# define gsl_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] +# define gsl_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) ) +# define gsl_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes)) +# define gsl_RESTORE_MSVC_WARNINGS() __pragma(warning(pop )) +#else +// TODO: define for Clang +# define gsl_SUPPRESS_MSGSL_WARNING(expr) +# define gsl_SUPPRESS_MSVC_WARNING(code, descr) +# define gsl_DISABLE_MSVC_WARNINGS(codes) +# define gsl_RESTORE_MSVC_WARNINGS() +#endif + +// Suppress the following MSVC GSL warnings: +// - C26432: gsl::c.21 : if you define or delete any default operation in the type '...', define or delete them all +// - C26410: gsl::r.32 : the parameter 'ptr' is a reference to const unique pointer, use const T* or const T& instead +// - C26415: gsl::r.30 : smart pointer parameter 'ptr' is used only to access contained pointer. Use T* or T& instead +// - C26418: gsl::r.36 : shared pointer parameter 'ptr' is not copied or moved. Use T* or T& instead +// - C26472: gsl::t.1 : don't use a static_cast for arithmetic conversions; +// use brace initialization, gsl::narrow_cast or gsl::narrow +// - C26439: gsl::f.6 : special function 'function' can be declared 'noexcept' +// - C26440: gsl::f.6 : function 'function' can be declared 'noexcept' +// - C26455: gsl::f.6 : default constructor may not throw. Declare it 'noexcept' +// - C26473: gsl::t.1 : don't cast between pointer types where the source type and the target type are the same +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead +// - C26482: gsl::b.2 : only index into arrays using constant expressions +// - C26446: gdl::b.4 : prefer to use gsl::at() instead of unchecked subscript operator +// - C26490: gsl::t.1 : don't use reinterpret_cast +// - C26487: gsl::l.4 : don't return a pointer '('s result)' that may be invalid + +gsl_DISABLE_MSVC_WARNINGS( 26432 26410 26415 26418 26472 26439 26440 26455 26473 26481 26482 26446 26490 26487 ) + +namespace gsl { + +// forward declare span<>: + +template< class T > +class span; + +// C++11 emulation: + +namespace std11 { + +#if gsl_HAVE( ADD_CONST ) + +using std::add_const; + +#elif gsl_HAVE( TR1_ADD_CONST ) + +using std::tr1::add_const; + +#else + +template< class T > struct add_const { typedef const T type; }; + +#endif // gsl_HAVE( ADD_CONST ) + +#if gsl_HAVE( REMOVE_CONST ) + +using std::remove_cv; +using std::remove_const; +using std::remove_volatile; + +#elif gsl_HAVE( TR1_REMOVE_CONST ) + +using std::tr1::remove_cv; +using std::tr1::remove_const; +using std::tr1::remove_volatile; + +#else + +template< class T > struct remove_const { typedef T type; }; +template< class T > struct remove_const { typedef T type; }; + +template< class T > struct remove_volatile { typedef T type; }; +template< class T > struct remove_volatile { typedef T type; }; + +template< class T > +struct remove_cv +{ + typedef typename remove_volatile::type>::type type; +}; + +#endif // gsl_HAVE( REMOVE_CONST ) + +#if gsl_HAVE( REMOVE_REFERENCE ) + +using std::remove_reference; + +#elif gsl_HAVE( TR1_REMOVE_REFERENCE ) + +using std::tr1::remove_reference; + +#else + +template< class T > struct remove_reference { typedef T type; }; +template< class T > struct remove_reference { typedef T type; }; +# if gsl_HAVE( RVALUE_REFERENCE ) +template< class T > struct remove_reference { typedef T type; }; +# endif + +#endif // gsl_HAVE( REMOVE_REFERENCE ) + + +#if gsl_HAVE( INTEGRAL_CONSTANT ) + +using std::integral_constant; +using std::true_type; +using std::false_type; + +#elif gsl_HAVE( TR1_INTEGRAL_CONSTANT ) + +using std::tr1::integral_constant; +using std::tr1::true_type; +using std::tr1::false_type; + +#else + +template< class T, T v > struct integral_constant { enum { value = v }; }; +typedef integral_constant< bool, true > true_type; +typedef integral_constant< bool, false > false_type; + +#endif + +#if gsl_HAVE( TYPE_TRAITS ) + +using std::underlying_type; + +#elif gsl_HAVE( TR1_TYPE_TRAITS ) + +using std::tr1::underlying_type; + +#else + +// We could try to define `underlying_type<>` for pre-C++11 here, but let's not until someone actually needs it. + +#endif + +} // namespace std11 + +// C++14 emulation: + +namespace std14 { + +#if gsl_HAVE( UNIQUE_PTR ) +# if gsl_HAVE( MAKE_UNIQUE ) + +using std::make_unique; + +# elif gsl_HAVE( VARIADIC_TEMPLATE ) + +template< class T, class... Args > +std::unique_ptr make_unique( Args &&... args ) +{ + return std::unique_ptr( new T( std::forward( args )... ) ); +} + +# endif // gsl_HAVE( MAKE_UNIQUE ), gsl_HAVE( VARIADIC_TEMPLATE ) +#endif // gsl_HAVE( UNIQUE_PTR ) + +} // namespace std14 + +namespace detail { + +#if gsl_HAVE( VARIADIC_TEMPLATE ) + +template < bool V0, class T0, class... Ts > struct conjunction_ { using type = T0; }; +template < class T0, class T1, class... Ts > struct conjunction_ : conjunction_ { }; +template < bool V0, class T0, class... Ts > struct disjunction_ { using type = T0; }; +template < class T0, class T1, class... Ts > struct disjunction_ : disjunction_ { }; + +#endif + +} // namespace detail + +// C++17 emulation: + +namespace std17 { + +template< bool v > struct bool_constant : std11::integral_constant{}; + +#if gsl_CPP11_120 + +template < class... Ts > struct conjunction; +template < > struct conjunction< > : std11::true_type { }; +template < class T0, class... Ts > struct conjunction : detail::conjunction_::type { }; +template < class... Ts > struct disjunction; +template < > struct disjunction< > : std11::false_type { }; +template < class T0, class... Ts > struct disjunction : detail::disjunction_::type { }; +template < class T > struct negation : std11::integral_constant { }; + +# if gsl_CPP14_OR_GREATER + +template < class... Ts > constexpr bool conjunction_v = conjunction::value; +template < class... Ts > constexpr bool disjunction_v = disjunction::value; +template < class T > constexpr bool negation_v = negation::value; + +# endif // gsl_CPP14_OR_GREATER + +template< class... Ts > +struct make_void { typedef void type; }; + +template< class... Ts > +using void_t = typename make_void< Ts... >::type; + +#endif // gsl_CPP11_120 + +#if gsl_HAVE( STD_DATA ) + +using std::data; +using std::size; + +#elif gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + +template< class T, size_t N > +gsl_api inline gsl_constexpr auto size( T const(&)[N] ) gsl_noexcept -> size_t +{ + return N; +} + +template< class C > +inline gsl_constexpr auto size( C const & cont ) -> decltype( cont.size() ) +{ + return cont.size(); +} + +template< class T, size_t N > +gsl_api inline gsl_constexpr auto data( T(&arr)[N] ) gsl_noexcept -> T* +{ + return &arr[0]; +} + +template< class C > +inline gsl_constexpr auto data( C & cont ) -> decltype( cont.data() ) +{ + return cont.data(); +} + +template< class C > +inline gsl_constexpr auto data( C const & cont ) -> decltype( cont.data() ) +{ + return cont.data(); +} + +template< class E > +inline gsl_constexpr auto data( std::initializer_list il ) gsl_noexcept -> E const * +{ + return il.begin(); +} + +#endif // span_HAVE( DATA ) + +} // namespace std17 + +// C++20 emulation: + +namespace std20 { + +#if gsl_CPP11_100 + +struct identity +{ + template < class T > + gsl_constexpr T && operator ()( T && arg ) const gsl_noexcept + { + return std::forward( arg ); + } +}; + +#endif // gsl_CPP11_100 + +template< class T > +struct type_identity +{ + typedef T type; +}; +#if gsl_HAVE( ALIAS_TEMPLATE ) +template< class T > +using type_identity_t = typename type_identity::type; +#endif // gsl_HAVE( ALIAS_TEMPLATE ) + +#if gsl_HAVE( STD_SSIZE ) + +using std::ssize; + +#elif gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + +template < class C > +gsl_constexpr auto ssize( C const & c ) + -> typename std::common_type::type>::type +{ + using R = typename std::common_type::type>::type; + return static_cast( c.size() ); +} + +template +gsl_constexpr auto ssize( T const(&)[N] ) gsl_noexcept -> std::ptrdiff_t +{ + return std::ptrdiff_t( N ); +} + +#endif // gsl_HAVE( STD_SSIZE ) + +#if gsl_HAVE( REMOVE_CVREF ) + +using std::remove_cvref; + +#else + +template< class T > struct remove_cvref { typedef typename std11::remove_cv< typename std11::remove_reference< T >::type >::type type; }; + +#endif // gsl_HAVE( REMOVE_CVREF ) + +} // namespace std20 + +namespace detail { + +/// for nsel_REQUIRES_T + +/*enum*/ class enabler{}; + +#if gsl_HAVE( TYPE_TRAITS ) + +template< class Q > +struct is_span_oracle : std::false_type{}; + +template< class T> +struct is_span_oracle< span > : std::true_type{}; + +template< class Q > +struct is_span : is_span_oracle< typename std::remove_cv::type >{}; + +template< class Q > +struct is_std_array_oracle : std::false_type{}; + +#if gsl_HAVE( ARRAY ) + +template< class T, std::size_t Extent > +struct is_std_array_oracle< std::array > : std::true_type{}; + +#endif + +template< class Q > +struct is_std_array : is_std_array_oracle< typename std::remove_cv::type >{}; + +template< class Q > +struct is_array : std::false_type{}; + +template< class T > +struct is_array : std::true_type{}; + +template< class T, std::size_t N > +struct is_array : std::true_type{}; + +# if gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) + +template< class, class = void > +struct has_size_and_data : std::false_type{}; + +template< class C > +struct has_size_and_data +< + C, std17::void_t< + decltype( std17::size(std::declval()) ), + decltype( std17::data(std::declval()) ) > +> : std::true_type{}; + +template< class, class, class = void > +struct is_compatible_element : std::false_type {}; + +template< class C, class E > +struct is_compatible_element +< + C, E, std17::void_t< + decltype( std17::data(std::declval()) ), + typename std::remove_pointer() ) )>::type(*)[] > +> : std::is_convertible< typename std::remove_pointer() ) )>::type(*)[], E(*)[] >{}; + +template< class C > +struct is_container : std17::bool_constant +< + ! is_span< C >::value + && ! is_array< C >::value + && ! is_std_array< C >::value + && has_size_and_data< C >::value +>{}; + +template< class C, class E > +struct is_compatible_container : std17::bool_constant +< + is_container::value + && is_compatible_element::value +>{}; + +# else // ^^^ gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) ^^^ / vvv ! gsl_CPP11_140 || gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) vvv + +template< + class C, class E + , typename = typename std::enable_if< + ! is_span< C >::value + && ! is_array< C >::value + && ! is_std_array< C >::value + && ( std::is_convertible< typename std::remove_pointer() ) )>::type(*)[], E(*)[] >::value) + // && has_size_and_data< C >::value + , enabler>::type + , class = decltype( std17::size(std::declval()) ) + , class = decltype( std17::data(std::declval()) ) +> +# if gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) +// VS2013 has insufficient support for expression SFINAE; we cannot make `is_compatible_container<>` a proper type trait here +struct is_compatible_container : std::true_type { }; +# else +struct is_compatible_container_r { is_compatible_container_r(int); }; +template< class C, class E > +std::true_type is_compatible_container_f( is_compatible_container_r ); +template< class C, class E > +std::false_type is_compatible_container_f( ... ); + +template< class C, class E > +struct is_compatible_container : decltype( is_compatible_container_f< C, E >( 0 ) ) { }; +# endif // gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) + +# endif // gsl_CPP11_140 && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 1, 500 ) + +#endif // gsl_HAVE( TYPE_TRAITS ) + +} // namespace detail + +// +// GSL.util: utilities +// + +// Integer type for indices (e.g. in a loop). +typedef gsl_CONFIG_INDEX_TYPE index; + +// +// GSL.owner: ownership pointers +// +#if gsl_HAVE( SHARED_PTR ) + using std::unique_ptr; + using std::shared_ptr; + using std::make_shared; +# if gsl_HAVE( MAKE_UNIQUE ) || gsl_HAVE( VARIADIC_TEMPLATE ) + using std14::make_unique; +# endif +#endif + +#if gsl_HAVE( ALIAS_TEMPLATE ) + template< class T +#if gsl_HAVE( TYPE_TRAITS ) + , typename = typename std::enable_if< std::is_pointer::value >::type +#endif + > + using owner = T; +#elif gsl_CONFIG_DEFAULTS_VERSION == 0 + // TODO vNext: remove + template< class T > struct owner { typedef T type; }; +#endif + +#define gsl_HAVE_OWNER_TEMPLATE gsl_HAVE_ALIAS_TEMPLATE + +// TODO vNext: remove +#if gsl_FEATURE( OWNER_MACRO ) +# if gsl_HAVE( OWNER_TEMPLATE ) +# define Owner(t) ::gsl::owner +# else +# define Owner(t) ::gsl::owner::type +# endif +#endif + +// +// GSL.assert: assertions +// + +#if gsl_HAVE( TYPE_TRAITS ) +# define gsl_ELIDE_CONTRACT_( x ) static_assert(::std::is_constructible::value, "argument of contract check must be convertible to bool") +#else +# define gsl_ELIDE_CONTRACT_( x ) +#endif + +#if defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) +# define gsl_ASSUME( x ) gsl_ELIDE_CONTRACT_( x ) /* there is no assume intrinsic in CUDA device code */ +#elif gsl_COMPILER_MSVC_VERSION +# define gsl_ASSUME( x ) __assume( x ) +#elif gsl_COMPILER_GNUC_VERSION +# define gsl_ASSUME( x ) (( x ) ? static_cast(0) : __builtin_unreachable()) +#elif defined(__has_builtin) +# if __has_builtin(__builtin_unreachable) +# define gsl_ASSUME( x ) (( x ) ? static_cast(0) : __builtin_unreachable()) +# endif +#else +# define gsl_ASSUME( x ) gsl_ELIDE_CONTRACT_( x ) /* unknown compiler; cannot rely on assume intrinsic */ +#endif + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::fail_fast_assert_handler( #x, "GSL: " str, __FILE__, __LINE__ ) ) +#elif defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) +# define gsl_CONTRACT_CHECK_( str, x ) assert( ( x ) && str ) +#elif defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::detail::fail_fast_throw( "GSL: " str " at " __FILE__ ":" gsl_STRINGIFY(__LINE__) ) ) +#else // defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) [default] +# define gsl_CONTRACT_CHECK_( str, x ) ( ( x ) ? static_cast(0) : ::gsl::detail::fail_fast_terminate() ) +#endif + +#if defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) || defined( gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF ) +# if defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) +# define gsl_Expects( x ) gsl_ASSUME( x ) +# else // defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) [default] +# define gsl_Expects( x ) gsl_ELIDE_CONTRACT_( x ) +# endif +#else +# define gsl_Expects( x ) gsl_CONTRACT_CHECK_( "Precondition failure", x ) +#endif +#define Expects( x ) gsl_Expects( x ) + +#if !defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) || defined( gsl_CONFIG_CONTRACT_CHECKING_EXPECTS_OFF ) +# define gsl_ExpectsAudit( x ) gsl_ELIDE_CONTRACT_( x ) +#else +# define gsl_ExpectsAudit( x ) gsl_CONTRACT_CHECK_( "Precondition failure (audit)", x ) +#endif + +#if defined( gsl_CONFIG_CONTRACT_CHECKING_OFF ) || defined( gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF ) +# if defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ASSUME ) +# define gsl_Ensures( x ) gsl_ASSUME( x ) +# else // defined( gsl_CONFIG_UNENFORCED_CONTRACTS_ELIDE ) [default] +# define gsl_Ensures( x ) gsl_ELIDE_CONTRACT_( x ) +# endif +#else +# define gsl_Ensures( x ) gsl_CONTRACT_CHECK_( "Postcondition failure", x ) +#endif +#define Ensures( x ) gsl_Ensures( x ) + +#if !defined( gsl_CONFIG_CONTRACT_CHECKING_AUDIT ) || defined( gsl_CONFIG_CONTRACT_CHECKING_ENSURES_OFF ) +# define gsl_EnsuresAudit( x ) gsl_ELIDE_CONTRACT_( x ) +#else +# define gsl_EnsuresAudit( x ) gsl_CONTRACT_CHECK_( "Postcondition failure (audit)", x ) +#endif + +#define gsl_STRINGIFY( x ) gsl_STRINGIFY_( x ) +#define gsl_STRINGIFY_( x ) #x + +struct fail_fast : public std::logic_error +{ + explicit fail_fast( char const * message ) + : std::logic_error( message ) {} +}; + +namespace detail { + + +#if gsl_HAVE( EXCEPTIONS ) +gsl_NORETURN inline void fail_fast_throw( char const * message ) +{ + throw fail_fast( message ); +} +#endif // gsl_HAVE( EXCEPTIONS ) +gsl_NORETURN inline void fail_fast_terminate() gsl_noexcept +{ + std::terminate(); +} + +} // namespace detail + +// Should be defined by user +gsl_api void fail_fast_assert_handler( char const * const expression, char const * const message, char const * const file, int line ); + +#if defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + +# if gsl_HAVE( EXCEPTIONS ) +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_constexpr14 inline +void fail_fast_assert( bool cond, char const * const message ) +{ + if ( !cond ) + throw fail_fast( message ); +} +# endif // gsl_HAVE( EXCEPTIONS ) + +#elif defined( gsl_CONFIG_CONTRACT_VIOLATION_CALLS_HANDLER ) + +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_api gsl_constexpr14 inline +void fail_fast_assert( bool cond, char const * const expression, char const * const message, char const * const file, int line ) +{ + if ( !cond ) + ::gsl::fail_fast_assert_handler( expression, message, file, line ); +} + +#else // defined( gsl_CONFIG_CONTRACT_VIOLATION_TERMINATES ) [default] + +gsl_DEPRECATED_MSG("don't call gsl::fail_fast_assert() directly; use contract checking macros instead") +gsl_constexpr14 inline +void fail_fast_assert( bool cond ) gsl_noexcept +{ + if ( !cond ) + std::terminate(); +} + +#endif + + +// +// GSL.util: utilities +// + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +// Add uncaught_exceptions for pre-2017 MSVC, GCC and Clang +// Return unsigned char to save stack space, uncaught_exceptions can only increase by 1 in a scope + +namespace detail { + +gsl_api inline unsigned char to_uchar( unsigned x ) gsl_noexcept +{ + return static_cast( x ); +} + +} // namespace detail + +namespace std11 { + +#if gsl_HAVE( UNCAUGHT_EXCEPTIONS ) + +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( std::uncaught_exceptions() ); +} + +#elif gsl_COMPILER_MSVC_VERSION + +extern "C" char * __cdecl _getptd(); +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( *reinterpret_cast(_getptd() + (sizeof(void*) == 8 ? 0x100 : 0x90) ) ); +} + +#elif gsl_COMPILER_CLANG_VERSION || gsl_COMPILER_GNUC_VERSION || gsl_COMPILER_APPLECLANG_VERSION + +extern "C" char * __cxa_get_globals(); +inline unsigned char uncaught_exceptions() gsl_noexcept +{ + return detail::to_uchar( *reinterpret_cast(__cxa_get_globals() + sizeof(void*) ) ); +} +#endif +} // namespace std11 +#endif + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + +template< class F > +class final_action +{ +public: + explicit final_action( F action ) gsl_noexcept + : action_( std::move( action ) ) + , invoke_( true ) + {} + + final_action( final_action && other ) gsl_noexcept + : action_( std::move( other.action_ ) ) + , invoke_( other.invoke_ ) + { + other.invoke_ = false; + } + + gsl_SUPPRESS_MSGSL_WARNING(f.6) + virtual ~final_action() gsl_noexcept + { + if ( invoke_ ) + action_(); + } + +gsl_is_delete_access: + final_action( final_action const & ) gsl_is_delete; + final_action & operator=( final_action const & ) gsl_is_delete; + final_action & operator=( final_action && ) gsl_is_delete; + +protected: + void dismiss() gsl_noexcept + { + invoke_ = false; + } + +private: + F action_; + bool invoke_; +}; + +template< class F > +inline final_action finally( F const & action ) gsl_noexcept +{ + return final_action( action ); +} + +template< class F > +inline final_action finally( F && action ) gsl_noexcept +{ + return final_action( std::forward( action ) ); +} + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +template< class F > +class final_action_return : public final_action +{ +public: + explicit final_action_return( F && action ) gsl_noexcept + : final_action( std::move( action ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + final_action_return( final_action_return && other ) gsl_noexcept + : final_action( std::move( other ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_return() override + { + if ( std11::uncaught_exceptions() != exception_count ) + this->dismiss(); + } + +gsl_is_delete_access: + final_action_return( final_action_return const & ) gsl_is_delete; + final_action_return & operator=( final_action_return const & ) gsl_is_delete; + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_return on_return( F const & action ) gsl_noexcept +{ + return final_action_return( action ); +} + +template< class F > +inline final_action_return on_return( F && action ) gsl_noexcept +{ + return final_action_return( std::forward( action ) ); +} + +template< class F > +class final_action_error : public final_action +{ +public: + explicit final_action_error( F && action ) gsl_noexcept + : final_action( std::move( action ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + final_action_error( final_action_error && other ) gsl_noexcept + : final_action( std::move( other ) ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_error() override + { + if ( std11::uncaught_exceptions() == exception_count ) + this->dismiss(); + } + +gsl_is_delete_access: + final_action_error( final_action_error const & ) gsl_is_delete; + final_action_error & operator=( final_action_error const & ) gsl_is_delete; + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_error on_error( F const & action ) gsl_noexcept +{ + return final_action_error( action ); +} + +template< class F > +inline final_action_error on_error( F && action ) gsl_noexcept +{ + return final_action_error( std::forward( action ) ); +} + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#else // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 110 + +class final_action +{ +public: + typedef void (*Action)(); + + final_action( Action action ) + : action_( action ) + , invoke_( true ) + {} + + final_action( final_action const & other ) + : action_( other.action_ ) + , invoke_( other.invoke_ ) + { + other.invoke_ = false; + } + + virtual ~final_action() + { + if ( invoke_ ) + action_(); + } + +protected: + void dismiss() + { + invoke_ = false; + } + +private: + final_action & operator=( final_action const & ); + +private: + Action action_; + mutable bool invoke_; +}; + +template< class F > +inline final_action finally( F const & f ) +{ + return final_action(( f )); +} + +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +class final_action_return : public final_action +{ +public: + explicit final_action_return( Action action ) + : final_action( action ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_return() + { + if ( std11::uncaught_exceptions() != exception_count ) + this->dismiss(); + } + +private: + final_action_return & operator=( final_action_return const & ); + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_return on_return( F const & action ) +{ + return final_action_return( action ); +} + +class final_action_error : public final_action +{ +public: + explicit final_action_error( Action action ) + : final_action( action ) + , exception_count( std11::uncaught_exceptions() ) + {} + + ~final_action_error() + { + if ( std11::uncaught_exceptions() == exception_count ) + this->dismiss(); + } + +private: + final_action_error & operator=( final_action_error const & ); + +private: + unsigned char exception_count; +}; + +template< class F > +inline final_action_error on_error( F const & action ) +{ + return final_action_error( action ); +} + +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION == 110 + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +template< class T, class U > +gsl_api inline gsl_constexpr T narrow_cast( U && u ) gsl_noexcept +{ + return static_cast( std::forward( u ) ); +} + +#else + +template< class T, class U > +gsl_api inline T narrow_cast( U u ) gsl_noexcept +{ + return static_cast( u ); +} + +#endif // gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +struct narrowing_error : public std::exception {}; + +#if gsl_HAVE( TYPE_TRAITS ) + +namespace detail { + + template< class T, class U > + struct is_same_signedness : public std::integral_constant::value == std::is_signed::value> + {}; + +# if defined( __NVCC__ ) + // We do this to circumvent NVCC warnings about pointless unsigned comparisons with 0. + template< class T > + gsl_constexpr gsl_api bool is_negative( T value, std::true_type /*isSigned*/ ) gsl_noexcept + { + return value < T(); + } + template< class T > + gsl_constexpr gsl_api bool is_negative( T /*value*/, std::false_type /*isUnsigned*/ ) gsl_noexcept + { + return false; + } + template< class T, class U > + gsl_constexpr gsl_api bool have_same_sign( T t, U u, std::true_type /*isSameSignedness*/ ) gsl_noexcept + { + return true; + } + template< class T, class U > + gsl_constexpr gsl_api bool have_same_sign( T t, U u, std::false_type /*isSameSignedness*/ ) gsl_noexcept + { + return detail::is_negative( t, std::is_signed() ) == detail::is_negative( u, std::is_signed() ); + } +# endif // defined( __NVCC__ ) + +} // namespace detail + +#endif + +#if gsl_HAVE( EXCEPTIONS ) || !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION +template< class T, class U > +# if !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION && !defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +gsl_api +# endif // !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION && !defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) +inline T narrow( U u ) +{ + T t = static_cast( u ); + + if ( static_cast( t ) != u ) + { +# if gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION || defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + throw narrowing_error(); +# else + std::terminate(); +# endif + } + +# if gsl_HAVE( TYPE_TRAITS ) +# if defined( __NVCC__ ) + if ( ! detail::have_same_sign( t, u, detail::is_same_signedness() ) ) +# else + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + if ( ! detail::is_same_signedness::value && ( t < T() ) != ( u < U() ) ) +# endif +# else + // Don't assume T() works: + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + if ( ( t < 0 ) != ( u < 0 ) ) +# endif + { +# if gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION || defined( gsl_CONFIG_CONTRACT_VIOLATION_THROWS ) + throw narrowing_error(); +# else + std::terminate(); +# endif + } + + return t; +} +#endif // gsl_HAVE( EXCEPTIONS ) || !gsl_CONFIG_NARROW_THROWS_ON_TRUNCATION + +template< class T, class U > +gsl_api inline T narrow_failfast( U u ) +{ + T t = static_cast( u ); + + gsl_Expects( static_cast( t ) == u ); + +#if gsl_HAVE( TYPE_TRAITS ) +# if defined( __NVCC__ ) + gsl_Expects( ::gsl::detail::have_same_sign( t, u, ::gsl::detail::is_same_signedness() ) ); +# else + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + gsl_Expects( ( ::gsl::detail::is_same_signedness::value || ( t < T() ) == ( u < U() ) ) ); +# endif +#else + // Don't assume T() works: + gsl_SUPPRESS_MSVC_WARNING( 4127, "conditional expression is constant" ) + gsl_Expects( ( t < 0 ) == ( u < 0 ) ); +#endif + + return t; +} + + +// +// at() - Bounds-checked way of accessing static arrays, std::array, std::vector. +// + +template< class T, size_t N > +gsl_api inline gsl_constexpr14 T & at( T(&arr)[N], size_t pos ) +{ + gsl_Expects( pos < N ); + return arr[pos]; +} + +template< class Container > +inline gsl_constexpr14 typename Container::value_type & at( Container & cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return cont[pos]; +} + +template< class Container > +inline gsl_constexpr14 typename Container::value_type const & at( Container const & cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return cont[pos]; +} + +#if gsl_HAVE( INITIALIZER_LIST ) + +template< class T > +inline const gsl_constexpr14 T at( std::initializer_list cont, size_t pos ) +{ + gsl_Expects( pos < cont.size() ); + return *( cont.begin() + pos ); +} +#endif + +template< class T > +gsl_api inline gsl_constexpr14 T & at( span s, size_t pos ) +{ + return s[ pos ]; +} + +// +// GSL.views: views +// + +// +// not_null<> - Wrap any indirection and enforce non-null. +// + +template< class T > +class not_null; + +namespace detail { + +// helper class to figure out the pointed-to type of a pointer +#if gsl_CPP11_OR_GREATER +template< class T, class E = void > +struct element_type_helper +{ + // For types without a member element_type (this will handle raw pointers) + typedef typename std::remove_reference< decltype( *std::declval() ) >::type type; +}; + +template< class T > +struct element_type_helper< T, std17::void_t< typename T::element_type > > +{ + // For types with a member element_type + typedef typename T::element_type type; +}; +#else +// Pre-C++11, we cannot have decltype, so we cannot handle types without a member element_type +template< class T, class E = void > +struct element_type_helper +{ + typedef typename T::element_type type; +}; + +template< class T > +struct element_type_helper< T* > +{ + typedef T type; +}; +#endif + +template< class T > +struct is_not_null_oracle : std11::false_type { }; +template< class T > +struct is_not_null_oracle< not_null > : std11::true_type { }; + +template< class T, bool IsCopyable = true > +struct not_null_data; +#if gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) +template< class T > +struct not_null_data< T, false > +{ + T ptr_; + + gsl_constexpr14 not_null_data( T && _ptr ) gsl_noexcept + : ptr_( std::move( _ptr ) ) + { + } + + gsl_constexpr14 not_null_data( not_null_data && other ) gsl_noexcept + : ptr_( std::move( other.ptr_ ) ) + { + } + gsl_constexpr14 not_null_data & operator=( not_null_data && other ) gsl_noexcept + { + ptr_ = std::move( other.ptr_ ); + return *this; + } + +gsl_is_delete_access: + not_null_data( not_null_data const & other ) gsl_is_delete; + not_null_data & operator=( not_null_data const & other ) gsl_is_delete; +}; +#endif // gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) +template< class T > +struct not_null_data< T, true > +{ + T ptr_; + + gsl_constexpr14 not_null_data( T const & _ptr ) gsl_noexcept + : ptr_( _ptr ) + { + } + +#if gsl_HAVE( RVALUE_REFERENCE ) + gsl_constexpr14 not_null_data( T && _ptr ) gsl_noexcept + : ptr_( std::move( _ptr ) ) + { + } + + gsl_constexpr14 not_null_data( not_null_data && other ) gsl_noexcept + : ptr_( std::move( other.ptr_ ) ) + { + } + gsl_constexpr14 not_null_data & operator=( not_null_data && other ) gsl_noexcept + { + ptr_ = std::move( other.ptr_ ); + return *this; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) + + gsl_constexpr14 not_null_data( not_null_data const & other ) + : ptr_( other.ptr_ ) + { + gsl_Expects( ptr_ != gsl_nullptr ); + } + gsl_constexpr14 not_null_data & operator=( not_null_data const & other ) + { + gsl_Expects( other.ptr_ != gsl_nullptr ); + ptr_ = other.ptr_; + return *this; + } +}; + +template< class T > +struct is_copyable +#if gsl_HAVE( TYPE_TRAITS ) +: std11::integral_constant< bool, std::is_copy_constructible::value && std::is_copy_assignable::value > +#else +: std11::true_type +#endif +{ +}; +#if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( UNIQUE_PTR ) && gsl_BETWEEN( gsl_COMPILER_MSVC_VERSION, 1, 140 ) +// Type traits are buggy in VC++ 2013, so we explicitly declare `unique_ptr<>` non-copyable. +template< class T, class Deleter > +struct is_copyable< std::unique_ptr< T, Deleter > > : std11::false_type +{ +}; +#endif + +} // namespace detail + +template< class T > +class not_null +{ +private: + detail::not_null_data< T, detail::is_copyable< T >::value > data_; + + // need to access `not_null::data_` + template< class U > + friend class not_null; + +public: + typedef typename detail::element_type_helper::type element_type; + +#if gsl_HAVE( TYPE_TRAITS ) + static_assert( std::is_assignable::value, "T cannot be assigned nullptr." ); +#endif + +#if gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) +# if gsl_HAVE( RVALUE_REFERENCE ) + template< class U + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value ), int >::type = 0 +# endif + > + gsl_constexpr14 explicit not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 explicit not_null( U const& other ) + : data_( T( other ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) +#else // a.k.a. !gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) +# if gsl_HAVE( RVALUE_REFERENCE ) + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 explicit not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !( gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // If type_traits are not available, then we can't distinguish `is_convertible<>` and `is_constructible<>`, so we unconditionally permit implicit construction. + template< class U > + gsl_constexpr14 not_null( U other ) + : data_( T( std::move( other ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 not_null( U const& other ) + : data_( T( other ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) +#endif // gsl_CONFIG( NOT_NULL_EXPLICIT_CTOR ) + +# if gsl_HAVE( RVALUE_REFERENCE ) + // In Clang 3.x, `is_constructible>, unique_ptr>` tries to instantiate the copy constructor of `unique_ptr<>`, triggering an error. + // Note that Apple Clang's `__clang_major__` etc. are different from regular Clang. +# if gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 explicit not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value ), int >::type = 0 + > + gsl_constexpr14 not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } +# else // a.k.a. !( gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) + // If type_traits are not available, then we can't distinguish `is_convertible<>` and `is_constructible<>`, so we unconditionally permit implicit construction. + template< class U > + gsl_constexpr14 not_null( not_null other ) + : data_( T( std::move( other.data_.ptr_ ) ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + template< class U > + gsl_constexpr14 not_null& operator=( not_null other ) + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_.ptr_ = std::move( other.data_.ptr_ ); + return *this; + } +# endif // gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && !gsl_BETWEEN( gsl_COMPILER_CLANG_VERSION, 1, 400 ) && !gsl_BETWEEN( gsl_COMPILER_APPLECLANG_VERSION, 1, 1001 ) +# else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) + template< class U > + gsl_constexpr14 not_null( not_null const& other ) + : data_( T( other.data_.ptr_ ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + template< class U > + gsl_constexpr14 not_null& operator=( not_null const & other ) + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_.ptr_ = other.data_.ptr_; + return *this; + } +# endif // gsl_HAVE( RVALUE_REFERENCE ) + +#if gsl_CONFIG( TRANSPARENT_NOT_NULL ) + gsl_constexpr14 element_type * + get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_.get(); + } +#else +# if gsl_CONFIG( NOT_NULL_GET_BY_CONST_REF ) + gsl_constexpr14 T const & get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# else + gsl_constexpr14 T get() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# endif +#endif + + // We want an implicit conversion operator that can be used to convert from both lvalues (by + // const reference or by copy) and rvalues (by move). So it seems like we could define + // + // template< class U > + // operator U const &() const & { ... } + // template< class U > + // operator U &&() && { ... } + // + // However, having two conversion operators with different return types renders the assignment + // operator of the result type ambiguous: + // + // not_null> p( ... ); + // std::unique_ptr q; + // q = std::move( p ); // ambiguous + // + // To avoid this ambiguity, we have both overloads of the conversion operator return `U` + // rather than `U const &` or `U &&`. This implies that converting an lvalue always induces + // a copy, which can cause unnecessary copies or even fail to compile in some situations: + // + // not_null> sp( ... ); + // std::shared_ptr const & rs = sp; // unnecessary copy + // std::unique_ptr const & ru = p; // error: cannot copy `unique_ptr` + // + // However, these situations are rather unusual, and the following, more frequent situations + // remain unimpaired: + // + // std::shared_ptr vs = sp; // no extra copy + // std::unique_ptr vu = std::move( p ); + +#if gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) + // explicit conversion operator + + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 explicit + operator U() const +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + & +# endif + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return U( data_.ptr_ ); + } +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && !std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 explicit + operator U() && + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return U( std::move( data_.ptr_ ) ); + } +# endif + + // implicit conversion operator + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_constructible::value && std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 + operator U() const +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + & +# endif + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +# if gsl_HAVE( FUNCTION_REF_QUALIFIER ) + template< class U + // We *have* to use SFINAE with an NTTP arg here, otherwise the overload is ambiguous. + , typename std::enable_if< ( std::is_convertible::value && !detail::is_not_null_oracle::value ), int >::type = 0 + > + gsl_constexpr14 + operator U() && + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return std::move( data_.ptr_ ); + } +# endif +#else // a.k.a. #if !( gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) ) + template< class U > + gsl_constexpr14 + operator U() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) && gsl_HAVE( TYPE_TRAITS ) && gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) && gsl_HAVE( EXPLICIT ) + + gsl_constexpr14 T const & + operator->() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return data_.ptr_; + } + + gsl_constexpr14 element_type & + operator*() const + { + gsl_Ensures( data_.ptr_ != gsl_nullptr ); + return *data_.ptr_; + } + +#if gsl_HAVE( RVALUE_REFERENCE ) + // Visual C++ 2013 doesn't generate default move constructors, so we declare them explicitly. + gsl_constexpr14 not_null( not_null && other ) gsl_noexcept + : data_( std::move( other.data_ ) ) + { + gsl_Expects( data_.ptr_ != gsl_nullptr ); + } + gsl_constexpr14 not_null & operator=( not_null && other ) gsl_noexcept + { + gsl_Expects( other.data_.ptr_ != gsl_nullptr ); + data_ = std::move( other.data_ ); + return *this; + } +#endif // gsl_HAVE( RVALUE_REFERENCE ) + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 not_null( not_null const & other ) = default; + gsl_constexpr14 not_null & operator=( not_null const & other ) = default; +#endif + +gsl_is_delete_access: + not_null() gsl_is_delete; + // prevent compilation when initialized with a nullptr or literal 0: +#if gsl_HAVE( NULLPTR ) + not_null( std::nullptr_t ) gsl_is_delete; + not_null & operator=( std::nullptr_t ) gsl_is_delete; +#else + not_null( int ) gsl_is_delete; + not_null & operator=( int ) gsl_is_delete; +#endif + + // unwanted operators...pointers only point to single objects! + not_null & operator++() gsl_is_delete; + not_null & operator--() gsl_is_delete; + not_null operator++( int ) gsl_is_delete; + not_null operator--( int ) gsl_is_delete; + not_null & operator+ ( size_t ) gsl_is_delete; + not_null & operator+=( size_t ) gsl_is_delete; + not_null & operator- ( size_t ) gsl_is_delete; + not_null & operator-=( size_t ) gsl_is_delete; + not_null & operator+=( std::ptrdiff_t ) gsl_is_delete; + not_null & operator-=( std::ptrdiff_t ) gsl_is_delete; + void operator[]( std::ptrdiff_t ) const gsl_is_delete; +}; +#if gsl_HAVE( DEDUCTION_GUIDES ) +template< class U > +not_null( U ) -> not_null; +template< class U > +not_null( not_null ) -> not_null; +#endif + +#if gsl_HAVE( NULLPTR ) +void make_not_null( std::nullptr_t ) gsl_is_delete; +#endif // gsl_HAVE( NULLPTR ) +#if gsl_HAVE( RVALUE_REFERENCE ) +template< class U > +not_null make_not_null( U u ) +{ + return not_null( std::move( u ) ); +} +template< class U > +not_null make_not_null( not_null u ) +{ + return std::move( u ); +} +#else // a.k.a. !gsl_HAVE( RVALUE_REFERENCE ) +template< class U > +not_null make_not_null( U const & u ) +{ + return not_null( u ); +} +template< class U > +not_null make_not_null( not_null const & u ) +{ + return u; +} +#endif // gsl_HAVE( RVALUE_REFERENCE ) + + +// not_null with implicit constructor, allowing copy-initialization: + +template< class T > +class not_null_ic : public not_null +{ +public: + template< class U + gsl_ENABLE_IF_(( std::is_constructible::value )) + > + gsl_constexpr14 +#if gsl_HAVE( RVALUE_REFERENCE ) + not_null_ic( U && u ) + : not_null( std::forward( u ) ) +#else + not_null_ic( U const & u ) + : not_null( u ) +#endif + {} +}; + +// more not_null unwanted operators + +template< class T, class U > +std::ptrdiff_t operator-( not_null const &, not_null const & ) gsl_is_delete; + +template< class T > +not_null operator-( not_null const &, std::ptrdiff_t ) gsl_is_delete; + +template< class T > +not_null operator+( not_null const &, std::ptrdiff_t ) gsl_is_delete; + +template< class T > +not_null operator+( std::ptrdiff_t, not_null const & ) gsl_is_delete; + +// not_null comparisons + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( not_null const & l, not_null const & r ) +{ + return l.operator->() == r.operator->(); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( not_null const & l, U const & r ) +{ + return l.operator->() == r; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() == std::declval() ) +operator==( T const & l, not_null const & r ) +{ + return l == r.operator->(); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( not_null const & l, not_null const & r ) +{ + return l.operator->() < r.operator->(); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( not_null const & l, U const & r ) +{ + return l.operator->() < r; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator<( T const & l, not_null const & r ) +{ + return l < r.operator->(); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( not_null const & l, not_null const & r ) +{ + return !( l == r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( not_null const & l, U const & r ) +{ + return !( l == r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() == std::declval() ) ) +operator!=( T const & l, not_null const & r ) +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( not_null const & l, not_null const & r ) +{ + return !( r < l ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( not_null const & l, U const & r ) +{ + return !( r < l ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator<=( T const & l, not_null const & r ) +{ + return !( r < l ); +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( not_null const & l, not_null const & r ) +{ + return r < l; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( not_null const & l, U const & r ) +{ + return r < l; +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, std::declval() < std::declval() ) +operator>( T const & l, not_null const & r ) +{ + return r < l; +} + +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( not_null const & l, not_null const & r ) +{ + return !( l < r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( not_null const & l, U const & r ) +{ + return !( l < r ); +} +template< class T, class U > +inline gsl_constexpr gsl_DECLTYPE_( bool, !( std::declval() < std::declval() ) ) +operator>=( T const & l, not_null const & r ) +{ + return !( l < r ); +} + +// print not_null + +template< class CharType, class Traits, class T > +std::basic_ostream< CharType, Traits > & operator<<( std::basic_ostream< CharType, Traits > & os, not_null const & p ) +{ + return os << p.operator->(); +} + + +// +// Byte-specific type. +// +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + enum class gsl_may_alias byte : unsigned char {}; +#else + struct gsl_may_alias byte { typedef unsigned char type; type v; }; +#endif + +template< class T > +gsl_api inline gsl_constexpr byte to_byte( T v ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return static_cast( v ); +#elif gsl_HAVE( CONSTEXPR_11 ) + return { static_cast( v ) }; +#else + byte b = { static_cast( v ) }; return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr IntegerType to_integer( byte b ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return static_cast::type>( b ); +#else + return b.v; +#endif +} + +gsl_api inline gsl_constexpr unsigned char to_uchar( byte b ) gsl_noexcept +{ + return to_integer( b ); +} + +gsl_api inline gsl_constexpr unsigned char to_uchar( int i ) gsl_noexcept +{ + return static_cast( i ); +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr14 byte & operator<<=( byte & b, IntegerType shift ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return b = ::gsl::to_byte( ::gsl::to_uchar( b ) << shift ); +#else + b.v = ::gsl::to_uchar( b.v << shift ); return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr byte operator<<( byte b, IntegerType shift ) gsl_noexcept +{ + return ::gsl::to_byte( ::gsl::to_uchar( b ) << shift ); +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr14 byte & operator>>=( byte & b, IntegerType shift ) gsl_noexcept +{ +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + return b = ::gsl::to_byte( ::gsl::to_uchar( b ) >> shift ); +#else + b.v = ::gsl::to_uchar( b.v >> shift ); return b; +#endif +} + +template< class IntegerType gsl_ENABLE_IF_(( std::is_integral::value )) > +gsl_api inline gsl_constexpr byte operator>>( byte b, IntegerType shift ) gsl_noexcept +{ + return ::gsl::to_byte( ::gsl::to_uchar( b ) >> shift ); +} + +#if gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) +gsl_DEFINE_ENUM_BITMASK_OPERATORS( byte ) +gsl_DEFINE_ENUM_RELATIONAL_OPERATORS( byte ) +#else // a.k.a. !gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) +gsl_api inline gsl_constexpr bool operator==( byte l, byte r ) gsl_noexcept +{ + return l.v == r.v; +} + +gsl_api inline gsl_constexpr bool operator!=( byte l, byte r ) gsl_noexcept +{ + return !( l == r ); +} + +gsl_api inline gsl_constexpr bool operator< ( byte l, byte r ) gsl_noexcept +{ + return l.v < r.v; +} + +gsl_api inline gsl_constexpr bool operator<=( byte l, byte r ) gsl_noexcept +{ + return !( r < l ); +} + +gsl_api inline gsl_constexpr bool operator> ( byte l, byte r ) gsl_noexcept +{ + return ( r < l ); +} + +gsl_api inline gsl_constexpr bool operator>=( byte l, byte r ) gsl_noexcept +{ + return !( l < r ); +} + +gsl_api inline gsl_constexpr14 byte & operator|=( byte & l, byte r ) gsl_noexcept +{ + l.v |= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator|( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v | r.v ); +} + +gsl_api inline gsl_constexpr14 byte & operator&=( byte & l, byte r ) gsl_noexcept +{ + l.v &= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator&( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v & r.v ); +} + +gsl_api inline gsl_constexpr14 byte & operator^=( byte & l, byte r ) gsl_noexcept +{ + l.v ^= r.v; return l; +} + +gsl_api inline gsl_constexpr byte operator^( byte l, byte r ) gsl_noexcept +{ + return ::gsl::to_byte( l.v ^ r.v ); +} + +gsl_api inline gsl_constexpr byte operator~( byte b ) gsl_noexcept +{ + return ::gsl::to_byte( ~b.v ); +} +#endif // gsl_HAVE( ENUM_CLASS_CONSTRUCTION_FROM_UNDERLYING_TYPE ) + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +// Tag to select span constructor taking a container: + +struct with_container_t { gsl_constexpr with_container_t() gsl_noexcept {} }; +const gsl_constexpr with_container_t with_container; // TODO: this can lead to ODR violations because the symbol will be defined in multiple translation units + +#endif + +// +// span<> - A 1D view of contiguous T's, replace (*,len). +// +template< class T > +class span +{ + template< class U > friend class span; + +public: + typedef gsl_CONFIG_SPAN_INDEX_TYPE index_type; + + typedef T element_type; + typedef typename std11::remove_cv< T >::type value_type; + + typedef T & reference; + typedef T * pointer; + typedef T const * const_pointer; + typedef T const & const_reference; + + typedef pointer iterator; + typedef const_pointer const_iterator; + + typedef std::reverse_iterator< iterator > reverse_iterator; + typedef std::reverse_iterator< const_iterator > const_reverse_iterator; + + typedef typename std::iterator_traits< iterator >::difference_type difference_type; + + // 26.7.3.2 Constructors, copy, and assignment [span.cons] + + gsl_api gsl_constexpr14 span() gsl_noexcept + : first_( gsl_nullptr ) + , last_ ( gsl_nullptr ) + { + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + +#if gsl_HAVE( NULLPTR ) + gsl_api gsl_constexpr14 span( std::nullptr_t, index_type size_in ) + : first_( nullptr ) + , last_ ( nullptr ) + { + gsl_Expects( size_in == 0 ); + } +#endif + +#if gsl_HAVE( IS_DELETE ) + gsl_DEPRECATED + gsl_api gsl_constexpr span( reference data_in ) + : span( &data_in, 1 ) + {} + + gsl_api gsl_constexpr span( element_type && ) = delete; +#endif + +#endif // deprecate + + gsl_api gsl_constexpr14 span( pointer data_in, index_type size_in ) + : first_( data_in ) + , last_ ( data_in + size_in ) + { + gsl_Expects( size_in == 0 || ( size_in > 0 && data_in != gsl_nullptr ) ); + } + + gsl_api gsl_constexpr14 span( pointer first_in, pointer last_in ) + : first_( first_in ) + , last_ ( last_in ) + { + gsl_Expects( first_in <= last_in ); + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + + template< class U > + gsl_api gsl_constexpr14 span( U * data_in, index_type size_in ) + : first_( data_in ) + , last_ ( data_in + size_in ) + { + gsl_Expects( size_in == 0 || ( size_in > 0 && data_in != gsl_nullptr ) ); + } + +#endif // deprecate + +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + template< class U, size_t N > + gsl_api gsl_constexpr span( U (&arr)[N] ) gsl_noexcept + : first_( gsl_ADDRESSOF( arr[0] ) ) + , last_ ( gsl_ADDRESSOF( arr[0] ) + N ) + {} +#else + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_api gsl_constexpr span( element_type (&arr)[N] ) gsl_noexcept + : first_( gsl_ADDRESSOF( arr[0] ) ) + , last_ ( gsl_ADDRESSOF( arr[0] ) + N ) + {} +#endif // deprecate + +#if gsl_HAVE( ARRAY ) +#if ! gsl_DEPRECATE_TO_LEVEL( 5 ) + + template< class U, size_t N > + gsl_constexpr span( std::array< U, N > & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + + template< class U, size_t N > + gsl_constexpr span( std::array< U, N > const & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + +#else + + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_constexpr span( std::array< value_type, N > & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + + template< size_t N + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_constexpr span( std::array< value_type, N > const & arr ) + : first_( arr.data() ) + , last_ ( arr.data() + N ) + {} + +#endif // deprecate +#endif // gsl_HAVE( ARRAY ) + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + template< class Container + gsl_ENABLE_IF_(( detail::is_compatible_container< Container, element_type >::value )) + > + gsl_constexpr span( Container & cont ) gsl_noexcept + : first_( std17::data( cont ) ) + , last_ ( std17::data( cont ) + std17::size( cont ) ) + {} + + template< class Container + gsl_ENABLE_IF_(( + std::is_const< element_type >::value + && detail::is_compatible_container< Container, element_type >::value + )) + > + gsl_constexpr span( Container const & cont ) gsl_noexcept + : first_( std17::data( cont ) ) + , last_ ( std17::data( cont ) + std17::size( cont ) ) + {} + +#elif gsl_HAVE( UNCONSTRAINED_SPAN_CONTAINER_CTOR ) + + template< class Container > + gsl_constexpr span( Container & cont ) + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + + template< class Container > + gsl_constexpr span( Container const & cont ) + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + + template< class Container > + gsl_constexpr span( with_container_t, Container & cont ) gsl_noexcept + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + + template< class Container > + gsl_constexpr span( with_container_t, Container const & cont ) gsl_noexcept + : first_( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) ) + , last_ ( cont.size() == 0 ? gsl_nullptr : gsl_ADDRESSOF( cont[0] ) + cont.size() ) + {} + +#endif + +#if !gsl_DEPRECATE_TO_LEVEL( 4 ) + // constructor taking shared_ptr deprecated since 0.29.0 + +# if gsl_HAVE( SHARED_PTR ) + gsl_DEPRECATED + gsl_constexpr span( shared_ptr const & ptr ) + : first_( ptr.get() ) + , last_ ( ptr.get() ? ptr.get() + 1 : gsl_nullptr ) + {} +# endif + + // constructors taking unique_ptr deprecated since 0.29.0 + +# if gsl_HAVE( UNIQUE_PTR ) +# if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + template< class ArrayElementType = typename std::add_pointer::type > +# else + template< class ArrayElementType > +# endif + gsl_DEPRECATED + gsl_constexpr span( unique_ptr const & ptr, index_type count ) + : first_( ptr.get() ) + , last_ ( ptr.get() + count ) + {} + + gsl_DEPRECATED + gsl_constexpr span( unique_ptr const & ptr ) + : first_( ptr.get() ) + , last_ ( ptr.get() ? ptr.get() + 1 : gsl_nullptr ) + {} +# endif + +#endif // deprecate shared_ptr, unique_ptr + +#if gsl_HAVE( IS_DEFAULT ) && ! gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 430, 600) + gsl_constexpr span( span && ) gsl_noexcept = default; + gsl_constexpr span( span const & ) = default; +#else + gsl_api gsl_constexpr span( span const & other ) + : first_( other.begin() ) + , last_ ( other.end() ) + {} +#endif + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 span & operator=( span && ) gsl_noexcept = default; + gsl_constexpr14 span & operator=( span const & ) gsl_noexcept = default; +#else + gsl_constexpr14 span & operator=( span other ) gsl_noexcept + { + first_ = other.first_; + last_ = other.last_; + return *this; + } +#endif + + template< class U + gsl_ENABLE_IF_(( std::is_convertible::value )) + > + gsl_api gsl_constexpr span( span const & other ) + : first_( other.begin() ) + , last_ ( other.end() ) + {} + +#if 0 + // Converting from other span ? + template< class U > operator=(); +#endif + + // 26.7.3.3 Subviews [span.sub] + + gsl_api gsl_constexpr14 span first( index_type count ) const + { + gsl_Expects( std::size_t( count ) <= std::size_t( this->size() ) ); + return span( this->data(), count ); + } + + gsl_api gsl_constexpr14 span last( index_type count ) const + { + gsl_Expects( std::size_t( count ) <= std::size_t( this->size() ) ); + return span( this->data() + this->size() - count, count ); + } + + gsl_api gsl_constexpr14 span subspan( index_type offset ) const + { + gsl_Expects( std::size_t( offset ) <= std::size_t( this->size() ) ); + return span( this->data() + offset, this->size() - offset ); + } + + gsl_api gsl_constexpr14 span subspan( index_type offset, index_type count ) const + { + gsl_Expects( + std::size_t( offset ) <= std::size_t( this->size() ) && + std::size_t( count ) <= std::size_t( this->size() - offset ) ); + return span( this->data() + offset, count ); + } + + // 26.7.3.4 Observers [span.obs] + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return narrow_cast( last_ - first_ ); + } + + gsl_api gsl_constexpr std::ptrdiff_t ssize() const gsl_noexcept + { + return narrow_cast( last_ - first_ ); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return size() * narrow_cast( sizeof( element_type ) ); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + // 26.7.3.5 Element access [span.elem] + + gsl_api gsl_constexpr14 reference operator[]( index_type pos ) const + { + gsl_Expects( pos < size() ); + return first_[ pos ]; + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference operator()( index_type pos ) const + { + return (*this)[ pos ]; + } + + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference at( index_type pos ) const + { + return (*this)[ pos ]; + } +#endif // deprecate + + gsl_api gsl_constexpr14 reference front() const + { + gsl_Expects( first_ != last_ ); + return *first_; + } + + gsl_api gsl_constexpr14 reference back() const + { + gsl_Expects( first_ != last_ ); + return *(last_ - 1); + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return first_; + } + + // 26.7.3.6 Iterator support [span.iterators] + + gsl_api gsl_constexpr iterator begin() const gsl_noexcept + { + return iterator( first_ ); + } + + gsl_api gsl_constexpr iterator end() const gsl_noexcept + { + return iterator( last_ ); + } + + gsl_api gsl_constexpr const_iterator cbegin() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return { begin() }; +#else + return const_iterator( begin() ); +#endif + } + + gsl_api gsl_constexpr const_iterator cend() const gsl_noexcept + { +#if gsl_CPP11_OR_GREATER + return { end() }; +#else + return const_iterator( end() ); +#endif + } + + gsl_constexpr17 reverse_iterator rbegin() const gsl_noexcept + { + return reverse_iterator( end() ); + } + + gsl_constexpr17 reverse_iterator rend() const gsl_noexcept + { + return reverse_iterator( begin() ); + } + + gsl_constexpr17 const_reverse_iterator crbegin() const gsl_noexcept + { + return const_reverse_iterator( cend() ); + } + + gsl_constexpr17 const_reverse_iterator crend() const gsl_noexcept + { + return const_reverse_iterator( cbegin() ); + } + + gsl_constexpr14 void swap( span & other ) gsl_noexcept + { + std::swap( first_, other.first_ ); + std::swap( last_ , other.last_ ); + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 3 ) + // member length() deprecated since 0.29.0 + + gsl_DEPRECATED_MSG("use size() instead") + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return size(); + } + + // member length_bytes() deprecated since 0.29.0 + + gsl_DEPRECATED_MSG("use size_bytes() instead") + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return size_bytes(); + } +#endif + +#if ! gsl_DEPRECATE_TO_LEVEL( 2 ) + // member as_bytes(), as_writeable_bytes deprecated since 0.17.0 + + gsl_DEPRECATED_MSG("use free function gsl::as_bytes() instead") + gsl_api span< const byte > as_bytes() const gsl_noexcept + { + return span< const byte >( reinterpret_cast( data() ), size_bytes() ); // NOLINT + } + + gsl_DEPRECATED_MSG("use free function gsl::as_writable_bytes() instead") + gsl_api span< byte > as_writeable_bytes() const gsl_noexcept + { + return span< byte >( reinterpret_cast( data() ), size_bytes() ); // NOLINT + } + +#endif + + template< class U > + gsl_api span< U > as_span() const + { + gsl_Expects( ( this->size_bytes() % sizeof(U) ) == 0 ); + return span< U >( reinterpret_cast( this->data() ), this->size_bytes() / sizeof( U ) ); // NOLINT + } + +private: + pointer first_; + pointer last_; +}; + +// class template argument deduction guides: + +#if gsl_HAVE( DEDUCTION_GUIDES ) // gsl_CPP17_OR_GREATER + +template< class T, size_t N > +span( T (&)[N] ) -> span; + +template< class T, size_t N > +span( std::array & ) -> span; + +template< class T, size_t N > +span( std::array const & ) -> span; + +template< class Container > +span( Container& ) -> span; + +template< class Container > +span( Container const & ) -> span; + +#endif // gsl_HAVE( DEDUCTION_GUIDES ) + +// 26.7.3.7 Comparison operators [span.comparison] + +#if gsl_CONFIG( ALLOWS_SPAN_COMPARISON ) +# if gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator==( span const & l, span const & r ) +{ + return l.size() == r.size() + && (l.begin() == r.begin() || std::equal( l.begin(), l.end(), r.begin() ) ); +} + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator< ( span const & l, span const & r ) +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +# else // a.k.a. !gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator==( span const & l, span const & r ) +{ + return l.size() == r.size() + && (l.begin() == r.begin() || std::equal( l.begin(), l.end(), r.begin() ) ); +} + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr bool operator< ( span const & l, span const & r ) +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} +# endif // gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +inline gsl_constexpr bool operator!=( span const & l, span const & r ) +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr bool operator<=( span const & l, span const & r ) +{ + return !( r < l ); +} + +template< class T, class U > +inline gsl_constexpr bool operator> ( span const & l, span const & r ) +{ + return ( r < l ); +} + +template< class T, class U > +inline gsl_constexpr bool operator>=( span const & l, span const & r ) +{ + return !( l < r ); +} +#endif // gsl_CONFIG( ALLOWS_SPAN_COMPARISON ) + +// span algorithms + +template< class T > +gsl_api inline gsl_constexpr std::size_t size( span const & spn ) +{ + return static_cast( spn.size() ); +} + +template< class T > +gsl_api inline gsl_constexpr std::ptrdiff_t ssize( span const & spn ) +{ + return spn.ssize(); +} + +namespace detail { + +template< class II, class N, class OI > +gsl_api gsl_constexpr14 inline OI copy_n( II first, N count, OI result ) +{ + if ( count > 0 ) + { + *result++ = *first; + for ( N i = 1; i < count; ++i ) + { + *result++ = *++first; + } + } + return result; +} +} + +template< class T, class U > +gsl_api gsl_constexpr14 inline void copy( span src, span dest ) +{ +#if gsl_CPP14_OR_GREATER // gsl_HAVE( TYPE_TRAITS ) (circumvent Travis clang 3.4) + static_assert( std::is_assignable::value, "Cannot assign elements of source span to elements of destination span" ); +#endif + gsl_Expects( dest.size() >= src.size() ); + detail::copy_n( src.data(), src.size(), dest.data() ); +} + +// span creator functions (see ctors) + +template< class T > +gsl_api inline span< const byte > as_bytes( span spn ) gsl_noexcept +{ + return span< const byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +template< class T> +gsl_api inline span< byte > as_writable_bytes( span spn ) gsl_noexcept +{ + return span< byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) +template< class T> +gsl_DEPRECATED_MSG("use as_writable_bytes() (different spelling) instead") +gsl_api inline span< byte > as_writeable_bytes( span spn ) gsl_noexcept +{ + return span< byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} +#endif // deprecate + +#if gsl_FEATURE_TO_STD( MAKE_SPAN ) + +template< class T > +gsl_api inline gsl_constexpr span +make_span( T * ptr, typename span::index_type count ) +{ + return span( ptr, count ); +} + +template< class T > +gsl_api inline gsl_constexpr span +make_span( T * first, T * last ) +{ + return span( first, last ); +} + +template< class T, size_t N > +gsl_api inline gsl_constexpr span +make_span( T (&arr)[N] ) +{ + return span( gsl_ADDRESSOF( arr[0] ), N ); +} + +#if gsl_HAVE( ARRAY ) + +template< class T, size_t N > +inline gsl_constexpr span +make_span( std::array & arr ) +{ + return span( arr ); +} + +template< class T, size_t N > +inline gsl_constexpr span +make_span( std::array const & arr ) +{ + return span( arr ); +} +#endif + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) && gsl_HAVE( AUTO ) + +template< class Container, class EP = decltype( std17::data(std::declval())) > +inline gsl_constexpr auto +make_span( Container & cont ) -> span< typename std::remove_pointer::type > +{ + return span< typename std::remove_pointer::type >( cont ); +} + +template< class Container, class EP = decltype( std17::data(std::declval())) > +inline gsl_constexpr auto +make_span( Container const & cont ) -> span< const typename std::remove_pointer::type > +{ + return span< const typename std::remove_pointer::type >( cont ); +} + +#else + +template< class T > +inline span +make_span( std::vector & cont ) +{ + return span( with_container, cont ); +} + +template< class T > +inline span +make_span( std::vector const & cont ) +{ + return span( with_container, cont ); +} +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +template< class Container > +inline gsl_constexpr span +make_span( with_container_t, Container & cont ) gsl_noexcept +{ + return span< typename Container::value_type >( with_container, cont ); +} + +template< class Container > +inline gsl_constexpr span +make_span( with_container_t, Container const & cont ) gsl_noexcept +{ + return span< const typename Container::value_type >( with_container, cont ); +} + +#endif // gsl_FEATURE_TO_STD( WITH_CONTAINER ) + +#if !gsl_DEPRECATE_TO_LEVEL( 4 ) +template< class Ptr > +gsl_DEPRECATED +inline span +make_span( Ptr & ptr ) +{ + return span( ptr ); +} +#endif // !gsl_DEPRECATE_TO_LEVEL( 4 ) + +template< class Ptr > +gsl_DEPRECATED +inline span +make_span( Ptr & ptr, typename span::index_type count ) +{ + return span( ptr, count ); +} + +#endif // gsl_FEATURE_TO_STD( MAKE_SPAN ) + +#if gsl_FEATURE_TO_STD( BYTE_SPAN ) + +template< class T > +gsl_api inline gsl_constexpr span +byte_span( T & t ) gsl_noexcept +{ + return span( reinterpret_cast( &t ), sizeof(T) ); +} + +template< class T > +gsl_api inline gsl_constexpr span +byte_span( T const & t ) gsl_noexcept +{ + return span( reinterpret_cast( &t ), sizeof(T) ); +} + +#endif // gsl_FEATURE_TO_STD( BYTE_SPAN ) + +// +// basic_string_span: +// + +template< class T > +class basic_string_span; + +namespace detail { + +template< class T > +struct is_basic_string_span_oracle : std11::false_type {}; + +template< class T > +struct is_basic_string_span_oracle< basic_string_span > : std11::true_type {}; + +template< class T > +struct is_basic_string_span : is_basic_string_span_oracle< typename std11::remove_cv::type > {}; + +template< class T > +gsl_api inline gsl_constexpr14 std::size_t string_length( T * ptr, std::size_t max ) +{ + if ( ptr == gsl_nullptr || max <= 0 ) + return 0; + + std::size_t len = 0; + while ( len < max && ptr[len] ) // NOLINT + ++len; + + return len; +} + +} // namespace detail + +// +// basic_string_span<> - A view of contiguous characters, replace (*,len). +// +template< class T > +class basic_string_span +{ +public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef typename span_type::pointer pointer ; + typedef typename span_type::reference reference ; + + typedef typename span_type::iterator iterator ; + typedef typename span_type::const_iterator const_iterator ; + typedef typename span_type::reverse_iterator reverse_iterator; + typedef typename span_type::const_reverse_iterator const_reverse_iterator; + + // construction: + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr basic_string_span() gsl_noexcept = default; +#else + gsl_api gsl_constexpr basic_string_span() gsl_noexcept {} +#endif + +#if gsl_HAVE( NULLPTR ) + gsl_api gsl_constexpr basic_string_span( std::nullptr_t ) gsl_noexcept + : span_( nullptr, static_cast( 0 ) ) + {} +#endif + +#ifdef __CUDACC_RELAXED_CONSTEXPR__ + gsl_api +#endif // __CUDACC_RELAXED_CONSTEXPR__ + gsl_constexpr basic_string_span( pointer ptr ) + : span_( remove_z( ptr, (std::numeric_limits::max)() ) ) + {} + + gsl_api gsl_constexpr basic_string_span( pointer ptr, index_type count ) + : span_( ptr, count ) + {} + + gsl_api gsl_constexpr basic_string_span( pointer firstElem, pointer lastElem ) + : span_( firstElem, lastElem ) + {} + + template< std::size_t N > + gsl_api gsl_constexpr basic_string_span( element_type (&arr)[N] ) + : span_( remove_z( gsl_ADDRESSOF( arr[0] ), N ) ) + {} + +#if gsl_HAVE( ARRAY ) + + template< std::size_t N > + gsl_constexpr basic_string_span( std::array< typename std11::remove_const::type, N> & arr ) + : span_( remove_z( arr ) ) + {} + + template< std::size_t N > + gsl_constexpr basic_string_span( std::array< typename std11::remove_const::type, N> const & arr ) + : span_( remove_z( arr ) ) + {} + +#endif + +#if gsl_HAVE( CONSTRAINED_SPAN_CONTAINER_CTOR ) + + // Exclude: array, [basic_string,] basic_string_span + + template< class Container + gsl_ENABLE_IF_(( + ! detail::is_std_array< Container >::value + && ! detail::is_basic_string_span< Container >::value + && std::is_convertible< typename Container::pointer, pointer >::value + && std::is_convertible< typename Container::pointer, decltype(std::declval().data()) >::value + )) + > + gsl_constexpr basic_string_span( Container & cont ) + : span_( ( cont ) ) + {} + + // Exclude: array, [basic_string,] basic_string_span + + template< class Container + gsl_ENABLE_IF_(( + ! detail::is_std_array< Container >::value + && ! detail::is_basic_string_span< Container >::value + && std::is_convertible< typename Container::pointer, pointer >::value + && std::is_convertible< typename Container::pointer, decltype(std::declval().data()) >::value + )) + > + gsl_constexpr basic_string_span( Container const & cont ) + : span_( ( cont ) ) + {} + +#elif gsl_HAVE( UNCONSTRAINED_SPAN_CONTAINER_CTOR ) + + template< class Container > + gsl_constexpr basic_string_span( Container & cont ) + : span_( cont ) + {} + + template< class Container > + gsl_constexpr basic_string_span( Container const & cont ) + : span_( cont ) + {} + +#else + + template< class U > + gsl_api gsl_constexpr basic_string_span( span const & rhs ) + : span_( rhs ) + {} + +#endif + +#if gsl_FEATURE_TO_STD( WITH_CONTAINER ) + + template< class Container > + gsl_constexpr basic_string_span( with_container_t, Container & cont ) + : span_( with_container, cont ) + {} +#endif + +#if gsl_HAVE( IS_DEFAULT ) +# if gsl_BETWEEN( gsl_COMPILER_GNUC_VERSION, 440, 600 ) + gsl_constexpr basic_string_span( basic_string_span const & rhs ) = default; + + gsl_constexpr basic_string_span( basic_string_span && rhs ) = default; +# else + gsl_constexpr basic_string_span( basic_string_span const & rhs ) gsl_noexcept = default; + + gsl_constexpr basic_string_span( basic_string_span && rhs ) gsl_noexcept = default; +# endif +#endif + + template< class U + gsl_ENABLE_IF_(( std::is_convertible::pointer, pointer>::value )) + > + gsl_api gsl_constexpr basic_string_span( basic_string_span const & rhs ) + : span_( reinterpret_cast( rhs.data() ), rhs.length() ) // NOLINT + {} + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + template< class U + gsl_ENABLE_IF_(( std::is_convertible::pointer, pointer>::value )) + > + gsl_api gsl_constexpr basic_string_span( basic_string_span && rhs ) + : span_( reinterpret_cast( rhs.data() ), rhs.length() ) // NOLINT + {} +#endif + + template< class CharTraits, class Allocator > + gsl_constexpr basic_string_span( + std::basic_string< typename std11::remove_const::type, CharTraits, Allocator > & str ) + : span_( gsl_ADDRESSOF( str[0] ), str.length() ) + {} + + template< class CharTraits, class Allocator > + gsl_constexpr basic_string_span( + std::basic_string< typename std11::remove_const::type, CharTraits, Allocator > const & str ) + : span_( gsl_ADDRESSOF( str[0] ), str.length() ) + {} + + // assignment: + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr14 basic_string_span & operator=( basic_string_span const & rhs ) gsl_noexcept = default; + + gsl_constexpr14 basic_string_span & operator=( basic_string_span && rhs ) gsl_noexcept = default; +#endif + + // sub span: + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span first( index_type count ) const + { + return span_.first( count ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span last( index_type count ) const + { + return span_.last( count ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span subspan( index_type offset ) const + { + return span_.subspan( offset ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr14 basic_string_span subspan( index_type offset, index_type count ) const + { + return span_.subspan( offset, count ); + } + + // observers: + + gsl_api gsl_constexpr index_type length() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type size() const gsl_noexcept + { + return span_.size(); + } + + gsl_api gsl_constexpr index_type length_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr index_type size_bytes() const gsl_noexcept + { + return span_.size_bytes(); + } + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return size() == 0; + } + + gsl_api gsl_constexpr14 reference operator[]( index_type idx ) const + { + return span_[idx]; + } + +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) + gsl_DEPRECATED_MSG("use subscript indexing instead") + gsl_api gsl_constexpr14 reference operator()( index_type idx ) const + { + return span_[idx]; + } +#endif // deprecate + + gsl_api gsl_constexpr14 reference front() const + { + return span_.front(); + } + + gsl_api gsl_constexpr14 reference back() const + { + return span_.back(); + } + + gsl_api gsl_constexpr pointer data() const gsl_noexcept + { + return span_.data(); + } + + gsl_api gsl_constexpr iterator begin() const gsl_noexcept + { + return span_.begin(); + } + + gsl_api gsl_constexpr iterator end() const gsl_noexcept + { + return span_.end(); + } + + gsl_constexpr17 reverse_iterator rbegin() const gsl_noexcept + { + return span_.rbegin(); + } + + gsl_constexpr17 reverse_iterator rend() const gsl_noexcept + { + return span_.rend(); + } + + // const version not in p0123r2: + + gsl_api gsl_constexpr const_iterator cbegin() const gsl_noexcept + { + return span_.cbegin(); + } + + gsl_api gsl_constexpr const_iterator cend() const gsl_noexcept + { + return span_.cend(); + } + + gsl_constexpr17 const_reverse_iterator crbegin() const gsl_noexcept + { + return span_.crbegin(); + } + + gsl_constexpr17 const_reverse_iterator crend() const gsl_noexcept + { + return span_.crend(); + } + +private: + gsl_api static gsl_constexpr14 span_type remove_z( pointer const & sz, std::size_t max ) + { + return span_type( sz, detail::string_length( sz, max ) ); + } + +#if gsl_HAVE( ARRAY ) + template< size_t N > + static gsl_constexpr14 span_type remove_z( std::array::type, N> & arr ) + { + return remove_z( gsl_ADDRESSOF( arr[0] ), narrow_cast< std::size_t >( N ) ); + } + + template< size_t N > + static gsl_constexpr14 span_type remove_z( std::array::type, N> const & arr ) + { + return remove_z( gsl_ADDRESSOF( arr[0] ), narrow_cast< std::size_t >( N ) ); + } +#endif + +private: + span_type span_; +}; + +// basic_string_span comparison functions: + +#if gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( basic_string_span const & l, U const & u ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > r( u ); + + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T, class U > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( basic_string_span const & l, U const & u ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > r( u ); + + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( U const & u, basic_string_span const & r ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > l( u ); + + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( U const & u, basic_string_span const & r ) gsl_noexcept +{ + const basic_string_span< typename std11::add_const::type > l( u ); + + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} +#endif + +#else //gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator==( basic_string_span const & l, basic_string_span const & r ) gsl_noexcept +{ + return l.size() == r.size() + && std::equal( l.begin(), l.end(), r.begin() ); +} + +template< class T > +gsl_SUPPRESS_MSGSL_WARNING(stl.1) +inline gsl_constexpr14 bool operator<( basic_string_span const & l, basic_string_span const & r ) gsl_noexcept +{ + return std::lexicographical_compare( l.begin(), l.end(), r.begin(), r.end() ); +} + +#endif // gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + +template< class T, class U > +inline gsl_constexpr14 bool operator!=( basic_string_span const & l, U const & r ) gsl_noexcept +{ + return !( l == r ); +} + +template< class T, class U > +inline gsl_constexpr14 bool operator<=( basic_string_span const & l, U const & r ) gsl_noexcept +{ +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) || ! gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + return !( r < l ); +#else + basic_string_span< typename std11::add_const::type > rr( r ); + return !( rr < l ); +#endif +} + +template< class T, class U > +inline gsl_constexpr14 bool operator>( basic_string_span const & l, U const & r ) gsl_noexcept +{ +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) || ! gsl_CONFIG( ALLOWS_NONSTRICT_SPAN_COMPARISON ) + return ( r < l ); +#else + basic_string_span< typename std11::add_const::type > rr( r ); + return ( rr < l ); +#endif +} + +template< class T, class U > +inline gsl_constexpr14 bool operator>=( basic_string_span const & l, U const & r ) gsl_noexcept +{ + return !( l < r ); +} + +#if gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator!=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( l == r ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator<=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( r < l ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator>( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return ( r < l ); +} + +template< class T, class U + gsl_ENABLE_IF_(( !detail::is_basic_string_span::value )) +> +inline gsl_constexpr14 bool operator>=( U const & l, basic_string_span const & r ) gsl_noexcept +{ + return !( l < r ); +} + +#endif // gsl_HAVE( DEFAULT_FUNCTION_TEMPLATE_ARG ) + +// convert basic_string_span to byte span: + +template< class T > +gsl_api inline span< const byte > as_bytes( basic_string_span spn ) gsl_noexcept +{ + return span< const byte >( reinterpret_cast( spn.data() ), spn.size_bytes() ); // NOLINT +} + +// +// String types: +// + +typedef char * zstring; +typedef const char * czstring; + +#if gsl_HAVE( WCHAR ) +typedef wchar_t * wzstring; +typedef const wchar_t * cwzstring; +#endif + +typedef basic_string_span< char > string_span; +typedef basic_string_span< char const > cstring_span; + +#if gsl_HAVE( WCHAR ) +typedef basic_string_span< wchar_t > wstring_span; +typedef basic_string_span< wchar_t const > cwstring_span; +#endif + +// to_string() allow (explicit) conversions from string_span to string + +#if 0 + +template< class T > +inline std::basic_string< typename std::remove_const::type > to_string( basic_string_span spn ) +{ + std::string( spn.data(), spn.length() ); +} + +#else + +inline std::string to_string( string_span const & spn ) +{ + return std::string( spn.data(), spn.length() ); +} + +inline std::string to_string( cstring_span const & spn ) +{ + return std::string( spn.data(), spn.length() ); +} + +#if gsl_HAVE( WCHAR ) + +inline std::wstring to_string( wstring_span const & spn ) +{ + return std::wstring( spn.data(), spn.length() ); +} + +inline std::wstring to_string( cwstring_span const & spn ) +{ + return std::wstring( spn.data(), spn.length() ); +} + +#endif // gsl_HAVE( WCHAR ) +#endif // to_string() + +// +// Stream output for string_span types +// + +namespace detail { + +template< class Stream > +void write_padding( Stream & os, std::streamsize n ) +{ + for ( std::streamsize i = 0; i < n; ++i ) + os.rdbuf()->sputc( os.fill() ); +} + +template< class Stream, class Span > +Stream & write_to_stream( Stream & os, Span const & spn ) +{ + typename Stream::sentry sentry( os ); + + if ( !os ) + return os; + + const std::streamsize length = narrow( spn.length() ); + + // Whether, and how, to pad + const bool pad = ( length < os.width() ); + const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right; + + if ( left_pad ) + write_padding( os, os.width() - length ); + + // Write span characters + os.rdbuf()->sputn( spn.begin(), length ); + + if ( pad && !left_pad ) + write_padding( os, os.width() - length ); + + // Reset output stream width + os.width(0); + + return os; +} + +} // namespace detail + +template< typename Traits > +std::basic_ostream< char, Traits > & operator<<( std::basic_ostream< char, Traits > & os, string_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +template< typename Traits > +std::basic_ostream< char, Traits > & operator<<( std::basic_ostream< char, Traits > & os, cstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +#if gsl_HAVE( WCHAR ) + +template< typename Traits > +std::basic_ostream< wchar_t, Traits > & operator<<( std::basic_ostream< wchar_t, Traits > & os, wstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +template< typename Traits > +std::basic_ostream< wchar_t, Traits > & operator<<( std::basic_ostream< wchar_t, Traits > & os, cwstring_span const & spn ) +{ + return detail::write_to_stream( os, spn ); +} + +#endif // gsl_HAVE( WCHAR ) + +// +// ensure_sentinel() +// +// Provides a way to obtain a span from a contiguous sequence +// that ends with a (non-inclusive) sentinel value. +// +// Will fail-fast if sentinel cannot be found before max elements are examined. +// +namespace detail { + +template< class T, class SizeType, const T Sentinel > +gsl_api static span ensure_sentinel( T * seq, SizeType max = (std::numeric_limits::max)() ) +{ + typedef T * pointer; + + gsl_SUPPRESS_MSVC_WARNING( 26429, "f.23: symbol 'cur' is never tested for nullness, it can be marked as not_null" ) + pointer cur = seq; + + while ( static_cast( cur - seq ) < max && *cur != Sentinel ) + ++cur; + + gsl_Expects( *cur == Sentinel ); + + return span( seq, narrow_cast< typename span::index_type >( cur - seq ) ); +} +} // namespace detail + +// +// ensure_z - creates a string_span for a czstring or cwzstring. +// Will fail fast if a null-terminator cannot be found before +// the limit of size_type. +// + +template< class T > +gsl_api inline span ensure_z( T * const & sz, size_t max = (std::numeric_limits::max)() ) +{ + return detail::ensure_sentinel( sz, max ); +} + +template< class T, size_t N > +gsl_api inline span ensure_z( T (&sz)[N] ) +{ + return ::gsl::ensure_z( gsl_ADDRESSOF( sz[0] ), N ); +} + +# if gsl_HAVE( TYPE_TRAITS ) + +template< class Container > +inline span< typename std::remove_pointer::type > +ensure_z( Container & cont ) +{ + return ::gsl::ensure_z( cont.data(), cont.length() ); +} +# endif + +// +// basic_zstring_span<> - A view of contiguous null-terminated characters, replace (*,len). +// + +template +class basic_zstring_span +{ +public: + typedef T element_type; + typedef span span_type; + + typedef typename span_type::index_type index_type; + typedef typename span_type::difference_type difference_type; + + typedef element_type * czstring_type; + typedef basic_string_span string_span_type; + + gsl_api gsl_constexpr14 basic_zstring_span( span_type s ) + : span_( s ) + { + // expects a zero-terminated span + gsl_Expects( s[s.size() - 1] == '\0'); + } + +#if gsl_HAVE( IS_DEFAULT ) + gsl_constexpr basic_zstring_span( basic_zstring_span const & other ) = default; + gsl_constexpr basic_zstring_span( basic_zstring_span && other ) = default; + gsl_constexpr14 basic_zstring_span & operator=( basic_zstring_span const & other ) = default; + gsl_constexpr14 basic_zstring_span & operator=( basic_zstring_span && other ) = default; +#else + gsl_api gsl_constexpr basic_zstring_span( basic_zstring_span const & other) : span_ ( other.span_ ) {} + gsl_api gsl_constexpr basic_zstring_span & operator=( basic_zstring_span const & other ) { span_ = other.span_; return *this; } +#endif + + gsl_api gsl_constexpr bool empty() const gsl_noexcept + { + return span_.size() == 0; + } + + gsl_api gsl_constexpr string_span_type as_string_span() const gsl_noexcept + { + return string_span_type( span_.data(), span_.size() > 1 ? span_.size() - 1 : 0 ); + } + + /*gsl_api*/ // currently disabled due to an apparent NVCC bug + gsl_constexpr string_span_type ensure_z() const + { + return ::gsl::ensure_z(span_.data(), span_.size()); + } + + gsl_api gsl_constexpr czstring_type assume_z() const gsl_noexcept + { + return span_.data(); + } + +private: + span_type span_; +}; + +// +// zString types: +// + +typedef basic_zstring_span< char > zstring_span; +typedef basic_zstring_span< char const > czstring_span; + +#if gsl_HAVE( WCHAR ) +typedef basic_zstring_span< wchar_t > wzstring_span; +typedef basic_zstring_span< wchar_t const > cwzstring_span; +#endif + +} // namespace gsl + +#if gsl_CPP11_OR_GREATER || gsl_COMPILER_MSVC_VERSION >= 120 + +namespace std { + +template<> +struct hash< ::gsl::byte > +{ +public: + gsl_constexpr std::size_t operator()( ::gsl::byte v ) const gsl_noexcept + { + return ::gsl::to_integer( v ); + } +}; + +} // namespace std + +#endif + +#if gsl_FEATURE_GSL_LITE_NAMESPACE + +// gsl_lite namespace: + +// gsl-lite currently keeps all symbols in the namespace `gsl`. The `gsl_lite` namespace contains all the symbols in the +// `gsl` namespace, plus some extensions that are not specified in the Core Guidelines. +// +// Going forward, we want to support coexistence of gsl-lite with M-GSL, so we want to encourage using the `gsl_lite` +// namespace when consuming gsl-lite. Typical use in library code would be: +// +// #include // instead of +// +// namespace foo { +// namespace gsl = ::gsl_lite; // convenience alias +// double mean(gsl::span elements) { +// gsl_Expects(!elements.empty()); // instead of Expects() +// ... +// } +// } // namespace foo +// +// In a future version, the new header will only define the `gsl_lite` namespace and no +// unprefixed `Expects()` and `Ensures()` macros to avoid collision with M-GSL. To ensure backward compatibility, the +// old header will keep defining the `gsl` namespace and the `Expects()` and `Ensures()` macros. + +namespace gsl_lite +{ + +namespace std11 = ::gsl::std11; +namespace std14 = ::gsl::std14; +namespace std17 = ::gsl::std17; +namespace std20 = ::gsl::std20; + +using namespace std11; +using namespace std14; +using namespace std17; +using namespace std20; + +#if gsl_HAVE( SHARED_PTR ) +using std::unique_ptr; +using std::shared_ptr; +using std::make_shared; +#endif + +using ::gsl::index; + +// Integer type for dimensions. +typedef gsl_CONFIG_INDEX_TYPE dim; + +// Integer type for array strides. +typedef gsl_CONFIG_INDEX_TYPE stride; + +// Integer type for pointer, iterator, or index differences. +typedef gsl_CONFIG_INDEX_TYPE diff; + +#if gsl_HAVE( ALIAS_TEMPLATE ) +using ::gsl::owner; +#endif + +using ::gsl::fail_fast; + +using ::gsl::finally; +#if gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) +using ::gsl::on_return; +using ::gsl::on_error; +#endif // gsl_FEATURE( EXPERIMENTAL_RETURN_GUARD ) + +using ::gsl::narrow_cast; +using ::gsl::narrowing_error; +using ::gsl::narrow; +using ::gsl::narrow_failfast; + + +using ::gsl::at; + +using ::gsl::not_null; +using ::gsl::make_not_null; + +using ::gsl::byte; + +using ::gsl::with_container_t; +using ::gsl::with_container; + +using ::gsl::span; +using ::gsl::make_span; +using ::gsl::byte_span; +using ::gsl::copy; +using ::gsl::as_bytes; +using ::gsl::as_writable_bytes; +#if ! gsl_DEPRECATE_TO_LEVEL( 6 ) +using ::gsl::as_writeable_bytes; +#endif + +using ::gsl::basic_string_span; +using ::gsl::string_span; +using ::gsl::cstring_span; + +using ::gsl::basic_zstring_span; +using ::gsl::zstring_span; +using ::gsl::czstring_span; + +using ::gsl::zstring; +using ::gsl::czstring; + +#if gsl_HAVE( WCHAR ) +using ::gsl::wzstring; +using ::gsl::cwzstring; + +using ::gsl::wzstring_span; +using ::gsl::cwzstring_span; +#endif // gsl_HAVE( WCHAR ) + +} // namespace gsl_lite + +#endif // gsl_FEATURE_GSL_LITE_NAMESPACE + +gsl_RESTORE_MSVC_WARNINGS() + +#endif // GSL_GSL_LITE_HPP_INCLUDED + +// end of file diff --git a/buildroot-overlay/package/face_detect/main.cc b/buildroot-overlay/package/face_detect/main.cc new file mode 100755 index 0000000..a630c5b --- /dev/null +++ b/buildroot-overlay/package/face_detect/main.cc @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mobile_retinaface.h" +#ifdef LINUX_RUNTIME +#include "mmz.h" +#else +#include "mpi_sys_api.h" +#endif + +using namespace nncase; +using namespace nncase::runtime; +using namespace nncase::runtime::detail; + +#define img_channels 3 +#define img_rows 624 +#define img_cols 1024 + +std::atomic ai_stop(false); + +void ai_proc(const char *kmodel_file, const char *image_file) +{ + // input data + size_t paddr = 0; + void *vaddr = nullptr; + + auto in_data = read_binary_file(image_file); + MobileRetinaface model(kmodel_file, img_channels, img_rows, img_cols); + size_t idx = 0; + while (!ai_stop) + { + // run kpu + model.run(in_data); + auto result = model.get_result(); + + std::cout << "Detection results for image: " << image_file << std::endl; + std::cout << "Number of faces detected: " << result.boxes.size() << std::endl; + + for (size_t i = 0; i < result.boxes.size(); i++) { + auto box = result.boxes[i]; + auto landmark = result.landmarks[i]; + + std::cout << "Face " << i + 1 << ":" << std::endl; + std::cout << " Bounding box: " + << "(" << box.x1 << ", " << box.y1 << ") to " + << "(" << box.x2 << ", " << box.y2 << ")" << std::endl; + + std::cout << " Landmarks:" << std::endl; + for (int j = 0; j < 5; j++) { + std::cout << " Point " << j + 1 << ": " + << "(" << landmark.points[2 * j] << ", " << landmark.points[2 * j + 1] << ")" << std::endl; + } + std::cout << std::endl; + } + + std::cout << "----------------------------------------" << std::endl; + + if (result.boxes.size() > 0) { + idx++; + idx %= 10; + std::cout << "Processing count: " << idx << std::endl; + } + + ai_stop=1; + } +} + +void __attribute__((destructor)) cleanup() { + std::cout << "Cleaning up memory..." << std::endl; + shrink_memory_pool(); +#ifdef LINUX_RUNTIME + kd_mpi_mmz_deinit(); +#endif +} + +int main(int argc, char *argv[]) +{ + std::cout << "case " << argv[0] << " built at " << __DATE__ << " " << __TIME__ << std::endl; + if (argc != 3) + { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + return -1; + } + + ai_proc(argv[1], argv[2]); + + return 0; +} \ No newline at end of file diff --git a/buildroot-overlay/package/face_detect/mobile_retinaface.cc b/buildroot-overlay/package/face_detect/mobile_retinaface.cc new file mode 100755 index 0000000..d4dc2e3 --- /dev/null +++ b/buildroot-overlay/package/face_detect/mobile_retinaface.cc @@ -0,0 +1,618 @@ +#include +#include +#include +#include "mobile_retinaface.h" +#include "util.h" + +using namespace nncase; +using namespace nncase::runtime; +using namespace nncase::runtime::k230; + +#define MIN_SIZE 200 +#define LOC_SIZE 4 +#define CONF_SIZE 2 +#define LAND_SIZE 10 + +extern float anchors320[4200][4]; +typedef int (*__compar_fn_t) (__const void *, __const void *); +static float umeyama_args[] = +{ + 76.5892, 103.3926, + 147.0636, 103.0028, + 112.0504, 143.4732, + 83.0986, 184.731, + 141.4598,184.4082 +}; + +MobileRetinaface::MobileRetinaface(const char *kmodel_file, size_t channel, size_t height, size_t width) + : Model("MobileRetinaface", kmodel_file), ai2d_input_c_(channel), ai2d_input_h_(height), ai2d_input_w_(width) +{ +#if ENABLE_DEBUG + std::cout << __FUNCTION__ << ": c = " << channel << ", h = " << height << ", w = " << width << std::endl; +#endif + + // ai2d output tensor + ai2d_out_tensor_ = input_tensor(0); + + // ai2d config + dims_t in_shape { 1, ai2d_input_c_, ai2d_input_h_, ai2d_input_w_ }; + auto out_shape = input_shape(0); + + ai2d_datatype_t ai2d_dtype { ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, typecode_t::dt_uint8, typecode_t::dt_uint8 }; + ai2d_crop_param_t crop_param { false, 0, 0, 0, 0 }; + ai2d_shift_param_t shift_param { false, 0 }; + + float h_ratio = static_cast(height) / out_shape[2]; + float w_ratio = static_cast(width) / out_shape[3]; + float ratio = h_ratio > w_ratio ? h_ratio : w_ratio; + + int h_pad = out_shape[2] - height / ratio; + int h_pad_before = h_pad / 2; + int h_pad_after = h_pad - h_pad_before; + + int w_pad = out_shape[3] - width / ratio; + int w_pad_before = w_pad / 2; + int w_pad_after = w_pad - w_pad_before; + +#if ENABLE_DEBUG + std::cout << "h_ratio = " << h_ratio << ", w_ratio = " << w_ratio << ", ratio = " << ratio << std::endl; + std::cout << "h_pad = " << h_pad << ", h_pad_before = " << h_pad_before << ", h_pad_after = " << h_pad_after << std::endl; + std::cout << "w_pad = " << w_pad << ", w_pad_before = " << w_pad_before << ", w_pad_after = " << w_pad_after << std::endl; +#endif + + ai2d_pad_param_t pad_param{true, {{ 0, 0 }, { 0, 0 }, { h_pad_before, h_pad_after }, { w_pad_before, w_pad_after }}, ai2d_pad_mode::constant, { 0, 0, 0 }}; + ai2d_resize_param_t resize_param { true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel }; + ai2d_affine_param_t affine_param { false }; + ai2d_builder_.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + ai2d_builder_->build_schedule(); +} + +MobileRetinaface::~MobileRetinaface() +{ +} + +void MobileRetinaface::preprocess(std::vector &data) +{ +#if ENABLE_PROFILING + ScopedTiming st(model_name() + " " + __FUNCTION__); +#endif + + // ai2d input tensor + dims_t in_shape { 1, ai2d_input_c_, ai2d_input_h_, ai2d_input_w_ }; + auto ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, { (gsl::byte *)data.data(), (size_t)data.size() }, + true, hrt::pool_shared).expect("cannot create input tensor"); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("sync write_back failed"); + + // run ai2d + ai2d_builder_->invoke(ai2d_in_tensor, ai2d_out_tensor_).expect("error occurred in ai2d running"); +} + +void MobileRetinaface::postprocess() +{ +#if ENABLE_PROFILING + ScopedTiming st(model_name() + " " + __FUNCTION__); +#endif + + std::vector pred_box; + pred_box.reserve(16); + std::vector landmarks; + + decode(pred_box, landmarks); + + int long_side = ai2d_input_h_ > ai2d_input_w_ ? ai2d_input_h_ : ai2d_input_w_; + int short_side = ai2d_input_h_ < ai2d_input_w_ ? ai2d_input_h_ : ai2d_input_w_; + int pad = (long_side - short_side) / 2; + bool width_pad = long_side == ai2d_input_h_ ? true : false; + + // boxes + result_.boxes.clear(); + result_.boxes.reserve(pred_box.size()); + for (size_t i = 0; i < pred_box.size(); i++) + { + face_coordinate box; + + if(width_pad) + { + box.x1 = (int)(pred_box[i].x * long_side - pred_box[i].w * long_side / 2) - pad; + box.y1 = (int)(pred_box[i].y * long_side - pred_box[i].h * long_side / 2); + box.x2 = (int)(pred_box[i].x * long_side + pred_box[i].w * long_side / 2) - pad; + box.y2 = (int)(pred_box[i].y * long_side + pred_box[i].h * long_side / 2); + } + else + { + box.x1 = (int)(pred_box[i].x * long_side - pred_box[i].w * long_side / 2); + box.y1 = (int)(pred_box[i].y * long_side - pred_box[i].h * long_side / 2) - pad; + box.x2 = (int)(pred_box[i].x * long_side + pred_box[i].w * long_side / 2); + box.y2 = (int)(pred_box[i].y * long_side + pred_box[i].h * long_side / 2) - pad; + } + + box.x1 = box.x1 < 0 ? 1 : box.x1; + box.y1 = box.y1 < 0 ? 1 : box.y1; + box.x2 = box.x2 > ai2d_input_w_ ? ai2d_input_w_ : box.x2; + box.y2 = box.y2 > ai2d_input_h_ ? ai2d_input_h_ : box.y2; + + result_.boxes.push_back(box); +#if ENABLE_DEBUG + std::cout << "face_location: (" << box.x1 << ", " << box.y1 << "), (" << box.x2 << ", " << box.y2 << ")" << std::endl; +#endif + } + + // landmarks + result_.landmarks.clear(); + for (size_t i = 0; i < landmarks.size(); i++) + { + auto landmark = landmarks[i]; + int x = 0, y = 0; +#if ENABLE_DEBUG + std::cout << "landmark: "; +#endif + for (uint32_t j = 0; j < 5; j++) + { + if(width_pad) + { + x = (int)(landmark.points[2 * j + 0] * long_side) - pad; + y = (int)(landmark.points[2 * j + 1] * long_side); + } + else + { + x = (int)(landmark.points[2 * j + 0] * long_side); + y = (int)(landmark.points[2 * j + 1] * long_side) - pad; + } + + landmark.points[2 * j + 0] = x; + landmark.points[2 * j + 1] = y; + +#if ENABLE_DEBUG + std::cout << "(" << x << ", " << y << "),"; +#endif + } +#if ENABLE_DEBUG + std::cout << std::endl; +#endif + result_.landmarks.push_back(landmark); + } +} + +float MobileRetinaface::overlap(float x1, float w1, float x2, float w2) +{ + float l1 = x1 - w1 / 2; + float l2 = x2 - w2 / 2; + float left = l1 > l2 ? l1 : l2; + float r1 = x1 + w1 / 2; + float r2 = x2 + w2 / 2; + float right = r1 < r2 ? r1 : r2; + + return right - left; +} + +float MobileRetinaface::box_intersection(box_t a, box_t b) +{ + float w = overlap(a.x, a.w, b.x, b.w); + float h = overlap(a.y, a.h, b.y, b.h); + + if (w < 0 || h < 0) + return 0; + return w * h; +} + +float MobileRetinaface::box_union(box_t a, box_t b) +{ + float i = box_intersection(a, b); + float u = a.w * a.h + b.w * b.h - i; + + return u; +} + +float MobileRetinaface::box_iou(box_t a, box_t b) +{ + return box_intersection(a, b) / box_union(a, b); +} + +#if !ENABLE_RVV + +int nms_comparator(void* pa, void* pb) +{ + sortable_obj_t a = *(sortable_obj_t*)pa; + sortable_obj_t b = *(sortable_obj_t*)pb; + float diff = a.probs[a.index] - b.probs[b.index]; + + if (diff < 0) + return 1; + else if (diff > 0) + return -1; + return 0; +} + +void MobileRetinaface::deal_conf(float* conf, float* s_probs, sortable_obj_t* s, int size, int* obj_cnt) +{ + float prob[CONF_SIZE] = { 0.0 }; + for (uint32_t ww = 0; ww < size; ww++) + { + for (uint32_t hh = 0; hh < 2; hh++) + { + for (uint32_t cc = 0; cc < CONF_SIZE; cc++) + { + prob[cc] = conf[(hh * CONF_SIZE + cc) * size + ww]; + } + softmax(prob, prob, 2); + s[*obj_cnt].index = *obj_cnt; + s_probs[*obj_cnt] = prob[1]; + *obj_cnt += 1; + } + } +} + +void MobileRetinaface::deal_loc(float* loc, float* boxes, int size, int* obj_cnt) +{ + for (uint32_t ww = 0; ww < size; ww++) + { + for (uint32_t hh = 0; hh < 2; hh++) + { + for (uint32_t cc = 0; cc < LOC_SIZE; cc++) + { + boxes[*obj_cnt * LOC_SIZE + cc] = loc[(hh * LOC_SIZE + cc) * size + ww]; + } + *obj_cnt += 1; + } + } +} + +void MobileRetinaface::deal_landms(float* landms, float* landmarks, int size, int* obj_cnt) +{ + for (uint32_t ww = 0; ww < size; ww++) + { + for (uint32_t hh = 0; hh < 2; hh++) + { + for (uint32_t cc = 0; cc < LAND_SIZE; cc++) + { + landmarks[*obj_cnt * LAND_SIZE + cc] = landms[(hh * LAND_SIZE + cc) * size + ww]; + } + *obj_cnt += 1; + } + } +} + +box_t MobileRetinaface::get_box(float* boxes, int obj_index) +{ + float x, y, w, h; + x = boxes[obj_index * LOC_SIZE + 0]; + y = boxes[obj_index * LOC_SIZE + 1]; + w = boxes[obj_index * LOC_SIZE + 2]; + h = boxes[obj_index * LOC_SIZE + 3]; + x = anchors320[obj_index][0] + x * 0.1 * anchors320[obj_index][2]; + y = anchors320[obj_index][1] + y * 0.1 * anchors320[obj_index][3]; + w = anchors320[obj_index][2] * expf(w * 0.2); + h = anchors320[obj_index][3] * expf(h * 0.2); + box_t box; + box.x = x; + box.y = y; + box.w = w; + box.h = h; + return box; +} + +landmarks_t MobileRetinaface::get_landmark(float* landmarks, int obj_index) +{ + landmarks_t landmark; + for (uint32_t ll = 0; ll < 5; ll++) + { + landmark.points[2 * ll + 0] = anchors320[obj_index][0] + landmarks[obj_index * LAND_SIZE + 2 * ll + 0] * 0.1 * anchors320[obj_index][2]; + landmark.points[2 * ll + 1] = anchors320[obj_index][1] + landmarks[obj_index * LAND_SIZE + 2 * ll + 1] * 0.1 * anchors320[obj_index][3]; + } + return landmark; +} + +void MobileRetinaface::decode(std::vector &pred_box, std::vector &pred_landmarks) +{ + const size_t size = 9; + float *out[size]; + for (size_t i = 0; i < size; i++) + { + auto tensor = output_tensor(i); + auto buf = tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_read).unwrap().buffer(); + out[i] = reinterpret_cast(buf.data()); + // dump("kpu output " + std::to_string(i), out[i], 32); + } + + float *loc0 = out[0]; + float *loc1 = out[1]; + float *loc2 = out[2]; + float *conf0 = out[3]; + float *conf1 = out[4]; + float *conf2 = out[5]; + float *landms0 = out[6]; + float *landms1 = out[7]; + float *landms2 = out[8]; + + float box[LOC_SIZE] = { 0.0 }; + float landms[LAND_SIZE] = { 0.0 }; + int objs_num = MIN_SIZE * (1 + 4 + 16); + sortable_obj_t* s = (sortable_obj_t*)malloc(objs_num * sizeof(sortable_obj_t)); + float* s_probs = (float*)malloc(objs_num * sizeof(float)); + int obj_cnt = 0; + deal_conf(conf0, s_probs, s, 16 * MIN_SIZE / 2, &obj_cnt); + deal_conf(conf1, s_probs, s, 4 * MIN_SIZE / 2, &obj_cnt); + deal_conf(conf2, s_probs, s, 1 * MIN_SIZE / 2, &obj_cnt); + + float* boxes = (float*)malloc(objs_num * LOC_SIZE * sizeof(float)); + obj_cnt = 0; + deal_loc(loc0, boxes, 16 * MIN_SIZE / 2, &obj_cnt); + deal_loc(loc1, boxes, 4 * MIN_SIZE / 2, &obj_cnt); + deal_loc(loc2, boxes, 1 * MIN_SIZE / 2, &obj_cnt); + + float* landmarks = (float*)malloc(objs_num * LAND_SIZE * sizeof(float)); + obj_cnt = 0; + deal_landms(landms0, landmarks, 16 * MIN_SIZE / 2, &obj_cnt); + deal_landms(landms1, landmarks, 4 * MIN_SIZE / 2, &obj_cnt); + deal_landms(landms2, landmarks, 1 * MIN_SIZE / 2, &obj_cnt); + + sortable_obj_t* s_copy = (sortable_obj_t*)malloc(objs_num * sizeof(sortable_obj_t)); + float* s_probs_copy = (float*)malloc(objs_num * sizeof(float)); + memset(s_probs_copy, 0, objs_num * sizeof(float)); + obj_cnt = 0; + for (uint32_t oo = 0; oo < objs_num; oo++) + { + if(s_probs[oo] >= obj_threshold_) + { + s_probs_copy[obj_cnt] = s_probs[oo]; + s_copy[obj_cnt].index = s[oo].index; + obj_cnt += 1; + } + s[oo].probs = s_probs; + } + for (uint32_t oo = 0; oo < obj_cnt; oo++) + { + s_copy[oo].probs = s_probs_copy; + } + qsort(s_copy, obj_cnt, sizeof(sortable_obj_t), (__compar_fn_t)nms_comparator); + qsort(s, objs_num, sizeof(sortable_obj_t), (__compar_fn_t)nms_comparator); + int iou_cal_times = 0; + int i, j, k, obj_index; + for (i = 0; i < objs_num; ++i) + { + obj_index = s[i].index; + //cout << "s_probs[obj_index]: " << s_probs[obj_index] << endl; + //cout << "obj_threshold_: " << obj_threshold_ << endl; + if (s_probs[obj_index] < obj_threshold_) + continue; + // s_probs[obj_index]: 0.99418 + //cout << "s_probs[obj_index]: " << s_probs[obj_index] << endl; + //printf("pred conf: %f\n", s_probs[obj_index]); + box_t a = get_box(boxes, obj_index); + pred_box.push_back(a); + + landmarks_t l = get_landmark(landmarks, obj_index); + pred_landmarks.push_back(l); + // box a: 0.543867, 0.470195, 0.090413, 0.116365 + // cout << "box a: " << a.x << ", " << a.y << ", " << a.w << ", " << a.h << ";" << endl; + // printf("pred box: %f, %f, %f, %f\n", a.x, a.y, a.w, a.h); + for (j = i + 1; j < objs_num; ++j){ + obj_index = s[j].index; + if (s_probs[obj_index] < obj_threshold_) + continue; + box_t b = get_box(boxes, obj_index); + iou_cal_times += 1; + if (box_iou(a, b) >= nms_threshold_) + s_probs[obj_index] = 0; + } + } + + free(s_probs_copy); + free(s_copy); + free(landmarks); + free(boxes); + free(s_probs); + free(s); +} +#else + +void MobileRetinaface::deal_conf_opt(float* conf, float* s_probs, int* s, int size, int* obj_cnt, int* real_count, float* tmp) +{ + softmax_2group_vec(size, conf, conf + size, tmp, tmp + size); // + softmax_2group_vec(size, conf + 2 * size, conf + 3 * size, tmp + 2 * size, tmp + 3 * size); + register int cnt = *obj_cnt; + register int index_s = *real_count; + + for(int i = 0; i < size; ++i) + { + register float soft_vlaue = tmp[size + i]; + if(soft_vlaue >= obj_threshold_) + { + s[index_s] = cnt; + s_probs[index_s] = soft_vlaue; + ++ index_s; + } + cnt += 1; + soft_vlaue = tmp[size * 3 + i]; + if(soft_vlaue >= obj_threshold_) + { + s[index_s] = cnt; + s_probs[index_s] = soft_vlaue; + ++ index_s; + } + cnt += 1; + } + + *obj_cnt= cnt; + *real_count = index_s; +} + + +void MobileRetinaface::deal_loc_opt(float* loc, float* boxes, int size, int* obj_cnt, int* s, int* real_count) +{ + register int cnt = *obj_cnt; + register int index_s = *real_count; + for (uint32_t ww = 0; ww < size; ww++) + { + for (uint32_t hh = 0; hh < 2; hh++) + { + if(cnt == s[index_s]) + { + for (uint32_t cc = 0; cc < LOC_SIZE; cc++) + { + boxes[index_s * LOC_SIZE + cc] = loc[(hh * LOC_SIZE + cc) * size + ww]; + } + index_s += 1; + } + cnt += 1; + + } + } + *obj_cnt = cnt; + *real_count = index_s; +} + +void MobileRetinaface::deal_landms_opt(float* landms, float* landmarks, int size, int* obj_cnt, int* s, int* real_count) +{ + register int cnt = *obj_cnt; + register int index_s = *real_count; + for (uint32_t ww = 0; ww < size; ww++) + { + for (uint32_t hh = 0; hh < 2; hh++) + { + if(cnt == s[index_s]) + { + for (uint32_t cc = 0; cc < LAND_SIZE; cc++) + { + landmarks[index_s * LAND_SIZE + cc] = landms[(hh * LAND_SIZE + cc) * size + ww]; + } + index_s += 1; + } + cnt += 1; + } + } + *obj_cnt = cnt; + *real_count = index_s; +} + +box_t MobileRetinaface::get_box_opt(float* boxes, int obj_index, int index_anchors) +{ + float x, y, w, h; + x = boxes[obj_index * LOC_SIZE + 0]; + y = boxes[obj_index * LOC_SIZE + 1]; + w = boxes[obj_index * LOC_SIZE + 2]; + h = boxes[obj_index * LOC_SIZE + 3]; + x = anchors320[index_anchors][0] + x * 0.1 * anchors320[index_anchors][2]; + y = anchors320[index_anchors][1] + y * 0.1 * anchors320[index_anchors][3]; + w = anchors320[index_anchors][2] * k230_expf(w * 0.2); + h = anchors320[index_anchors][3] * k230_expf(h * 0.2); + box_t box; + box.x = x; + box.y = y; + box.w = w; + box.h = h; + return box; +} + +landmarks_t MobileRetinaface::get_landmark_opt(float* landmarks, int obj_index, int index_anchors) +{ + landmarks_t landmark; + for (uint32_t ll = 0; ll < 5; ll++) + { + landmark.points[2 * ll + 0] = anchors320[index_anchors][0] + landmarks[obj_index * LAND_SIZE + 2 * ll + 0] * 0.1 * anchors320[index_anchors][2]; + landmark.points[2 * ll + 1] = anchors320[index_anchors][1] + landmarks[obj_index * LAND_SIZE + 2 * ll + 1] * 0.1 * anchors320[index_anchors][3]; + } + return landmark; +} + +static float* cmp_prob; +int nms_comparator2(void* pa, void* pb) +{ + int a = *(int*)pa; + int b = *(int*)pb; + + if(cmp_prob[a] < cmp_prob[b]) + return 1; + else if(cmp_prob[a] > cmp_prob[b]) + return -1; + else + return 0; +} + +void MobileRetinaface::decode(std::vector &pred_box, std::vector &pred_landmarks) +{ + const size_t size = 9; + float *out[size]; + for (size_t i = 0; i < size; i++) + { + auto tensor = output_tensor(i); + auto buf = tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_read).unwrap().buffer(); + out[i] = reinterpret_cast(buf.data()); + } + + float *loc0 = out[0]; + float *loc1 = out[1]; + float *loc2 = out[2]; + float *conf0 = out[3]; + float *conf1 = out[4]; + float *conf2 = out[5]; + float *landms0 = out[6]; + float *landms1 = out[7]; + float *landms2 = out[8]; + + int objs_num = MIN_SIZE * (1 + 4 + 16); + int* s = (int*)malloc(objs_num * sizeof(int)); + float* s_probs = (float*)malloc(objs_num * sizeof(float)); + cmp_prob = s_probs; + int obj_cnt = 0; + int real_count = 0; + + float*tmp = (float*)malloc(16 * MIN_SIZE / 2 * sizeof(float) * CONF_SIZE * 2); + + deal_conf_opt(conf0, s_probs, s, 16 * MIN_SIZE / 2, &obj_cnt, &real_count, tmp); + deal_conf_opt(conf1, s_probs, s, 4 * MIN_SIZE / 2, &obj_cnt, &real_count, tmp); + deal_conf_opt(conf2, s_probs, s, 1 * MIN_SIZE / 2, &obj_cnt, &real_count, tmp); + + float* boxes = (float*)malloc(objs_num * LOC_SIZE * sizeof(float)); + obj_cnt = 0; + int real_count_box = 0; + + deal_loc_opt(loc0, boxes, 16 * MIN_SIZE / 2, &obj_cnt, s, &real_count_box); + deal_loc_opt(loc1, boxes, 4 * MIN_SIZE / 2, &obj_cnt, s, &real_count_box); + deal_loc_opt(loc2, boxes, 1 * MIN_SIZE / 2, &obj_cnt, s, &real_count_box); + + float* landmarks = (float*)malloc(objs_num * LAND_SIZE * sizeof(float)); + obj_cnt = 0; + int real_count_landms = 0; + deal_landms_opt(landms0, landmarks, 16 * MIN_SIZE / 2, &obj_cnt, s, &real_count_landms); + deal_landms_opt(landms1, landmarks, 4 * MIN_SIZE / 2, &obj_cnt, s, &real_count_landms); + deal_landms_opt(landms2, landmarks, 1 * MIN_SIZE / 2, &obj_cnt, s, &real_count_landms); + + objs_num = real_count; + int* s_int = (int*)malloc(objs_num * sizeof(int)); + for(int i = 0; i < objs_num; ++i) + { + s_int[i] = i; + } + qsort(s_int, objs_num, sizeof(int), (__compar_fn_t)nms_comparator2); + + for (int i = 0; i < objs_num; ++i) + { + int obj_index = s_int[i]; + if (s_probs[obj_index] < obj_threshold_) + continue; + box_t a = get_box_opt(boxes, obj_index, s[obj_index]); + pred_box.push_back(a); + + landmarks_t l = get_landmark_opt(landmarks, obj_index, s[obj_index]); + pred_landmarks.push_back(l); + for (int j = i + 1; j < objs_num; ++j) + { + obj_index = s_int[j]; + if (s_probs[obj_index] < obj_threshold_) + continue; + box_t b = get_box_opt(boxes, obj_index, s[obj_index]); + if (box_iou(a, b) >= nms_threshold_) + s_probs[obj_index] = 0; + } + } + + free(s_int); + free(landmarks); + free(boxes); + free(tmp); + free(s_probs); + free(s); +} + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/face_detect/mobile_retinaface.h b/buildroot-overlay/package/face_detect/mobile_retinaface.h new file mode 100755 index 0000000..d70f8d6 --- /dev/null +++ b/buildroot-overlay/package/face_detect/mobile_retinaface.h @@ -0,0 +1,60 @@ +#ifndef _MOBILE_RETINAFACE_H +#define _MOBILE_RETINAFACE_H +#include "model.h" +#include "util.h" + +#if ENABLE_RVV +#include "k230_math.h" +#include "rvv_math.h" +#endif + +typedef struct +{ + std::vector boxes; + std::vector landmarks; +} DetectResult; + +class MobileRetinaface : public Model +{ +public: + MobileRetinaface(const char *kmodel_file, size_t channel, size_t height, size_t width); + ~MobileRetinaface(); + DetectResult get_result() const + { + return result_; + } + +protected: + void preprocess(std::vector &data); + void postprocess(); + +private: + void decode(std::vector &pred_box, std::vector &pred_landmarks); + float overlap(float x1, float w1, float x2, float w2); + float box_intersection(box_t a, box_t b); + float box_union(box_t a, box_t b); + float box_iou(box_t a, box_t b); +#if !ENABLE_RVV + void deal_conf(float *conf, float *s_probs, sortable_obj_t *s, int size, int *obj_cnt); + void deal_loc(float *loc, float *boxes, int size, int *obj_cnt); + void deal_landms(float *landms, float *landmarks, int size, int *obj_cnt); + box_t get_box(float *boxes, int obj_index); + landmarks_t get_landmark(float *landmarks, int obj_index); +#else + void deal_conf_opt(float *conf, float *s_probs, int *s, int size, int *obj_cnt, int *real_count, float *tmp); + void deal_loc_opt(float *loc, float *boxes, int size, int *obj_cnt, int *s, int *real_count); + void deal_landms_opt(float *landms, float *landmarks, int size, int *obj_cnt, int *s, int *real_count); + box_t get_box_opt(float *boxes, int obj_index, int index_anchors); + landmarks_t get_landmark_opt(float *landmarks, int obj_index, int index_anchors); +#endif + +private: + size_t ai2d_input_c_; + size_t ai2d_input_h_; + size_t ai2d_input_w_; + float obj_threshold_ = 0.6f; + float nms_threshold_ = 0.5f; + DetectResult result_; +}; + +#endif diff --git a/buildroot-overlay/package/face_detect/model.cc b/buildroot-overlay/package/face_detect/model.cc new file mode 100755 index 0000000..2631215 --- /dev/null +++ b/buildroot-overlay/package/face_detect/model.cc @@ -0,0 +1,73 @@ +#include +#include +#include +#include "model.h" +#include "util.h" + +Model::Model(const char *model_name, const char *kmodel_file): model_name_(model_name) +{ + // load kmodel + std::ifstream ifs(kmodel_file, std::ios::binary); + interp_.load_model(ifs).expect("load_model failed"); + + // create kpu input tensors + for (size_t i = 0; i < interp_.inputs_size(); i++) + { + auto desc = interp_.input_desc(i); + auto shape = interp_.input_shape(i); + auto tensor = host_runtime_tensor::create(desc.datatype, shape, hrt::pool_shared).expect("cannot create input tensor"); + interp_.input_tensor(i, tensor).expect("cannot set input tensor"); + } +} + +Model::~Model() +{ + +} + +void Model::run(std::vector &data) +{ + preprocess(data); + kpu_run(); + postprocess(); +} + +std::string Model::model_name() const +{ + return model_name_; +} + +void Model::kpu_run() +{ +#if ENABLE_PROFILING + ScopedTiming st(model_name() + " " + __FUNCTION__); +#endif + + interp_.run().expect("error occurred in running model"); +} + +runtime_tensor Model::input_tensor(size_t idx) +{ + return interp_.input_tensor(idx).expect("cannot get input tensor"); +} + +void Model::input_tensor(size_t idx, runtime_tensor &tensor) +{ + interp_.input_tensor(idx, tensor).expect("cannot set input tensor"); +} + +runtime_tensor Model::output_tensor(size_t idx) +{ + printf("output tensor idx: %d\n", idx); + return interp_.output_tensor(idx).expect("cannot get output tensor"); +} + +dims_t Model::input_shape(size_t idx) +{ + return interp_.input_shape(idx); +} + +dims_t Model::output_shape(size_t idx) +{ + return interp_.output_shape(idx); +} diff --git a/buildroot-overlay/package/face_detect/model.h b/buildroot-overlay/package/face_detect/model.h new file mode 100755 index 0000000..5cf34bb --- /dev/null +++ b/buildroot-overlay/package/face_detect/model.h @@ -0,0 +1,44 @@ +#ifndef _MODEL_H +#define _MODEL_H + +#include +#include +#include +// #include +// #include +// #include +#include "util.h" + +using namespace nncase; +using namespace nncase::runtime; +using namespace nncase::runtime::detail; +using namespace nncase::F::k230; + +class Model +{ +public: + Model(const char *model_name, const char *kmodel_file); + ~Model(); + void run(std::vector &data); + std::string model_name() const; + +protected: + virtual void preprocess(std::vector &data) = 0; + void kpu_run(); + virtual void postprocess() = 0; + runtime_tensor input_tensor(size_t idx); + void input_tensor(size_t idx, runtime_tensor &tensor); + runtime_tensor output_tensor(size_t idx); + dims_t input_shape(size_t idx); + dims_t output_shape(size_t idx); +protected: + std::unique_ptr ai2d_builder_; + runtime_tensor ai2d_in_tensor_; + runtime_tensor ai2d_out_tensor_; + +private: + interpreter interp_; + std::string model_name_; + std::vector kmodel_; +}; +#endif diff --git a/buildroot-overlay/package/face_detect/run.sh b/buildroot-overlay/package/face_detect/run.sh new file mode 100644 index 0000000..227a731 --- /dev/null +++ b/buildroot-overlay/package/face_detect/run.sh @@ -0,0 +1 @@ +./face_detect.elf face_detection_320.kmodel ai2d_input.bin diff --git a/buildroot-overlay/package/face_detect/util.cc b/buildroot-overlay/package/face_detect/util.cc new file mode 100755 index 0000000..23be428 --- /dev/null +++ b/buildroot-overlay/package/face_detect/util.cc @@ -0,0 +1,61 @@ +#include +#include +#include +#include "util.h" + +void read_binary_file(const char *file_name, char *buffer, size_t size) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + if (size != 0) + { + len = size; + } + + ifs.seekg(0, ifs.beg); + ifs.read(buffer, len); + ifs.close(); +} + +void dump(const std::string &info, volatile float *p, size_t size) +{ + std::cout << info << " dump: p = " << std::hex << (void *)p << std::dec << ", size = " << size << std::endl; + volatile unsigned int *q = reinterpret_cast(p); + for (size_t i = 0; i < size; i++) + { + if ((i != 0) && (i % 4 == 0)) + { + std::cout << std::endl; + } + + std::cout << std::hex << q[i] << " "; + } + std::cout << std::dec << std::endl; +} + +void softmax(float* x, float* dx, uint32_t len) +{ + float max_value = x[0]; + for (uint32_t i = 0; i < len; i++) + { + if (max_value < x[i]) + { + max_value = x[i]; + } + } + for (uint32_t i = 0; i < len; i++) + { + x[i] -= max_value; + x[i] = expf(x[i]); + } + float sum_value = 0.0f; + for (uint32_t i = 0; i < len; i++) + { + sum_value += x[i]; + } + for (uint32_t i = 0; i < len; i++) + { + dx[i] = x[i] / sum_value; + } +} diff --git a/buildroot-overlay/package/face_detect/util.h b/buildroot-overlay/package/face_detect/util.h new file mode 100755 index 0000000..5172ff6 --- /dev/null +++ b/buildroot-overlay/package/face_detect/util.h @@ -0,0 +1,75 @@ +#ifndef _UTIL_H +#define _UTIL_H +#include +#include +#include + +#define ENABLE_RVV 0 +#define ENABLE_DEBUG 0 +#define ENABLE_PROFILING 0 + +typedef struct +{ + int index; + float* probs; +} sortable_obj_t; + +typedef struct +{ + float x; + float y; + float w; + float h; +} box_t; + +typedef struct +{ + float points[10]; +} landmarks_t; + +typedef struct +{ + int x1; + int y1; + int x2; + int y2; +} face_coordinate; + +void read_binary_file(const char *file_name, char *buffer, size_t size = 0); +template +std::vector read_binary_file(const char *file_name) +{ + std::ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + std::vector vec(len / sizeof(T), 0); + ifs.seekg(0, ifs.beg); + ifs.read(reinterpret_cast(vec.data()), len); + ifs.close(); + return std::move(vec); +} +void dump(const std::string &info, volatile float *p, size_t size); +void softmax(float *x, float *dx, uint32_t len); + +class ScopedTiming +{ +public: + ScopedTiming(std::string info = "ScopedTiming") + : m_info(info) + { + m_start = std::chrono::steady_clock::now(); + } + + ~ScopedTiming() + { + m_stop = std::chrono::steady_clock::now(); + double elapsed_ms = std::chrono::duration(m_stop - m_start).count(); + std::cout << m_info << " took " << elapsed_ms << " ms" << std::endl; + } + +private: + std::string m_info; + std::chrono::steady_clock::time_point m_start; + std::chrono::steady_clock::time_point m_stop; +}; +#endif diff --git a/buildroot-overlay/package/libmmz/Config.in b/buildroot-overlay/package/libmmz/Config.in new file mode 100644 index 0000000..cd83ec2 --- /dev/null +++ b/buildroot-overlay/package/libmmz/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_LIBMMZ + bool "libmmz" + help + mmz lib diff --git a/buildroot-overlay/package/libmmz/Makefile b/buildroot-overlay/package/libmmz/Makefile new file mode 100644 index 0000000..358ee80 --- /dev/null +++ b/buildroot-overlay/package/libmmz/Makefile @@ -0,0 +1,17 @@ +CFLAG := -mcpu=c908v -O2 + +ifeq ($(CC), cc) + CC=riscv64-unknown-linux-gnu-gcc +endif + +ifeq ($(AR), ar) + AR=riscv64-unknown-linux-gnu-ar +endif + +all: + echo $(CC) + $(CC) $(CFLAG) -c mmz.c + $(AR) rcs libmmz.a mmz.o + +clean: + rm -f *.o \ No newline at end of file diff --git a/buildroot-overlay/package/libmmz/libmmz.a b/buildroot-overlay/package/libmmz/libmmz.a new file mode 100644 index 0000000..d57a293 Binary files /dev/null and b/buildroot-overlay/package/libmmz/libmmz.a differ diff --git a/buildroot-overlay/package/libmmz/libmmz.mk b/buildroot-overlay/package/libmmz/libmmz.mk new file mode 100644 index 0000000..7407e7c --- /dev/null +++ b/buildroot-overlay/package/libmmz/libmmz.mk @@ -0,0 +1,12 @@ +LIBMMZ_SITE = $(realpath $(TOPDIR))"/package/libmmz" +LIBMMZ_SITE_METHOD = local + +define LIBMMZ_BUILD_CMDS + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" AR="$(TARGET_AR)" -C $(@D) +endef + +define LIBMMZ_INSTALL_TARGET_CMDS + $(INSTALL) -m 0755 $(@D)/libmmz.a $(TARGET_DIR)/usr/lib/ +endef + +$(eval $(generic-package)) diff --git a/buildroot-overlay/package/libmmz/mmz.c b/buildroot-overlay/package/libmmz/mmz.c new file mode 100755 index 0000000..9cbdf37 --- /dev/null +++ b/buildroot-overlay/package/libmmz/mmz.c @@ -0,0 +1,260 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include"mmz.h" + +#define MMZ_ALLOC_MEM _IOWR('g', 1, unsigned long) +#define MMZ_FREE_MEM _IOWR('g', 2, unsigned long) + +#define MMZ_DEV "/dev/mmz" + +typedef struct { + void *user_virt_addr; + void *kernel_virt_addr; + unsigned long mmz_phys; + unsigned long length; +} mmz_data_type; + +typedef struct s_mmz_node +{ + mmz_data_type data; + struct s_mmz_node* next; +}mmz_node; + +static pthread_mutex_t mmz_mutex = PTHREAD_MUTEX_INITIALIZER; +int fd_mmz = -1; +mmz_node* plist = NULL; +int mmz_init_flag = 0; + +static inline void thead_csi_dcache_clean_invalid_range(void* addr, uint64_t size) +{ + uint64_t op_addr = (uint64_t)addr; + int64_t op_size = size + op_addr % 64; + const int64_t linesize = 64; + + __asm volatile("fence iorw, iorw"); + + while (op_size > 0) { + __asm volatile("dcache.civa %0" : : "r"(op_addr)); + op_addr += linesize; + op_size -= linesize; + } + + __asm volatile("fence iorw, iorw"); + __asm volatile("fence.i"); + __asm volatile("fence r, r"); +} + +static mmz_node* mmz_create_node(void) +{ + mmz_node* newnode = (mmz_node*)malloc(sizeof(mmz_node)); + if (newnode == NULL) + { + perror("malloc"); + exit(1); + } + memset(&(newnode->data), 0, sizeof(newnode->data)); + newnode->next = NULL; + + return newnode; +} + +static void mmz_push_back(mmz_node** pphead, mmz_node* node) +{ + assert(pphead); + mmz_node* newnode = node; + if (*pphead == NULL) + { + *pphead = newnode; + } + else + { + mmz_node* ptail = *pphead; + while (ptail->next != NULL) + { + ptail = ptail->next; + } + ptail->next = newnode; + } +} + +static void mmz_pop_front(mmz_node** pphead) +{ + assert(pphead); + assert(*pphead); + mmz_node* next = (*pphead)->next; + free(*pphead); + *pphead = next; +} + +static mmz_node* mmz_find(mmz_node* phead, void *ptr) +{ + mmz_node* pcur = phead; + while (pcur) + { + if (pcur->data.user_virt_addr == ptr) + { + return pcur; + } + pcur = pcur->next; + } + return NULL; +} + +static void mmz_erase(mmz_node** pphead, mmz_node* pos) +{ + assert(pphead); + assert(*pphead); + assert(pos); + + if (pos == *pphead) + { + mmz_pop_front(pphead); + } + else + { + mmz_node* prev = *pphead; + while (prev->next != pos) + { + prev = prev->next; + } + prev->next = pos->next; + free(pos); + pos = NULL; + } +} + +static int mmz_free(unsigned long phy_addr, void *virt_addr) +{ + mmz_node* ret = mmz_find(plist, virt_addr); + if(ret == NULL) + { + printf("Find Err\n"); + return -1; + } + else + { + // printf("Find pass\n"); + // printf("PHY 0x%llX, user addr %p\n\n", ret->data.mmz_phys, ret->data.user_virt_addr); + } + + if (munmap(virt_addr, ret->data.length) == -1) { + printf("failed to munmap /dev/mmz!"); + } + + ioctl(fd_mmz, MMZ_FREE_MEM, &ret->data); + + mmz_erase(&plist, ret); + + return 0; +} + +static int mmz_destroy(mmz_node** pphead) +{ + mmz_node* pcur = *pphead; + while (pcur) + { + mmz_node* tmp = pcur->next; + + if(mmz_free(pcur->data.mmz_phys, pcur->data.user_virt_addr)) + { + return -1; + } + pcur = tmp; + } + + return 0; +} + +static int mmz_init(void) +{ + fd_mmz = open(MMZ_DEV, O_RDWR | O_SYNC); + if(fd_mmz < 0) + { + printf("open k230-mmz error\n"); + return -1; + } + return 0; +} + +int kd_mpi_sys_mmz_alloc(unsigned long *phy_addr, void **virt_addr, const char *mmb, const char *zone, unsigned int len) +{ + mmz_node *tmp; + pthread_mutex_lock(&mmz_mutex); + + if(fd_mmz < 0) { + if(mmz_init()) { + pthread_mutex_unlock(&mmz_mutex); + return -1; + } + } + + tmp = mmz_create_node(); + tmp->data.length = len; + ioctl(fd_mmz, MMZ_ALLOC_MEM, &(tmp->data)); + // printf("Alloc phy 0x%llX\n", tmp->data.mmz_phys); + tmp->data.user_virt_addr = mmap(NULL, tmp->data.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd_mmz, tmp->data.mmz_phys); + if (tmp->data.user_virt_addr == MAP_FAILED) { + pthread_mutex_unlock(&mmz_mutex); + printf("failed to mmap /dev/mmz!"); + return -1; + } + + *phy_addr = tmp->data.mmz_phys; + *virt_addr = tmp->data.user_virt_addr; + mmz_push_back(&plist, tmp); + pthread_mutex_unlock(&mmz_mutex); + + return 0; +} + +int kd_mpi_sys_mmz_alloc_cached(unsigned long *phy_addr, void **virt_addr, const char *mmb, const char *zone, unsigned int len) +{ + return kd_mpi_sys_mmz_alloc(phy_addr, virt_addr, mmb, zone, len); +} + +int kd_mpi_sys_mmz_free(unsigned long phy_addr, void *virt_addr) +{ + pthread_mutex_lock(&mmz_mutex); + mmz_free(phy_addr, virt_addr); + pthread_mutex_unlock(&mmz_mutex); + + return 0; +} + +int kd_mpi_sys_mmz_flush_cache(unsigned long phy_addr, void *virt_addr, unsigned int size) +{ + thead_csi_dcache_clean_invalid_range(virt_addr, size); + return 0; +} + +int kd_mpi_mmz_init(void) +{ + int ret = 0; + + pthread_mutex_lock(&mmz_mutex); + ret = mmz_init(); + pthread_mutex_unlock(&mmz_mutex); + + return ret; +} + +int kd_mpi_mmz_deinit(void) +{ + pthread_mutex_lock(&mmz_mutex); + mmz_destroy(&plist); + if(fd_mmz >= 0) + close(fd_mmz); + fd_mmz = -1; + plist = NULL; + pthread_mutex_unlock(&mmz_mutex); + return 0; +} diff --git a/buildroot-overlay/package/libmmz/mmz.h b/buildroot-overlay/package/libmmz/mmz.h new file mode 100755 index 0000000..8542e5a --- /dev/null +++ b/buildroot-overlay/package/libmmz/mmz.h @@ -0,0 +1,19 @@ +#ifndef __MMZ__ +#define __MMZ__ + +#ifdef __cplusplus +extern "C" { +#endif /* End of #ifdef __cplusplus */ + +int kd_mpi_mmz_init(void); +int kd_mpi_mmz_deinit(void); +int kd_mpi_sys_mmz_alloc(unsigned long *phy_addr, void **virt_addr, const char *mmb, const char *zone, unsigned int len); +int kd_mpi_sys_mmz_alloc_cached(unsigned long *phy_addr, void **virt_addr, const char *mmb, const char *zone, unsigned int len); +int kd_mpi_sys_mmz_flush_cache(unsigned long phy_addr, void *virt_addr, unsigned int size); +int kd_mpi_sys_mmz_free(unsigned long phy_addr, void *virt_addr); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/buildroot-overlay/package/libnncase/Config.in b/buildroot-overlay/package/libnncase/Config.in new file mode 100644 index 0000000..21f3768 --- /dev/null +++ b/buildroot-overlay/package/libnncase/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_LIBNNCASE + bool "nncase runtime" + help + nncase runtime diff --git a/buildroot-overlay/package/libnncase/libnncase.hash b/buildroot-overlay/package/libnncase/libnncase.hash new file mode 100644 index 0000000..f708c27 --- /dev/null +++ b/buildroot-overlay/package/libnncase/libnncase.hash @@ -0,0 +1 @@ +sha256 7220fa6094c05fb7d410cd16422f0d09805e4ff58a6404f039f059ebe5a04f82 nncase_k230_v2.9.0_runtime_linux.tgz diff --git a/buildroot-overlay/package/libnncase/libnncase.mk b/buildroot-overlay/package/libnncase/libnncase.mk new file mode 100644 index 0000000..7be74ca --- /dev/null +++ b/buildroot-overlay/package/libnncase/libnncase.mk @@ -0,0 +1,11 @@ +LIBNNCASE_VERSION = +NNCASE_VERSION = v2.9.0 +LIBNNCASE_SOURCE = nncase_k230_$(NNCASE_VERSION)_runtime_linux.tgz +LIBNNCASE_SITE = https://github.com/kendryte/nncase/releases/download/$(NNCASE_VERSION) + +define LIBNNCASE_EXTRACT_CMDS + tar zxf $(LIBNNCASE_DL_DIR)/$(LIBNNCASE_SOURCE) -C $(@D) + mv $(@D)/nncase_k230_$(NNCASE_VERSION)_runtime_linux $(@D)/nncase +endef + +$(eval $(generic-package)) \ No newline at end of file diff --git a/buildroot-overlay/package/lvgl/0001-modify-cpu-usage-method.patch b/buildroot-overlay/package/lvgl/0001-modify-cpu-usage-method.patch new file mode 100644 index 0000000..b7b1758 --- /dev/null +++ b/buildroot-overlay/package/lvgl/0001-modify-cpu-usage-method.patch @@ -0,0 +1,87 @@ +From 892efae80ad619da97985d572e8e670d925fdeb7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E6=87=BF?= + +Date: Thu, 25 Jul 2024 14:57:46 +0800 +Subject: [PATCH] modify cpu usage method +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: 黄子懿 +--- + src/core/lv_refr.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 44 insertions(+), 1 deletion(-) + +diff --git a/lvgl/src/core/lv_refr.c b/lvgl/src/core/lv_refr.c +index 45ff2e0e7..3728a3979 100644 +--- a/lvgl/src/core/lv_refr.c ++++ b/lvgl/src/core/lv_refr.c +@@ -7,6 +7,8 @@ + * INCLUDES + *********************/ + #include ++#include ++#include + #include "lv_refr.h" + #include "lv_disp.h" + #include "../hal/lv_hal_tick.h" +@@ -279,6 +281,47 @@ void _lv_refr_set_disp_refreshing(lv_disp_t * disp) + disp_refr = disp; + } + ++uint8_t get_cpu_usage(void); ++ ++uint8_t get_cpu_usage(void) { ++ struct timeval tv2; ++ char proc_buffer[1024]; ++ unsigned proc_buffer_size = 0; ++ FILE* f = fopen("/proc/self/stat", "r"); ++ static uint64_t start; ++ uint64_t current; ++ static uint64_t last_cpu_time; ++ uint64_t current_cpu_time, ret; ++ uint32_t utime = 0, stime = 0; ++ ++ gettimeofday(&tv2, NULL); ++ current = (tv2.tv_sec * 1000000 + tv2.tv_usec) / 10000; ++ // read /proc/self/stat ++ memset(proc_buffer, 0, sizeof(proc_buffer)); ++ if (f == NULL) { ++ perror("open /proc/self/stat"); ++ return 0; ++ } ++ proc_buffer_size = fread(proc_buffer, 1, sizeof(proc_buffer), f); ++ fclose(f); ++ // find the 13rd space and the 14th space ++ for (unsigned i = 0, space_cnt = 0; i < proc_buffer_size; i++) { ++ if (proc_buffer[i] == ' ') { ++ space_cnt += 1; ++ if (space_cnt == 13) { ++ sscanf(proc_buffer + i, "%u%u", &utime, &stime); ++ break; ++ } ++ } ++ } ++ current_cpu_time = utime + stime; ++ ret = (current_cpu_time - last_cpu_time) * 100 / (current - start); ++ start = current; ++ last_cpu_time = current_cpu_time; ++ ++ return ret; ++} ++ + /** + * Called periodically to handle the refreshing + * @param tmr pointer to the timer itself +@@ -398,7 +441,7 @@ void _lv_disp_refr_timer(lv_timer_t * tmr) + + perf_monitor.fps_sum_all += fps; + perf_monitor.fps_sum_cnt ++; +- uint32_t cpu = 100 - lv_timer_get_idle(); ++ uint32_t cpu = get_cpu_usage(); + lv_label_set_text_fmt(perf_label, "%"LV_PRIu32" FPS\n%"LV_PRIu32"%% CPU", fps, cpu); + } + #endif +-- +2.39.1 + diff --git a/buildroot-overlay/package/lvgl/Makefile b/buildroot-overlay/package/lvgl/Makefile index c7399d5..d022837 100644 --- a/buildroot-overlay/package/lvgl/Makefile +++ b/buildroot-overlay/package/lvgl/Makefile @@ -3,22 +3,17 @@ # LVGL_DIR_NAME ?= lvgl LVGL_DIR ?= ${shell pwd} -CFLAGS ?= -O3 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare -D_DEFAULT_SOURCE -std=c99 -LDFLAGS ?= -lm -ldrm +CFLAGS ?= -mcpu=c908v -O3 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare -D_DEFAULT_SOURCE -std=c99 +LDFLAGS ?= -mcpu=c908v +LIBS += -lm -ldrm BIN = lvgl_demo_music CFLAGS += -flto LDFLAGS += -flto -ifeq ($(findstring riscv64, $(CC)), riscv64) -CFLAGS += -march=rv64gcv -else -CFLAGS += -march=rv32gcv -endif - # LDFLAGS += -Wl,-Map=$(BIN).map,--cref CFLAGS += $(CFLAG) -LDFLAGS += $(LDFLAG) +LDFLAGS += $(LDFLAG) $(CFLAG) prefix ?= /usr bindir ?= $(prefix)/bin @@ -51,7 +46,7 @@ all: default default: $(AOBJS) $(COBJS) $(MAINOBJ) @echo LD $(BIN) - @$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS) + @$(CC) $(LDFLAGS) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LIBS) clean: rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ) diff --git a/buildroot-overlay/package/lvgl/lv_conf.h b/buildroot-overlay/package/lvgl/lv_conf.h index 380226c..cbe734f 100644 --- a/buildroot-overlay/package/lvgl/lv_conf.h +++ b/buildroot-overlay/package/lvgl/lv_conf.h @@ -84,10 +84,10 @@ extern uint32_t custom_tick_get(void); *====================*/ /*Default display refresh period. LVG will redraw changed areas with this period time*/ -#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ +#define LV_DISP_DEF_REFR_PERIOD 10 /*[ms]*/ /*Input device read period in milliseconds*/ -#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ +#define LV_INDEV_DEF_READ_PERIOD 10 /*[ms]*/ /*Use a custom tick source that tells the elapsed time in milliseconds. *It removes the need to manually update the tick with `lv_tick_inc()`)*/ diff --git a/buildroot-overlay/package/lvgl/lv_drivers/display/drm.c b/buildroot-overlay/package/lvgl/lv_drivers/display/drm.c index b283b80..4130fb3 100644 --- a/buildroot-overlay/package/lvgl/lv_drivers/display/drm.c +++ b/buildroot-overlay/package/lvgl/lv_drivers/display/drm.c @@ -8,7 +8,7 @@ *********************/ #include "drm.h" #if USE_DRM - +#include #include #include #include @@ -726,28 +726,32 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color #define FPS_COUNTER 1 #if FPS_COUNTER static unsigned count = 0; - static unsigned long flush_duration; + static unsigned long draw_duration; static struct timeval tv; + static struct timeval tv3; count += 1; struct timeval tv2; gettimeofday(&tv2, NULL); + draw_duration += (tv2.tv_sec - tv3.tv_sec) * 1000000 + tv2.tv_usec - tv3.tv_usec; if ((tv2.tv_sec - tv.tv_sec) * 1000000 + (tv2.tv_usec - tv.tv_usec) >= 1000000) { - printf(" fps: %u, flush: %f\r", count, (float)flush_duration / count); + printf(" fps: %u, draw: %f us\r", count, (float)draw_duration / count); fflush(stdout); count = 0; - flush_duration = 0; + draw_duration = 0; gettimeofday(&tv, NULL); } #endif #define TEST_FPS_ONLY 0 #if TEST_FPS_ONLY + gettimeofday(&tv3, NULL); lv_disp_flush_ready(disp_drv); return; #endif /* Partial update */ #if DRM_DIRECT_BUFFER + thead_csi_dcache_clean_invalid_range(color_p, drm_dev.drm_bufs[0].size); if (color_p == drm_dev.drm_bufs[0].map) { fbuf = &drm_dev.drm_bufs[0]; } else { @@ -780,9 +784,7 @@ void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color lv_disp_flush_ready(disp_drv); #if FPS_COUNTER - struct timeval tv3; gettimeofday(&tv3, NULL); - flush_duration += (tv3.tv_sec - tv2.tv_sec) * 1000000 + tv3.tv_usec - tv2.tv_usec; #endif } diff --git a/buildroot-overlay/package/lvgl/lv_drivers/display/drm.h b/buildroot-overlay/package/lvgl/lv_drivers/display/drm.h index 2396fd0..2cfc410 100644 --- a/buildroot-overlay/package/lvgl/lv_drivers/display/drm.h +++ b/buildroot-overlay/package/lvgl/lv_drivers/display/drm.h @@ -32,7 +32,7 @@ extern "C" { /********************* * DEFINES *********************/ -#define DRM_DIRECT_BUFFER 0 +#define DRM_DIRECT_BUFFER 1 /********************** * TYPEDEFS **********************/ diff --git a/buildroot-overlay/package/lvgl/lvgl.mk b/buildroot-overlay/package/lvgl/lvgl.mk index c703f71..d61a243 100644 --- a/buildroot-overlay/package/lvgl/lvgl.mk +++ b/buildroot-overlay/package/lvgl/lvgl.mk @@ -6,7 +6,14 @@ LVGL_VERSION = v8.3.7 LVGL_SOURCE = $(LVGL_VERSION).tar.gz LVGL_SITE = https://github.com/lvgl/lvgl/archive/refs/tags -LVGL_DEPENDENCIES += libdrm +LVGL_DEPENDENCIES += libdrm vg_lite + +LVGL_CFLAG = -I$(STAGING_DIR)/usr/include/libdrm + +ifeq ($(BR2_RISCV_32), y) +LVGL_CFLAG += -march=rv32gcv_xtheadc +LVGL_LDFLAG += -march=rv32gcv_xtheadc +endif define LVGL_EXTRACT_CMDS tar zxf $(LVGL_DL_DIR)/$(LVGL_SOURCE) -C $(@D) @@ -15,7 +22,7 @@ define LVGL_EXTRACT_CMDS endef define LVGL_BUILD_CMDS - $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" CFLAG="-I$(STAGING_DIR)/usr/include/libdrm" -C $(@D) + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" CFLAG="$(LVGL_CFLAG)" LDFLAG="$(LVGL_LDFLAG)" -C $(@D) endef define LVGL_INSTALL_TARGET_CMDS diff --git a/buildroot-overlay/package/vg_lite/VGLite/Makefile b/buildroot-overlay/package/vg_lite/VGLite/Makefile index a8227e0..eb9c147 100644 --- a/buildroot-overlay/package/vg_lite/VGLite/Makefile +++ b/buildroot-overlay/package/vg_lite/VGLite/Makefile @@ -8,8 +8,7 @@ SOURCES = vg_lite_dump.c \ ../VGLiteKernel/linux/vg_lite_ioctl.c \ ../VGLiteKernel/linux/vg_lite_os.c -CFLAGS += -I../inc -I../VGLiteKernel -I. -CFLAGS += -Wno-missing-braces -D_GNU_SOURCE -lpthread -lrt -g +CFLAG := -mcpu=c908v -I../inc -I../VGLiteKernel -I. -Wno-missing-braces -D_GNU_SOURCE -g $(CFLAGS) LIBS += m LDFLAGS += $(addprefix -l,$(LIBS)) @@ -23,10 +22,10 @@ clean: install: cp $(OUT)/$(NAME) $(TARGET_DIR)/usr/lib/$(NAME) cp $(OUT)/$(NAME) $(STAGING_DIR)/usr/lib/$(NAME) - cp ../inc/vg_lite.h $(STAGING_DIR)/usr/include/vg_lite.h + cp ../inc/*.h $(STAGING_DIR)/usr/include/ $(OUT): mkdir $(OUT) $(OUT)/$(NAME) : $(OUT) $(SOURCES) - $(CC) $(CFLAGS) -o $@ $(SOURCES) ../libthead.o $(LDFLAGS) + $(CC) $(CFLAG) -o $@ $(SOURCES) $(LDFLAGS) diff --git a/buildroot-overlay/package/vg_lite/inc/thead.h b/buildroot-overlay/package/vg_lite/inc/thead.h index c3744c0..5e65306 100644 --- a/buildroot-overlay/package/vg_lite/inc/thead.h +++ b/buildroot-overlay/package/vg_lite/inc/thead.h @@ -7,10 +7,26 @@ extern "C" { #endif -void thead_csi_dcache_clean_invalid_range(void* addr, uint64_t size); +static inline void thead_csi_dcache_clean_invalid_range(void* addr, uint64_t size) { + uint64_t op_addr = (uint64_t)addr; + int64_t op_size = size + op_addr % 64; + const int64_t linesize = 64; + + __asm volatile("fence iorw, iorw"); + + while (op_size > 0) { + __asm volatile("dcache.civa %0" : : "r"(op_addr)); + op_addr += linesize; + op_size -= linesize; + } + + __asm volatile("fence iorw, iorw"); + __asm volatile("fence.i"); + __asm volatile("fence r, r"); +} #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/buildroot-overlay/package/vg_lite/libthead.o b/buildroot-overlay/package/vg_lite/libthead.o deleted file mode 100644 index 120ba4b..0000000 Binary files a/buildroot-overlay/package/vg_lite/libthead.o and /dev/null differ diff --git a/buildroot-overlay/package/vg_lite/vg_lite.mk b/buildroot-overlay/package/vg_lite/vg_lite.mk index 9e5fe29..9623369 100644 --- a/buildroot-overlay/package/vg_lite/vg_lite.mk +++ b/buildroot-overlay/package/vg_lite/vg_lite.mk @@ -13,9 +13,14 @@ VG_LITE_DEPENDENCIES += libdrm DRM_CFLAGS = $(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include/libdrm -I$(STAGING_DIR)/usr/include DRM_LDFLAGS = -L$(STAGING_DIR)/usr/lib -ldrm +ifeq ($(BR2_RISCV_32), y) +VG_LITE_CFLAGS += -march=rv32gcv_xtheadc +DRM_CFLAGS += -march=rv32gcv_xtheadc +endif + ifeq ($(BR2_PACKAGE_VG_LITE_DEMOS),y) define VG_LITE_BUILD_CMDS - $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" -C $(@D)/VGLite + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" CFLAGS="$(VG_LITE_CFLAGS)" -C $(@D)/VGLite $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" DRM_CFLAGS="$(DRM_CFLAGS)" DRM_LDFLAGS="$(DRM_LDFLAGS)" SDK_DIR=$(@D) -C $(@D)/test endef @@ -26,7 +31,7 @@ endef else define VG_LITE_BUILD_CMDS - $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" -C $(@D)/VGLite + $(TARGET_MAKE_ENV) $(MAKE) CC="$(TARGET_CC)" CFLAGS="$(VG_LITE_CFLAGS)" -C $(@D)/VGLite endef define VG_LITE_INSTALL_TARGET_CMDS diff --git a/buildroot-overlay/package/vvcam/Makefile b/buildroot-overlay/package/vvcam/Makefile new file mode 100644 index 0000000..206f5df --- /dev/null +++ b/buildroot-overlay/package/vvcam/Makefile @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0 + +ccflags-y += -DVVCAM_ISP0_BASE=0x90000000 +ccflags-y += -DVVCAM_ISP_REG_SIZE=0x10000 +ccflags-y += -DVVCAM_ISP0_IRQ=129 +ccflags-y += -DVVCAM_ISP0_MI_IRQ=127 +ccflags-y += -DVVCAM_ISP0_FE_IRQ=128 +ccflags-y += -DVVCAM_PLATFORM_REGISTER +ccflags-y += -DVVCAM_ISP_DEV_MAX=1 +ccflags-y += -I$(src)/v4l2/common + +vvcam_mipi-objs := mipi/vvcam_mipi_driver.o mipi/k230_csi.o mipi/k230_vi.o + +obj-m += vvcam_mipi.o + +vvcam_isp-objs := isp/vvcam_isp_driver.o isp/vvcam_isp_hal.o isp/vvcam_isp_procfs.o isp/vvcam_event.o + +obj-m += vvcam_isp.o + +vvcam_vb-objs := vb/vvcam_vb_platform.o vb/vvcam_cma.o vb/vvcam_vb_driver.o vb/vvcam_vb_procfs.o vb/vvcam_mmz.o + +obj-m += vvcam_vb.o + +obj-y += v4l2/isp/ + +vvcam_video-objs := v4l2/video/vvcam_video_platform.o v4l2/video/vvcam_video_register.o v4l2/video/vvcam_video_event.o v4l2/video/vvcam_video_m2m_register.o v4l2/video/vvcam_video_driver.o + +obj-m += vvcam_video.o diff --git a/buildroot-overlay/package/vvcam/isp/Makefile b/buildroot-overlay/package/vvcam/isp/Makefile new file mode 100644 index 0000000..b11c348 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/Makefile @@ -0,0 +1 @@ +obj-m := vvcam_isp.o diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_event.c b/buildroot-overlay/package/vvcam/isp/vvcam_event.c new file mode 100644 index 0000000..932eb60 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_event.c @@ -0,0 +1,298 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include + +#include "vvcam_event.h" + +void vvcam_event_dev_init(struct vvcam_event_dev *event_dev) +{ + spin_lock_init(&event_dev->fh_lock); + INIT_LIST_HEAD(&event_dev->fh_list); + return; +} + +void vvcam_event_fh_init(struct vvcam_event_dev *event_dev, + struct vvcam_event_fh *event_fh) +{ + unsigned long flags; + + INIT_LIST_HEAD(&event_fh->subscribed); + INIT_LIST_HEAD(&event_fh->available); + init_waitqueue_head(&event_fh->wait); + event_fh->event_dev = event_dev; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + list_add(&event_fh->list, &event_dev->fh_list); + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + return; +} + +void vvcam_event_fh_destroy(struct vvcam_event_dev *event_dev, + struct vvcam_event_fh *event_fh) +{ + unsigned long flags; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + list_del(&event_fh->list); + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + return; +} + +static unsigned sev_pos(const struct vvcam_subscribed_event *sev, unsigned idx) +{ + idx += sev->first; + return idx >= sev->elems ? idx - sev->elems : idx; +} + +static struct vvcam_subscribed_event *vvcam_event_subscribed( + struct vvcam_event_fh *event_fh, uint32_t type, uint32_t id) +{ + struct vvcam_subscribed_event *sev; + + assert_spin_locked(&event_fh->event_dev->fh_lock); + + if (list_empty(&event_fh->subscribed)) + return NULL; + + list_for_each_entry(sev, &event_fh->subscribed, list) + if (sev->type == type && sev->id == id) + return sev; + + return NULL; +} + +int vvcam_event_subscribe(struct vvcam_event_fh *event_fh, + const vvcam_subscription_t *sub, unsigned elems) +{ + struct vvcam_subscribed_event *sev, *found_ev; + unsigned long flags; + unsigned i; + + if (elems < 1) + elems = 1; + + sev = kzalloc(sizeof(*sev) + sizeof(struct vvcam_kevent) * elems, GFP_KERNEL); + if (!sev) + return -ENOMEM; + + for (i = 0; i < elems; i++) { + sev->events[i].sev = sev; + } + + sev->type = sub->type; + sev->id = sub->id; + sev->event_fh = event_fh; + sev->elems = elems; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + + found_ev = vvcam_event_subscribed(event_fh, sub->type, sub->id); + if (!found_ev) + list_add(&sev->list, &event_fh->subscribed); + + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + if (found_ev) { + kfree(sev); + return 0; + } + + return 0; +} + +int vvcam_event_unsubscribe(struct vvcam_event_fh *event_fh, + const vvcam_subscription_t *sub) +{ + struct vvcam_subscribed_event *sev; + unsigned long flags; + int i; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + + sev = vvcam_event_subscribed(event_fh, sub->type, sub->id); + if (sev != NULL) { + for (i = 0; i < sev->in_use; i++) { + list_del(&sev->events[sev_pos(sev, i)].list); + event_fh->navailable--; + } + + list_del(&sev->list); + kfree(sev); + } + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + return 0; +} + +int vvcam_event_unsubscribe_all(struct vvcam_event_fh *event_fh) +{ + vvcam_subscription_t sub; + struct vvcam_subscribed_event *sev; + unsigned long flags; + + do { + sev = NULL; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + + if (!list_empty(&event_fh->subscribed)) { + sev = list_first_entry(&event_fh->subscribed, + struct vvcam_subscribed_event, list); + sub.type = sev->type; + sub.id = sev->id; + } + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + if (sev) + vvcam_event_unsubscribe(event_fh, &sub); + + } while (sev); + + return 0; +} + +static void __vvcam_event_queue_fh(struct vvcam_event_fh *event_fh, + const vvcam_event_t *event) +{ + struct vvcam_subscribed_event *sev; + struct vvcam_kevent *kev; + + sev = vvcam_event_subscribed(event_fh, event->type, event->id); + if (!sev) + return; + + if (!sev->elems) + return; + + if (sev->in_use == sev->elems) { + kev = sev->events + sev_pos(sev, 0); + list_del(&kev->list); + sev->in_use--; + sev->first = sev_pos(sev, 1); + event_fh->navailable--; + } + + kev = sev->events + sev_pos(sev, sev->in_use); + + kev->event = *event; + sev->in_use++; + + list_add_tail(&kev->list, &event_fh->available); + event_fh->navailable++; + + wake_up_all(&event_fh->wait); + + return; +} + +void vvcam_event_queue(struct vvcam_event_dev *event_dev, + const vvcam_event_t *event) +{ + struct vvcam_event_fh *event_fh; + unsigned long flags; + + spin_lock_irqsave(&event_dev->fh_lock, flags); + + if (list_empty(&event_dev->fh_list)) { + spin_unlock_irqrestore(&event_dev->fh_lock, flags); + return; + } + + list_for_each_entry(event_fh, &event_dev->fh_list, list) + __vvcam_event_queue_fh(event_fh, event); + + spin_unlock_irqrestore(&event_dev->fh_lock, flags); + + return; +} + +int vvcam_event_dequeue(struct vvcam_event_fh *event_fh, vvcam_event_t *event) +{ + struct vvcam_kevent *kev; + unsigned long flags; + + spin_lock_irqsave(&event_fh->event_dev->fh_lock, flags); + + if (list_empty(&event_fh->available)) { + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + return -ENOENT; + } + + kev = list_first_entry(&event_fh->available, struct vvcam_kevent, list); + list_del(&kev->list); + event_fh->navailable--; + + kev->sev->first = sev_pos(kev->sev, 1); + kev->sev->in_use--; + *event = kev->event; + + spin_unlock_irqrestore(&event_fh->event_dev->fh_lock, flags); + + return 0; +} + +unsigned int vvcam_event_poll(struct file *file, + struct vvcam_event_fh *event_fh, poll_table *wait) +{ + poll_wait(file, &event_fh->wait, wait); + + if (event_fh->navailable) + return POLLPRI; + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_event.h b/buildroot-overlay/package/vvcam/isp/vvcam_event.h new file mode 100644 index 0000000..cb90688 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_event.h @@ -0,0 +1,129 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#ifndef __VVCAM_EVENT_H__ +#define __VVCAM_EVENT_H__ + +#define VVCAM_EVENT_IRQ_TYPE 0x00000000 +#define VVCAM_VIDEO_IN_EVENT_IRQ_TYPE 0x00000001 +typedef struct { + uint32_t type; + uint32_t id; +} vvcam_subscription_t; + +typedef struct { + uint32_t irq_value; +} vvcam_irqevent; + +typedef struct { + uint32_t type; + uint32_t id; + union { + vvcam_irqevent irqevent; + }; + uint64_t timestamp; +} vvcam_event_t; + +#ifdef __KERNEL__ +#include + +struct vvcam_event_dev { + spinlock_t fh_lock; + struct list_head fh_list; +}; + +struct vvcam_event_fh { + struct list_head list; + struct vvcam_event_dev *event_dev; + wait_queue_head_t wait; + unsigned int navailable; + struct list_head subscribed; + struct list_head available; +}; + +struct vvcam_kevent { + struct list_head list; + struct vvcam_subscribed_event *sev; + vvcam_event_t event; +}; + +struct vvcam_subscribed_event { + struct list_head list; + uint32_t type; + uint32_t id; + + struct vvcam_event_fh *event_fh; + uint32_t elems; + uint32_t in_use; + uint32_t first; + struct vvcam_kevent events[]; +}; + +void vvcam_event_dev_init(struct vvcam_event_dev *event_dev); +void vvcam_event_fh_init(struct vvcam_event_dev *event_dev, + struct vvcam_event_fh *event_fh); +void vvcam_event_fh_destroy(struct vvcam_event_dev *event_dev, + struct vvcam_event_fh *event_fh); +int vvcam_event_subscribe(struct vvcam_event_fh *event_fh, + const vvcam_subscription_t *sub, unsigned elems); +int vvcam_event_unsubscribe(struct vvcam_event_fh *event_fh, + const vvcam_subscription_t *sub); +int vvcam_event_unsubscribe_all(struct vvcam_event_fh *event_fh); +void vvcam_event_queue(struct vvcam_event_dev *event_dev, + const vvcam_event_t *event); +int vvcam_event_dequeue(struct vvcam_event_fh *event_fh, vvcam_event_t *event); +unsigned int vvcam_event_poll(struct file *file, + struct vvcam_event_fh *event_fh, poll_table *wait); + +#endif + +#endif diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp.h b/buildroot-overlay/package/vvcam/isp/vvcam_isp.h new file mode 100644 index 0000000..fd3fa9e --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp.h @@ -0,0 +1,99 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_H__ +#define __VVCAM_ISP_H__ +#include "vvcam_event.h" + +enum { + VVCAM_EID_ISP_MIS = 0x00, + VVCAM_EID_MIV2_MIS = 0x01, + VVCAM_EID_MIV2_MIS1 = 0x02, + VVCAM_EID_MIV2_MIS2 = 0x03, + VVCAM_EID_MIV2_MIS3 = 0x04, + VVCAM_EID_MI_MIS_HDR1 = 0x05, + VVCAM_EID_RDMA_MIS = 0x06, + VVCAM_EID_MCM_WR_RAW0_MIS = 0x07, + VVCAM_EID_MCM_WR_RAW1_MIS = 0x08, + VVCAM_EID_MCM_WR_G2_RAW0_MIS = 0x09, + VVCAM_EID_MCM_WR_G2_RAW1_MIS = 0x10, + VVCAM_EID_FE_MIS = 0x11, + VVCAM_EID_MIV2_MIS2_HDR = 0x12, + VVCAM_EID_MIV2_JDP = 0x13, + VVCAM_EID_FUSA_ECC_IMSC1 = 0x14, + VVCAM_EID_FUSA_ECC_IMSC2 = 0x15, + VVCAM_EID_FUSA_ECC_IMSC3 = 0x16, + VVCAM_EID_FUSA_ECC_IMSC4 = 0x17, + VVCAM_EID_FUSA_ECC_IMSC5 = 0x18, + VVCAM_EID_FUSA_ECC_IMSC6 = 0x19, + VVCAM_EID_FUSA_DUP_IMSC = 0x1a, + VVCAM_EID_FUSA_PARITY_IMSC = 0x1b, + VVCAM_EID_FUSA_LV1_IMSC1 = 0x1c, + VVCAM_EID_MAX = 0x1d +}; + + +typedef struct { + uint32_t addr; + uint32_t value; +} vvcam_isp_reg_t; + +#define VVCAM_ISP_IOC_MAGIC 'v' +#define VVCAM_ISP_RESET _IOW(VVCAM_ISP_IOC_MAGIC, 0x01, uint32_t) +#define VVCAM_ISP_READ_REG _IOWR(VVCAM_ISP_IOC_MAGIC, 0x02, vvcam_isp_reg_t) +#define VVCAM_ISP_WRITE_REG _IOW(VVCAM_ISP_IOC_MAGIC, 0x03, vvcam_isp_reg_t) +#define VVCAM_ISP_SUBSCRIBE_EVENT _IOW(VVCAM_ISP_IOC_MAGIC, 0x04, vvcam_subscription_t) +#define VVCAM_ISP_UNSUBSCRIBE_EVENT _IOW(VVCAM_ISP_IOC_MAGIC, 0x05, vvcam_subscription_t) +#define VVCAM_ISP_DQEVENT _IOR(VVCAM_ISP_IOC_MAGIC, 0x06, vvcam_event_t) + +#endif diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.c b/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.c new file mode 100644 index 0000000..b65cb34 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.c @@ -0,0 +1,482 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_isp_driver.h" +#include "vvcam_isp.h" +#include "vvcam_event.h" +#include "vvcam_isp_procfs.h" + +extern void vvcam_isp_irq_stat_tasklet(unsigned long); + +static irqreturn_t vvcam_isp_irq_handler(int irq, void *isp_dev) +{ + return vvcam_isp_irq_process(isp_dev); +} + +static irqreturn_t vvcam_isp_mi_irq_handler(int irq, void *isp_dev) +{ + return vvcam_isp_mi_irq_process(isp_dev); +} + +static irqreturn_t vvcam_isp_fe_irq_handler(int irq, void *isp_dev) +{ + return vvcam_isp_fe_irq_process(isp_dev); +} + +static int vvcam_isp_open(struct inode *inode, struct file *file) +{ + struct miscdevice *pmisc_dev = file->private_data; + struct vvcam_isp_dev *isp_dev; + struct vvcam_isp_fh *isp_fh; + + isp_dev = container_of(pmisc_dev, struct vvcam_isp_dev, miscdev); + if (!isp_dev) + return -ENOMEM; + + dev_info(isp_dev->dev, "%s:%d\n", __func__, __LINE__); + + isp_fh = kzalloc(sizeof(struct vvcam_isp_fh), GFP_KERNEL); + if (!isp_fh) + return -ENOMEM; + + isp_fh->isp_dev = isp_dev; + vvcam_event_fh_init( &isp_dev->event_dev, &isp_fh->event_fh); + file->private_data = isp_fh; + + mutex_lock(&isp_dev->mlock); + isp_dev->refcnt++; + pm_runtime_get_sync(isp_dev->dev); + mutex_unlock(&isp_dev->mlock); + + return 0; +} + +static int vvcam_isp_release(struct inode *inode, struct file *file) +{ + struct vvcam_isp_dev *isp_dev; + struct vvcam_isp_fh *isp_fh; + + isp_fh = file->private_data; + isp_dev = isp_fh->isp_dev; + + dev_info(isp_dev->dev, "%s:%d\n", __func__, __LINE__); + + vvcam_event_unsubscribe_all(&isp_fh->event_fh); + + vvcam_event_fh_destroy(&isp_dev->event_dev, &isp_fh->event_fh); + + mutex_lock(&isp_dev->mlock); + isp_dev->refcnt--; + pm_runtime_put(isp_dev->dev); + mutex_unlock(&isp_dev->mlock); + + kfree(isp_fh); + + return 0; +} + +static long vvcam_isp_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct vvcam_isp_dev *isp_dev; + struct vvcam_isp_fh *isp_fh; + uint32_t reset; + vvcam_isp_reg_t isp_reg; + vvcam_subscription_t sub; + vvcam_event_t event; + int ret = 0; + + isp_fh = file->private_data; + isp_dev = isp_fh->isp_dev; + + mutex_lock(&isp_dev->mlock); + + switch(cmd) { + case VVCAM_ISP_RESET: + ret = copy_from_user(&reset, (void __user *)arg, sizeof(reset)); + if (ret) + break; + ret = vvcam_isp_reset(isp_dev, reset); + break; + case VVCAM_ISP_READ_REG: + ret = copy_from_user(&isp_reg, (void __user *)arg, sizeof(isp_reg)); + if (ret) + break; + ret = vvcam_isp_read_reg(isp_dev, &isp_reg); + if (ret) + break; + ret = copy_to_user((void __user *)arg, &isp_reg, sizeof(isp_reg)); + break; + case VVCAM_ISP_WRITE_REG: + ret = copy_from_user(&isp_reg, (void __user *)arg, sizeof(isp_reg)); + if (ret) + break; + ret = vvcam_isp_write_reg(isp_dev, isp_reg); + break; + case VVCAM_ISP_SUBSCRIBE_EVENT: + ret = copy_from_user(&sub, (void __user *)arg, sizeof(sub)); + if (ret) + break; + ret = vvcam_event_subscribe(&isp_fh->event_fh, + &sub, VVCAM_ISP_EVENT_ELEMS); + break; + case VVCAM_ISP_UNSUBSCRIBE_EVENT: + ret = copy_from_user(&sub, (void __user *)arg, sizeof(sub)); + if (ret) + break; + ret = vvcam_event_unsubscribe(&isp_fh->event_fh, &sub); + break; + case VVCAM_ISP_DQEVENT: + ret = vvcam_event_dequeue(&isp_fh->event_fh, &event); + if (ret) + break; + ret = copy_to_user((void __user *)arg, &event, sizeof(event)); + break; + default: + ret = -EINVAL; + break; + } + + mutex_unlock(&isp_dev->mlock); + + return ret; +} + +static unsigned int vvcam_isp_poll(struct file *file, poll_table *wait) +{ + struct vvcam_isp_fh *isp_fh; + + isp_fh = file->private_data; + + return vvcam_event_poll(file, &isp_fh->event_fh, wait); +} + +int vvcam_isp_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct vvcam_isp_dev *isp_dev; + struct vvcam_isp_fh *isp_fh; + + isp_fh = file->private_data; + isp_dev = isp_fh->isp_dev; + + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + + return vm_iomap_memory(vma, isp_dev->paddr, isp_dev->regs_size); +} + +static struct file_operations vvcam_isp_fops = { + .owner = THIS_MODULE, + .open = vvcam_isp_open, + .release = vvcam_isp_release, + .unlocked_ioctl = vvcam_isp_ioctl, + .poll = vvcam_isp_poll, + .mmap = vvcam_isp_mmap, + +}; + +static int vvcam_isp_parse_params(struct vvcam_isp_dev *isp_dev, + struct platform_device *pdev) +{ + struct resource *res; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "can't fetch device resource info\n"); + return -EIO; + } + isp_dev->paddr = res->start; + isp_dev->regs_size = resource_size(res); + dev_info(&pdev->dev, "isp addr: %08llx, size: %u\n", isp_dev->paddr, isp_dev->regs_size); + isp_dev->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(isp_dev->base)) { + dev_err(&pdev->dev, "can't remap device resource info\n"); + return PTR_ERR(isp_dev->base); + } + + isp_dev->isp_irq = platform_get_irq(pdev, 0); + if (isp_dev->isp_irq < 0) { + dev_err(&pdev->dev, "can't get irq resource\n"); + return -ENXIO; + } else { + dev_info(&pdev->dev, "isp irq: %d\n", isp_dev->isp_irq); + } + + isp_dev->mi_irq = platform_get_irq(pdev, 1); + if (isp_dev->mi_irq < 0) { + dev_err(&pdev->dev, "can't get mi irq resource\n"); + return -ENXIO; + } else { + dev_info(&pdev->dev, "mi irq: %d\n", isp_dev->mi_irq); + } + + isp_dev->fe_irq = platform_get_irq(pdev, 2); + if (isp_dev->fe_irq < 0) { + dev_err(&pdev->dev, "can't get fe irq resource\n"); + return -ENXIO; + } else { + dev_info(&pdev->dev, "fe irq: %d\n", isp_dev->fe_irq); + } + + isp_dev->reset = devm_reset_control_get(&pdev->dev, NULL); + if (IS_ERR(isp_dev->reset)) { + dev_err(&pdev->dev, "can't get device reset control\n"); + // ignore + // return PTR_ERR(isp_dev->reset); + } + + return 0; +} + +static int vvcam_isp_probe(struct platform_device *pdev) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev; + char *ispdev_name; + + isp_dev = devm_kzalloc(&pdev->dev, + sizeof(struct vvcam_isp_dev), GFP_KERNEL); + if (!isp_dev) + return -ENOMEM; + + ret = vvcam_isp_parse_params(isp_dev, pdev); + if (ret) { + dev_err(&pdev->dev, "failed to parse params\n"); + return -EINVAL; + } + + mutex_init(&isp_dev->mlock); + spin_lock_init(&isp_dev->stat_lock); + vvcam_event_dev_init(&isp_dev->event_dev); + platform_set_drvdata(pdev, isp_dev); + + isp_dev->dev = &pdev->dev; + isp_dev->id = pdev->id; + + ispdev_name = devm_kzalloc(&pdev->dev, 16, GFP_KERNEL); + if (!ispdev_name) + return -ENOMEM; + snprintf(ispdev_name, 16, "%s.%d", VVCAM_ISP_NAME, 0/*pdev->id*/); + + isp_dev->miscdev.minor = MISC_DYNAMIC_MINOR; + isp_dev->miscdev.name = ispdev_name; + isp_dev->miscdev.fops = &vvcam_isp_fops; + + ret = misc_register(&isp_dev->miscdev); + if (ret) { + dev_err(&pdev->dev, "failed to register device\n"); + return -EINVAL; + } + + ret = vvcam_isp_procfs_register(isp_dev, &isp_dev->pde); + if (ret) { + dev_err(&pdev->dev, "isp register procfs failed.\n"); + goto error_request_isp_irq; + } + + tasklet_init(&isp_dev->stat_tasklet, + vvcam_isp_irq_stat_tasklet, (unsigned long)isp_dev); + + ret = devm_request_irq(&pdev->dev, isp_dev->isp_irq, vvcam_isp_irq_handler, + IRQF_TRIGGER_HIGH | IRQF_SHARED, dev_name(&pdev->dev), isp_dev); + if (ret) { + dev_err(&pdev->dev, "can't request isp irq %d\n", isp_dev->isp_irq); + goto error_request_isp_irq; + } + + ret = devm_request_irq(&pdev->dev, isp_dev->mi_irq, vvcam_isp_mi_irq_handler, + IRQF_TRIGGER_HIGH | IRQF_SHARED, dev_name(&pdev->dev), isp_dev); + if (ret) { + dev_err(&pdev->dev, "can't request mi irq %d\n", isp_dev->mi_irq); + goto error_request_mi_irq; + } + + ret = devm_request_irq(&pdev->dev, isp_dev->fe_irq, vvcam_isp_fe_irq_handler, + IRQF_TRIGGER_HIGH | IRQF_SHARED, dev_name(&pdev->dev), isp_dev); + if (ret) { + dev_err(&pdev->dev, "can't request fe irq %d\n", isp_dev->fe_irq); + goto error_request_fe_irq; + } + + dev_info(&pdev->dev, "vvcam isp driver probe success\n"); + + return 0; + +error_request_fe_irq: + devm_free_irq(&pdev->dev, isp_dev->mi_irq, isp_dev); +error_request_mi_irq: + devm_free_irq(&pdev->dev, isp_dev->isp_irq, isp_dev);; +error_request_isp_irq: + misc_deregister(&isp_dev->miscdev); + + return ret; +} + +static int vvcam_isp_remove(struct platform_device *pdev) +{ + struct vvcam_isp_dev *isp_dev; + + isp_dev = platform_get_drvdata(pdev); + + vvcam_isp_procfs_unregister(isp_dev->pde); + + misc_deregister(&isp_dev->miscdev); + devm_free_irq(&pdev->dev, isp_dev->isp_irq, isp_dev); + devm_free_irq(&pdev->dev, isp_dev->mi_irq, isp_dev); + devm_free_irq(&pdev->dev, isp_dev->fe_irq, isp_dev); + + return 0; +} + +static int vvcam_isp_system_suspend(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_suspend(dev); + if (ret) { + dev_err(dev, "force suspend %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_isp_system_resume(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_resume(dev); + if (ret) { + dev_err(dev, "force resume %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_isp_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int vvcam_isp_runtime_resume(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops vvcam_isp_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(vvcam_isp_system_suspend, vvcam_isp_system_resume) + SET_RUNTIME_PM_OPS(vvcam_isp_runtime_suspend, vvcam_isp_runtime_resume, NULL) +}; + +static const struct of_device_id vvcam_isp_of_match[] = { + {.compatible = "verisilicon,isp",}, + { /* sentinel */ }, +}; + +static struct platform_driver vvcam_isp_driver = { + .probe = vvcam_isp_probe, + .remove = vvcam_isp_remove, + .driver = { + .name = VVCAM_ISP_NAME, + .owner = THIS_MODULE, + .of_match_table = vvcam_isp_of_match, + .pm = &vvcam_isp_pm_ops, + } +}; + +static int __init vvcam_isp_init_module(void) +{ + int ret; + ret = platform_driver_register(&vvcam_isp_driver); + if (ret) { + printk(KERN_ERR "Failed to register isp driver\n"); + return ret; + } +#if 0 +#ifdef VVCAM_PLATFORM_REGISTER + ret = vvcam_isp_platform_device_register(); + if (ret) { + platform_driver_unregister(&vvcam_isp_driver); + printk(KERN_ERR "Failed to register vvcam isp platform devices\n"); + return ret; + } +#endif +#endif + return ret; +} + +static void __exit vvcam_isp_exit_module(void) +{ + platform_driver_unregister(&vvcam_isp_driver); +#if 0 +#ifdef VVCAM_PLATFORM_REGISTER + vvcam_isp_platform_device_unregister(); +#endif +#endif +} + +module_init(vvcam_isp_init_module); +module_exit(vvcam_isp_exit_module); + +MODULE_DESCRIPTION("Verisilicon isp driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.h b/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.h new file mode 100644 index 0000000..e029521 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_driver.h @@ -0,0 +1,104 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DRIVER_H__ +#define __VVCAM_ISP_DRIVER_H__ + +#include +#include +#include +#include + +#include "vvcam_isp.h" +#include "vvcam_event.h" + +#define VVCAM_ISP_NAME "vvcam-isp" + +#define VVCAM_ISP_EVENT_ELEMS 10 +#define VVCAM_VI_EVENT_ELEMS 10 +struct vvcam_isp_dev { + phys_addr_t paddr; + uint32_t regs_size; + void __iomem *base; + // void __iomem *reset; + struct reset_control* reset; + int id; + int isp_irq; + int fe_irq; + int mi_irq; + // int fusa_irq; + struct miscdevice miscdev; + struct device *dev; + unsigned long pde; + struct mutex mlock; + struct vvcam_event_dev event_dev; + uint32_t irq_mis[VVCAM_EID_MAX]; + struct tasklet_struct stat_tasklet; + spinlock_t stat_lock; + uint32_t refcnt; +}; + +struct vvcam_isp_fh { + struct vvcam_isp_dev *isp_dev; + struct vvcam_event_fh event_fh; +}; + +int vvcam_isp_reset(struct vvcam_isp_dev *isp_dev, uint32_t reset); +int vvcam_isp_write_reg(struct vvcam_isp_dev *isp_dev, vvcam_isp_reg_t isp_reg); +int vvcam_isp_read_reg(struct vvcam_isp_dev *isp_dev, vvcam_isp_reg_t *isp_reg); +irqreturn_t vvcam_isp_irq_process(struct vvcam_isp_dev *isp_dev); +irqreturn_t vvcam_isp_mi_irq_process(struct vvcam_isp_dev *isp_dev); +irqreturn_t vvcam_isp_fe_irq_process(struct vvcam_isp_dev *isp_dev); +irqreturn_t vvcam_isp_fusa_irq_process(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.c b/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.c new file mode 100644 index 0000000..3ebc195 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.c @@ -0,0 +1,551 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_hal.h" + +extern void vvcam_isp_proc_stat(unsigned long pde, + const uint32_t *irq_mis, const int len); + +void vvcam_isp_irq_stat_tasklet(unsigned long dev) +{ + struct vvcam_isp_dev *isp_dev = (struct vvcam_isp_dev *)dev; + uint32_t irq_mis[VVCAM_EID_MAX]; + + memset(irq_mis, 0, sizeof(irq_mis)); + + memcpy(irq_mis, isp_dev->irq_mis, sizeof(irq_mis)); + memset(isp_dev->irq_mis, 0, sizeof(isp_dev->irq_mis)); + + vvcam_isp_proc_stat(isp_dev->pde, irq_mis, VVCAM_EID_MAX); +} + +static void vvcam_isp_hal_write_reg(void __iomem *base, + uint32_t addr, uint32_t value) +{ + writel(value, base + addr); +} + +static int vvcam_isp_hal_read_reg(void __iomem *base, uint32_t addr) +{ + return readl(base + addr); +} + +int vvcam_isp_reset(struct vvcam_isp_dev *isp_dev, uint32_t reset) +{ + if (IS_ERR(isp_dev->reset)) { + // ??? + return -1; + } + dev_info(isp_dev->dev, "reset\n"); + return reset_control_reset(isp_dev->reset); +} + +int vvcam_isp_write_reg(struct vvcam_isp_dev *isp_dev, vvcam_isp_reg_t isp_reg) +{ + vvcam_isp_hal_write_reg(isp_dev->base, isp_reg.addr, isp_reg.value); + return 0; +} + +int vvcam_isp_read_reg(struct vvcam_isp_dev *isp_dev, vvcam_isp_reg_t *isp_reg) +{ + uint32_t reg_value = 0; + + reg_value = vvcam_isp_hal_read_reg(isp_dev->base, isp_reg->addr); + + isp_reg->value = reg_value; + + return 0; +} + + +irqreturn_t vvcam_isp_irq_process(struct vvcam_isp_dev *isp_dev) +{ + uint32_t isp_mis = 0; + uint32_t isp_fe_ctrl = 0; + uint64_t timestamp; + + vvcam_event_t event; + + if (!isp_dev->refcnt) + return IRQ_NONE; + + isp_fe_ctrl = vvcam_isp_hal_read_reg(isp_dev->base, ISP_FE_CTL); + if ((isp_fe_ctrl & ISP_FE_CFG_SEL_MASK) == ISP_FE_SEL_CMDBUF) { + return IRQ_HANDLED; + } + + isp_mis = vvcam_isp_hal_read_reg(isp_dev->base, ISP_MIS); + if (isp_mis) { + // printk("isp_mis mis 0x%08x\n", isp_mis); + vvcam_isp_hal_write_reg(isp_dev->base, ISP_ICR, isp_mis); + } else { + return IRQ_NONE; + } + + timestamp = ktime_get_ns(); + + if (isp_mis) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_ISP_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = isp_mis; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_ISP_MIS] = isp_mis; + tasklet_schedule(&isp_dev->stat_tasklet); + } + + return IRQ_HANDLED; +} + +irqreturn_t vvcam_isp_mi_irq_process(struct vvcam_isp_dev *isp_dev) +{ + uint32_t miv2_mis = 0; + uint32_t miv2_mis1 = 0; + uint32_t miv2_mis2 = 0; + uint32_t miv2_mis3 = 0; + uint32_t mi_mis_hdr1 = 0; + uint32_t isp_fe_ctrl = 0; + uint64_t timestamp; + + vvcam_event_t event; + bool irq = false; + + if (!isp_dev->refcnt) + return IRQ_NONE; + + isp_fe_ctrl = vvcam_isp_hal_read_reg(isp_dev->base, ISP_FE_CTL); + if ((isp_fe_ctrl & ISP_FE_CFG_SEL_MASK) == ISP_FE_SEL_CMDBUF) { + return IRQ_HANDLED; + } + + miv2_mis = vvcam_isp_hal_read_reg(isp_dev->base, MIV2_MIS); + if (miv2_mis) { + //printk("miv2 mis 0x%08x\n", miv2_mis); + vvcam_isp_hal_write_reg(isp_dev->base, MIV2_ICR, miv2_mis); + irq = true; + } + + miv2_mis1 = vvcam_isp_hal_read_reg(isp_dev->base, MIV2_MIS1); + if (miv2_mis1) { + vvcam_isp_hal_write_reg(isp_dev->base, MIV2_ICR1, miv2_mis1); + irq = true; + } + + miv2_mis2 = vvcam_isp_hal_read_reg(isp_dev->base, MIV2_MIS2); + if (miv2_mis2) { + vvcam_isp_hal_write_reg(isp_dev->base, MIV2_ICR2, miv2_mis2); + irq = true; + } + + miv2_mis3 = vvcam_isp_hal_read_reg(isp_dev->base, MIV2_MIS3); + if (miv2_mis3) { + vvcam_isp_hal_write_reg(isp_dev->base, MIV2_ICR3, miv2_mis3); + irq = true; + } + + mi_mis_hdr1 = vvcam_isp_hal_read_reg(isp_dev->base, MI_MIS_HDR1); + if (mi_mis_hdr1) { + vvcam_isp_hal_write_reg(isp_dev->base, MI_ICR_HDR1, mi_mis_hdr1); + irq = true; + } + + timestamp = ktime_get_ns(); + + if (miv2_mis & (MIV2_MIS_MCM_RAW_RADY_MASK | MIV2_MIS_FRAME_END_MASK)) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_RDMA_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis & + (MIV2_MIS_MCM_RAW_RADY_MASK | MIV2_MIS_FRAME_END_MASK); + miv2_mis &= ~MIV2_MIS_MCM_RAW_RADY_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_RDMA_MIS] = event.irqevent.irq_value; + } + + if (miv2_mis & MIV2_MIS_JPD_FRAME_END_MASK) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_JDP; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis & MIV2_MIS_JPD_FRAME_END_MASK; + miv2_mis &= ~MIV2_MIS_JPD_FRAME_END_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_MIV2_JDP] = event.irqevent.irq_value; + } + + if (miv2_mis & MIV2_MIS_MCM_RAW0_FRAME_END_MASK) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MCM_WR_RAW0_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis & MIV2_MIS_MCM_RAW0_FRAME_END_MASK; + miv2_mis &= ~MIV2_MIS_MCM_RAW0_FRAME_END_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_MCM_WR_RAW0_MIS] = event.irqevent.irq_value; + } + + if (miv2_mis & MIV2_MIS_MCM_RAW1_FRAME_END_MASK) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MCM_WR_RAW1_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis & MIV2_MIS_MCM_RAW1_FRAME_END_MASK; + miv2_mis &= ~MIV2_MIS_MCM_RAW1_FRAME_END_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_MCM_WR_RAW1_MIS] = event.irqevent.irq_value; + } + + + if (miv2_mis3 & MIV2_MIS3_MCM_G2RAW0_FRAME_END_MASK) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MCM_WR_G2_RAW0_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis3 & MIV2_MIS3_MCM_G2RAW0_FRAME_END_MASK; + miv2_mis3 &= ~MIV2_MIS3_MCM_G2RAW0_FRAME_END_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_MCM_WR_G2_RAW0_MIS] = event.irqevent.irq_value; + } + + if (miv2_mis3 & MIV2_MIS3_MCM_G2RAW1_FRAME_END_MASK) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MCM_WR_G2_RAW1_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis3 & MIV2_MIS3_MCM_G2RAW1_FRAME_END_MASK; + miv2_mis3 &= ~MIV2_MIS3_MCM_G2RAW1_FRAME_END_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_MCM_WR_G2_RAW1_MIS] = event.irqevent.irq_value; + } + + if (miv2_mis) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if (miv2_mis1) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_MIS1; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis1; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if ((miv2_mis2 & MIV2_MIS2_HDR_RDMA_READY_MASK) + || (miv2_mis & MIV2_MIS_FRAME_END_MASK)) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_MIS2_HDR; + event.timestamp = timestamp; + event.irqevent.irq_value = (miv2_mis2 & MIV2_MIS2_HDR_RDMA_READY_MASK) + | (miv2_mis & MIV2_MIS_FRAME_END_MASK); + miv2_mis2 &= ~MIV2_MIS2_HDR_RDMA_READY_MASK; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if (miv2_mis2) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_MIS2; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis2; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if (miv2_mis3) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MIV2_MIS3; + event.timestamp = timestamp; + event.irqevent.irq_value = miv2_mis3; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if (mi_mis_hdr1) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_MI_MIS_HDR1; + event.timestamp = timestamp; + event.irqevent.irq_value = mi_mis_hdr1; + vvcam_event_queue(&isp_dev->event_dev, &event); + } + + if (irq) { + tasklet_schedule(&isp_dev->stat_tasklet); + return IRQ_HANDLED; + } + + return IRQ_NONE; +} + +irqreturn_t vvcam_isp_fe_irq_process(struct vvcam_isp_dev *isp_dev) +{ + uint32_t isp_fe_mis = 0; + uint32_t isp_fe_ctrl = 0; + vvcam_event_t event; + uint64_t timestamp; + + if (!isp_dev->refcnt) + return IRQ_NONE; + + isp_fe_mis = vvcam_isp_hal_read_reg(isp_dev->base, ISP_FE_MIS); + if (isp_fe_mis) { + vvcam_isp_hal_write_reg(isp_dev->base, ISP_FE_ICR, isp_fe_mis); + } else { + return IRQ_NONE; + } + + isp_fe_ctrl = vvcam_isp_hal_read_reg(isp_dev->base, ISP_FE_CTL); + if ((isp_fe_ctrl & ISP_FE_CFG_SEL_MASK) == ISP_FE_SEL_CMDBUF) { + isp_fe_ctrl &= ~(ISP_FE_CFG_SEL_MASK | ISP_FE_AHB_WRITE_MASK); + isp_fe_ctrl |= (ISP_FE_SEL_AHBBUF) << ISP_FE_CFG_SEL_SHIFT; + isp_fe_ctrl |= (ISP_FE_AHB_WR_ENABLE) << ISP_FE_AHB_WRITE_SHIFT; + vvcam_isp_hal_write_reg(isp_dev->base, ISP_FE_CTL, isp_fe_ctrl); + + } + + timestamp = ktime_get_ns(); + + if (isp_fe_mis) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FE_MIS; + event.timestamp = timestamp; + event.irqevent.irq_value = isp_fe_mis; + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FE_MIS] = isp_fe_mis; + tasklet_schedule(&isp_dev->stat_tasklet); + } + + return IRQ_HANDLED; +} + +irqreturn_t vvcam_isp_fusa_irq_process(struct vvcam_isp_dev *isp_dev) +{ + uint32_t fusa_ecc_mis1 = 0; + uint32_t fusa_ecc_mis2 = 0; + uint32_t fusa_ecc_mis3 = 0; + uint32_t fusa_ecc_mis4 = 0; + uint32_t fusa_ecc_mis5 = 0; + uint32_t fusa_ecc_mis6 = 0; + uint32_t fusa_dup_mis = 0; + uint32_t fusa_parity_mis = 0; + uint32_t fusa_lv1_mis1 = 0; + uint64_t timestamp; + + vvcam_event_t event; + bool irq = false; + + if (!isp_dev->refcnt) + return IRQ_NONE; + + printk("enter fusa_irq_process\n"); + + fusa_ecc_mis1 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS1); + printk("FUSA_ECC_MIS1 : 0x%08x \n", fusa_ecc_mis1); + if (fusa_ecc_mis1) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR1, fusa_ecc_mis1); + irq = true; + } + + fusa_ecc_mis2 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS2); + printk("FUSA_ECC_MIS2 : 0x%08x \n", fusa_ecc_mis2); + if (fusa_ecc_mis2) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR2, fusa_ecc_mis2); + irq = true; + } + + fusa_ecc_mis3 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS3); + printk("FUSA_ECC_MIS3 : 0x%08x \n", fusa_ecc_mis3); + if (fusa_ecc_mis3) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR3, fusa_ecc_mis3); + irq = true; + } + + fusa_ecc_mis4 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS4); + printk("FUSA_ECC_MIS4 : 0x%08x \n", fusa_ecc_mis4); + if (fusa_ecc_mis4) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR4, fusa_ecc_mis4); + irq = true; + } + + fusa_ecc_mis5 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS5); + printk("FUSA_ECC_MIS5 : 0x%08x \n", fusa_ecc_mis5); + if (fusa_ecc_mis5) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR5, fusa_ecc_mis5); + irq = true; + } + + fusa_ecc_mis6 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_ECC_MIS6); + printk("FUSA_ECC_MIS6 : 0x%08x \n", fusa_ecc_mis6); + if (fusa_ecc_mis6) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_ECC_ICR6, fusa_ecc_mis6); + irq = true; + } + + fusa_dup_mis = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_DUP_MIS); + printk("FUSA_DUP_MIS : 0x%08x \n", fusa_dup_mis); + if (fusa_dup_mis) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_DUP_ICR, fusa_dup_mis); + irq = true; + } + + fusa_parity_mis = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_PARITY_MIS); + printk("FUSA_PARITY_MIS : 0x%08x \n", fusa_parity_mis); + if (fusa_parity_mis) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_PARITY_ICR, fusa_parity_mis); + irq = true; + } + + fusa_lv1_mis1 = vvcam_isp_hal_read_reg(isp_dev->base, FUSA_LV1_MIS1); + printk("FUSA_LV1_MIS1 : 0x%08x \n", fusa_lv1_mis1); + if (fusa_lv1_mis1) { + vvcam_isp_hal_write_reg(isp_dev->base, FUSA_LV1_ICR1, fusa_lv1_mis1); + irq = true; + } + + timestamp = ktime_get_ns(); + + if (fusa_ecc_mis1) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC1; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis1; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC1] = event.irqevent.irq_value; + } + + if (fusa_ecc_mis2) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC2; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis2; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC2] = event.irqevent.irq_value; + } + + if (fusa_ecc_mis3) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC3; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis3; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC3] = event.irqevent.irq_value; + } + + if (fusa_ecc_mis4) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC4; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis4; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC4] = event.irqevent.irq_value; + } + + if (fusa_ecc_mis5) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC5; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis5; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC5] = event.irqevent.irq_value; + } + + if (fusa_ecc_mis6) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_ECC_IMSC6; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_ecc_mis6; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_ECC_IMSC6] = event.irqevent.irq_value; + } + + if (fusa_dup_mis) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_DUP_IMSC; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_dup_mis; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_DUP_IMSC] = event.irqevent.irq_value; + } + + if (fusa_parity_mis) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_PARITY_IMSC; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_parity_mis; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_PARITY_IMSC] = event.irqevent.irq_value; + } + + if (fusa_lv1_mis1) { + event.type = VVCAM_EVENT_IRQ_TYPE; + event.id = VVCAM_EID_FUSA_LV1_IMSC1; + event.timestamp = timestamp; + event.irqevent.irq_value = fusa_lv1_mis1; + + vvcam_event_queue(&isp_dev->event_dev, &event); + isp_dev->irq_mis[VVCAM_EID_FUSA_LV1_IMSC1] = event.irqevent.irq_value; + } + + if (irq) { + tasklet_schedule(&isp_dev->stat_tasklet); + return IRQ_HANDLED; + } + + return IRQ_HANDLED; +} \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.h b/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.h new file mode 100644 index 0000000..2b081db --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_hal.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_HAL_H__ +#define __VVCAM_ISP_HAL_H__ + +#define TPG_ISP_RST_SHIFT 24 +#define TPG_ISP_RST_MASK 0x01000000 + +#define ISP_MIS 0x000005c4 +#define ISP_ICR 0x000005c8 + +#define MIV2_CTRL 0x00001300 +#define MIV2_MIS 0x000016d0 +#define MIV2_MIS1 0x000016d4 +#define MIV2_ICR 0x000016d8 +#define MIV2_ICR1 0x000016dc +#define MIV2_MIS2 0x000016f0 +#define MIV2_ICR2 0x000016f4 +#define MIV2_MIS3 0x000056d8 +#define MIV2_ICR3 0x000056dc +#define MI_MIS_HDR1 0x000072c8 +#define MI_ICR_HDR1 0x000072cc + +#define ISP_FE_MIS 0x00003D74 +#define ISP_FE_ICR 0x00003D78 +#define ISP_FE_CTL 0x00003D60 + + +#define MIV2_CTRL_MCM_RAW_RDMA_START_MASK 0x00008000 + +#define MIV2_MIS_MCM_RAW_RADY_MASK 0x01000000 +#define MIV2_MIS_MCM_RAW1_FRAME_END_MASK 0x00000080 +#define MIV2_MIS_MCM_RAW0_FRAME_END_MASK 0x00000040 +#define MIV2_MIS_MCM_RAW_FRAME_END_MASK 0x000000c0 +#define MIV2_MIS_FRAME_END_MASK 0x0000003f +#define MIV2_MIS_JPD_FRAME_END_MASK 0x00000004U + +#define MIV2_MIS2_HDR_RDMA_READY_MASK 0x20000700 +#define MIV2_MIS2_HDR_FRAME_END_MASK 0x0800001c + +#define MIV2_MIS3_MCM_G2RAW1_FRAME_END_MASK 0x00008000 +#define MIV2_MIS3_MCM_G2RAW0_FRAME_END_MASK 0x00004000 +#define MIV2_MIS3_MCM_G2RAW_FRAME_END_MASK 0x0000c000 + +#define MIV2_MIS_MP_FRAME_END_MASK 0x00000003 +#define MIV2_MIS_SP_FRAME_END_MASK 0x00000008 +#define MIV2_MIS_SP2_FRAME_END_MASK 0x00000030 + +#define ISP_MIS_FRAME_IN_MASK 0x00000020 +#define ISP_MIS_FRAME_OUT_MASK 0x00000002 + +#define ISP_FE_CFG_SEL_MASK 0x00000001 +#define ISP_FE_CFG_SEL_SHIFT 0 +#define ISP_FE_AHB_WRITE_MASK 0x00000002 +#define ISP_FE_AHB_WRITE_SHIFT 1 + +#define FUSA_ECC_IMSC1 0x00005b54 +#define FUSA_ECC_RIS1 0x00005b58 +#define FUSA_ECC_MIS1 0x00005b5c +#define FUSA_ECC_ICR1 0x00005b64 +#define FUSA_ECC_IMSC2 0x00005b68 +#define FUSA_ECC_RIS2 0x00005b6C +#define FUSA_ECC_MIS2 0x00005b70 +#define FUSA_ECC_ICR2 0x00005b78 +#define FUSA_ECC_IMSC3 0x00005b7c +#define FUSA_ECC_RIS3 0x00005b80 +#define FUSA_ECC_MIS3 0x00005b84 +#define FUSA_ECC_ICR3 0x00005b8c +#define FUSA_ECC_IMSC4 0x00005b90 +#define FUSA_ECC_RIS4 0x00005b94 +#define FUSA_ECC_MIS4 0x00005b98 +#define FUSA_ECC_ICR4 0x00005ba0 +#define FUSA_ECC_IMSC5 0x00005ba4 +#define FUSA_ECC_RIS5 0x00005ba8 +#define FUSA_ECC_MIS5 0x00005bac +#define FUSA_ECC_ICR5 0x00005bb4 +#define FUSA_ECC_IMSC6 0x00005c44 +#define FUSA_ECC_RIS6 0x00005c48 +#define FUSA_ECC_MIS6 0x00005c4c +#define FUSA_ECC_ICR6 0x00005c54 + +#define FUSA_DUP_IMSC 0x00005bb8 +#define FUSA_DUP_RIS 0x00005bbc +#define FUSA_DUP_MIS 0x00005bc0 +#define FUSA_DUP_ICR 0x00005bc8 +#define FUSA_PARITY_IMSC 0x00005bcc +#define FUSA_PARITY_RIS 0x00005bd0 +#define FUSA_PARITY_MIS 0x00005bd4 +#define FUSA_PARITY_ICR 0x00005bdc +#define FUSA_LV1_IMSC1 0x00005b40 +#define FUSA_LV1_RIS1 0x00005b44 +#define FUSA_LV1_MIS1 0x00005b48 +#define FUSA_LV1_ICR1 0x00005b50 + +enum isp_fe_cfg_sel_e { + ISP_FE_SEL_AHBBUF = 0, + ISP_FE_SEL_CMDBUF = 1, +}; + +enum isp_fe_ahb_wr_en_e { + ISP_FE_AHB_WR_DISABLE = 0, + ISP_FE_AHB_WR_ENABLE = 1, +}; + +#endif diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.c b/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.c new file mode 100644 index 0000000..18923af --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.c @@ -0,0 +1,709 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_procfs.h" +#include "vvcam_isp_hal.h" + +#define VVCAM_ISP_PROCFS_BUF_SIZE 256 + +#define PROC_OUT_OF_RANGE 0x01 +#define PROC_PARSE_ERROR 0x02 + +#define PROC_PRINT_STAT(stat, sfile, name) \ + seq_printf(sfile, "|%-32s|%-16d|\n", #name, stat.name); \ + seq_printf(sfile, "|--------------------------------|----------------|\n"); + + +enum { + PROC_CMD_RW, + PROC_CMD_CLEAR +}; + +struct rw_cmd { + bool is_write; + int8_t flags; + uint32_t start_addr; + uint8_t num_elems; + uint32_t *rw_buffer; + struct list_head list; +}; + +struct vvcam_isp_irq_stat { + uint32_t isp_frame_in_cnt; + uint32_t isp_frame_out_cnt; + + uint32_t mp_frame_out_cnt; + uint32_t sp_frame_out_cnt; + uint32_t sp2_frame_out_cnt; + + uint32_t mcm_raw0_frame_cnt; + uint32_t mcm_raw1_frame_cnt; + uint32_t mcm_g2_raw0_frame_cnt; + uint32_t mcm_g2_raw1_frame_cnt; + uint32_t mcm_rdma_frame_cnt; + + uint32_t fe_irq_cnt; + + uint32_t fusa_ecc1_cnt; + uint32_t fusa_ecc2_cnt; + uint32_t fusa_ecc3_cnt; + uint32_t fusa_ecc4_cnt; + uint32_t fusa_ecc5_cnt; + uint32_t fusa_ecc6_cnt; + uint32_t fusa_dup_cnt; + uint32_t fusa_parity_cnt; + uint32_t fusa_lv1_cnt; + + unsigned long long start; + unsigned long long end; +}; + +struct vvcam_isp_status { + int8_t flags; + int8_t type; + struct vvcam_isp_irq_stat stat; + struct list_head cmd_list; +}; + +struct vvcam_isp_procfs { + struct proc_dir_entry *pde; + struct vvcam_isp_dev *isp_dev; + struct mutex lock; + struct vvcam_isp_status status; +}; + +void vvcam_isp_proc_stat(unsigned long pde, + const uint32_t *irq_mis, const int len) +{ + struct vvcam_isp_procfs *isp_proc = (struct vvcam_isp_procfs*)pde; + struct vvcam_isp_irq_stat *stat = &isp_proc->status.stat; + int eid = 0; + + //mutex_lock(&isp_proc->lock); + for (eid = 0; eid < len; eid++) { + if (!irq_mis[eid]) + continue; + + switch (eid) + { + case VVCAM_EID_ISP_MIS: + if (irq_mis[eid] & ISP_MIS_FRAME_IN_MASK) + stat->isp_frame_in_cnt++; + + if (irq_mis[eid] & ISP_MIS_FRAME_OUT_MASK) + stat->isp_frame_out_cnt++; + + break; + + case VVCAM_EID_MIV2_MIS: + /* reserve */ + break; + + case VVCAM_EID_MIV2_MIS1: + /* reserve */ + break; + + case VVCAM_EID_MIV2_MIS2: + /* reserve */ + break; + + case VVCAM_EID_MIV2_MIS3: + /* reserve */ + break; + + case VVCAM_EID_RDMA_MIS: + if (irq_mis[eid] & MIV2_MIS_MCM_RAW_RADY_MASK) + stat->mcm_rdma_frame_cnt++; + + if (irq_mis[eid] & MIV2_MIS_MP_FRAME_END_MASK) + stat->mp_frame_out_cnt++; + + if (irq_mis[eid] & MIV2_MIS_SP_FRAME_END_MASK) + stat->sp_frame_out_cnt++; + + if (irq_mis[eid] & MIV2_MIS_SP2_FRAME_END_MASK) + stat->sp2_frame_out_cnt++; + + break; + + case VVCAM_EID_MCM_WR_RAW0_MIS: + stat->mcm_raw0_frame_cnt++; + break; + + case VVCAM_EID_MCM_WR_RAW1_MIS: + stat->mcm_raw1_frame_cnt++; + break; + + case VVCAM_EID_MCM_WR_G2_RAW0_MIS: + stat->mcm_g2_raw0_frame_cnt++; + break; + + case VVCAM_EID_MCM_WR_G2_RAW1_MIS: + stat->mcm_g2_raw1_frame_cnt++; + break; + + case VVCAM_EID_FE_MIS: + stat->fe_irq_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC1: + stat->fusa_ecc1_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC2: + stat->fusa_ecc2_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC3: + stat->fusa_ecc3_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC4: + stat->fusa_ecc4_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC5: + stat->fusa_ecc5_cnt++; + break; + + case VVCAM_EID_FUSA_ECC_IMSC6: + stat->fusa_ecc6_cnt++; + break; + + case VVCAM_EID_FUSA_DUP_IMSC: + stat->fusa_dup_cnt++; + break; + + case VVCAM_EID_FUSA_PARITY_IMSC: + stat->fusa_parity_cnt++; + break; + + case VVCAM_EID_FUSA_LV1_IMSC1: + stat->fusa_lv1_cnt++; + break; + } + } + //mutex_unlock(&isp_proc->lock); +} + + +static void release_cmd_list(struct list_head *cmd_list) +{ + struct rw_cmd *cmd = NULL, *old = NULL; + + if (!list_empty( cmd_list)) { + list_for_each_entry(cmd, cmd_list, list) { + if (old) { + list_del(&old->list); + kfree(old); + old = NULL; + } + if (cmd->rw_buffer) + kfree(cmd->rw_buffer); + old = cmd; + } + + if (old) { + list_del(&old->list); + kfree(old); + old = NULL; + } + } +} + +static int vvcam_isp_procfs_info_show(struct seq_file *sfile, void *offset) +{ + struct vvcam_isp_procfs *isp_proc; + struct vvcam_isp_dev *isp_dev; + struct vvcam_isp_status *status; + struct rw_cmd *cmd = NULL; + uint8_t i = 0; + + isp_proc = (struct vvcam_isp_procfs *) sfile->private; + + mutex_lock(&isp_proc->lock); + isp_dev = isp_proc->isp_dev; + status = &isp_proc->status; + + if (status->flags & PROC_PARSE_ERROR) { + seq_printf(sfile, "please check input!\n"); + seq_printf(sfile, + "Usage: echo [r|w][num_of_32bit_value]@[addr] [values]>[proc path]\n"); + seq_printf(sfile, + "eg: echo w2@0x00005400 0x00412745 0x80252941 r2>/proc/vsi/vsiisp0 && cat /proc/vsi/vsiisp0\n"); + status->flags = 0; + mutex_unlock(&isp_proc->lock); + return 0; + } + + if (!list_empty(&status->cmd_list)) { + list_for_each_entry(cmd, &status->cmd_list, list) { + if (cmd->is_write) { + if (cmd->flags & PROC_OUT_OF_RANGE) { + seq_printf(sfile, "write addr %08x ~ %08x out of range.\n", + cmd->start_addr, cmd->start_addr + + (uint32_t)sizeof(cmd->start_addr) * (cmd->num_elems - 1)); + } else { + seq_printf(sfile, "write addr %08x ~ %08x successed.\n", + cmd->start_addr, cmd->start_addr + + (uint32_t)sizeof(cmd->start_addr) * (cmd->num_elems - 1)); + } + } else { + if (cmd->flags & PROC_OUT_OF_RANGE) { + seq_printf(sfile, "read addr %08x ~ %08x out of range.\n", + cmd->start_addr, cmd->start_addr + + (uint32_t)sizeof(cmd->start_addr) * (cmd->num_elems - 1)); + } else { + seq_printf(sfile, "read addr %08x ~ %08x successed:\n", + cmd->start_addr, cmd->start_addr + + (uint32_t)sizeof(cmd->start_addr) * (cmd->num_elems - 1)); + for (i = 0; i < cmd->num_elems; i++) { + seq_printf(sfile, "addr:0x%08x value:0x%08x\n", + cmd->start_addr + + (uint32_t)sizeof(cmd->start_addr) * i, + cmd->rw_buffer[i]); + } + } + } + cmd->flags = 0; + } + release_cmd_list(&status->cmd_list); + status->flags = 0; + } else { + status->stat.end = ktime_get_ns(); + seq_printf(sfile, + "/***statistic for %s time(ns):%lld)***/\n", + isp_dev->miscdev.name, status->stat.end - status->stat.start); + + seq_printf(sfile, "|--------------------------------|----------------|\n"); + seq_printf(sfile, "|%-32s|%-16s|\n", + " Name", " Number"); \ + seq_printf(sfile, "|--------------------------------|----------------|\n"); + PROC_PRINT_STAT(status->stat, sfile, isp_frame_in_cnt); + PROC_PRINT_STAT(status->stat, sfile, isp_frame_out_cnt); + PROC_PRINT_STAT(status->stat, sfile, mp_frame_out_cnt); + PROC_PRINT_STAT(status->stat, sfile, sp_frame_out_cnt); + PROC_PRINT_STAT(status->stat, sfile, sp2_frame_out_cnt); + PROC_PRINT_STAT(status->stat, sfile, mcm_raw0_frame_cnt); + PROC_PRINT_STAT(status->stat, sfile, mcm_raw1_frame_cnt); + PROC_PRINT_STAT(status->stat, sfile, mcm_g2_raw0_frame_cnt); + PROC_PRINT_STAT(status->stat, sfile, mcm_g2_raw1_frame_cnt); + PROC_PRINT_STAT(status->stat, sfile, mcm_rdma_frame_cnt); + PROC_PRINT_STAT(status->stat, sfile, fe_irq_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc1_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc2_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc3_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc4_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc5_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_ecc6_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_dup_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_parity_cnt); + PROC_PRINT_STAT(status->stat, sfile, fusa_lv1_cnt); + } + mutex_unlock(&isp_proc->lock); + + return 0; +} + +static int vvcam_isp_procfs_open(struct inode *inode, struct file *file) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + return single_open(file, vvcam_isp_procfs_info_show, PDE_DATA(inode)); +#else + return single_open(file, vvcam_isp_procfs_info_show, pde_data(inode)); +#endif +} + +static char *vvcam_isp_next_arg(char *str_buf, char **param) +{ + int i = 0; + for (; str_buf[i]; i++) { + if (isspace(str_buf[i])) + break; + } + *param = str_buf; + + if (str_buf[i]) { + str_buf[i] = '\0'; + str_buf += i + 1; + } else + str_buf += i; + + return skip_spaces(str_buf); +} + +static int vvcam_isp_proc_parse_args(char *str_buf, + struct vvcam_isp_status *status) +{ + char *param, *end = NULL; + int32_t address = -1; + uint8_t read_write = 0; + uint8_t num_elems = 0; + int8_t index= 0; + struct rw_cmd *cmd = NULL; + + if ((strlen(str_buf) == 1) || (strcmp(str_buf, "clear\n") == 0)) { + status->type = PROC_CMD_CLEAR; + return 0; + } + + status->type = PROC_CMD_RW; + while (*str_buf) { + param = NULL; + str_buf = vvcam_isp_next_arg(str_buf, ¶m); + if ((*param == 'r') || (*param == 'w')) { + if (index != 0) + goto error_isp_proc_cmd; + + read_write = *param; + num_elems = (uint8_t)simple_strtoul((param + 1), &end, 0); + if (num_elems != 0) + param = end; + else + num_elems = 1; + + if (*end == '@') { + address = (uint32_t)simple_strtoul(param + 1, &end, 0); + if (((end - param - 1) > 10) || ((end - param - 1) <= 6)) { + goto error_isp_proc_cmd; + } + } + + if (*end != '\0') + goto error_isp_proc_cmd; + + if (address < 0) { + goto error_isp_proc_cmd; + } + + cmd = kzalloc(sizeof(struct rw_cmd), GFP_KERNEL); + if (!cmd) + goto error_isp_proc_cmd; + + cmd->is_write = (read_write == 'w' ? true : false); + cmd->start_addr = address; + cmd->num_elems = num_elems; + cmd->rw_buffer = + kzalloc(sizeof(int32_t) * cmd->num_elems, GFP_KERNEL); + if (!cmd->rw_buffer) + goto error_isp_proc_cmd; + + list_add_tail(&cmd->list, &status->cmd_list); + if (read_write == 'w') + index = num_elems; + continue; + } + + if (*param != '\0' && read_write != 0) { + if (read_write == 'r') + goto error_isp_proc_cmd; + + if (index <= 0) + goto error_isp_proc_cmd; + + cmd->rw_buffer[num_elems - index] = + (uint32_t)simple_strtoul(param, &end, 0); + + if ((*end != '\0') || ((end - param) > 10) || + ((end - param) <= 6)) + goto error_isp_proc_cmd; + + index--; + } + } + return 0; + +error_isp_proc_cmd: + release_cmd_list(&status->cmd_list); + return -EFAULT; +} + +static int32_t vvcam_isp_proc_process(struct seq_file *sfile, + struct vvcam_isp_procfs *isp_proc, char *str_buf) +{ + struct vvcam_isp_status *status; + vvcam_isp_reg_t reg; + struct rw_cmd *cmd = NULL; + int32_t ret = 0; + uint8_t i = 0; + + status = &isp_proc->status; + + mutex_lock(&isp_proc->lock); + if (!list_empty(&status->cmd_list)) { + release_cmd_list(&status->cmd_list); + } + + status->flags = 0; + status->type = -1; + + ret = vvcam_isp_proc_parse_args(str_buf, status); + if (ret) { + status->flags = PROC_PARSE_ERROR; + mutex_unlock(&isp_proc->lock); + return ret; + } + + if (status->type == PROC_CMD_CLEAR) { + memset(&status->stat, 0, sizeof(status->stat)); + status->stat.start = ktime_get_ns(); + } else { + mutex_lock(&isp_proc->isp_dev->mlock); + list_for_each_entry(cmd, &status->cmd_list, list) { + for (i = 0; i < cmd->num_elems; i++) { + reg.addr = cmd->start_addr + sizeof(cmd->start_addr) * i; + if (reg.addr >= isp_proc->isp_dev->regs_size) { + cmd->flags |= PROC_OUT_OF_RANGE; + continue; + } + if (cmd->is_write) { + reg.value = cmd->rw_buffer[i]; + ret = vvcam_isp_write_reg(isp_proc->isp_dev, reg); + } else { + ret = vvcam_isp_read_reg(isp_proc->isp_dev, ®); + cmd->rw_buffer[i] = reg.value; + } + } + } + mutex_unlock(&isp_proc->isp_dev->mlock); + } + + mutex_unlock(&isp_proc->lock); + + return 0; +} + +static ssize_t vvcam_isp_procfs_write(struct file *file, + const char __user *buffer, size_t count, loff_t *ppos) +{ + struct vvcam_isp_procfs *isp_proc; + struct seq_file *sfile; + char *str_buf; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + isp_proc = (struct vvcam_isp_procfs *) PDE_DATA(file_inode(file)); +#else + isp_proc = (struct vvcam_isp_procfs *) pde_data(file_inode(file)); +#endif + sfile = file->private_data; + + if (count > VVCAM_ISP_PROCFS_BUF_SIZE) + count = VVCAM_ISP_PROCFS_BUF_SIZE - 1; + + str_buf = (char *)kzalloc(count, GFP_KERNEL); + if (!str_buf) + return -ENOMEM; + + if (copy_from_user(str_buf, buffer, count)) + return -EFAULT; + + *(str_buf + count) = '\0'; + + vvcam_isp_proc_process(sfile, isp_proc, str_buf); + + kfree(str_buf); + + return count; +} + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0) +static const struct file_operations vvcam_isp_procfs_ops = { + .open = vvcam_isp_procfs_open, + .release = seq_release, + .read = seq_read, + .write = vvcam_isp_procfs_write, + .llseek = seq_lseek, +}; +#else +static const struct proc_ops vvcam_isp_procfs_ops = { + .proc_open = vvcam_isp_procfs_open, + .proc_release = seq_release, + .proc_read = seq_read, + .proc_write = vvcam_isp_procfs_write, + .proc_lseek = seq_lseek, +}; +#endif + +struct finddir_callback { + struct dir_context ctx; + const char *name; + int32_t files_cnt; + bool found; +}; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) +static int readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return 0; + + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return 0; +} + +#else +static bool readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return true; + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return true; +} +#endif + + +static int find_proc_dir_by_name(const char *root, + const char *name, bool *found, int32_t *files_cnt) { + struct file *pfile; + int ret = 0; + struct finddir_callback fc = { + .ctx.actor = readdir_callback, + .name = name, + .found = false, + .files_cnt = -2, + }; + + pfile = filp_open(root, O_RDONLY | O_DIRECTORY, 0); + if (pfile->f_op->iterate_shared) { + ret = pfile->f_op->iterate_shared(pfile, &fc.ctx); + } else { + // ret = pfile->f_op->iterate(pfile, &fc.ctx); + } + + if (ret == 0) { + *found = fc.found; + } + + if (files_cnt != NULL) { + *files_cnt = fc.files_cnt; + } + + filp_close(pfile, NULL); + return ret; +} + +int vvcam_isp_procfs_register(struct vvcam_isp_dev *isp_dev, unsigned long *pde) +{ + struct vvcam_isp_procfs *isp_proc; + char isp_proc_name[32]; + int ret = 0; + bool found = false; + + if (!isp_dev) + return -1; + sprintf(isp_proc_name, "vsi/isp%d", isp_dev->id); + + isp_proc = devm_kzalloc(isp_dev->dev, + sizeof(struct vvcam_isp_procfs), GFP_KERNEL); + + if (!isp_proc) + return -ENOMEM; + + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (!found) + proc_mkdir("vsi", NULL); + } else { + return -EFAULT; + } + + isp_proc->isp_dev = isp_dev; + isp_proc->pde = proc_create_data(isp_proc_name, 0664, NULL, + &vvcam_isp_procfs_ops, isp_proc); + if (!isp_proc->pde) + return -EFAULT; + *pde = (unsigned long)&isp_proc->pde; + + INIT_LIST_HEAD(&isp_proc->status.cmd_list); + mutex_init(&(isp_proc->lock)); + return 0; +} + +void vvcam_isp_procfs_unregister(unsigned long pde) +{ + int ret = 0; + bool found = false; + int32_t files_cnt; + struct vvcam_isp_procfs *isp_proc = (struct vvcam_isp_procfs*)pde; + + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (found) { + proc_remove(isp_proc->pde); + ret = find_proc_dir_by_name("/proc/vsi", "", &found, &files_cnt); + if (files_cnt == 0) { + remove_proc_subtree("vsi", NULL); + } + } + } +} diff --git a/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.h b/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.h new file mode 100644 index 0000000..9af86c1 --- /dev/null +++ b/buildroot-overlay/package/vvcam/isp/vvcam_isp_procfs.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_PROCFS_H__ +#define __VVCAM_ISP_PROCFS_H__ + +int vvcam_isp_procfs_register(struct vvcam_isp_dev *isp_dev, + unsigned long *pde); +void vvcam_isp_procfs_unregister(unsigned long pde); + +#endif diff --git a/buildroot-overlay/package/vvcam/mipi/k230_csi.c b/buildroot-overlay/package/vvcam/mipi/k230_csi.c new file mode 100644 index 0000000..ee8099f --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/k230_csi.c @@ -0,0 +1,1766 @@ +/* Copyright (c) 2024, Canaan Bright Sight Co., Ltd + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "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 COPYRIGHT HOLDER OR + * CONTRIBUTORS 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. + */ + +#include "k230_csi.h" +#include +#include +#include + +static u8 *g_csi_addr = NULL; + +static void k230_csi0_rxphy0_reg_write(u16 phy_addr, u8 code_data) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 reg = 0; + + code_addr_msb = (phy_addr >> 8) & 0xff; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + //3. writing data + //a. place the 8-bit data + //b. set testclk to high + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + phy_testdin = code_data; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); +} + + +static void k230_csi1_rxphy1_reg_write(u16 phy_addr, u8 code_data) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 reg = 0; + + code_addr_msb = (phy_addr >> 8) & 0xff; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + //3. writing data + //a. place the 8-bit data + //b. set testclk to high + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + phy_testdin = code_data; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); +} + + +static void k230_csi2_rxphy2_reg_write(u16 phy_addr, u8 code_data) +{ + + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 reg = 0; + + code_addr_msb = (phy_addr >> 8) & 0xff; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + //3. writing data + //a. place the 8-bit data + //b. set testclk to high + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + phy_testdin = code_data; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); +} + + +static void k230_csi0_rxphy1_reg_write(u16 phy_addr, u8 code_data) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 reg = 0; + + code_addr_msb = (phy_addr >> 8) & 0xff; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + writel(0x0, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + //3. writing data + //a. place the 8-bit data + //b. set testclk to high + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + phy_testdin = code_data; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); +} + +#if 0 +static u8 k230_csi0_rxphy0_reg_read(u16 phy_addr) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 rdata, reg; + + code_addr_msb = (phy_addr >> 8) & 0xff ; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + //g. get phy data (read testout) + rdata = readl(g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL1); + // reg_read(32'h9000_a854, rdata); + + rdata = (rdata >> 8) & 0xff; + // code_data = rdata[15:8]; + + return rdata; +} + +static u8 k230_csi0_rxphy1_reg_read(u16 phy_addr) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 rdata, reg; + + code_addr_msb = (phy_addr >> 8) & 0xff ; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + + writel(0x0, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + //g. get phy data (read testout) + rdata = readl(g_csi_addr + 0x800 + DWC_PHY2_TEST_CTRL1); + // reg_read(32'h9000_a854, rdata); + + rdata = (rdata >> 8) & 0xff; + // code_data = rdata[15:8]; + + return rdata; +} + +static u8 k230_csi1_rxphy1_reg_read(u16 phy_addr) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 rdata, reg; + + code_addr_msb = (phy_addr >> 8) & 0xff ; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + //g. get phy data (read testout) + rdata = readl(g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL1); + // reg_read(32'h9000_a854, rdata); + + rdata = (rdata >> 8) & 0xffff; + // code_data = rdata[15:8]; + + return rdata; +} + +static u32 k230_csi2_rxphy2_reg_read(u16 phy_addr) +{ + u8 code_addr_msb, code_addr_lsb, phy_testdin; + u8 phy_testclr, phy_testclk,phy_testen; + u32 rdata, reg; + + code_addr_msb = (phy_addr >> 8) & 0xff ; + code_addr_lsb = phy_addr & 0xff; + + //1. writing the 4-bit test code MSBs + //a. set testclk & testen to low + phy_testclr = 0; + phy_testclk = 0; + phy_testen = 0; + phy_testdin = 0; + + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //b.set tesen to high, set clk to high, any delay needed? + phy_testen = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + + //c. place 0x00 in testdin + phy_testdin = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //d. set testclk to low, set testen to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //e. place the 8-bit word corresponding to the testcode MSBs in testdin + phy_testdin = code_addr_msb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + //f. set testclk to high + phy_testclk = 1; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + // #10ns; + // udelay(1); + udelay(1); + //2. writing the 8-bit test code LSBs + //a. set tesclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //b. set testen to high + //c. set testclk to high + //d. place the 8-bit word test data in testdin + phy_testen = 1; + phy_testclk = 1; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + phy_testdin = code_addr_lsb; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + // #10ns; + // udelay(1); + udelay(1); + //e. set testclk to low + phy_testclk = 0; + reg = 0; + reg = (reg & ~(BIT_MASK(0))) | (phy_testclr << 0); + reg = (reg & ~(BIT_MASK(1))) | (phy_testclk << 1); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + // reg_write(32'h9000_a850, {30'd0, phy_testclk, phy_testclr}); + //f. set testen to low + phy_testclk = 0; + phy_testen = 0; + reg = 0; + reg = (reg & ~(GENMASK(7, 0))) | (phy_testdin << 0); + reg = (reg & ~(BIT_MASK(16))) | (phy_testen << 16); + writel(reg, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_write(32'h9000_a854, {15'd0, phy_testen, 8'd0, phy_testdin}); + //g. get phy data (read testout) + rdata = readl(g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL1); + // reg_read(32'h9000_a854, rdata); + + rdata = (rdata >> 8) & 0xffff; + // code_data = rdata[15:8]; + + return rdata; +} +#endif +static void k230_csi0_phy0_config(u32 freq) +{ + //1. set rstz = 1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_DPHY_RSTZ); + //2. set shutdownz=1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_SHUTDOWNZ); + //3. set testclr=1'b1 + writel(0x1, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + //4. wait for 15ns + // #15ns; + // udelay(1); + udelay(1); + //5. set testclr =1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + //6. set hsfreqrange[6:0]=7'b0001010 + //phy_reg_write(16'h2, 7'b0001010); + + // writel(0x26 << 25, g_csi_addr ); //h9000_9010 + writel(freq << 25, g_csi_addr ); + + //7. config register 0xe5 to set counter_for_des_enbypass(bit0) to 1'b1 + k230_csi0_rxphy0_reg_write(0xe5, 0x1); + //8. config 0xe4(bits7:4) to 2 (27M cflclk) for counter_for_des_en_config_if_fw + k230_csi0_rxphy0_reg_write(0xe4, 0x20); //8'b00100000 + //9. config 0x1ab to set cb_sel_vref_lprx_fw(bits1:0) to 2'b10 + k230_csi0_rxphy0_reg_write(0x1ab, 0x06); //8'b00000110 + //10. config 0x1ac to set rx_rxlp_bias_prog_rw(bit6) to 1'b1 + k230_csi0_rxphy0_reg_write(0x1ac, 0x4b); // 8'b01001011 + //11. config 0x8 to set deskew_pol_rw signal (bit 5) to 1'b1 + k230_csi0_rxphy0_reg_write(0x08, 0x38); //8'b00111000 + //12. config 0x307 to set rxclk_rxhs_pull_long_channel_if_rw signal(bit 7) to 1'b1 + k230_csi0_rxphy0_reg_write(0x307, 0x80); //8'b10000000 + + //13. config 0x607 to set rxclk_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx0_rxhs_ddl_tune_ovr_rw[4:0] (bits 4:0) to 5'b11111 + k230_csi0_rxphy0_reg_write(0x607, 0x3f); //8'b00111111 + //14. config 0x807 to set rx1_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx1_rxhs_ddl_tune_ovr_rw[4:0](bits 4:0) to 5'b11111 + k230_csi0_rxphy0_reg_write(0x807, 0x3f); //8'b00111111 + + //15. set cfgclkfreqrange[5:0] = round[Fcfg_clk(MHz)-17)*4] = 6'b101000 + //16. Apply cfg_clk signal with the appropriate frequency with 27Mhz frequency + + // writel(0x00000050 | (0x26 << 25), g_csi_addr ); //h9000_9010 hsfreqrange_0 = 0x26 + + writel(0x00000050 | (freq << 25), g_csi_addr ); //h9000_9010 hsfreqrange_0 = 0x26 + + //17. Set basedir_0 = 1'b1 + // writel(0x00000051 | (0x26 << 25), g_csi_addr ); //h9000_9010 + writel(0x00000051 | (freq << 25), g_csi_addr ); //h9000_9010 + //18. Set forcerxm + writel(0x00c00051 | (freq << 25), g_csi_addr ); //h9000_9010 + // writel(0x00c00051 | (0x26 << 25), g_csi_addr ); //h9000_9010 + //19. Set all requests inputs to zero; + //20. Wait for 15 ns; + // #15ns; + // udelay(1); + udelay(1); + //21. Set enable_n and enableclk=1'b1; + //tie 1 in maix3 + //22. Wait 5ns; + // #5ns; + + //23. Set shutdownz=1'b1; + writel(0x1, g_csi_addr + 0x800 + DWC_PHY_SHUTDOWNZ); + //24. Wait 5ns; + // #5ns; + //25. Set rstz=1'b1; + writel(0x1, g_csi_addr + 0x800 + DWC_DPHY_RSTZ); + //26. Wait until stopstatedata_n and stopstateclk outputs are asserted indicating PHY is receiving LP11 in enabled datalanes and clocklanes; + // #1000ns; + // udelay(1); + // udelay(1); + // int count = 0; + // while((readl(g_csi_addr + 0x800 + DWC_PHY_STOPSTATE) & 0x10000) != 0x10000) + // { + // // udelay(1); + // udelay(1); + // count++; + // if (count >1000000) { + // pr_err("wait stop timeout\n"); + // break; + // } + // } + // udelay(1); + // udelay(1); + + // writel(0x00000051 | (0x14 << 25), g_csi_addr ); //h9000_9010 +} + +static void k230_csi1_phy1_config(u32 freq) +{ + int count = 0; + //1. set rstz = 1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_DPHY_RSTZ); + //2. set shutdownz=1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_SHUTDOWNZ); + //3. set testclr=1'b1 + writel(0x1, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + //4. wait for 15ns + // #15ns; + // udelay(1); + udelay(1); + //5. set testclr =1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + //6. set hsfreqrange[6:0]=7'b0001010 + //phy_reg_write(16'h2, 7'b0001010); + writel(freq << 25, g_csi_addr + 0x08); //h9000_9010 + + //7. config register 0xe5 to set counter_for_des_enbypass(bit0) to 1'b1 + k230_csi1_rxphy1_reg_write(0xe5, 0x1); + //8. config 0xe4(bits7:4) to 2 (27M cflclk) for counter_for_des_en_config_if_fw + k230_csi1_rxphy1_reg_write(0xe4, 0x20); //8'b00100000 + //9. config 0x1ab to set cb_sel_vref_lprx_fw(bits1:0) to 2'b10 + k230_csi1_rxphy1_reg_write(0x1ab, 0x06); //8'b00000110 + //10. config 0x1ac to set rx_rxlp_bias_prog_rw(bit6) to 1'b1 + k230_csi1_rxphy1_reg_write(0x1ac, 0x4b); // 8'b01001011 + //11. config 0x8 to set deskew_pol_rw signal (bit 5) to 1'b1 + k230_csi1_rxphy1_reg_write(0x08, 0x38); //8'b00111000 + //12. config 0x307 to set rxclk_rxhs_pull_long_channel_if_rw signal(bit 7) to 1'b1 + k230_csi1_rxphy1_reg_write(0x307, 0x80); //8'b10000000 + + //13. config 0x607 to set rxclk_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx0_rxhs_ddl_tune_ovr_rw[4:0] (bits 4:0) to 5'b11111 + k230_csi1_rxphy1_reg_write(0x607, 0x3f); //8'b00111111 + //14. config 0x807 to set rx1_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx1_rxhs_ddl_tune_ovr_rw[4:0](bits 4:0) to 5'b11111 + k230_csi1_rxphy1_reg_write(0x807, 0x3f); //8'b00111111 + + //15. set cfgclkfreqrange[5:0] = round[Fcfg_clk(MHz)-17)*4] = 6'b101000 + //16. Apply cfg_clk signal with the appropriate frequency with 27Mhz frequency + writel(0x00000050 | (freq << 25), g_csi_addr + 0x08); //h9000_9010 hsfreqrange_0 = 0x26 + + //17. Set basedir_0 = 1'b1 + writel(0x00000051 | (freq << 25), g_csi_addr + 0x08); //h9000_9010 + //18. Set forcerxm + writel(0x00c00051 | (freq << 25), g_csi_addr + 0x08); //h9000_9010 + //19. Set all requests inputs to zero; + //20. Wait for 15 ns; + // #15ns; + // udelay(1); + udelay(1); + //21. Set enable_n and enableclk=1'b1; + //tie 1 in maix3 + //22. Wait 5ns; + // #5ns; + //23. Set shutdownz=1'b1; + writel(0x1, g_csi_addr + 0x1000 + DWC_PHY_SHUTDOWNZ); + //24. Wait 5ns; + // #5ns; + // udelay(1); + udelay(1); + //25. Set rstz=1'b1; + writel(0x1, g_csi_addr + 0x1000 + DWC_DPHY_RSTZ); + //26. Wait until stopstatedata_n and stopstateclk outputs are asserted indicating PHY is receiving LP11 in enabled datalanes and clocklanes; + // #1000ns; + // udelay(1); + udelay(1); + while((readl(g_csi_addr + 0x1000 + DWC_PHY_STOPSTATE) & 0x10000) != 0x10000) + { + // udelay(1); + udelay(1); + count++; + if (count >1000000) { + break; + } + } + + // udelay(1); + udelay(1); + // writel(0x00000051 | (0x14 << 25), g_csi_addr + 0x08); //h9000_9010 +} + + +static void k230_csi2_phy2_config(u32 freq) +{ + int count = 0; + //1. set rstz = 1'b0 + writel(0x0, g_csi_addr + 0x1800 + DWC_DPHY_RSTZ); + //2. set shutdownz=1'b0 + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_SHUTDOWNZ); + //3. set testclr=1'b1 + writel(0x1, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + //4. wait for 15ns + // #15ns; + // udelay(1); + udelay(1); + //5. set testclr =1'b0 + writel(0x0, g_csi_addr + 0x1800 + DWC_PHY_TEST_CTRL0); + //6. set hsfreqrange[6:0]=7'b0001010 + //phy_reg_write(16'h2, 7'b0001010); + writel(freq << 25, g_csi_addr + 0x10); //h9000_9010 + + //7. config register 0xe5 to set counter_for_des_enbypass(bit0) to 1'b1 + k230_csi2_rxphy2_reg_write(0xe5, 0x1); + //8. config 0xe4(bits7:4) to 2 (27M cflclk) for counter_for_des_en_config_if_fw + k230_csi2_rxphy2_reg_write(0xe4, 0x20); //8'b00100000 + //9. config 0x1ab to set cb_sel_vref_lprx_fw(bits1:0) to 2'b10 + k230_csi2_rxphy2_reg_write(0x1ab, 0x06); //8'b00000110 + //10. config 0x1ac to set rx_rxlp_bias_prog_rw(bit6) to 1'b1 + k230_csi2_rxphy2_reg_write(0x1ac, 0x4b); // 8'b01001011 + //11. config 0x8 to set deskew_pol_rw signal (bit 5) to 1'b1 + k230_csi2_rxphy2_reg_write(0x08, 0x38); //8'b00111000 + //12. config 0x307 to set rxclk_rxhs_pull_long_channel_if_rw signal(bit 7) to 1'b1 + k230_csi2_rxphy2_reg_write(0x307, 0x80); //8'b10000000 + + //13. config 0x607 to set rxclk_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx0_rxhs_ddl_tune_ovr_rw[4:0] (bits 4:0) to 5'b11111 + k230_csi2_rxphy2_reg_write(0x607, 0x3f); //8'b00111111 + //14. config 0x807 to set rx1_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx1_rxhs_ddl_tune_ovr_rw[4:0](bits 4:0) to 5'b11111 + k230_csi2_rxphy2_reg_write(0x807, 0x3f); //8'b00111111 + + //15. set cfgclkfreqrange[5:0] = round[Fcfg_clk(MHz)-17)*4] = 6'b101000 + //16. Apply cfg_clk signal with the appropriate frequency with 27Mhz frequency + writel(0x00000050 | (freq << 25), g_csi_addr + 0x10); //h9000_9010 hsfreqrange_0 = 0x26 + + //17. Set basedir_0 = 1'b1 + writel(0x00000051 | (freq << 25), g_csi_addr + 0x10); //h9000_9010 + //18. Set forcerxm + writel(0x00c00051 | (freq << 25), g_csi_addr + 0x10); //h9000_9010 + //19. Set all requests inputs to zero; + //20. Wait for 15 ns; + // #15ns; + // udelay(1); + udelay(1); + //21. Set enable_n and enableclk=1'b1; + //tie 1 in maix3 + //22. Wait 5ns; + // #5ns; + //23. Set shutdownz=1'b1; + writel(0x1, g_csi_addr + 0x1800 + DWC_PHY_SHUTDOWNZ); + //24. Wait 5ns; + // #5ns; + // udelay(1); + udelay(1); + //25. Set rstz=1'b1; + writel(0x1, g_csi_addr + 0x1800 + DWC_DPHY_RSTZ); + //26. Wait until stopstatedata_n and stopstateclk outputs are asserted indicating PHY is receiving LP11 in enabled datalanes and clocklanes; + // #1000ns; + // udelay(1); + udelay(1); + while((readl(g_csi_addr + 0x1800 + DWC_PHY_STOPSTATE) & 0x10000) != 0x10000) + { + udelay(1); + count++; + if (count >1000000) { + pr_err("wait stop timeout\n"); + break; + } + } + // udelay(1); + udelay(1); + + // writel(0x00000051 | (0x14 << 25), g_csi_addr + 0x10); //h9000_9010 +} + + +void k230_csi0_phy0_4lane_config(u32 freq) +{ + // config 4 lan + writel(0x0, g_csi_addr + 0x18 ); //0x90009018 + //1. set rstz = 1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_DPHY_RSTZ); + //2. set shutdownz=1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_SHUTDOWNZ); + //3. set testclr=1'b1 + writel(0x1, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + //4. wait for 15ns + // #15ns; + udelay(1); + //5. set testclr =1'b0 + writel(0x0, g_csi_addr + 0x800 + DWC_PHY_TEST_CTRL0); + //6. set hsfreqrange[6:0]=7'b0001010 + //phy_reg_write(16'h2, 7'b0001010); + + // writel csi 4 lan + writel(0x3, g_csi_addr + 0x800 + 0x4); + + // writel(0x26 << 25, 0x90009000); //h9000_9010 + // writel(0x14 << 25, 0x90009000); + writel(0x1 | (freq << 25), g_csi_addr + 0x0); + + //7. config register 0xe5 to set counter_for_des_enbypass(bit0) to 1'b1 + k230_csi0_rxphy0_reg_write(0xe5, 0x1); + //8. config 0xe4(bits7:4) to 2 (27M cflclk) for counter_for_des_en_config_if_fw + k230_csi0_rxphy0_reg_write(0xe4, 0x20); //8'b00100000 + //9. config 0x1ab to set cb_sel_vref_lprx_fw(bits1:0) to 2'b10 + k230_csi0_rxphy0_reg_write(0x1ab, 0x06); //8'b00000110 + //10. config 0x1ac to set rx_rxlp_bias_prog_rw(bit6) to 1'b1 + k230_csi0_rxphy0_reg_write(0x1ac, 0x4b); // 8'b01001011 + //11. config 0x8 to set deskew_pol_rw signal (bit 5) to 1'b1 + k230_csi0_rxphy0_reg_write(0x08, 0x38); //8'b00111000 + //12. config 0x307 to set rxclk_rxhs_pull_long_channel_if_rw signal(bit 7) to 1'b1 + //k230_csi0_rxphy0_reg_write(0x307, 0x80); //8'b10000000 //del by wangchao @20230215 + + //13. config 0x607 to set rxclk_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx0_rxhs_ddl_tune_ovr_rw[4:0] (bits 4:0) to 5'b11111 + k230_csi0_rxphy0_reg_write(0x607, 0x3f); //8'b00111111 + //14. config 0x807 to set rx1_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx1_rxhs_ddl_tune_ovr_rw[4:0](bits 4:0) to 5'b11111 + k230_csi0_rxphy0_reg_write(0x807, 0x3f); //8'b00111111 + + //15. set cfgclkfreqrange[5:0] = round[Fcfg_clk(MHz)-17)*4] = 6'b101000 + //16. Apply cfg_clk signal with the appropriate frequency with 27Mhz frequency + + // writel(0x00000050 | (0x26 << 25), 0x90009000 + // writel(0x00000050 | (0x14 << 25), 0x90009000); //h9000_9010 hsfreqrange_0 = 0x26 + + //17. Set basedir_0 = 1'b1 + // writel(0x00000051 | (0x26 << 25), 0x90009000); //h9000_9010 + writel(0x00000051 | (freq << 25), g_csi_addr + 0x0); //h9000_9010 + //18. Set forcerxm + writel(0x00c00051 | (freq << 25), g_csi_addr + 0x0); //h9000_9010 + // writel(0x00c00051 | (0x26 << 25), 0x90009000); //h9000_9010 + //19. Set all requests inputs to zero; + //20. Wait for 15 ns; + // #15ns; + udelay(1); + //21. Set enable_n and enableclk=1'b1; + //tie 1 in maix3 + writel(0x1, g_csi_addr + 0xb0); + udelay(1); +} + +void k230_csi0_phy1_4lane_config(u32 freq) +{ + //1. set rstz = 1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_DPHY_RSTZ); + //2. set shutdownz=1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_SHUTDOWNZ); + //3. set testclr=1'b1 + writel(0x1, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + //4. wait for 15ns + // #15ns; + udelay(1); + //5. set testclr =1'b0 + writel(0x0, g_csi_addr + 0x1000 + DWC_PHY_TEST_CTRL0); + //6. set hsfreqrange[6:0]=7'b0001010 + //phy_reg_write(16'h2, 7'b0001010); + + // writel(0x26 << 25, 0x90009000); //h9000_9010 + // writel(0x14 << 25, 0x90009008); + writel(0x1 | (freq << 25), g_csi_addr + 0x8); + + //7. config register 0xe5 to set counter_for_des_enbypass(bit0) to 1'b1 + k230_csi0_rxphy1_reg_write(0xe5, 0x1); + //8. config 0xe4(bits7:4) to 2 (27M cflclk) for counter_for_des_en_config_if_fw + k230_csi0_rxphy1_reg_write(0xe4, 0x20); //8'b00100000 + //9. config 0x1ab to set cb_sel_vref_lprx_fw(bits1:0) to 2'b10 + k230_csi0_rxphy1_reg_write(0x1ab, 0x06); //8'b00000110 + //10. config 0x1ac to set rx_rxlp_bias_prog_rw(bit6) to 1'b1 + k230_csi0_rxphy1_reg_write(0x1ac, 0x4b); // 8'b01001011 + //11. config 0x8 to set deskew_pol_rw signal (bit 5) to 1'b1 + k230_csi0_rxphy1_reg_write(0x08, 0x38); //8'b00111000 + //12. config 0x307 to set rxclk_rxhs_pull_long_channel_if_rw signal(bit 7) to 1'b1 + //k230_csi0_rxphy1_reg_write(0x307, 0x80); //8'b10000000 //del by wangchao @20230215 + + //13. config 0x607 to set rxclk_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx0_rxhs_ddl_tune_ovr_rw[4:0] (bits 4:0) to 5'b11111 + k230_csi0_rxphy1_reg_write(0x607, 0x3f); //8'b00111111 + //14. config 0x807 to set rx1_rxhs_ddl_tune_ovr_en_rw(bit 5) to 1'b1 and set rx1_rxhs_ddl_tune_ovr_rw[4:0](bits 4:0) to 5'b11111 + k230_csi0_rxphy1_reg_write(0x807, 0x3f); //8'b00111111 + + //15. set cfgclkfreqrange[5:0] = round[Fcfg_clk(MHz)-17)*4] = 6'b101000 + //16. Apply cfg_clk signal with the appropriate frequency with 27Mhz frequency + + // writel(0x00000050 | (0x26 << 25), 0x90009000); //h9000_9010 hsfreqrange_0 = 0x26 + + // writel(0x00000050 | (0x14 << 25), 0x90009008); //h9000_9010 hsfreqrange_0 = 0x26 + + //17. Set basedir_0 = 1'b1 + // writel(0x00000051 | (0x26 << 25), 0x90009000); //h9000_9010 + writel(0x00000051 | (freq << 25), g_csi_addr + 0x8); //h9000_9010 + //18. Set forcerxm + writel(0x00c00051 | (freq << 25), g_csi_addr + 0x8); //h9000_9010 + // writel(0x00c00051 | (0x26 << 25), 0x90009000); //h9000_9010 + //19. Set all requests inputs to zero; + //20. Wait for 15 ns; + udelay(1); + + // writel(0x00000051 | (0x14 << 25), 0x90009000); //h9000_9010 +} + +void k230_phy0_master_phy1_slave_config(void) +{ + int count = 0; + //Set bit [0] (mastermacro -> set as master PHY) of register 0x133 of the master PHY to 1?��b1 + k230_csi0_rxphy0_reg_write(0x133, 0x1); + //Set bit [0] (mastermacro -> set as slave PHY) of register 0x133 of the slave PHY to 1?��b0 + k230_csi0_rxphy1_reg_write(0x133, 0x0); + //Set bit [2](rxclk_rxhs_clk_to_long_channel_if -> enable the hs clock to long channel) of register 0x307 of the master PHY to 1?��b1 + k230_csi0_rxphy0_reg_write(0x307, 0x4); + //Set bit [2] (rxclk_rxhs_clk_to_long_channel_if -> disable the hs clock to long channel) of register 0x307 of the slave PHY to 1?��b0 + k230_csi0_rxphy1_reg_write(0x307, 0x0); + //Set bit [5](rxhs_clk_from_long_channel_if_rw -> enable the hs clock to long channel of lane0) of register 0x508 of the master/slave PHYs to 1?��b1 + k230_csi0_rxphy0_reg_write(0x508, 0x20); + k230_csi0_rxphy1_reg_write(0x508, 0x20); + //Set bit [5] (rxhs_clk_from_long_channel_if_rw of lane1 -> enable the hs clock to long channel of lane0) of register 0x708 of the master/slave PHYs to 1?��b1 + k230_csi0_rxphy0_reg_write(0x708, 0x20); + k230_csi0_rxphy1_reg_write(0x708, 0x20); + //Set bit [3](rxclk_rxhs_ddr_clk_sel_if -> disable the DDR clock source) of register 0x308 of the master PHY to 1?��b0 ( use short channel to generate DDR) + k230_csi0_rxphy0_reg_write(0x308, 0x0); + //Set bit [3](rxclk_rxhs_ddr_clk_sel_if -> enable the DDR clock source) of register 0x308 of the slave PHY to 1?��b1 ( use long channel to generate DDR) + k230_csi0_rxphy1_reg_write(0x308, 0x8); + //Set bits [1:0](clk_en_lanes_tester,clk_en_lanes_bypass -> enable the clock for tester and bypass the clock lane) of register 0x0E0 of the slave PHY to 2?��b11 + k230_csi0_rxphy1_reg_write(0xe0, 0x3); + //Set bit [1]( rxclk_rxhs_ddr_clk_en_bypass ��C> enable DDR clock bypass) of register 0x0E1 of the slave PHY to 1?��b1 + k230_csi0_rxphy1_reg_write(0xe1, 0x2); + //Set bit [3]( rxclk_rxhs_ddr_cl(rxclk_rxhs_ddr_clk_sel_if -> disable the DDR clock source) of register 0x308 of the master PHY to 1?��b0 ( use short channel to generate DDR) + k230_csi0_rxphy0_reg_write(0x308, 0x0); + //Set bit [3](rxclk_rxhs_ddr_clk_sel_if -> enable the DDR clock source) of register 0x308 of the slave PHY to 1?��b1 ( use long channel to generate DDR) + k230_csi0_rxphy1_reg_write(0x308, 0x8); + //Set bits [1:0](clk_en_lanes_tester,clk_en_lanes_bypass -> enable the clock for tester and bypass the clock lane) of register 0x0E0 of the slave PHY to 2?��b11 + k230_csi0_rxphy1_reg_write(0xe0, 0x3); + //Set bit [1]( rxclk_rxhs_ddr_clk_en_bypass ��C> enable DDR clock bypass) of register 0x0E1 of the slave PHY to 1?��b1 + k230_csi0_rxphy1_reg_write(0xe1, 0x2); + //Set bit [3]( rxclk_rxhs_ddr_clk_en ��C> enable the HS DDR clock) of register 0x307 of the slave PHY to 1?��b1 (this configuration can be done when setting slave PHY clock lane to don?��t drive long channel clock) + k230_csi0_rxphy1_reg_write(0x307, 0x8); + //Set bit [7]( lprxponcd_bypass_clklane -> enable the LP-CD bypass) of register 0x304 of the slave PHY to 1?��b1 + k230_csi0_rxphy1_reg_write(0x304, 0x80); + k230_csi0_rxphy1_reg_write(0x305, 0xa); + //#5ns; + udelay(1); + //Set shutdownz=1'b1; + writel(0x1, g_csi_addr + 0x800 + DWC_PHY_SHUTDOWNZ); + //#5ns; + udelay(1); + //Set rstz=1'b1; + writel(0x1, g_csi_addr + 0x800 + DWC_DPHY_RSTZ); + + //Wait until stopstatedata_n and stopstateclk outputs are asserted indicating PHY is receiving LP11 in enabled datalanes and clocklanes; + udelay(1); + while((readl(g_csi_addr + 0x800 + DWC_PHY_STOPSTATE) & 0x10003) != 0x10003) + { + // udelay(1); + udelay(1); + count++; + if (count >1000000) { + pr_err("4lan wait stop timeout\n"); + break; + } + } + udelay(1); + //#5ns; + udelay(1); + writel(0x400, g_csi_addr + 0x18);//0x90009018); + //Wait until stopstatedata_n and stopstateclk outputs are asserted indicating PHY is receiving LP11 in enabled datalanes and data lan2 3 ; + udelay(1); + while((readl(g_csi_addr + 0x800 + DWC_PHY_STOPSTATE) & 0xc) != 0xc) + { + // udelay(1); + udelay(1); + count++; + if (count >1000000) { + pr_err("4lan wait stop timeout\n"); + break; + } + } + udelay(1); +} + +static void k230_csi0_config_4lan_phy(u32 freq) +{ + k230_csi0_phy0_4lane_config(freq); + k230_csi0_phy1_4lane_config(freq); + k230_phy0_master_phy1_slave_config(); +} + +int dwc_csi_phy_init(enum csi_num csi, enum mipi_phy_freq freq, enum mipi_lanes lan_num) +{ + u32 phy_freq; + + if (csi > CSI2) { + pr_err("%s invalid param csi %d.\n", __func__, csi); + return -EINVAL; + } + // enable clk + writel(0b111, g_csi_addr + 0xb0); + + switch(freq) + { + case MIPI_PHY_800M : + //795.625 - 905.625 0011001 = 0x19 + phy_freq = 0x19; + break; + case MIPI_PHY_1200M : + //1128.125 - 1273.125 0001011 = 0x0b + phy_freq = 0x0b; + break; + case MIPI_PHY_1600M : + // 1508.125 - 1693.125 0001101 = 0x0d + phy_freq = 0x0d; + break; + default : + pr_err("%s invalid param phy_freq %d.\n", __func__, phy_freq); + return -EINVAL; + } + + //set phy attr + switch(csi) + { + case CSI0 : + if(lan_num == MIPI_4LANE) + { + k230_csi0_config_4lan_phy(phy_freq); + } + else + { + k230_csi0_phy0_config(phy_freq); + } + break; + + case CSI1 : + k230_csi1_phy1_config(phy_freq); + break; + + case CSI2 : + k230_csi2_phy2_config(phy_freq); + break; + default : + break; + } + + return 0; +} + + +int csi_device_init(void) +{ + if (g_csi_addr != NULL) { + iounmap(g_csi_addr); + g_csi_addr = NULL; + } + g_csi_addr = ioremap(CSI_REG_BASE_ADDR, CSI_REG_MEM_SIZE); + if (g_csi_addr == NULL) { + pr_err("%s ioremap error\n", __func__); + return -EINVAL; + } + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/mipi/k230_csi.h b/buildroot-overlay/package/vvcam/mipi/k230_csi.h new file mode 100644 index 0000000..3f2750c --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/k230_csi.h @@ -0,0 +1,134 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "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 COPYRIGHT HOLDER OR + * CONTRIBUTORS 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. + */ +#ifndef __DW_CSI_H__ +#define __DW_CSI_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* end of #ifdef __cplusplus */ + +#define CSI_REG_BASE_ADDR 0x90009000 +#define CSI_REG_MEM_SIZE 0x10000 + +#define DWC_LANES_NUM (0x04) +#define DWC_CSI2_RESETN (0x08) +#define DWC_INT_ST_MAIN (0x0c) +#define DWC_DATA_IDS_1 (0x10) +#define DWC_DATA_IDS_2 (0x14) +#define DWC_PHY_CFG (0x18) +#define DWC_PHY_MODE (0x1c) +#define DWC_DATA_IDS_VC_1 (0x30) +#define DWC_DATA_IDS_VC_2 (0x34) +#define DWC_PHY_SHUTDOWNZ (0x40) +#define DWC_DPHY_RSTZ (0x44) +#define DWC_PHY_RX (0x48) +#define DWC_PHY_STOPSTATE (0x4c) +#define DWC_PHY_TEST_CTRL0 (0x50) +#define DWC_PHY_TEST_CTRL1 (0x54) +#define DWC_PHY2_TEST_CTRL0 (0x58) +#define DWC_PHY2_TEST_CTRL1 (0x5c) +#define DWC_PPI_PG_PATTERN_VRES (0x60) +#define DWC_PPI_PG_PATTERN_HRES (0x64) +#define DWC_PPI_PG_CONFIG (0x68) +#define DWC_PPI_PG_ENABLE (0x6c) +#define DWC_PPI_PG_STATUS (0x70) +#define DWC_IPI_MODE (0x80) +#define DWC_IPI_VCID (0x84) +#define DWC_IPI_DATA_TYPE (0x88) +#define DWC_IPI_MEM_FLUSH (0x8c) +#define DWC_IPI_HSA_TIME (0x90) +#define DWC_IPI_HBP_TIME (0x94) +#define DWC_IPI_HSD_TIME (0x98) +#define DWC_IPI_HLINE_TIME (0x9c) +#define DWC_IPI_SOFTRSTN (0xa0) +#define DWC_IPI_ADV_FEATURES (0x0c) +#define DWC_IPI_VSA_LINES (0xb0) +#define DWC_IPI_VBP_LINES (0xb4) +#define DWC_IPI_VFP_LINES (0xb8) +#define DWC_IPI_VACTIVE_LINES (0xbc) +#define DWC_VC_EXTENSION (0xc8) +#define DWC_PHY_CAL (0xcc) +#define DWC_INT_ST_PHY_FATAL (0xe0) +#define DWC_INT_MSK_PHY_FATAL (0xe4) +#define DWC_INT_FORCE_PHY_FATAL (0xe8) +#define DWC_INT_ST_PKT_FATAL (0xf0) +#define INT_MSK_PKT_FATAL (0xf4) +#define DWC_INT_FORCE_PKT_FATAL (0x08) +#define DWC_IPI2_MODE (0x200) +#define DWC_IPI2_VCID (0x204) +#define DWC_IPI2_DATA_TYPE (0x208) +#define DWC_IPI2_MEM_FLUSH (0x20c) +#define DWC_IPI2_HSA_TIME (0x210) +#define DWC_IPI2_HBP_TIME (0x214) +#define DWC_IPI2_HSD_TIME (0x218) +#define DWC_IPI2_ADV_FEATURES (0x21c) +#define DWC_IPI3_MODE (0x220) +#define DWC_IPI3_VCID (0x224) +#define DWC_IPI3_DATA_TYPE (0x228) +#define DWC_IPI3_MEM_FLUSH (0x22c) +#define DWC_IPI3_HSA_TIME (0x230) +#define DWC_IPI3_HBP_TIME (0x234) +#define DWC_IPI3_HSD_TIME (0x238) +#define DWC_IPI3_ADV_FEATURES (0x23c) + +/** + * @brief Defines the CSI NUM + * + */ +enum csi_num { + CSI0 = 1, + CSI1 = 2, + CSI2 = 3, +}; + +/** + * @brief Defines the MIPI LANEs + * + */ +enum mipi_lanes { + MIPI_1LANE = 0, + MIPI_2LANE = 1, + MIPI_4LANE = 3, +}; + +/** + * @brief Defines the MIPI CSI PHY freq + * + */ +enum mipi_phy_freq { + MIPI_PHY_800M = 1, + MIPI_PHY_1200M = 2, + MIPI_PHY_1600M = 3, +}; + +int dwc_csi_phy_init(enum csi_num csi, enum mipi_phy_freq freq, enum mipi_lanes lan_num); +int csi_device_init(void); + +#ifdef __cplusplus +} +#endif /* end of #ifdef __cplusplus */ + +#endif + diff --git a/buildroot-overlay/package/vvcam/mipi/k230_vi.c b/buildroot-overlay/package/vvcam/mipi/k230_vi.c new file mode 100644 index 0000000..d004f86 --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/k230_vi.c @@ -0,0 +1,241 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "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 COPYRIGHT HOLDER OR + * CONTRIBUTORS 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. + */ + +#include "k230_vi.h" +#include +#include +#include + +static u8 *g_vi_addr = NULL; + +static void dwc_rst_csi(enum csi_num csi_num) +{ + writel(0x01, (g_vi_addr + (csi_num * 0x800)) + DWC_CSI2_RESETN); +} + +static void dwc_set_lan_num(enum csi_num csi_num, u32 lan_num, u32 freq) +{ + u32 phy_freq[] = {0, 0x14 ,0x0b, 0x0d}; + + dwc_rst_csi(csi_num); + + if(lan_num == MIPI_4LANE) + { + writel(0x00000051 | (phy_freq[freq] << 25), g_vi_addr + ((csi_num - 1) * 0x8)); //h9000_9010 + writel(0x00000051 | (phy_freq[freq] << 25), g_vi_addr + (csi_num * 0x8)); //h9000_9010 + } + else + writel(0x00000051 | (phy_freq[freq] << 25), g_vi_addr + ((csi_num - 1) * 0x8)); //h9000_9010 + + writel(lan_num, (g_vi_addr + (csi_num * 0x800)) + DWC_LANES_NUM); +} + +static int kd_vi_set_ipi_attr(enum csi_num csi, enum vi_ipi ipi, struct vi_ipi_attr *attr) +{ + u32 reg = 0; + + if ((csi > CSI2) || (!attr) || (ipi > IPI3)) { + printk("%s, invalid param, csi(%d), ipi(%d)\n", __func__, csi, ipi); + return -1; + } + + switch(ipi) + { + case IPI1 : + //set hsa + writel(0x0, (g_vi_addr + (csi * 0x800)) + DWC_IPI_VCID); + + writel(attr->hsa, (g_vi_addr + (csi * 0x800)) + DWC_IPI_HSA_TIME); + //set hbp + writel(attr->hbp, (g_vi_addr + (csi * 0x800)) + DWC_IPI_HBP_TIME); + //set csi sync + if(attr->is_csi_sync_event == 1) + writel(0x1030000, (g_vi_addr + (csi * 0x800)) + 0xac); + // set work mode + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + reg = (reg & ~(BIT_MASK(0))) | (0 << 0); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + // set data type + writel(attr->data_type, (g_vi_addr + (csi * 0x800)) + DWC_IPI_DATA_TYPE); + // set cut through + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + reg = (reg & ~(BIT_MASK(16))) | (0x1 << 16); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + // set interface = 16 + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + reg = (reg & ~(BIT_MASK(8))) | (0x1 << 8); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + //enable ipi + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + reg = (reg & ~(BIT_MASK(24))) | (0x1 << 24); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI_MODE); + break; + + case IPI2 : + writel(0x1, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_VCID); + + //set hsa + writel(attr->hsa, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_HSA_TIME); + //set hbp + writel(attr->hbp, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_HBP_TIME); + //set csi sync + if(attr->is_csi_sync_event == 1) + writel(0x1030000, (g_vi_addr + (csi * 0x800)) + 0x21c); + // set work mode + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + reg = (reg & ~(BIT_MASK(0))) | (0 << 0); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + // set data type + writel(attr->data_type, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_DATA_TYPE); + // set cut through + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + reg = (reg & ~(BIT_MASK(16))) | (0x1 << 16); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + // set interface = 16 + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + reg = (reg & ~(BIT_MASK(8))) | (0x1 << 8); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + //enable ipi + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + reg = (reg & ~(BIT_MASK(24))) | (0x1 << 24); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI2_MODE); + + break; + + case IPI3 : + writel(0x2, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_VCID); + + //set hsa + writel(attr->hsa, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_HSA_TIME); + //set hbp + writel(attr->hbp, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_HBP_TIME); + //set csi sync + if(attr->is_csi_sync_event == 1) + writel(0x1030000, (g_vi_addr + (csi * 0x800)) + 0x23c); + // set work mode + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + reg = (reg & ~(BIT_MASK(0))) | (0 << 0); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + // set data type + writel(attr->data_type, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_DATA_TYPE); + // set cut through + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + reg = (reg & ~(BIT_MASK(16))) | (0x1 << 16); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + // set interface = 16 + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + reg = (reg & ~(BIT_MASK(8))) | (0x1 << 8); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + //enable ipi + reg = readl((g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + reg = (reg & ~(BIT_MASK(24))) | (0x1 << 24); + writel(reg, (g_vi_addr + (csi * 0x800)) + DWC_IPI3_MODE); + break; + + default : + break; + } + + return 0; +} + +int kd_vi_set_config(struct vi_attr *attr) +{ + struct vi_ipi_attr ipi; + + if(!attr) { + printk("%s attr is null\n", __func__); + return -1; + } + + // set lan num + dwc_set_lan_num(attr->csi_num, attr->mipi_lanes, attr->phy_freq); + // set csi + switch(attr->hdr_mode) + { + case LINERA_MODE: + //set ipi csi + ipi.work_mode = CSI_CAMERA_MODE; + ipi.data_type = attr->data_type; + ipi.is_csi_sync_event = 1; + ipi.hsa = 10; + ipi.hbp = 10; + kd_vi_set_ipi_attr(CSI0, IPI1, &ipi); + break; + + case VCID_HDR_2FRAME: + //set ipi csi + ipi.work_mode = CSI_CAMERA_MODE; + ipi.data_type = attr->data_type; + ipi.is_csi_sync_event = 1; + ipi.hsa = 10; + ipi.hbp = 10; + + kd_vi_set_ipi_attr(CSI0, IPI1, &ipi); + kd_vi_set_ipi_attr(CSI0, IPI2, &ipi); + break; + + case VCID_HDR_3FRAME: + //set ipi csi + ipi.work_mode = CSI_CAMERA_MODE; + ipi.data_type = attr->data_type; + ipi.is_csi_sync_event = 1; + ipi.hsa = 10; + ipi.hbp = 10; + + kd_vi_set_ipi_attr(CSI0, IPI1, &ipi); + kd_vi_set_ipi_attr(CSI0, IPI2, &ipi); + kd_vi_set_ipi_attr(CSI0, IPI3, &ipi); + break; + + case SONY_HDR_3FRAME: + break; + + case SONY_HDR_2FRAME: + break; + } + + return 0; +} + +void kd_vi_3d_mode_crtl(bool enable) +{ + u32 reg = 0; + reg = readl(g_vi_addr + VI_3D_MODE_LIGHT_CTL); + reg = (reg & ~(BIT_MASK(31))) | (enable << 31); + writel(reg, g_vi_addr + VI_3D_MODE_LIGHT_CTL); + +} + +int vi_device_init(void) +{ + g_vi_addr = ioremap(VI_REG_BASE_ADDR, VI_REG_MEM_SIZE); + if (!g_vi_addr) { + printk("vi_init g_vi_addr ioremap err.\n"); + return -1; + } + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/mipi/k230_vi.h b/buildroot-overlay/package/vvcam/mipi/k230_vi.h new file mode 100644 index 0000000..906b317 --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/k230_vi.h @@ -0,0 +1,197 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "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 COPYRIGHT HOLDER OR + * CONTRIBUTORS 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. + */ +#ifndef __VI_H__ +#define __VI_H__ + +#ifdef __cplusplus + extern "C" { +#endif /* end of #ifdef __cplusplus */ + +#include "k230_csi.h" +#include + +#define VI_REG_BASE_ADDR 0x90009000 +#define VI_REG_MEM_SIZE 0x10000 +#define SYSCTL_CLK_ADDR (0X91108000) +#define SYSCTL_REG_MEM_SIZE 0x1000 + +#define VI_RXDPHY0_CFG0 (0x0) +#define VI_RXDPHY0_CFG1 (0x4) +#define VI_RXDPHY1_CFG0 (0x8) +#define VI_RXDPHY1_CFG1 (0xc) +#define VI_RXDPHY2_CFG0 (0x10) +#define VI_RXDPHY2_CFG1 (0x14) +#define VI_CSI_IPI_HALT_CFG (0x18) +#define VI_CSI_EMAEDDED_STA (0x1C) +#define VI_ISP_CFG (0x20) +#define VI_SLAVE_MODE_CFG (0x24) +#define VI_SLAVE_MODE_SEN0_VS_CFG (0x28) +#define VI_SLAVE_MODE_SEN0_HS_CFG (0x2C) +#define VI_SLAVE_MODE_SEN1_VS_CFG (0x30) +#define VI_SLAVE_MODE_SEN1_HS_CFG (0x34) +#define VI_SLAVE_MODE_SEN0_VS_HIGH (0x38) +#define VI_SLAVE_MODE_SEN0_HS_HIGH (0x3C) +#define VI_SLAVE_MODE_SEN1_VS_HIGH (0x40) +#define VI_SLAVE_MODE_SEN1_HS_HIGH (0x44) +#define VI_3D_MODE_LIGHT_CTL (0x48) +#define VI_FLASH_TRIGGER_0_CFG_0 (0x4c) +#define VI_FLASH_TRIGGER_0_CFG_1 (0x50) +#define VI_FLASH_TRIGGER_1_CFG_0 (0x54) +#define VI_FLASH_TRIGGER_1_CFG_1 (0x58) +#define VI_FLASH_TRIGGER_CFG (0x5c) +#define VI_IMG_DVP_SELECT_CTL (0x60) +#define VI_CAP_STC_VI_CFG (0x64) +#define VI_INTR_SET (0x68) +#define VI_INTR_CLR (0x6C) +#define VI_INTR_MASK_REG (0x70) +#define VI_INTR_STATUS (0x74) +#define VI_IPI_POL_CFG (0x78) +#define VI_CSI0_DIS_FRAME_M (0x7C) +#define VI_CSI0_DIS_FRAME_N (0x80) +#define VI_CSI1_DIS_FRAME_M (0x84) +#define VI_CSI1_DIS_FRAME_N (0x88) +#define VI_CSI2_DIS_FRAME_M (0x8C) +#define VI_CSI2_DIS_FRAME_N (0x90) +#define VI_DIS_FRAME_EN (0x94) +#define VI_SONY_CONFIG (0x98) +#define VI_VI_PHY_STA_CLR (0x9C) +#define VI_FLASH_TRIGGER_CFG_1 (0xA0) +#define VI_SONY_CONFIG_1 (0xA4) +#define VI_SONY_CONFIG_2 (0xA8) +#define VI_CAP_STC_VI_HDR (0xAC) +#define VI_PHY_ENABLE_CLK (0xB0) + +// bit ops +#define BITS_PER_LONG 64 +// #define BIT_MASK(nr) (1ul << ((nr) % BITS_PER_LONG)) +// #define GENMASK(h, l) (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + + +typedef struct { + bool err_phy0_control_lan0; + bool err_phy0_control_lan1; + bool err_phy0_lp1_contention; + bool err_phy0_lp0_contention; + + bool err_phy1_control_lan0; + bool err_phy1_control_lan1; + bool err_phy1_lp1_contention; + bool err_phy1_lp0_contention; + + bool err_phy2_control_lan0; + bool err_phy2_control_lan1; + bool err_phy2_lp1_contention; + bool err_phy2_lp0_contention; + + bool flash_trigger0_strobe_miss; + bool flash_trigger1_strobe_miss; + bool flash_trigger0_frame_miss; + bool flash_trigger1_frame_miss; +} k_vi_err_status; + +/** + * @brief Defines the MIPI CSI data type + * + */ +enum csi_data_type { + CSI_DATA_TYPE_RAW8 = 0x2A, + CSI_DATA_TYPE_RAW10 = 0x2B, + CSI_DATA_TYPE_RAW12 = 0x2C, + CSI_DATA_TYPE_RAW16 = 0x2E, + CSI_DATA_TYPE_YUV422_8 = 0x1E, +}; + +/** + * @brief Defines the HDR mode of VICAP + * + */ +enum hdr_mode { + VCID_HDR_2FRAME = 0, + VCID_HDR_3FRAME = 1, + SONY_HDR_3FRAME = 2, + SONY_HDR_2FRAME = 3, + LINERA_MODE = 4, +}; + +/** + * @brief Defines the dvp port of VICAP + * + */ +enum vi_dvp_port { + VI_DVP_PORT0 = 0, + VI_DVP_PORT1 = 1, + VI_DVP_PORT2 = 2, + VI_DVP_PORT_MAX, +}; + +/** + * @brief Defines the MIPI CSI work mode + * + */ +enum csi_work_mode { + CSI_CAMERA_MODE = 0, + CSI_CONTROL_MODE = 1, +}; + +enum vi_ipi { + IPI1 = 1, + IPI2 = 2, + IPI3 = 3, +}; + +/** + * @brief Defines the vi ipi attr of VICAP + * + */ +struct vi_ipi_attr { + enum csi_work_mode work_mode; + enum csi_data_type data_type; + bool is_csi_sync_event; + u32 hsa; + u32 hbp; +}; + +/** + * @brief Defines vi attributes of VICAP + * + */ +struct vi_attr { + enum csi_num csi_num; + enum mipi_lanes mipi_lanes; + enum csi_data_type data_type; + enum mipi_phy_freq phy_freq; + enum hdr_mode hdr_mode; + enum vi_dvp_port dvp_port; +}; + +int vi_device_init(void); +int kd_vi_set_config(struct vi_attr *attr); + +#ifdef __cplusplus +} +#endif /* end of #ifdef __cplusplus */ + +#endif + diff --git a/buildroot-overlay/package/vvcam/mipi/vvcam_mipi.h b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi.h new file mode 100644 index 0000000..3a99f5a --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi.h @@ -0,0 +1,157 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_MIPI_H__ +#define __VVCAM_MIPI_H__ + +#define MIPI_LANE_NUM_MAX 8 +#define MIPI_OUTPUT_INTERFACES_MAX 8 + +typedef enum { + VVCAM_INPUT_MODE_MIPI = 0x00, + VVCAM_INPUT_MODE_LVDS = 0x01, + VVCAM_INPUT_MODE_BT1120 = 0x02, +} vvcam_input_mode_t; + +typedef struct { + unsigned int left; + unsigned int top; + unsigned int width; + unsigned int height; +} vvcam_image_rect_t; + +typedef enum { + VVCAM_RAW_8BIT = 0, + VVCAM_RAW_10BIT, + VVCAM_RAW_12BIT, + VVCAM_RAW_14BIT, + VVCAM_RAW_16BIT, + VVCAM_RAW_20BIT, + VVCAM_RAW_24BIT, + VVCAM_RGB_444, + VVCAM_RGB_555, + VVCAM_RGB_565, + VVCAM_RGB_666, + VVCAM_RGB_888, + VVCAM_YUV420_8BIT, + VVCAM_YUV420_8BIT_LEG, + VVCAM_YUV420_8BIT_CSPS, + VVCAM_YUV420_10BIT, + VVCAM_YUV420_10BIT_CSPS, + VVCAM_YUV422_8BIT, + VVCAM_YUV422_10BIT, +} vvcam_data_type_t; + +typedef enum { + VVCAM_ITF_VCID_0 = 0, + VVCAM_ITF_VCID_1, + VVCAM_ITF_VCID_2, + VVCAM_ITF_VCID_3, + VVCAM_ITF_VCID_4, + VVCAM_ITF_VCID_5, + VVCAM_ITF_VCID_6, + VVCAM_ITF_VCID_7, + VVCAM_ITF_VCID_MAX, +} vvcam_itf_vcid_t; + +typedef enum { + VVCAM_ITF_BIT_MODE_48BIT = 0, + VVCAM_ITF_BIT_MODE_16BIT, +} vvcam_itf_bit_mode_t; + +typedef struct { + uint32_t hsa; /* horizontal synchronism activate (pixel cycle) */ + uint32_t hbp; /* horizontal back porch (pixel cycle) */ + uint32_t hfp; /* horizontal front porch (pixel cycle) */ + uint32_t hline; /* overall time for each line (pixel cycle) */ +} vvcam_itf_horizontal_time_t; + +typedef struct { + uint32_t vsa; /* vertical synchronism activate (hline) */ + uint32_t vbp; /* vertical back porch (hline) */ + uint32_t vfp; /* vertical front porch (hline) */ + uint32_t vactivate_lines; /* vertical resolution of video */ +} vvcam_itf_vertical_time_t; + +typedef struct { + bool enable; + bool embedded_data_en; + vvcam_itf_vcid_t vcid; + vvcam_itf_bit_mode_t bit_mode; + vvcam_data_type_t data_type; + vvcam_itf_horizontal_time_t h_time; + vvcam_itf_vertical_time_t v_time; +} vvcam_mipi_output_itf_t; + +typedef struct { + vvcam_mipi_output_itf_t itf_cfg[MIPI_OUTPUT_INTERFACES_MAX]; + short lane_id[MIPI_LANE_NUM_MAX]; /* lane id: -1 - disable */ + uint32_t phy_freq; +} vvcam_mipi_dev_attr_t; + +typedef struct { + vvcam_input_mode_t mode; /* input mode: MIPI/LVDS/BT1120 */ + vvcam_image_rect_t image_rect; /* Rx device area */ + + union { + vvcam_mipi_dev_attr_t mipi_attr; + //vvcam_lvds_dev_attr_t lvds_attr; + }; +} vvcam_input_dev_attr_t; + +#define VVCAM_MIPI_IOC_MAGIC 'v' +#define VVCAM_MIPI_RESET _IOW(VVCAM_MIPI_IOC_MAGIC, 0x01, unsigned int) /* 1:reset 0:unreset */ +#define VVCAM_MIPI_SET_DEV_ATTR _IOW(VVCAM_MIPI_IOC_MAGIC, 0x02, vvcam_input_dev_attr_t) +#define VVCAM_MIPI_SET_STREAM _IOW(VVCAM_MIPI_IOC_MAGIC, 0x03, unsigned int) + +#endif diff --git a/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.c b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.c new file mode 100644 index 0000000..2f8d51f --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.c @@ -0,0 +1,422 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "asm/delay.h" +#include "k230_csi.h" +#include "linux/interrupt.h" +#include "vvcam_mipi.h" +#include "vvcam_mipi_driver.h" +#include "k230_vi.h" + +static int vvcam_mipi_open(struct inode *inode, struct file *file) +{ + struct miscdevice *pmisc_dev = file->private_data; + struct vvcam_mipi_dev *mipi_dev; + + mipi_dev = container_of(pmisc_dev, struct vvcam_mipi_dev, miscdev); + if (!mipi_dev) + return -ENOMEM; + + dev_info(mipi_dev->dev, "%s\n", __func__); + + file->private_data = mipi_dev; + + mutex_lock(&mipi_dev->mlock); + pm_runtime_get_sync(mipi_dev->dev); + mutex_unlock(&mipi_dev->mlock); + + return 0; +} + +static int vvcam_mipi_release(struct inode *inode, struct file *file) +{ + struct vvcam_mipi_dev *mipi_dev; + + mipi_dev = file->private_data; + + dev_info(mipi_dev->dev, "%s\n", __func__); + + mutex_lock(&mipi_dev->mlock); + pm_runtime_put(mipi_dev->dev); + mutex_unlock(&mipi_dev->mlock); + + return 0; +} + +static void convert_to_vi_attr(struct device* dev, const vvcam_input_dev_attr_t* mipi_cfg, struct vi_attr* vi_attr) { + unsigned i = 0; + unsigned mipi_lanes = 0; + + vi_attr->csi_num = CSI0; + for (i = 0; i < MIPI_LANE_NUM_MAX; i++) { + if (mipi_cfg->mipi_attr.lane_id[i] != -1) { + mipi_lanes += 1; + } + } + if (mipi_lanes == 1) { + vi_attr->mipi_lanes = MIPI_1LANE; + } else if (mipi_lanes == 2) { + vi_attr->mipi_lanes = MIPI_2LANE; + } else { + vi_attr->mipi_lanes = MIPI_4LANE; + } + dev_info(dev, "lanes: %u\n", mipi_lanes); + switch (mipi_cfg->mipi_attr.itf_cfg[0].data_type) { + case VVCAM_RAW_8BIT: + vi_attr->data_type = CSI_DATA_TYPE_RAW8; + break; + case VVCAM_RAW_10BIT: + vi_attr->data_type = CSI_DATA_TYPE_RAW10; + break; + case VVCAM_RAW_12BIT: + vi_attr->data_type = CSI_DATA_TYPE_RAW12; + break; + case VVCAM_RAW_16BIT: + vi_attr->data_type = CSI_DATA_TYPE_RAW16; + break; + case VVCAM_YUV422_8BIT: + vi_attr->data_type = CSI_DATA_TYPE_YUV422_8; + break; + default: + dev_err(dev, "unknown format %d\n", mipi_cfg->mipi_attr.itf_cfg[0].data_type); + break; + } + dev_info(dev, "format: %u\n", vi_attr->data_type); + if (mipi_cfg->mipi_attr.phy_freq == 800) { + vi_attr->phy_freq = MIPI_PHY_800M; + dev_info(dev, "PHY freq: 800M\n"); + } else if (mipi_cfg->mipi_attr.phy_freq == 1200) { + vi_attr->phy_freq = MIPI_PHY_1200M; + dev_info(dev, "PHY freq: 1200M\n"); + } else if (mipi_cfg->mipi_attr.phy_freq == 1600) { + vi_attr->phy_freq = MIPI_PHY_1600M; + dev_info(dev, "PHY freq: 1600M\n"); + } else { + dev_err(dev, "unsupport PHY frequency %u, expected 800/1200/1600\n", mipi_cfg->mipi_attr.phy_freq); + vi_attr->phy_freq = MIPI_PHY_800M; + } + vi_attr->hdr_mode = LINERA_MODE; + vi_attr->dvp_port = VI_DVP_PORT0; +} + +static long vvcam_mipi_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct vvcam_mipi_dev *mipi_dev; + int ret = 0; + // uint32_t reset; + // uint32_t stream_enable; + vvcam_input_dev_attr_t mipi_cfg; + struct vi_attr vi_attr = { + .csi_num = CSI0, + .mipi_lanes = MIPI_2LANE, + .data_type = CSI_DATA_TYPE_RAW10, + .phy_freq = MIPI_PHY_1200M, + .hdr_mode = LINERA_MODE, + .dvp_port = VI_DVP_PORT0 + }; + + mipi_dev = file->private_data; + + mutex_lock(&mipi_dev->mlock); + + switch(cmd) { + case VVCAM_MIPI_RESET: + if (!IS_ERR(mipi_dev->reset_csi)) { + dev_info(mipi_dev->dev, "csi reset\n"); + ret = reset_control_reset(mipi_dev->reset_csi); + } + if (!IS_ERR(mipi_dev->reset_sensor)) { + dev_info(mipi_dev->dev, "sensor reset\n"); + ret |= reset_control_reset(mipi_dev->reset_sensor); + } + // vicap_reset(); + // ret = copy_from_user(&reset, (void __user *)arg, sizeof(reset)); + // if (ret) + // break; + // ret = vvcam_mipi_reset(mipi_dev, reset); + break; + case VVCAM_MIPI_SET_DEV_ATTR: + dev_info(mipi_dev->dev, "set dev attr\n"); + ret = copy_from_user(&mipi_cfg, (void __user *)arg, sizeof(mipi_cfg)); + if (ret) + break; + // convert to k230 api + convert_to_vi_attr(mipi_dev->dev, &mipi_cfg, &vi_attr); + ret = dwc_csi_phy_init(CSI0, vi_attr.phy_freq, vi_attr.mipi_lanes); + if (ret) { + dev_err(mipi_dev->dev, "dwc_csi_phy_init error %d\n", ret); + break; + } + ret = kd_vi_set_config(&vi_attr); + if (ret) { + dev_err(mipi_dev->dev, "kd_vi_set_config error %d\n", ret); + break; + } + // ret = vvcam_mipi_set_cfg(mipi_dev, mipi_cfg); + break; + case VVCAM_MIPI_SET_STREAM: + // ret = copy_from_user(&stream_enable, + // (void __user *)arg, sizeof(stream_enable)); + // if (ret) + // break; + // ret = vvcam_mipi_set_stream(mipi_dev, stream_enable); + break; + default: + break; + } + + mutex_unlock(&mipi_dev->mlock); + + return ret; +} + +static struct file_operations vvcam_mipi_fops = { + .owner = THIS_MODULE, + .open = vvcam_mipi_open, + .release = vvcam_mipi_release, + .unlocked_ioctl = vvcam_mipi_ioctl, +}; + +static irqreturn_t vvcam_mipi_irq_handler(int irq, void *mipi_dev) { + // printk("mipi irq\n"); + return IRQ_HANDLED; +} + +static int vvcam_mipi_probe(struct platform_device *pdev) +{ + int ret = 0; + struct vvcam_mipi_dev *mipi_dev; + struct resource *res; + char *miscdev_name; + + dev_info(&pdev->dev, "start probe"); + + mipi_dev = devm_kzalloc(&pdev->dev, + sizeof(struct vvcam_mipi_dev), GFP_KERNEL); + if (!mipi_dev) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "can't fetch device resource info\n"); + return -EIO; + } + mipi_dev->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(mipi_dev->base)) { + dev_err(&pdev->dev, "can't remap device resource info\n"); + return PTR_ERR(mipi_dev->base); + } + + mipi_dev->irq = platform_get_irq(pdev, 0); + if (mipi_dev->irq < 0) { + dev_err(&pdev->dev, "can't get irq\n"); + return -EIO; + } + ret = devm_request_irq(&pdev->dev, mipi_dev->irq, vvcam_mipi_irq_handler, IRQF_TRIGGER_HIGH | IRQF_SHARED, dev_name(&pdev->dev), mipi_dev); + if (ret) { + dev_err(&pdev->dev, "can't request isp irq %d\n", mipi_dev->irq); + goto error_request_isp_irq; + } + dev_info(&pdev->dev, "irq: %d\n", mipi_dev->irq); + + mipi_dev->reset_csi = devm_reset_control_get(&pdev->dev, "csi"); + if (IS_ERR(mipi_dev->reset_csi)) { + dev_err(&pdev->dev, "can't get mipi csi reset\n"); + } + mipi_dev->reset_sensor = devm_reset_control_get(&pdev->dev, "sensor"); + if (IS_ERR(mipi_dev->reset_sensor)) { + dev_err(&pdev->dev, "can't get mipi sensor reset\n"); + } + + mutex_init(&mipi_dev->mlock); + platform_set_drvdata(pdev, mipi_dev); + + mipi_dev->dev = &pdev->dev; + mipi_dev->id = pdev->id; + + // vvcam_mipi_default_cfg(mipi_dev); + csi_device_init(); + vi_device_init(); + + miscdev_name = devm_kzalloc(&pdev->dev, 16, GFP_KERNEL); + if (!miscdev_name) + return -ENOMEM; + // FIXME: + snprintf(miscdev_name, 16, "vvcam-mipi.0"); + + mipi_dev->miscdev.minor = MISC_DYNAMIC_MINOR; + mipi_dev->miscdev.name = miscdev_name; + mipi_dev->miscdev.fops = &vvcam_mipi_fops; + + ret = misc_register(&mipi_dev->miscdev); + if (ret) { + dev_err(&pdev->dev, "failed to register device\n"); + return -EINVAL; + } + + dev_info(&pdev->dev, "vvcam mipi driver probe success\n"); + + return 0; + +error_request_isp_irq: + devm_iounmap(&pdev->dev, mipi_dev->base); + return ret; +} + +static int vvcam_mipi_remove(struct platform_device *pdev) +{ + struct vvcam_mipi_dev *mipi_dev; + + mipi_dev = platform_get_drvdata(pdev); + devm_free_irq(&pdev->dev, mipi_dev->irq, mipi_dev); + misc_deregister(&mipi_dev->miscdev); + return 0; +} + +static int vvcam_mipi_system_suspend(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_suspend(dev); + if (ret) { + dev_err(dev, "force suspend %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_mipi_system_resume(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_resume(dev); + if (ret) { + dev_err(dev, "force resume %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_mipi_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int vvcam_mipi_runtime_resume(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops vvcam_mipi_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(vvcam_mipi_system_suspend, vvcam_mipi_system_resume) + SET_RUNTIME_PM_OPS(vvcam_mipi_runtime_suspend, vvcam_mipi_runtime_resume, NULL) +}; + +static const struct of_device_id vvcam_mipi_of_match[] = { + {.compatible = "verisilicon,mipi",}, + { /* sentinel */ }, +}; + +static struct platform_driver vvcam_mipi_driver = { + .probe = vvcam_mipi_probe, + .remove = vvcam_mipi_remove, + .driver = { + .name = VVCAM_MIPI_NAME, + .owner = THIS_MODULE, + .of_match_table = vvcam_mipi_of_match, + .pm = &vvcam_mipi_pm_ops, + } +}; + +static int __init vvcam_mipi_init_module(void) +{ + int ret; + ret = platform_driver_register(&vvcam_mipi_driver); + if (ret) { + printk(KERN_ERR "Failed to register mipi driver\n"); + return ret; + } + +#if 0 + ret = vvcam_mipi_platform_device_register(); + if (ret) { + platform_driver_unregister(&vvcam_mipi_driver); + printk(KERN_ERR "Failed to register vvcam mipi platform devices\n"); + return ret; + } +#endif + return ret; +} + +static void __exit vvcam_mipi_exit_module(void) +{ + platform_driver_unregister(&vvcam_mipi_driver); +#if 0 + vvcam_mipi_platform_device_unregister(); +#endif + return; +} + +module_init(vvcam_mipi_init_module); +module_exit(vvcam_mipi_exit_module); + +MODULE_DESCRIPTION("Verisilicon mipi driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); diff --git a/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.h b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.h new file mode 100644 index 0000000..26d3d00 --- /dev/null +++ b/buildroot-overlay/package/vvcam/mipi/vvcam_mipi_driver.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_MIPI_DRIVER_H__ +#define __VVCAM_MIPI_DRIVER_H__ + +#include "linux/reset.h" +#include +#include "vvcam_mipi.h" +#include "k230_vi.h" + +#define VVCAM_MIPI_NAME "vvcam-mipi" + +struct vvcam_mipi_dev { + void __iomem *base; + #if 0 // unused for DWC CSI + void __iomem *tpg_reg; + void __iomem *csi_ctrl_reg; + void __iomem *csi_mux_reg; + #endif + int id; + uint8_t bus_width; + struct miscdevice miscdev; + struct device *dev; + struct mutex mlock; + vvcam_input_dev_attr_t mipi_cfg; + int irq; + struct reset_control* reset_csi; + struct reset_control* reset_sensor; +}; + +int vvcam_mipi_reset(struct vvcam_mipi_dev *mipi_dev, uint32_t val); +int vvcam_mipi_default_cfg(struct vvcam_mipi_dev *mipi_dev); +int vvcam_mipi_set_cfg(struct vvcam_mipi_dev *mipi_dev, + vvcam_input_dev_attr_t mipi_cfg); +int vvcam_mipi_set_stream(struct vvcam_mipi_dev *mipi_dev, uint32_t enable); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/common/vvcam_v4l2_common.h b/buildroot-overlay/package/vvcam/v4l2/common/vvcam_v4l2_common.h new file mode 100644 index 0000000..023ecb4 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/common/vvcam_v4l2_common.h @@ -0,0 +1,125 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_V4L2_COMMON_H__ +#define __VVCAM_V4L2_COMMON_H__ +#include + +struct vvcam_video_plane { + uint32_t dma_addr; + uint32_t size; +}; + +struct vvcam_vb2_buffer { + struct vb2_v4l2_buffer vb; + unsigned int num_planes; + struct vvcam_video_plane planes[VIDEO_MAX_PLANES]; + struct list_head list; + uint32_t sequence; +}; + +struct vvcam_pad_reqbufs { + int pad; + uint32_t num_buffers; +}; + +struct vvcam_pad_buf { + uint32_t pad; + struct vvcam_vb2_buffer *buf; +}; + +struct vvcam_pad_stream_status { + uint32_t pad; + uint32_t status; +}; + +struct vvcam_pad_queryctrl { + uint32_t pad; + struct v4l2_queryctrl *query_ctrl; +}; + +struct vvcam_pad_query_ext_ctrl { + uint32_t pad; + struct v4l2_query_ext_ctrl *query_ext_ctrl; +}; + +struct vvcam_pad_control { + uint32_t pad; + struct v4l2_control *control; +}; + +struct vvcam_pad_ext_controls { + uint32_t pad; + struct v4l2_ext_controls *ext_controls; +}; + +struct vvcam_pad_querymenu { + uint32_t pad; + struct v4l2_querymenu *querymenu; +}; + +#define VVCAM_PAD_REQUBUFS _IOWR('V', BASE_VIDIOC_PRIVATE + 0, struct vvcam_pad_reqbufs) +#define VVCAM_PAD_BUF_DONE _IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct vvcam_pad_buf) +#define VVCAM_PAD_BUF_QUEUE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, struct vvcam_pad_buf) +#define VVCAM_PAD_S_STREAM _IOWR('V', BASE_VIDIOC_PRIVATE + 3, struct vvcam_pad_stream_status) + +#define VVCAM_PAD_QUERYCTRL _IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct vvcam_pad_queryctrl) +#define VVCAM_PAD_QUERY_EXT_CTRL _IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct vvcam_pad_query_ext_ctrl) +#define VVCAM_PAD_G_CTRL _IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct vvcam_pad_control) +#define VVCAM_PAD_S_CTRL _IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct vvcam_pad_control) +#define VVCAM_PAD_G_EXT_CTRLS _IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct vvcam_pad_ext_controls) +#define VVCAM_PAD_S_EXT_CTRLS _IOWR('V', BASE_VIDIOC_PRIVATE + 9, struct vvcam_pad_ext_controls) +#define VVCAM_PAD_TRY_EXT_CTRLS _IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct vvcam_pad_ext_controls) +#define VVCAM_PAD_QUERYMENU _IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct vvcam_pad_querymenu) + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/Makefile b/buildroot-overlay/package/vvcam/v4l2/isp/Makefile new file mode 100644 index 0000000..341eeb7 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/Makefile @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: GPL-2.0 + +ccflags-y += -DVVCAM_ISP0_BASE=0x90000000 +ccflags-y += -DVVCAM_ISP1_BASE=0x90000000 +ccflags-y += -DVVCAM_ISP_REG_SIZE=0x10000 +ccflags-y += -DVVCAM_ISP0_IRQ=129 +ccflags-y += -DVVCAM_ISP0_MI_IRQ=127 +ccflags-y += -DVVCAM_ISP0_FE_IRQ=128 +ccflags-y += -DVVCAM_ISP1_IRQ=129 +ccflags-y += -DVVCAM_ISP1_MI_IRQ=127 +ccflags-y += -DVVCAM_ISP1_FE_IRQ=128 +ccflags-y += -DVVCAM_PLATFORM_REGISTER +ccflags-y += -DVVCAM_ISP_DEV_MAX=1 +ccflags-y += -DVVCAM_TPG0=0xDE308300 +ccflags-y += -DVVCAM_TPG1=0xDE308300 +ccflags-y += -DVVCAM_TPG_SIZE=0x4 + +ccflags-y += -I$(src) -I$(src)/../common -I$(src)/isp_ctrl +ccflags-y += -DISP_AE_V3 -I$(src)/isp_ctrl/ae/ae_v3 +ccflags-y += -DISP_AWB_V3 -I$(src)/isp_ctrl/awb/awb_v3 +ccflags-y += -DISP_AF_V3 -I$(src)/isp_ctrl/af/af_v3 +ccflags-y += -DISP_BLS -I$(src)/isp_ctrl/bls/bls +ccflags-y += -DISP_CCM -I$(src)/isp_ctrl/ccm/ccm +ccflags-y += -DISP_DPCC -I$(src)/isp_ctrl/dpcc/dpcc +ccflags-y += -DISP_GE -I$(src)/isp_ctrl/ge/ge +ccflags-y += -DISP_LSC_V3 -I$(src)/isp_ctrl/lsc/lsc_v3 +ccflags-y += -DISP_WB -I$(src)/isp_ctrl/wb/wb +ccflags-y += -DISP_DG -I$(src)/isp_ctrl/dg/dg +ccflags-y += -DISP_CPROC -I$(src)/isp_ctrl/cproc/cproc +ccflags-y += -DISP_EE_V2 -I$(src)/isp_ctrl/ee/ee_v2 +ccflags-y += -DISP_GC_V2 -I$(src)/isp_ctrl/gc/gc_v2 +ccflags-y += -DISP_AFM_V1 -I$(src)/isp_ctrl/afm/afm_v1 +ccflags-y += -DISP_DMSC_V2 -I$(src)/isp_ctrl/dmsc/dmsc_v2 +ccflags-y += -DISP_EXP_V2 -I$(src)/isp_ctrl/exp/exp_v2 + +vvcam_isp_subdev-objs := vvcam_isp_procfs.o +vvcam_isp_subdev-objs += vvcam_isp_event.o +vvcam_isp_subdev-objs += vvcam_isp_platform.o +vvcam_isp_subdev-objs += vvcam_isp_driver.o +vvcam_isp_subdev-objs += isp_ctrl/vvcam_isp_ctrl.o +vvcam_isp_subdev-objs += isp_ctrl/ee/ee_v2/vvcam_isp_ee.o +vvcam_isp_subdev-objs += isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.o +vvcam_isp_subdev-objs += isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.o +vvcam_isp_subdev-objs += isp_ctrl/exp/exp_v2/vvcam_isp_exp.o +vvcam_isp_subdev-objs += isp_ctrl/afm/afm_v1/vvcam_isp_afm.o +vvcam_isp_subdev-objs += isp_ctrl/ge/ge/vvcam_isp_ge.o +vvcam_isp_subdev-objs += isp_ctrl/cproc/cproc/vvcam_isp_cproc.o +vvcam_isp_subdev-objs += isp_ctrl/wb/wb/vvcam_isp_wb.o +vvcam_isp_subdev-objs += isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.o +vvcam_isp_subdev-objs += isp_ctrl/gc/gc_v2/vvcam_isp_gc.o +vvcam_isp_subdev-objs += isp_ctrl/dg/dg/vvcam_isp_dg.o +vvcam_isp_subdev-objs += isp_ctrl/af/af_v3/vvcam_isp_af.o +vvcam_isp_subdev-objs += isp_ctrl/ae/ae_v3/vvcam_isp_ae.o +vvcam_isp_subdev-objs += isp_ctrl/ccm/ccm/vvcam_isp_ccm.o +vvcam_isp_subdev-objs += isp_ctrl/bls/bls/vvcam_isp_bls.o +vvcam_isp_subdev-objs += isp_ctrl/awb/awb_v3/vvcam_isp_awb.o +vvcam_isp_subdev-objs += isp_ctrl/vvcam_isp_ctrl.o + +obj-m += vvcam_isp_subdev.o diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.c new file mode 100644 index 0000000..0d40b57 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.c @@ -0,0 +1,273 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_2dnr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_2dnr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_2DNR_ENABLE: + case VVCAM_ISP_CID_2DNR_RESET: + case VVCAM_ISP_CID_2DNR_MODE: + case VVCAM_ISP_CID_2DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_2DNR_AUTO_GAIN: + case VVCAM_ISP_CID_2DNR_AUTO_SIGMA: + case VVCAM_ISP_CID_2DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_ENABLE: + case VVCAM_ISP_CID_2DNR_MANU_PRE_GC_ENABLE: + case VVCAM_ISP_CID_2DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_SIGMA: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_2dnr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_2DNR_ENABLE: + case VVCAM_ISP_CID_2DNR_RESET: + case VVCAM_ISP_CID_2DNR_MODE: + case VVCAM_ISP_CID_2DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_2DNR_AUTO_GAIN: + case VVCAM_ISP_CID_2DNR_AUTO_SIGMA: + case VVCAM_ISP_CID_2DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_ENABLE: + case VVCAM_ISP_CID_2DNR_MANU_PRE_GC_ENABLE: + case VVCAM_ISP_CID_2DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_SIGMA: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_2dnr_ctrl_ops = { + .s_ctrl = vvcam_isp_2dnr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_2dnr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_2dnr_ctrls[] = { + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_SIGMA, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_sigma", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_ENABLE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_pre_gc_enable", + .step = 1, + .min = 0, + .max = 1, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_PRE_GC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_pre_gc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_strength", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + /* float 0.1~120. */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_SIGMA, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_sigma", + .step = 1, + .min = 1, + .max = 1200, + .def = 50, + }, +}; + +int vvcam_isp_2dnr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_2dnr_ctrls); +} + +int vvcam_isp_2dnr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_2dnr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_2dnr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp 2dnr ctrl %s failed %d.\n", + vvcam_isp_2dnr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.h new file mode 100644 index 0000000..73c858f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v3/vvcam_isp_2dnr.h @@ -0,0 +1,74 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_2DNR_H__ +#define __VVCAM_ISP_2DNR_H__ + +#define VVCAM_ISP_CID_2DNR_ENABLE (VVCAM_ISP_CID_2DNR_BASE + 0x0000) +#define VVCAM_ISP_CID_2DNR_RESET (VVCAM_ISP_CID_2DNR_BASE + 0x0001) +#define VVCAM_ISP_CID_2DNR_MODE (VVCAM_ISP_CID_2DNR_BASE + 0x0002) +#define VVCAM_ISP_CID_2DNR_AUTO_LEVEL (VVCAM_ISP_CID_2DNR_BASE + 0x0003) +#define VVCAM_ISP_CID_2DNR_AUTO_GAIN (VVCAM_ISP_CID_2DNR_BASE + 0x0004) +#define VVCAM_ISP_CID_2DNR_AUTO_SIGMA (VVCAM_ISP_CID_2DNR_BASE + 0x0005) +#define VVCAM_ISP_CID_2DNR_AUTO_STRENGTH (VVCAM_ISP_CID_2DNR_BASE + 0x0006) +#define VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_ENABLE \ + (VVCAM_ISP_CID_2DNR_BASE + 0x0007) +#define VVCAM_ISP_CID_2DNR_MANU_PRE_GC_ENABLE \ + (VVCAM_ISP_CID_2DNR_BASE + 0x0008) +#define VVCAM_ISP_CID_2DNR_MANU_STRENGTH (VVCAM_ISP_CID_2DNR_BASE + 0x0009) +#define VVCAM_ISP_CID_2DNR_MANU_SIGMA (VVCAM_ISP_CID_2DNR_BASE + 0x000A) + +int vvcam_isp_2dnr_ctrl_count(void); +int vvcam_isp_2dnr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.c new file mode 100644 index 0000000..d08fd50 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.c @@ -0,0 +1,342 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_2dnr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_2dnr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_2DNR_ENABLE: + case VVCAM_ISP_CID_2DNR_RESET: + case VVCAM_ISP_CID_2DNR_ENABLE_LUMA: + case VVCAM_ISP_CID_2DNR_MODE: + case VVCAM_ISP_CID_2DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_2DNR_AUTO_GAIN: + case VVCAM_ISP_CID_2DNR_AUTO_SIGMA: + case VVCAM_ISP_CID_2DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_X: + case VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_Y: + case VVCAM_ISP_CID_2DNR_MANU_PRE_GC_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_SIGMA: + case VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_X: + case VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_Y: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_2dnr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_2DNR_ENABLE: + case VVCAM_ISP_CID_2DNR_RESET: + case VVCAM_ISP_CID_2DNR_ENABLE_LUMA: + case VVCAM_ISP_CID_2DNR_MODE: + case VVCAM_ISP_CID_2DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_2DNR_AUTO_GAIN: + case VVCAM_ISP_CID_2DNR_AUTO_SIGMA: + case VVCAM_ISP_CID_2DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_STRENGTH: + case VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_X: + case VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_Y: + case VVCAM_ISP_CID_2DNR_MANU_PRE_GC_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_2DNR_MANU_SIGMA: + case VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_X: + case VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_Y: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_2dnr_ctrl_ops = { + .s_ctrl = vvcam_isp_2dnr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_2dnr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_2dnr_ctrls[] = { + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_ENABLE_LUMA, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_enable_luma", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1} + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_SIGMA, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_sigma", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_pre_gc_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20}, + }, + { + /* uint16_t array 8x16bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_X, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_luma_curve_x", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 12}, + }, + { + /* uint16_t array 8x16bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_Y, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_auto_luma_curve_y", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 12}, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_PRE_GC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_pre_gc_strength", + .step = 1, + .min = 0, + .max = 1, + .dims = {1}, + }, + { + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_strength", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + /* float 0.1~100. */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_SIGMA, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_sigma", + .step = 1, + .min = 1, + .max = 1000, + .def = 50, + }, + { + /* uint16_t array 12x16bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_X, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_luma_curve_x", + .step = 1, + .min = 0, + .max = 4095, + .dims = {12}, + }, + { + /* uint16_t array 12x16bit */ + .ops = &vvcam_isp_2dnr_ctrl_ops, + .id = VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_Y, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_2dnr_manu_luma_curve_y", + .step = 1, + .min = 0, + .max = 256, + .dims = {12}, + }, +}; + +int vvcam_isp_2dnr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_2dnr_ctrls); +} + +int vvcam_isp_2dnr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_2dnr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_2dnr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp 2dnr ctrl %s failed %d.\n", + vvcam_isp_2dnr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.h new file mode 100644 index 0000000..832bf0f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/2dnr/2dnr_v5_2/vvcam_isp_2dnr.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_2DNR_H__ +#define __VVCAM_ISP_2DNR_H__ + +#define VVCAM_ISP_CID_2DNR_ENABLE (VVCAM_ISP_CID_2DNR_BASE + 0x0000) +#define VVCAM_ISP_CID_2DNR_RESET (VVCAM_ISP_CID_2DNR_BASE + 0x0001) +#define VVCAM_ISP_CID_2DNR_ENABLE_LUMA (VVCAM_ISP_CID_2DNR_BASE + 0x0002) +#define VVCAM_ISP_CID_2DNR_MODE (VVCAM_ISP_CID_2DNR_BASE + 0x0003) +#define VVCAM_ISP_CID_2DNR_AUTO_LEVEL (VVCAM_ISP_CID_2DNR_BASE + 0x0004) +#define VVCAM_ISP_CID_2DNR_AUTO_GAIN (VVCAM_ISP_CID_2DNR_BASE + 0x0005) +#define VVCAM_ISP_CID_2DNR_AUTO_SIGMA (VVCAM_ISP_CID_2DNR_BASE + 0x0006) +#define VVCAM_ISP_CID_2DNR_AUTO_STRENGTH (VVCAM_ISP_CID_2DNR_BASE + 0x0007) +#define VVCAM_ISP_CID_2DNR_AUTO_PRE_GC_STRENGTH \ + (VVCAM_ISP_CID_2DNR_BASE + 0x0008) +#define VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_X \ + (VVCAM_ISP_CID_2DNR_BASE + 0x000A) +#define VVCAM_ISP_CID_2DNR_AUTO_LUMA_CURVE_Y \ + (VVCAM_ISP_CID_2DNR_BASE + 0x000B) + +#define VVCAM_ISP_CID_2DNR_MANU_PRE_GC_STRENGTH \ + (VVCAM_ISP_CID_2DNR_BASE + 0x000C) +#define VVCAM_ISP_CID_2DNR_MANU_STRENGTH (VVCAM_ISP_CID_2DNR_BASE + 0x000D) +#define VVCAM_ISP_CID_2DNR_MANU_SIGMA (VVCAM_ISP_CID_2DNR_BASE + 0x000E) +#define VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_X \ + (VVCAM_ISP_CID_2DNR_BASE + 0x000F) +#define VVCAM_ISP_CID_2DNR_MANU_LUMA_CURVE_Y \ + (VVCAM_ISP_CID_2DNR_BASE + 0x0010) + +int vvcam_isp_2dnr_ctrl_count(void); +int vvcam_isp_2dnr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.c new file mode 100644 index 0000000..48867b2 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.c @@ -0,0 +1,272 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_3dnr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_3dnr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_3DNR_ENABLE: + case VVCAM_ISP_CID_3DNR_RESET: + case VVCAM_ISP_CID_3DNR_MODE: + case VVCAM_ISP_CID_3DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_3DNR_AUTO_GAIN: + case VVCAM_ISP_CID_3DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV: + case VVCAM_ISP_CID_3DNR_AUTO_DELTA: + case VVCAM_ISP_CID_3DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_3DNR_MANU_MOTION_INV: + case VVCAM_ISP_CID_3DNR_MANU_DELTA: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_3dnr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_3DNR_ENABLE: + case VVCAM_ISP_CID_3DNR_RESET: + case VVCAM_ISP_CID_3DNR_MODE: + case VVCAM_ISP_CID_3DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_3DNR_AUTO_GAIN: + case VVCAM_ISP_CID_3DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV: + case VVCAM_ISP_CID_3DNR_AUTO_DELTA: + case VVCAM_ISP_CID_3DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_3DNR_MANU_MOTION_INV: + case VVCAM_ISP_CID_3DNR_MANU_DELTA: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_3dnr_ctrl_ops = { + .s_ctrl = vvcam_isp_3dnr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_3dnr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_3dnr_ctrls[] = { + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {20, 0, 0, 0}, + }, + { + /* int32_t array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_motion_inv", + .step = 1, + .min = 1, + .max = 10000, + .def = 1, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_DELTA, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_delta", + .step = 1, + .min = 0, + .max = 1024, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_MOTION_INV, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_motion_inv", + .step = 1, + .min = 0, + .max = 10000, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_DELTA, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_delta", + .step = 1, + .min = 0, + .max = 1024, + .dims = {1, 0, 0, 0}, + }, +}; + +int vvcam_isp_3dnr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_3dnr_ctrls); +} + +int vvcam_isp_3dnr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_3dnr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_3dnr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp 3dnr ctrl %s failed %d.\n", + vvcam_isp_3dnr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.h new file mode 100644 index 0000000..c2510e1 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v1_2/vvcam_isp_3dnr.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_3DNR_H__ +#define __VVCAM_ISP_3DNR_H__ + +#define VVCAM_ISP_CID_3DNR_ENABLE (VVCAM_ISP_CID_3DNR_BASE + 0x0000) +#define VVCAM_ISP_CID_3DNR_RESET (VVCAM_ISP_CID_3DNR_BASE + 0x0001) +#define VVCAM_ISP_CID_3DNR_MODE (VVCAM_ISP_CID_3DNR_BASE + 0x0002) +#define VVCAM_ISP_CID_3DNR_AUTO_LEVEL (VVCAM_ISP_CID_3DNR_BASE + 0x0003) +#define VVCAM_ISP_CID_3DNR_AUTO_GAIN (VVCAM_ISP_CID_3DNR_BASE + 0x0004) +#define VVCAM_ISP_CID_3DNR_AUTO_STRENGTH (VVCAM_ISP_CID_3DNR_BASE + 0x0005) +#define VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV (VVCAM_ISP_CID_3DNR_BASE + 0x0006) +#define VVCAM_ISP_CID_3DNR_AUTO_DELTA (VVCAM_ISP_CID_3DNR_BASE + 0x0007) +#define VVCAM_ISP_CID_3DNR_MANU_STRENGTH (VVCAM_ISP_CID_3DNR_BASE + 0x0008) +#define VVCAM_ISP_CID_3DNR_MANU_MOTION_INV (VVCAM_ISP_CID_3DNR_BASE + 0x0009) +#define VVCAM_ISP_CID_3DNR_MANU_DELTA (VVCAM_ISP_CID_3DNR_BASE + 0x000A) + +int vvcam_isp_3dnr_ctrl_count(void); +int vvcam_isp_3dnr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.c new file mode 100644 index 0000000..49ffc9e --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.c @@ -0,0 +1,272 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_3dnr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_3dnr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_3DNR_ENABLE: + case VVCAM_ISP_CID_3DNR_RESET: + case VVCAM_ISP_CID_3DNR_MODE: + case VVCAM_ISP_CID_3DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_3DNR_AUTO_GAIN: + case VVCAM_ISP_CID_3DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV: + case VVCAM_ISP_CID_3DNR_AUTO_DELTA: + case VVCAM_ISP_CID_3DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_3DNR_MANU_MOTION_INV: + case VVCAM_ISP_CID_3DNR_MANU_DELTA: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_3dnr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_3DNR_ENABLE: + case VVCAM_ISP_CID_3DNR_RESET: + case VVCAM_ISP_CID_3DNR_MODE: + case VVCAM_ISP_CID_3DNR_AUTO_LEVEL: + case VVCAM_ISP_CID_3DNR_AUTO_GAIN: + case VVCAM_ISP_CID_3DNR_AUTO_STRENGTH: + case VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV: + case VVCAM_ISP_CID_3DNR_AUTO_DELTA: + case VVCAM_ISP_CID_3DNR_MANU_STRENGTH: + case VVCAM_ISP_CID_3DNR_MANU_MOTION_INV: + case VVCAM_ISP_CID_3DNR_MANU_DELTA: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_3dnr_ctrl_ops = { + .s_ctrl = vvcam_isp_3dnr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_3dnr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_3dnr_ctrls[] = { + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_strength", + .step = 1, + .min = 0, + .max = 127, + .dims = {20, 0, 0, 0}, + }, + { + /* int32_t array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_motion_inv", + .step = 1, + .min = 1, + .max = 65535, + .def = 1, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t array 20x */ + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_AUTO_DELTA, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_auto_delta", + .step = 1, + .min = 0, + .max = 1023, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_strength", + .step = 1, + .min = 0, + .max = 127, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_MOTION_INV, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_motion_inv", + .step = 1, + .min = 0, + .max = 65535, + }, + { + .ops = &vvcam_isp_3dnr_ctrl_ops, + .id = VVCAM_ISP_CID_3DNR_MANU_DELTA, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_3dnr_manu_delta", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1, 0, 0, 0}, + }, +}; + +int vvcam_isp_3dnr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_3dnr_ctrls); +} + +int vvcam_isp_3dnr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_3dnr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_3dnr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp 3dnr ctrl %s failed %d.\n", + vvcam_isp_3dnr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.h new file mode 100644 index 0000000..c2510e1 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/3dnr/3dnr_v2_1/vvcam_isp_3dnr.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_3DNR_H__ +#define __VVCAM_ISP_3DNR_H__ + +#define VVCAM_ISP_CID_3DNR_ENABLE (VVCAM_ISP_CID_3DNR_BASE + 0x0000) +#define VVCAM_ISP_CID_3DNR_RESET (VVCAM_ISP_CID_3DNR_BASE + 0x0001) +#define VVCAM_ISP_CID_3DNR_MODE (VVCAM_ISP_CID_3DNR_BASE + 0x0002) +#define VVCAM_ISP_CID_3DNR_AUTO_LEVEL (VVCAM_ISP_CID_3DNR_BASE + 0x0003) +#define VVCAM_ISP_CID_3DNR_AUTO_GAIN (VVCAM_ISP_CID_3DNR_BASE + 0x0004) +#define VVCAM_ISP_CID_3DNR_AUTO_STRENGTH (VVCAM_ISP_CID_3DNR_BASE + 0x0005) +#define VVCAM_ISP_CID_3DNR_AUTO_MOTION_INV (VVCAM_ISP_CID_3DNR_BASE + 0x0006) +#define VVCAM_ISP_CID_3DNR_AUTO_DELTA (VVCAM_ISP_CID_3DNR_BASE + 0x0007) +#define VVCAM_ISP_CID_3DNR_MANU_STRENGTH (VVCAM_ISP_CID_3DNR_BASE + 0x0008) +#define VVCAM_ISP_CID_3DNR_MANU_MOTION_INV (VVCAM_ISP_CID_3DNR_BASE + 0x0009) +#define VVCAM_ISP_CID_3DNR_MANU_DELTA (VVCAM_ISP_CID_3DNR_BASE + 0x000A) + +int vvcam_isp_3dnr_ctrl_count(void); +int vvcam_isp_3dnr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.c new file mode 100644 index 0000000..6e9ee75 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.c @@ -0,0 +1,532 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_ae.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_ae_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AE_ENABLE: + case VVCAM_ISP_CID_AE_RESET: + case VVCAM_ISP_CID_AE_STATE: + case VVCAM_ISP_CID_AE_SEM_MODE: + case VVCAM_ISP_CID_AE_FLICKER_PERIOD: + case VVCAM_ISP_CID_AE_SETPOINT: + case VVCAM_ISP_CID_AE_TOLORENCE: + case VVCAM_ISP_CID_AE_DAMPOVER: + case VVCAM_ISP_CID_AE_DAMPOVER_RATIO: + case VVCAM_ISP_CID_AE_DAMPOVER_GAIN: + case VVCAM_ISP_CID_AE_DAMPUNDER: + case VVCAM_ISP_CID_AE_DAMPUNDER_RATIO: + case VVCAM_ISP_CID_AE_DAMPUNDER_GAIN: + case VVCAM_ISP_CID_AE_MOTION_FILTER: + case VVCAM_ISP_CID_AE_MOTION_THRESHOLD: + case VVCAM_ISP_CID_AE_TARGET_FILTER: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_REPRESS: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_GAIN: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_LEVEL: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_REPRESS: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_GAIN: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_LEVEL: + case VVCAM_ISP_CID_AE_WDR_CONTRAST_MIN: + case VVCAM_ISP_CID_AE_WDR_CONTRAST_MAX: + case VVCAM_ISP_CID_AE_ROI_WEIGHT: + case VVCAM_ISP_CID_AE_ROI: + case VVCAM_ISP_CID_AE_HIST: + case VVCAM_ISP_CID_AE_LUMA: + case VVCAM_ISP_CID_AE_OBJECT_REGION: + case VVCAM_ISP_CID_AE_FRAME_CALC_ENABLE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_ae_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AE_ENABLE: + case VVCAM_ISP_CID_AE_RESET: + case VVCAM_ISP_CID_AE_STATE: + case VVCAM_ISP_CID_AE_SEM_MODE: + case VVCAM_ISP_CID_AE_FLICKER_PERIOD: + case VVCAM_ISP_CID_AE_SETPOINT: + case VVCAM_ISP_CID_AE_TOLORENCE: + case VVCAM_ISP_CID_AE_DAMPOVER: + case VVCAM_ISP_CID_AE_DAMPOVER_RATIO: + case VVCAM_ISP_CID_AE_DAMPOVER_GAIN: + case VVCAM_ISP_CID_AE_DAMPUNDER: + case VVCAM_ISP_CID_AE_DAMPUNDER_RATIO: + case VVCAM_ISP_CID_AE_DAMPUNDER_GAIN: + case VVCAM_ISP_CID_AE_MOTION_FILTER: + case VVCAM_ISP_CID_AE_MOTION_THRESHOLD: + case VVCAM_ISP_CID_AE_TARGET_FILTER: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_REPRESS: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_GAIN: + case VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_LEVEL: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_REPRESS: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_GAIN: + case VVCAM_ISP_CID_AE_LOWLIGHT_HDR_LEVEL: + case VVCAM_ISP_CID_AE_WDR_CONTRAST_MIN: + case VVCAM_ISP_CID_AE_WDR_CONTRAST_MAX: + case VVCAM_ISP_CID_AE_ROI_WEIGHT: + case VVCAM_ISP_CID_AE_ROI: + case VVCAM_ISP_CID_AE_HIST: + case VVCAM_ISP_CID_AE_LUMA: + case VVCAM_ISP_CID_AE_OBJECT_REGION: + case VVCAM_ISP_CID_AE_FRAME_CALC_ENABLE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_ae_ctrl_ops = { + .s_ctrl = vvcam_isp_ae_s_ctrl, + .g_volatile_ctrl = vvcam_isp_ae_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_ae_ctrls[] = { + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_STATE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_state", + .step = 1, + .min = 0, + .max = 4, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_SEM_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_sem_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_FLICKER_PERIOD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_flicker_period", + .step = 1, + .min = 0, + .max = 3, + }, + { + /* float (0,255) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_SETPOINT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_setpoint", + .step = 1, + .min = 1, + .max = 254, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_TOLORENCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_tolerence", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPOVER, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampover", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (1,4) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPOVER_RATIO, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampover_ratio", + .step = 1, + .min = 101, + .max = 399, + .def = 200, + }, + { + /* float [1,128) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPOVER_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampover_gain", + .step = 1, + .min = 100, + .max = 12799, + .def = 100, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPUNDER, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampunder", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPUNDER_RATIO, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampunder_ratio", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float [1,16) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_DAMPUNDER_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_dampunder_gain", + .step = 1, + .min = 100, + .max = 1599, + .def = 100, + }, + { + /* float (0,1) 32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_MOTION_FILTER, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_motion_filter", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (0,1) 32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_MOTION_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_motion_threshold", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (0,1) 32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_TARGET_FILTER, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_target_filter", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float array 8x32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_REPRESS, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_linear_repress", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {8}, + }, + { + /* float array 8x32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_linear_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {8}, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_LEVEL, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_linear_level", + .step = 1, + .min = 0, + .max = 16, + }, + { + /* float array 8x32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_HDR_REPRESS, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_hdr_repress", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {8}, + }, + { + /* float array 8x32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_HDR_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_hdr_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {8}, + }, + { + /* int 0~16 */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LOWLIGHT_HDR_LEVEL, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_lowlight_hdr_level", + .step = 1, + .min = 0, + .max = 16, + }, + { + /* float (0,255) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_WDR_CONTRAST_MIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_wdr_contrast_min", + .step = 1, + .min = 1, + .max = 254, + .def = 1, + }, + { + /* float (0,255) */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_WDR_CONTRAST_MAX, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_wdr_contrast_max", + .step = 1, + .min = 1, + .max = 254, + .def = 1, + }, + { + /* float 25x32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_ROI_WEIGHT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_roi_weight", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {25}, + }, + { + /* int 25x4*16bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_ROI, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_roi", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {25, 4, 0, 0}, + }, + { + /* uint32_t array 256*32bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_HIST, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_hist", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {256}, + }, + { + /* uint8_t array 32*32*8bit */ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_LUMA, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_luma", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1024}, + }, + { + /* uint8_t array 32*32*8bit*/ + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_OBJECT_REGION, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_object_region", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1024}, + }, + { + .ops = &vvcam_isp_ae_ctrl_ops, + .id = VVCAM_ISP_CID_AE_FRAME_CALC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ae_frame_calc_enable", + .step = 1, + .min = 0, + .max = 1, + }, +}; + +int vvcam_isp_ae_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_ae_ctrls); +} + +int vvcam_isp_ae_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_ae_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_ae_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp ae ctrl %s failed %d.\n", + vvcam_isp_ae_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.h new file mode 100644 index 0000000..ea32cdc --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ae/ae_v3/vvcam_isp_ae.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_AE_H__ +#define __VVCAM_ISP_AE_H__ + +#define VVCAM_ISP_CID_AE_ENABLE (VVCAM_ISP_CID_AE_BASE + 0x0000) +#define VVCAM_ISP_CID_AE_RESET (VVCAM_ISP_CID_AE_BASE + 0x0001) +#define VVCAM_ISP_CID_AE_STATE (VVCAM_ISP_CID_AE_BASE + 0x0002) +#define VVCAM_ISP_CID_AE_SEM_MODE (VVCAM_ISP_CID_AE_BASE + 0x0004) +#define VVCAM_ISP_CID_AE_FLICKER_PERIOD (VVCAM_ISP_CID_AE_BASE + 0x0005) +#define VVCAM_ISP_CID_AE_SETPOINT (VVCAM_ISP_CID_AE_BASE + 0x0006) +#define VVCAM_ISP_CID_AE_TOLORENCE (VVCAM_ISP_CID_AE_BASE + 0x0007) +#define VVCAM_ISP_CID_AE_DAMPOVER (VVCAM_ISP_CID_AE_BASE + 0x0008) +#define VVCAM_ISP_CID_AE_DAMPOVER_RATIO (VVCAM_ISP_CID_AE_BASE + 0x0009) +#define VVCAM_ISP_CID_AE_DAMPOVER_GAIN (VVCAM_ISP_CID_AE_BASE + 0x000A) +#define VVCAM_ISP_CID_AE_DAMPUNDER (VVCAM_ISP_CID_AE_BASE + 0x000B) +#define VVCAM_ISP_CID_AE_DAMPUNDER_RATIO (VVCAM_ISP_CID_AE_BASE + 0x000C) +#define VVCAM_ISP_CID_AE_DAMPUNDER_GAIN (VVCAM_ISP_CID_AE_BASE + 0x000D) +#define VVCAM_ISP_CID_AE_MOTION_FILTER (VVCAM_ISP_CID_AE_BASE + 0x000E) +#define VVCAM_ISP_CID_AE_MOTION_THRESHOLD (VVCAM_ISP_CID_AE_BASE + 0x000F) +#define VVCAM_ISP_CID_AE_TARGET_FILTER (VVCAM_ISP_CID_AE_BASE + 0x0010) +#define VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_REPRESS (VVCAM_ISP_CID_AE_BASE + 0x0011) +#define VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_GAIN (VVCAM_ISP_CID_AE_BASE + 0x0012) +#define VVCAM_ISP_CID_AE_LOWLIGHT_LINEAR_LEVEL (VVCAM_ISP_CID_AE_BASE + 0x0013) +#define VVCAM_ISP_CID_AE_LOWLIGHT_HDR_REPRESS (VVCAM_ISP_CID_AE_BASE + 0x0014) +#define VVCAM_ISP_CID_AE_LOWLIGHT_HDR_GAIN (VVCAM_ISP_CID_AE_BASE + 0x0015) +#define VVCAM_ISP_CID_AE_LOWLIGHT_HDR_LEVEL (VVCAM_ISP_CID_AE_BASE + 0x0016) +#define VVCAM_ISP_CID_AE_WDR_CONTRAST_MIN (VVCAM_ISP_CID_AE_BASE + 0x0017) +#define VVCAM_ISP_CID_AE_WDR_CONTRAST_MAX (VVCAM_ISP_CID_AE_BASE + 0x0018) +#define VVCAM_ISP_CID_AE_ROI_WEIGHT (VVCAM_ISP_CID_AE_BASE + 0x001A) +#define VVCAM_ISP_CID_AE_ROI (VVCAM_ISP_CID_AE_BASE + 0x001B) +#define VVCAM_ISP_CID_AE_HIST (VVCAM_ISP_CID_AE_BASE + 0x001C) +#define VVCAM_ISP_CID_AE_LUMA (VVCAM_ISP_CID_AE_BASE + 0x001D) +#define VVCAM_ISP_CID_AE_OBJECT_REGION (VVCAM_ISP_CID_AE_BASE + 0x001E) +#define VVCAM_ISP_CID_AE_FRAME_CALC_ENABLE (VVCAM_ISP_CID_AE_BASE + 0x001F) + +int vvcam_isp_ae_ctrl_count(void); +int vvcam_isp_ae_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.c new file mode 100644 index 0000000..97ddeb9 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.c @@ -0,0 +1,394 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_af.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_af_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AF_ENABLE: + case VVCAM_ISP_CID_AF_RESET: + case VVCAM_ISP_CID_AF_STATE: + case VVCAM_ISP_CID_AF_MODE: + case VVCAM_ISP_CID_CDAF_WINDOW_WEIGHT: + case VVCAM_ISP_CID_CDAF_STABLE_TOLERENCE: + case VVCAM_ISP_CID_CDAF_POINTS_OF_CURVE: + case VVCAM_ISP_CID_CDAF_FOCAL_FILTER: + case VVCAM_ISP_CID_CDAF_SHAPE_FILTER: + case VVCAM_ISP_CID_CDAF_MAX_FOCAL: + case VVCAM_ISP_CID_CDAF_MIN_FOCAL: + case VVCAM_ISP_CID_CDAF_MOTION_THRESHOLD: + case VVCAM_ISP_CID_CDAF_STABLE_THRESHOLD: + case VVCAM_ISP_CID_PDAF_MSE_TOLERENCE: + case VVCAM_ISP_CID_PDAF_PD_CONF_THRESHOLD: + case VVCAM_ISP_CID_PDAF_PD_FOCAL: + case VVCAM_ISP_CID_PDAF_PD_DISTANCE: + case VVCAM_ISP_CID_PDAF_PD_SHIFT_THRESHOLD: + case VVCAM_ISP_CID_PDAF_PD_STABLE_CNT_MAX: + case VVCAM_ISP_CID_PDAF_ROI_INDEX: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_af_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AF_ENABLE: + case VVCAM_ISP_CID_AF_RESET: + case VVCAM_ISP_CID_AF_STATE: + case VVCAM_ISP_CID_AF_MODE: + case VVCAM_ISP_CID_CDAF_WINDOW_WEIGHT: + case VVCAM_ISP_CID_CDAF_STABLE_TOLERENCE: + case VVCAM_ISP_CID_CDAF_POINTS_OF_CURVE: + case VVCAM_ISP_CID_CDAF_FOCAL_FILTER: + case VVCAM_ISP_CID_CDAF_SHAPE_FILTER: + case VVCAM_ISP_CID_CDAF_MAX_FOCAL: + case VVCAM_ISP_CID_CDAF_MIN_FOCAL: + case VVCAM_ISP_CID_CDAF_MOTION_THRESHOLD: + case VVCAM_ISP_CID_CDAF_STABLE_THRESHOLD: + case VVCAM_ISP_CID_PDAF_MSE_TOLERENCE: + case VVCAM_ISP_CID_PDAF_PD_CONF_THRESHOLD: + case VVCAM_ISP_CID_PDAF_PD_FOCAL: + case VVCAM_ISP_CID_PDAF_PD_DISTANCE: + case VVCAM_ISP_CID_PDAF_PD_SHIFT_THRESHOLD: + case VVCAM_ISP_CID_PDAF_PD_STABLE_CNT_MAX: + case VVCAM_ISP_CID_PDAF_ROI_INDEX: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_af_ctrl_ops = { + .s_ctrl = vvcam_isp_af_s_ctrl, + .g_volatile_ctrl = vvcam_isp_af_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_af_ctrls[] = { + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_AF_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_af_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_AF_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_af_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_AF_STATE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_af_state", + .step = 1, + .min = 0, + .max = 5, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_AF_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_af_mode", + .step = 1, + .min = 0, + .max = 0, + }, + { + /* float array 3x */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_WINDOW_WEIGHT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_window_weight", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {3, 0, 0, 0}, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_STABLE_TOLERENCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_stable_tolerance", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_POINTS_OF_CURVE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_points_of_curve", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float 5x array 0~1023 */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_FOCAL_FILTER, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_focal_filter", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {5, 0, 0, 0}, + }, + { + /* float 5x array 0~1023 */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_SHAPE_FILTER, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_shape_filter", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {5, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_MAX_FOCAL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_max_focal", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1}, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_MIN_FOCAL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_min_focal", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1}, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_MOTION_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_motion_threshold", + .step = 1, + .min = 1, + .max = 999, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_CDAF_STABLE_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cdaf_stable_threshold", + .step = 1, + .min = 1, + .max = 999, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_MSE_TOLERENCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_mse_tolerence", + .step = 1, + .min = 1, + .max = 99, + .def = 1, + }, + { + /* float (0,10230) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_PD_CONF_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_pd_conf_threshold", + .step = 1, + .min = 1, + .max = 10229, + .def = 1, + }, + { + /* int 48x array (-255,255)*/ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_PD_FOCAL, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_pd_focal", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {48, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_PD_DISTANCE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_pd_distance", + .step = 1, + .min = 1, + .max = 254, + .def = 1, + }, + { + /* float (0,1) */ + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_PD_SHIFT_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_pd_shift_threshold", + .step = 1, + .min = 1, + .max = 999, + .def = 1, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_PD_STABLE_CNT_MAX, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_pd_stable_cnt_max", + .step = 1, + .min = 1, + .max = 10, + .def = 1, + .dims = {1}, + }, + { + .ops = &vvcam_isp_af_ctrl_ops, + .id = VVCAM_ISP_CID_PDAF_ROI_INDEX, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_pdaf_roi_index", + .step = 1, + .min = 0, + .max = 48, + }, +}; + +int vvcam_isp_af_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_af_ctrls); +} + +int vvcam_isp_af_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_af_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_af_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp af ctrl %s failed %d.\n", + vvcam_isp_af_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.h new file mode 100644 index 0000000..a4b9fad --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/af/af_v3/vvcam_isp_af.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_AF_H__ +#define __VVCAM_ISP_AF_H__ + +#define VVCAM_ISP_CID_AF_ENABLE (VVCAM_ISP_CID_AF_BASE + 0x0000) +#define VVCAM_ISP_CID_AF_RESET (VVCAM_ISP_CID_AF_BASE + 0x0001) +#define VVCAM_ISP_CID_AF_STATE (VVCAM_ISP_CID_AF_BASE + 0x0002) +#define VVCAM_ISP_CID_AF_MODE (VVCAM_ISP_CID_AF_BASE + 0x0003) +#define VVCAM_ISP_CID_CDAF_WINDOW_WEIGHT (VVCAM_ISP_CID_AF_BASE + 0x0004) +#define VVCAM_ISP_CID_CDAF_STABLE_TOLERENCE (VVCAM_ISP_CID_AF_BASE + 0x0005) +#define VVCAM_ISP_CID_CDAF_POINTS_OF_CURVE (VVCAM_ISP_CID_AF_BASE + 0x0006) +#define VVCAM_ISP_CID_CDAF_FOCAL_FILTER (VVCAM_ISP_CID_AF_BASE + 0x0007) +#define VVCAM_ISP_CID_CDAF_SHAPE_FILTER (VVCAM_ISP_CID_AF_BASE + 0x0008) +#define VVCAM_ISP_CID_CDAF_MAX_FOCAL (VVCAM_ISP_CID_AF_BASE + 0x0009) +#define VVCAM_ISP_CID_CDAF_MIN_FOCAL (VVCAM_ISP_CID_AF_BASE + 0x000A) +#define VVCAM_ISP_CID_CDAF_MOTION_THRESHOLD (VVCAM_ISP_CID_AF_BASE + 0x000B) +#define VVCAM_ISP_CID_CDAF_STABLE_THRESHOLD (VVCAM_ISP_CID_AF_BASE + 0x000C) +#define VVCAM_ISP_CID_PDAF_MSE_TOLERENCE (VVCAM_ISP_CID_AF_BASE + 0x000D) +#define VVCAM_ISP_CID_PDAF_PD_CONF_THRESHOLD \ + (VVCAM_ISP_CID_AF_BASE + 0x000E) +#define VVCAM_ISP_CID_PDAF_PD_FOCAL (VVCAM_ISP_CID_AF_BASE + 0x000F) +#define VVCAM_ISP_CID_PDAF_PD_DISTANCE (VVCAM_ISP_CID_AF_BASE + 0x0010) +#define VVCAM_ISP_CID_PDAF_PD_SHIFT_THRESHOLD \ + (VVCAM_ISP_CID_AF_BASE + 0x0011) +#define VVCAM_ISP_CID_PDAF_PD_STABLE_CNT_MAX \ + (VVCAM_ISP_CID_AF_BASE + 0x0012) +#define VVCAM_ISP_CID_PDAF_ROI_INDEX (VVCAM_ISP_CID_AF_BASE + 0x0013) + +int vvcam_isp_af_ctrl_count(void); +int vvcam_isp_af_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.c new file mode 100644 index 0000000..7c413e7 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.c @@ -0,0 +1,326 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_afm.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_afm_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AFM_ENABLE: + case VVCAM_ISP_CID_AFM_RESET: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_A: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_B: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_C: + case VVCAM_ISP_CID_AFM_THRESHOLD: + case VVCAM_ISP_CID_AFM_WIN_A_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_B_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_C_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_A_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_B_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_C_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_A_PIXEL_CNT: + case VVCAM_ISP_CID_AFM_WIN_B_PIXEL_CNT: + case VVCAM_ISP_CID_AFM_WIN_C_PIXEL_CNT: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_afm_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AFM_ENABLE: + case VVCAM_ISP_CID_AFM_RESET: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_A: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_B: + case VVCAM_ISP_CID_AFM_MEASURE_WINDOW_C: + case VVCAM_ISP_CID_AFM_THRESHOLD: + case VVCAM_ISP_CID_AFM_WIN_A_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_B_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_C_SHARPNESS: + case VVCAM_ISP_CID_AFM_WIN_A_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_B_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_C_LUMINANCE: + case VVCAM_ISP_CID_AFM_WIN_A_PIXEL_CNT: + case VVCAM_ISP_CID_AFM_WIN_B_PIXEL_CNT: + case VVCAM_ISP_CID_AFM_WIN_C_PIXEL_CNT: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_afm_ctrl_ops = { + .s_ctrl = vvcam_isp_afm_s_ctrl, + .g_volatile_ctrl = vvcam_isp_afm_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_afm_ctrls[] = { + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* uint16_t 4x array */ + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_MEASURE_WINDOW_A, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_measure_window_a", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + /* uint16_t 4x array */ + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_MEASURE_WINDOW_B, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_measure_window_b", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + /* uint16_t 4x array */ + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_MEASURE_WINDOW_C, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_measure_window_c", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + /* 0~255 */ + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_THRESHOLD, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_threshold", + .step = 1, + .min = 0, + .max = 255, + .def = 0, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_A_SHARPNESS, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_a_sharpness", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_B_SHARPNESS, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_b_sharpness", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_C_SHARPNESS, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_c_sharpness", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_A_LUMINANCE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_a_luminance", + .step = 1, + .min = 0, + .max = 0xFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_B_LUMINANCE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_b_luminance", + .step = 1, + .min = 0, + .max = 0xFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_C_LUMINANCE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_c_luminance", + .step = 1, + .min = 0, + .max = 0xFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_A_PIXEL_CNT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_a_pixel_cnt", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_B_PIXEL_CNT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_b_pixel_cnt", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_afm_ctrl_ops, + .id = VVCAM_ISP_CID_AFM_WIN_C_PIXEL_CNT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_afm_window_c_pixel_cnt", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {1, 0, 0, 0}, + }, + +}; + +int vvcam_isp_afm_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_afm_ctrls); +} + +int vvcam_isp_afm_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_afm_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_afm_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp afm ctrl %s failed %d.\n", + vvcam_isp_afm_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.h new file mode 100644 index 0000000..5def58e --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/afm/afm_v1/vvcam_isp_afm.h @@ -0,0 +1,76 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_AFM_H__ +#define __VVCAM_ISP_AFM_H__ + +#define VVCAM_ISP_CID_AFM_ENABLE (VVCAM_ISP_CID_AFM_BASE + 0x0000) +#define VVCAM_ISP_CID_AFM_RESET (VVCAM_ISP_CID_AFM_BASE + 0x0001) +#define VVCAM_ISP_CID_AFM_MEASURE_WINDOW_A (VVCAM_ISP_CID_AFM_BASE + 0x0002) +#define VVCAM_ISP_CID_AFM_MEASURE_WINDOW_B (VVCAM_ISP_CID_AFM_BASE + 0x0003) +#define VVCAM_ISP_CID_AFM_MEASURE_WINDOW_C (VVCAM_ISP_CID_AFM_BASE + 0x0004) +#define VVCAM_ISP_CID_AFM_THRESHOLD (VVCAM_ISP_CID_AFM_BASE + 0x0005) +#define VVCAM_ISP_CID_AFM_WIN_A_SHARPNESS (VVCAM_ISP_CID_AFM_BASE + 0x0006) +#define VVCAM_ISP_CID_AFM_WIN_B_SHARPNESS (VVCAM_ISP_CID_AFM_BASE + 0x0007) +#define VVCAM_ISP_CID_AFM_WIN_C_SHARPNESS (VVCAM_ISP_CID_AFM_BASE + 0x0008) +#define VVCAM_ISP_CID_AFM_WIN_A_LUMINANCE (VVCAM_ISP_CID_AFM_BASE + 0x0009) +#define VVCAM_ISP_CID_AFM_WIN_B_LUMINANCE (VVCAM_ISP_CID_AFM_BASE + 0x000A) +#define VVCAM_ISP_CID_AFM_WIN_C_LUMINANCE (VVCAM_ISP_CID_AFM_BASE + 0x000B) +#define VVCAM_ISP_CID_AFM_WIN_A_PIXEL_CNT (VVCAM_ISP_CID_AFM_BASE + 0x000C) +#define VVCAM_ISP_CID_AFM_WIN_B_PIXEL_CNT (VVCAM_ISP_CID_AFM_BASE + 0x000D) +#define VVCAM_ISP_CID_AFM_WIN_C_PIXEL_CNT (VVCAM_ISP_CID_AFM_BASE + 0x000E) + +int vvcam_isp_afm_ctrl_count(void); +int vvcam_isp_afm_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.c new file mode 100644 index 0000000..36e96f5 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.c @@ -0,0 +1,227 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_awb.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_awb_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AWB_ENABLE: + case VVCAM_ISP_CID_AWB_STATE: + case VVCAM_ISP_CID_AWB_MODE: + case VVCAM_ISP_CID_AWB_USE_CC_OFFSET: + case VVCAM_ISP_CID_AWB_USE_CC_MATRIX: + case VVCAM_ISP_CID_AWB_USE_DAMPING: + case VVCAM_ISP_CID_AWB_ROI_WEIGHT: + case VVCAM_ISP_CID_AWB_ROI: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_awb_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_AWB_ENABLE: + case VVCAM_ISP_CID_AWB_STATE: + case VVCAM_ISP_CID_AWB_MODE: + case VVCAM_ISP_CID_AWB_USE_CC_OFFSET: + case VVCAM_ISP_CID_AWB_USE_CC_MATRIX: + case VVCAM_ISP_CID_AWB_USE_DAMPING: + case VVCAM_ISP_CID_AWB_ROI_WEIGHT: + case VVCAM_ISP_CID_AWB_ROI: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_awb_ctrl_ops = { + .s_ctrl = vvcam_isp_awb_s_ctrl, + .g_volatile_ctrl = vvcam_isp_awb_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_awb_ctrls[] = { + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_STATE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_state", + .step = 1, + .min = 0, + .max = 4, + }, + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_USE_CC_OFFSET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_use_cc_offset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_USE_CC_MATRIX, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_use_cc_matrix", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_USE_DAMPING, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_use_damping", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float array 25x32bit 0~1 */ + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_ROI_WEIGHT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_roi_weight", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {25}, + }, + { + /* int array 25x4*16bit */ + .ops = &vvcam_isp_awb_ctrl_ops, + .id = VVCAM_ISP_CID_AWB_ROI, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_awb_roi", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {25, 4, 0, 0}, + }, +}; + +int vvcam_isp_awb_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_awb_ctrls); +} + +int vvcam_isp_awb_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_awb_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_awb_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp awb ctrl %s failed %d.\n", + vvcam_isp_awb_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.h new file mode 100644 index 0000000..8752b65 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/awb/awb_v3/vvcam_isp_awb.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_AWB_H__ +#define __VVCAM_ISP_AWB_H__ + +#define VVCAM_ISP_CID_AWB_ENABLE (VVCAM_ISP_CID_AWB_BASE + 0x0000) +#define VVCAM_ISP_CID_AWB_STATE (VVCAM_ISP_CID_AWB_BASE + 0x0001) +#define VVCAM_ISP_CID_AWB_MODE (VVCAM_ISP_CID_AWB_BASE + 0x0002) +#define VVCAM_ISP_CID_AWB_USE_CC_OFFSET (VVCAM_ISP_CID_AWB_BASE + 0x0003) +#define VVCAM_ISP_CID_AWB_USE_CC_MATRIX (VVCAM_ISP_CID_AWB_BASE + 0x0004) +#define VVCAM_ISP_CID_AWB_USE_DAMPING (VVCAM_ISP_CID_AWB_BASE + 0x0005) +#define VVCAM_ISP_CID_AWB_ROI_WEIGHT (VVCAM_ISP_CID_AWB_BASE + 0x0008) +#define VVCAM_ISP_CID_AWB_ROI (VVCAM_ISP_CID_AWB_BASE + 0x0009) + +int vvcam_isp_awb_ctrl_count(void); +int vvcam_isp_awb_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.c new file mode 100644 index 0000000..ad7f8cf --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.c @@ -0,0 +1,244 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_bls.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_bls_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_BLS_RESET: + case VVCAM_ISP_CID_BLS_MODE: + case VVCAM_ISP_CID_BLS_AUTO_LEVEL: + case VVCAM_ISP_CID_BLS_AUTO_GAIN: + case VVCAM_ISP_CID_BLS_AUTO_VALUES: + case VVCAM_ISP_CID_BLS_MANU_R_VALUE: + case VVCAM_ISP_CID_BLS_MANU_GR_VALUE: + case VVCAM_ISP_CID_BLS_MANU_GB_VALUE: + case VVCAM_ISP_CID_BLS_MANU_B_VALUE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_bls_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_BLS_RESET: + case VVCAM_ISP_CID_BLS_MODE: + case VVCAM_ISP_CID_BLS_AUTO_LEVEL: + case VVCAM_ISP_CID_BLS_AUTO_GAIN: + case VVCAM_ISP_CID_BLS_AUTO_VALUES: + case VVCAM_ISP_CID_BLS_MANU_R_VALUE: + case VVCAM_ISP_CID_BLS_MANU_GR_VALUE: + case VVCAM_ISP_CID_BLS_MANU_GB_VALUE: + case VVCAM_ISP_CID_BLS_MANU_B_VALUE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_bls_ctrl_ops = { + .s_ctrl = vvcam_isp_bls_s_ctrl, + .g_volatile_ctrl = vvcam_isp_bls_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_bls_ctrls[] = { + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_AUTO_VALUES, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_auto_values", + .step = 1, + .min = 0, + .max = 4095, + .dims = {20, 4, 0, 0}, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_MANU_R_VALUE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_manu_r_value", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1}, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_MANU_GR_VALUE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_manu_gr_value", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1}, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_MANU_GB_VALUE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_manu_gb_value", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1}, + }, + { + .ops = &vvcam_isp_bls_ctrl_ops, + .id = VVCAM_ISP_CID_BLS_MANU_B_VALUE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_bls_manu_b_value", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1}, + }, +}; + +int vvcam_isp_bls_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_bls_ctrls); +} + +int vvcam_isp_bls_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_bls_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_bls_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp bls ctrl %s failed %d.\n", + vvcam_isp_bls_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.h new file mode 100644 index 0000000..b52d80e --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/bls/bls/vvcam_isp_bls.h @@ -0,0 +1,70 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_BLS_H__ +#define __VVCAM_ISP_BLS_H__ + +#define VVCAM_ISP_CID_BLS_RESET (VVCAM_ISP_CID_BLS_BASE + 0x0000) +#define VVCAM_ISP_CID_BLS_MODE (VVCAM_ISP_CID_BLS_BASE + 0x0001) +#define VVCAM_ISP_CID_BLS_AUTO_LEVEL (VVCAM_ISP_CID_BLS_BASE + 0x0002) +#define VVCAM_ISP_CID_BLS_AUTO_GAIN (VVCAM_ISP_CID_BLS_BASE + 0x0003) +#define VVCAM_ISP_CID_BLS_AUTO_VALUES (VVCAM_ISP_CID_BLS_BASE + 0x0004) +#define VVCAM_ISP_CID_BLS_MANU_R_VALUE (VVCAM_ISP_CID_BLS_BASE + 0x0005) +#define VVCAM_ISP_CID_BLS_MANU_GR_VALUE (VVCAM_ISP_CID_BLS_BASE + 0x0006) +#define VVCAM_ISP_CID_BLS_MANU_GB_VALUE (VVCAM_ISP_CID_BLS_BASE + 0x0007) +#define VVCAM_ISP_CID_BLS_MANU_B_VALUE (VVCAM_ISP_CID_BLS_BASE + 0x0008) + +int vvcam_isp_bls_ctrl_count(void); +int vvcam_isp_bls_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.c new file mode 100644 index 0000000..bf79ff0 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.c @@ -0,0 +1,178 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_ccm.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_ccm_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CCM_ENABLE: + case VVCAM_ISP_CID_CCM_RESET: + case VVCAM_ISP_CID_CCM_MATRIX: + case VVCAM_ISP_CID_CCM_OFFSET: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_ccm_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CCM_ENABLE: + case VVCAM_ISP_CID_CCM_RESET: + case VVCAM_ISP_CID_CCM_MATRIX: + case VVCAM_ISP_CID_CCM_OFFSET: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_ccm_ctrl_ops = { + .s_ctrl = vvcam_isp_ccm_s_ctrl, + .g_volatile_ctrl = vvcam_isp_ccm_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_ccm_ctrls[] = { + { + .ops = &vvcam_isp_ccm_ctrl_ops, + .id = VVCAM_ISP_CID_CCM_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ccm_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ccm_ctrl_ops, + .id = VVCAM_ISP_CID_CCM_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ccm_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float 3x3 array -16~15.992 */ + .ops = &vvcam_isp_ccm_ctrl_ops, + .id = VVCAM_ISP_CID_CCM_MATRIX, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ccm_matrix", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {3, 3, 0, 0}, + }, + { + /* float 3x array -4095~4095 */ + .ops = &vvcam_isp_ccm_ctrl_ops, + .id = VVCAM_ISP_CID_CCM_OFFSET, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ccm_offset", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {3}, + }, +}; + +int vvcam_isp_ccm_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_ccm_ctrls); +} + +int vvcam_isp_ccm_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_ccm_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_ccm_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp ccm ctrl %s failed %d.\n", + vvcam_isp_ccm_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.h new file mode 100644 index 0000000..98acbe3 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ccm/ccm/vvcam_isp_ccm.h @@ -0,0 +1,65 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_CCM_H__ +#define __VVCAM_ISP_CCM_H__ + +#define VVCAM_ISP_CID_CCM_ENABLE (VVCAM_ISP_CID_CCM_BASE + 0x0000) +#define VVCAM_ISP_CID_CCM_RESET (VVCAM_ISP_CID_CCM_BASE + 0x0001) +#define VVCAM_ISP_CID_CCM_MATRIX (VVCAM_ISP_CID_CCM_BASE + 0x0002) +#define VVCAM_ISP_CID_CCM_OFFSET (VVCAM_ISP_CID_CCM_BASE + 0x0003) + +int vvcam_isp_ccm_ctrl_count(void); +int vvcam_isp_ccm_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.c new file mode 100644 index 0000000..48df079 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.c @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_cnr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_cnr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CNR_ENABLE: + case VVCAM_ISP_CID_CNR_RESET: + case VVCAM_ISP_CID_CNR_MANU_LINE_WIDTH: + case VVCAM_ISP_CID_CNR_MANU_THRESHOLD1: + case VVCAM_ISP_CID_CNR_MANU_THRESHOLD2: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_cnr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CNR_ENABLE: + case VVCAM_ISP_CID_CNR_RESET: + case VVCAM_ISP_CID_CNR_MANU_LINE_WIDTH: + case VVCAM_ISP_CID_CNR_MANU_THRESHOLD1: + case VVCAM_ISP_CID_CNR_MANU_THRESHOLD2: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_cnr_ctrl_ops = { + .s_ctrl = vvcam_isp_cnr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_cnr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_cnr_ctrls[] = { + { + .ops = &vvcam_isp_cnr_ctrl_ops, + .id = VVCAM_ISP_CID_CNR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cnr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cnr_ctrl_ops, + .id = VVCAM_ISP_CID_CNR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cnr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cnr_ctrl_ops, + .id = VVCAM_ISP_CID_CNR_MANU_LINE_WIDTH, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cnr_manu_line_width", + .step = 1, + .min = 0, + .max = 16383, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_cnr_ctrl_ops, + .id = VVCAM_ISP_CID_CNR_MANU_THRESHOLD1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cnr_manu_threshold1", + .step = 1, + .min = 0, + .max = 32767, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_cnr_ctrl_ops, + .id = VVCAM_ISP_CID_CNR_MANU_THRESHOLD2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cnr_manu_threshold2", + .step = 1, + .min = 0, + .max = 32767, + .dims = {1, 0, 0, 0}, + }, +}; + +int vvcam_isp_cnr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_cnr_ctrls); +} + +int vvcam_isp_cnr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_cnr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_cnr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp cnr ctrl %s failed %d.\n", + vvcam_isp_cnr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.h new file mode 100644 index 0000000..9f825df --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cnr/cnr_v1/vvcam_isp_cnr.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_CNR_H__ +#define __VVCAM_ISP_CNR_H__ + +#define VVCAM_ISP_CID_CNR_ENABLE (VVCAM_ISP_CID_CNR_BASE + 0x0000) +#define VVCAM_ISP_CID_CNR_RESET (VVCAM_ISP_CID_CNR_BASE + 0x0001) +#define VVCAM_ISP_CID_CNR_MANU_LINE_WIDTH (VVCAM_ISP_CID_CNR_BASE + 0x0002) +#define VVCAM_ISP_CID_CNR_MANU_THRESHOLD1 (VVCAM_ISP_CID_CNR_BASE + 0x0003) +#define VVCAM_ISP_CID_CNR_MANU_THRESHOLD2 (VVCAM_ISP_CID_CNR_BASE + 0x0004) + +int vvcam_isp_cnr_ctrl_count(void); +int vvcam_isp_cnr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.c new file mode 100644 index 0000000..0ee8be4 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.c @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_cpd.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_cpd_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CPD_ENABLE: + case VVCAM_ISP_CID_CPD_RESET: + case VVCAM_ISP_CID_CPD_CURVE_X: + case VVCAM_ISP_CID_CPD_CURVE_Y: + case VVCAM_ISP_CID_CPD_USE_OUT_Y_CURVE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_cpd_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CPD_ENABLE: + case VVCAM_ISP_CID_CPD_RESET: + case VVCAM_ISP_CID_CPD_CURVE_X: + case VVCAM_ISP_CID_CPD_CURVE_Y: + case VVCAM_ISP_CID_CPD_USE_OUT_Y_CURVE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_cpd_ctrl_ops = { + .s_ctrl = vvcam_isp_cpd_s_ctrl, + .g_volatile_ctrl = vvcam_isp_cpd_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_cpd_ctrls[] = { + { + .ops = &vvcam_isp_cpd_ctrl_ops, + .id = VVCAM_ISP_CID_CPD_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cpd_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cpd_ctrl_ops, + .id = VVCAM_ISP_CID_CPD_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cpd_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cpd_ctrl_ops, + .id = VVCAM_ISP_CID_CPD_CURVE_X, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cpd_curve_x", + .step = 1, + .min = 0, + .max = 31, + .dims = {64}, + }, + { + .ops = &vvcam_isp_cpd_ctrl_ops, + .id = VVCAM_ISP_CID_CPD_CURVE_Y, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cpd_curve_y", + .step = 1, + .min = 0, + .max = 16777215, + .dims = {64}, + }, + { + .ops = &vvcam_isp_cpd_ctrl_ops, + .id = VVCAM_ISP_CID_CPD_USE_OUT_Y_CURVE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cpd_use_out_y_curve", + .step = 1, + .min = 0, + .max = 1, + }, +}; + +int vvcam_isp_cpd_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_cpd_ctrls); +} + +int vvcam_isp_cpd_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_cpd_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_cpd_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp cpd ctrl %s failed %d.\n", + vvcam_isp_cpd_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.h new file mode 100644 index 0000000..565fc9d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cpd/cpd/vvcam_isp_cpd.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_CPD_H__ +#define __VVCAM_ISP_CPD_H__ + +#define VVCAM_ISP_CID_CPD_ENABLE (VVCAM_ISP_CID_CPD_BASE + 0x0000) +#define VVCAM_ISP_CID_CPD_RESET (VVCAM_ISP_CID_CPD_BASE + 0x0001) +#define VVCAM_ISP_CID_CPD_CURVE_X (VVCAM_ISP_CID_CPD_BASE + 0x0002) +#define VVCAM_ISP_CID_CPD_CURVE_Y (VVCAM_ISP_CID_CPD_BASE + 0x0003) +#define VVCAM_ISP_CID_CPD_USE_OUT_Y_CURVE (VVCAM_ISP_CID_CPD_BASE + 0x0004) + +int vvcam_isp_cpd_ctrl_count(void); +int vvcam_isp_cpd_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.c new file mode 100644 index 0000000..664d76d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.c @@ -0,0 +1,336 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_cproc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_cproc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CPROC_ENABLE: + case VVCAM_ISP_CID_CPROC_RESET: + case VVCAM_ISP_CID_CPROC_CHROMA_OUT_TYPE: + case VVCAM_ISP_CID_CPROC_MODE: + case VVCAM_ISP_CID_CPROC_AUTO_LEVEL: + case VVCAM_ISP_CID_CPROC_AUTO_GAIN: + case VVCAM_ISP_CID_CPROC_AUTO_CONTRAST: + case VVCAM_ISP_CID_CPROC_AUTO_BRIGHT: + case VVCAM_ISP_CID_CPROC_AUTO_SATURATION: + case VVCAM_ISP_CID_CPROC_AUTO_HUE: + case VVCAM_ISP_CID_CPROC_MANU_CONTRAST: + case VVCAM_ISP_CID_CPROC_MANU_BRIGHT: + case VVCAM_ISP_CID_CPROC_MANU_SATURATION: + case VVCAM_ISP_CID_CPROC_MANU_HUE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_cproc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_CPROC_ENABLE: + case VVCAM_ISP_CID_CPROC_RESET: + case VVCAM_ISP_CID_CPROC_CHROMA_OUT_TYPE: + case VVCAM_ISP_CID_CPROC_MODE: + case VVCAM_ISP_CID_CPROC_AUTO_LEVEL: + case VVCAM_ISP_CID_CPROC_AUTO_GAIN: + case VVCAM_ISP_CID_CPROC_AUTO_CONTRAST: + case VVCAM_ISP_CID_CPROC_AUTO_BRIGHT: + case VVCAM_ISP_CID_CPROC_AUTO_SATURATION: + case VVCAM_ISP_CID_CPROC_AUTO_HUE: + case VVCAM_ISP_CID_CPROC_MANU_CONTRAST: + case VVCAM_ISP_CID_CPROC_MANU_BRIGHT: + case VVCAM_ISP_CID_CPROC_MANU_SATURATION: + case VVCAM_ISP_CID_CPROC_MANU_HUE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_cproc_ctrl_ops = { + .s_ctrl = vvcam_isp_cproc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_cproc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_cproc_ctrls[] = { + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_CHROMA_OUT_TYPE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_chroma_out_type", + .step = 1, + .min = 1, + .max = 2, + .def = 1, + }, +/* + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_LUMA_IN_TYPE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_luma_in_type", + .step = 1, + .min = 1, + .max = 2, + .def = 1, + }, + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_LUMA_OUT_TYPE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_luma_out_type", + .step = 1, + .min = 1, + .max = 2, + .def = 1, + }, +*/ + { + /* manual/auto */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_CONTRAST, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_contrast", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_BRIGHT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_bright", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_SATURATION, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_saturation", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_AUTO_HUE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_auto_hue", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* float [0,1.992] */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_MANU_CONTRAST, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_manu_contrast", + .step = 1, + .min = 0, + .max = 255, + }, + { + /* float [-127, 127] */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_MANU_BRIGHT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_manu_bright", + .step = 1, + .min = -127, + .max = 127, + }, + { + /* float [0,1.992] */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_MANU_SATURATION, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_manu_saturation", + .step = 1, + .min = 0, + .max = 255, + }, + { + /* float [-90, 90] */ + .ops = &vvcam_isp_cproc_ctrl_ops, + .id = VVCAM_ISP_CID_CPROC_MANU_HUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_cproc_manu_hue", + .step = 1, + .min = -90, + .max = 90, + }, +}; + +int vvcam_isp_cproc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_cproc_ctrls); +} + +int vvcam_isp_cproc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_cproc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_cproc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp cproc ctrl %s failed %d.\n", + vvcam_isp_cproc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.h new file mode 100644 index 0000000..6a61b6d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/cproc/cproc/vvcam_isp_cproc.h @@ -0,0 +1,79 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_CPROC_H__ +#define __VVCAM_ISP_CPROC_H__ + +#define VVCAM_ISP_CID_CPROC_ENABLE (VVCAM_ISP_CID_CPROC_BASE + 0x0000) +#define VVCAM_ISP_CID_CPROC_RESET (VVCAM_ISP_CID_CPROC_BASE + 0x0001) +#define VVCAM_ISP_CID_CPROC_CHROMA_OUT_TYPE (VVCAM_ISP_CID_CPROC_BASE + 0x0002) +// #define VVCAM_ISP_CID_CPROC_LUMA_IN_TYPE (VVCAM_ISP_CID_CPROC_BASE + 0x0003) +// #define VVCAM_ISP_CID_CPROC_LUMA_OUT_TYPE (VVCAM_ISP_CID_CPROC_BASE + 0x0004) +#define VVCAM_ISP_CID_CPROC_MODE (VVCAM_ISP_CID_CPROC_BASE + 0x0005) +#define VVCAM_ISP_CID_CPROC_AUTO_LEVEL (VVCAM_ISP_CID_CPROC_BASE + 0x0006) +#define VVCAM_ISP_CID_CPROC_AUTO_GAIN (VVCAM_ISP_CID_CPROC_BASE + 0x0007) +#define VVCAM_ISP_CID_CPROC_AUTO_CONTRAST (VVCAM_ISP_CID_CPROC_BASE + 0x0008) +#define VVCAM_ISP_CID_CPROC_AUTO_BRIGHT (VVCAM_ISP_CID_CPROC_BASE + 0x0009) +#define VVCAM_ISP_CID_CPROC_AUTO_SATURATION (VVCAM_ISP_CID_CPROC_BASE + 0x000A) +#define VVCAM_ISP_CID_CPROC_AUTO_HUE (VVCAM_ISP_CID_CPROC_BASE + 0x000B) +#define VVCAM_ISP_CID_CPROC_MANU_CONTRAST (VVCAM_ISP_CID_CPROC_BASE + 0x000C) +#define VVCAM_ISP_CID_CPROC_MANU_BRIGHT (VVCAM_ISP_CID_CPROC_BASE + 0x000D) +#define VVCAM_ISP_CID_CPROC_MANU_SATURATION \ + (VVCAM_ISP_CID_CPROC_BASE + 0x000E) +#define VVCAM_ISP_CID_CPROC_MANU_HUE (VVCAM_ISP_CID_CPROC_BASE + 0x000F) + + +int vvcam_isp_cproc_ctrl_count(void); +int vvcam_isp_cproc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.c new file mode 100644 index 0000000..ab0ad47 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_dg.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_dg_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DG_ENABLE: + case VVCAM_ISP_CID_DG_RESET: + case VVCAM_ISP_CID_DG_B_GAIN: + case VVCAM_ISP_CID_DG_GB_GAIN: + case VVCAM_ISP_CID_DG_GR_GAIN: + case VVCAM_ISP_CID_DG_R_GAIN: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_dg_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DG_ENABLE: + case VVCAM_ISP_CID_DG_RESET: + case VVCAM_ISP_CID_DG_B_GAIN: + case VVCAM_ISP_CID_DG_GB_GAIN: + case VVCAM_ISP_CID_DG_GR_GAIN: + case VVCAM_ISP_CID_DG_R_GAIN: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_dg_ctrl_ops = { + .s_ctrl = vvcam_isp_dg_s_ctrl, + .g_volatile_ctrl = vvcam_isp_dg_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_dg_ctrls[] = { + { + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float [1.0,255.0] */ + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_B_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_b_gain", + .step = 1, + .min = 256, + .max = 65280, + .def = 256, + }, + { + /* float [1.0,255.0] */ + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_GB_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_gb_gain", + .step = 1, + .min = 256, + .max = 65280, + .def = 256, + }, + { + /* float [1.0,255.0] */ + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_GR_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_gr_gain", + .step = 1, + .min = 256, + .max = 65280, + .def = 256, + }, + { + /* float [1.0,255.0] */ + .ops = &vvcam_isp_dg_ctrl_ops, + .id = VVCAM_ISP_CID_DG_R_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dg_r_gain", + .step = 1, + .min = 256, + .max = 65280, + .def = 256, + }, +}; + +int vvcam_isp_dg_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_dg_ctrls); +} + +int vvcam_isp_dg_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_dg_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_dg_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp dg ctrl %s failed %d.\n", + vvcam_isp_dg_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.h new file mode 100644 index 0000000..2890180 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dg/dg/vvcam_isp_dg.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DG_H__ +#define __VVCAM_ISP_DG_H__ + +#define VVCAM_ISP_CID_DG_ENABLE (VVCAM_ISP_CID_DG_BASE + 0x0000) +#define VVCAM_ISP_CID_DG_RESET (VVCAM_ISP_CID_DG_BASE + 0x0001) +#define VVCAM_ISP_CID_DG_B_GAIN (VVCAM_ISP_CID_DG_BASE + 0x0002) +#define VVCAM_ISP_CID_DG_GB_GAIN (VVCAM_ISP_CID_DG_BASE + 0x0003) +#define VVCAM_ISP_CID_DG_GR_GAIN (VVCAM_ISP_CID_DG_BASE + 0x0004) +#define VVCAM_ISP_CID_DG_R_GAIN (VVCAM_ISP_CID_DG_BASE + 0x0005) + +int vvcam_isp_dg_ctrl_count(void); +int vvcam_isp_dg_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.c new file mode 100644 index 0000000..030dad0 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.c @@ -0,0 +1,341 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_dmsc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_dmsc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DMSC_ENABLE: + case VVCAM_ISP_CID_DMSC_CAC_ENABLE: + case VVCAM_ISP_CID_DMSC_FILTER_ENABLE: + case VVCAM_ISP_CID_DMSC_RESET: + case VVCAM_ISP_CID_DMSC_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_DENOISE_LEVEL: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_SHARPEN_LEVEL: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_V_MODE: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_H_MODE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_dmsc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DMSC_ENABLE: + case VVCAM_ISP_CID_DMSC_CAC_ENABLE: + case VVCAM_ISP_CID_DMSC_FILTER_ENABLE: + case VVCAM_ISP_CID_DMSC_RESET: + case VVCAM_ISP_CID_DMSC_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_DENOISE_LEVEL: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_SHARPEN_LEVEL: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_V_MODE: + case VVCAM_ISP_CID_DMSC_MANU_FILTER_H_MODE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_dmsc_ctrl_ops = { + .s_ctrl = vvcam_isp_dmsc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_dmsc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_dmsc_ctrls[] = { + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_CAC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_cac_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_FILTER_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_filt_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_threshold", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_FILTER_DENOISE_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_filt_denoise_lvl", + .step = 1, + .min = 0, + .max = 11, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_FILTER_SHARPEN_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_filt_sharpen_lvl", + .step = 1, + .min = 0, + .max = 11, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_FILTER_V_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_filt_v_mode", + .step = 1, + .min = 0, + .max = 3, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_FILTER_H_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_filt_h_mode", + .step = 1, + .min = 0, + .max = 3, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_a_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_a_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_b_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_b_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_c_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_c_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* according to image width */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_ctr_h_offset", + .step = 1, + .min = -32768, + .max = 32767, + }, + { + /* according to image height */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_ctr_v_offset", + .step = 1, + .min = -32768, + .max = 32767, + }, +}; + +int vvcam_isp_dmsc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_dmsc_ctrls); +} + +int vvcam_isp_dmsc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_dmsc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_dmsc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp dmsc ctrl %s failed %d.\n", + vvcam_isp_dmsc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.h new file mode 100644 index 0000000..107016f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v1/vvcam_isp_dmsc.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DMSC_H__ +#define __VVCAM_ISP_DMSC_H__ + +#define VVCAM_ISP_CID_DMSC_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0000) +#define VVCAM_ISP_CID_DMSC_CAC_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0001) +#define VVCAM_ISP_CID_DMSC_FILTER_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0002) +#define VVCAM_ISP_CID_DMSC_RESET (VVCAM_ISP_CID_DMSC_BASE + 0x0003) +#define VVCAM_ISP_CID_DMSC_THRESHOLD (VVCAM_ISP_CID_DMSC_BASE + 0x0004) +#define VVCAM_ISP_CID_DMSC_MANU_FILTER_DENOISE_LEVEL \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0005) +#define VVCAM_ISP_CID_DMSC_MANU_FILTER_SHARPEN_LEVEL \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0006) +#define VVCAM_ISP_CID_DMSC_MANU_FILTER_V_MODE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0007) +#define VVCAM_ISP_CID_DMSC_MANU_FILTER_H_MODE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0008) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE (VVCAM_ISP_CID_DMSC_BASE + 0x0009) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED (VVCAM_ISP_CID_DMSC_BASE + 0x000A) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE (VVCAM_ISP_CID_DMSC_BASE + 0x000B) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED (VVCAM_ISP_CID_DMSC_BASE + 0x000C) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE (VVCAM_ISP_CID_DMSC_BASE + 0x000D) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED (VVCAM_ISP_CID_DMSC_BASE + 0x000E) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000F) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0010) + +int vvcam_isp_dmsc_ctrl_count(void); +int vvcam_isp_dmsc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.c new file mode 100644 index 0000000..6385bf7 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.c @@ -0,0 +1,1136 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_dmsc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_dmsc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DMSC_ENABLE: + case VVCAM_ISP_CID_DMSC_CAC_ENABLE: + case VVCAM_ISP_CID_DMSC_DEMOIRE_ENABLE: + case VVCAM_ISP_CID_DMSC_DEPURPLE_ENABLE: + case VVCAM_ISP_CID_DMSC_SHARPEN_ENABLE: + case VVCAM_ISP_CID_DMSC_SHARPEN_LINE_ENABLE: + case VVCAM_ISP_CID_DMSC_SKIN_ENABLE: + case VVCAM_ISP_CID_DMSC_RESET: + case VVCAM_ISP_CID_DMSC_MODE: + case VVCAM_ISP_CID_DMSC_AUTO_LEVEL: + case VVCAM_ISP_CID_DMSC_AUTO_GAIN: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_ENABLE: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_ENABLE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_BLACK: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_WHITE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_BLACK: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_WHITE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T1: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T3: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T4_SHIFT: + case VVCAM_ISP_CID_DMSC_AUTO_DENOISE_STRENGTH: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_SIZE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R1: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R2: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R3: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_CBCR_MODE: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R2: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R2: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_AREA_THR: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_BLACK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_WHITE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_BLACK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_WHITE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R2: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R3: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T3: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_SIZE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T4_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DENOISE_STRENGTH: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R2: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_STRENGTH: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THR_SHIFT1: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_CBCR_MODE: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_THR: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_dmsc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DMSC_ENABLE: + case VVCAM_ISP_CID_DMSC_CAC_ENABLE: + case VVCAM_ISP_CID_DMSC_DEMOIRE_ENABLE: + case VVCAM_ISP_CID_DMSC_DEPURPLE_ENABLE: + case VVCAM_ISP_CID_DMSC_SHARPEN_ENABLE: + case VVCAM_ISP_CID_DMSC_SHARPEN_LINE_ENABLE: + case VVCAM_ISP_CID_DMSC_SKIN_ENABLE: + case VVCAM_ISP_CID_DMSC_RESET: + case VVCAM_ISP_CID_DMSC_MODE: + case VVCAM_ISP_CID_DMSC_AUTO_LEVEL: + case VVCAM_ISP_CID_DMSC_AUTO_GAIN: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_ENABLE: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_ENABLE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_BLACK: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_WHITE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_BLACK: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_WHITE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T1: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T3: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T4_SHIFT: + case VVCAM_ISP_CID_DMSC_AUTO_DENOISE_STRENGTH: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_SIZE: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R1: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R2: + case VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R3: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_CBCR_MODE: + case VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R2: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R2: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T1: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_AREA_THR: + case VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_BLACK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_WHITE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_BLACK: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_WHITE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R2: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R3: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T3: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_SIZE: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T2_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T4_SHIFT: + case VVCAM_ISP_CID_DMSC_MANU_DENOISE_STRENGTH: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R1: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R2: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_STRENGTH: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THRESHOLD: + case VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THR_SHIFT1: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MAX: + case VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MIN: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_CBCR_MODE: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_SAT_SHRINK: + case VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_THR: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE: + case VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET: + case VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_dmsc_ctrl_ops = { + .s_ctrl = vvcam_isp_dmsc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_dmsc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_dmsc_ctrls[] = { + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_CAC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_cac_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_DEMOIRE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_demoire_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_DEPURPLE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_dpl_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_SHARPEN_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_sharpen_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_SHARPEN_LINE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_sharpen_line_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_SKIN_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_skin_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* 0: Manual 1: Auto */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* bool 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_ENABLE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_enable", + .step = 1, + .min = 0, + .max = 1, + .dims = {20, 0, 0, 0}, + }, + { + /* bool 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_ENABLE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_dpl_enable", + .step = 1, + .min = 0, + .max = 1, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_BLACK, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_fac_blk", + .step = 1, + .min = 0, + .max = 511, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_WHITE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_fac_wht", + .step = 1, + .min = 0, + .max = 511, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_BLACK, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_clip_blk", + .step = 1, + .min = 0, + .max = 2047, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_WHITE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_clip_wht", + .step = 1, + .min = 0, + .max = 2047, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_t1", + .step = 1, + .min = 0, + .max = 2047, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T2_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_t2_shift", + .step = 1, + .min = 0, + .max = 11, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T3, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_t3", + .step = 1, + .min = 0, + .max = 2047, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T4_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_t4_shift", + .step = 1, + .min = 0, + .max = 11, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_DENOISE_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_denoise_str", + .step = 1, + .min = 0, + .max = 32, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_SIZE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_size", + .step = 1, + .min = 0, + .max = 16, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_r1", + .step = 1, + .min = 0, + .max = 256, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_r2", + .step = 1, + .min = 0, + .max = 256, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R3, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_sharpen_r3", + .step = 1, + .min = 0, + .max = 256, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_SAT_SHRINK, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_dpl_sat_shrink", + .step = 1, + .min = 0, + .max = 8, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_CBCR_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_dpl_cbcr_mode", + .step = 1, + .min = 0, + .max = 3, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_auto_dpl_threshold", + .step = 1, + .min = 0, + .max = 255, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_threshold", + .step = 1, + .min = 0, + .max = 255, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MAX, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dir_thr_max", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dir_thr_min", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T1, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_t1", + .step = 1, + .min = 0, + .max = 255, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T2_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_t2_shift", + .step = 1, + .min = 0, + .max = 8, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_r1", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_r2", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_edge_r1", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_edge_r2", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_edge_t1", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T2_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_edge_t2_shift", + .step = 1, + .min = 0, + .max = 8, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_AREA_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_area_thr", + .step = 1, + .min = 0, + .max = 32, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_SAT_SHRINK, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dmr_sat_shrink", + .step = 1, + .min = 0, + .max = 32, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_BLACK, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_clip_blk", + .step = 1, + .min = 0, + .max = 2047, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_WHITE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_clip_wht", + .step = 1, + .min = 0, + .max = 2047, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_BLACK, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_fac_blk", + .step = 1, + .min = 0, + .max = 511, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_WHITE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_fac_wht", + .step = 1, + .min = 0, + .max = 511, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_r1", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_r2", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R3, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_r3", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_t1", + .step = 1, + .min = 0, + .max = 2047, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T3, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_t3", + .step = 1, + .min = 0, + .max = 2047, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_SIZE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_size", + .step = 1, + .min = 0, + .max = 16, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T2_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_t2_shift", + .step = 1, + .min = 0, + .max = 11, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T4_SHIFT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_t4_shift", + .step = 1, + .min = 0, + .max = 11, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DENOISE_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_denoise_str", + .step = 1, + .min = 0, + .max = 32, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R1, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_line_r1", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R2, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_line_r2", + .step = 1, + .min = 0, + .max = 256, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_STRENGTH, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_line_str", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THRESHOLD, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_line_thr", + .step = 1, + .min = 0, + .max = 2047, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THR_SHIFT1, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_sharpen_line_t_t1", + .step = 1, + .min = 0, + .max = 10, + .dims = {1, 0, 0, 0}, + }, + { + /* int16_t */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MAX, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_cb_thr_max", + .step = 1, + .min = -2047, + .max = 2047, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_cb_thr_min", + .step = 1, + .min = -2047, + .max = 2047, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MAX, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_cr_thr_max", + .step = 1, + .min = -2047, + .max = 2047, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_cr_thr_min", + .step = 1, + .min = -2047, + .max = 2047, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MAX, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_y_thr_max", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_skin_y_thr_min", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_CBCR_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dpl_cbcr_mode", + .step = 1, + .min = 0, + .max = 3, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_SAT_SHRINK, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dpl_sat_shrink", + .step = 1, + .min = 0, + .max = 8, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_dpl_thr", + .step = 1, + .min = 0, + .max = 255, + .dims = {1, 0, 0, 0}, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_a_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_a_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_b_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_b_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_c_blue", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* float -16.0~15.9375*/ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_c_red", + .step = 1, + .min = -256, + .max = 255, + }, + { + /* according to image width */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_ctr_h_offset", + .step = 1, + .min = -32768, + .max = 32767, + }, + { + /* according to image height */ + .ops = &vvcam_isp_dmsc_ctrl_ops, + .id = VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dmsc_manu_cac_ctr_v_offset", + .step = 1, + .min = -32768, + .max = 32767, + }, +}; + +int vvcam_isp_dmsc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_dmsc_ctrls); +} + +int vvcam_isp_dmsc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_dmsc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_dmsc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp dmsc ctrl %s failed %d.\n", + vvcam_isp_dmsc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.h new file mode 100644 index 0000000..860c700 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dmsc/dmsc_v2/vvcam_isp_dmsc.h @@ -0,0 +1,197 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DMSC_H__ +#define __VVCAM_ISP_DMSC_H__ + +#define VVCAM_ISP_CID_DMSC_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0000) +#define VVCAM_ISP_CID_DMSC_CAC_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0001) +#define VVCAM_ISP_CID_DMSC_DEMOIRE_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0002) +#define VVCAM_ISP_CID_DMSC_DEPURPLE_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0003) +#define VVCAM_ISP_CID_DMSC_SHARPEN_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0004) +#define VVCAM_ISP_CID_DMSC_SHARPEN_LINE_ENABLE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0005) +#define VVCAM_ISP_CID_DMSC_SKIN_ENABLE (VVCAM_ISP_CID_DMSC_BASE + 0x0006) +#define VVCAM_ISP_CID_DMSC_RESET (VVCAM_ISP_CID_DMSC_BASE + 0x0007) +#define VVCAM_ISP_CID_DMSC_MODE (VVCAM_ISP_CID_DMSC_BASE + 0x0008) +#define VVCAM_ISP_CID_DMSC_AUTO_LEVEL (VVCAM_ISP_CID_DMSC_BASE + 0x0009) +#define VVCAM_ISP_CID_DMSC_AUTO_GAIN (VVCAM_ISP_CID_DMSC_BASE + 0x000A) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_ENABLE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000B) +#define VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_ENABLE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000C) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_BLACK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000D) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_FACTOR_WHITE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000E) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_BLACK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x000F) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_CLIP_WHITE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0010) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T1 (VVCAM_ISP_CID_DMSC_BASE + 0x0011) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T2_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0012) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T3 (VVCAM_ISP_CID_DMSC_BASE + 0x0013) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_T4_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0014) +#define VVCAM_ISP_CID_DMSC_AUTO_DENOISE_STRENGTH \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0015) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_SIZE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0016) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R1 (VVCAM_ISP_CID_DMSC_BASE + 0x0017) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R2 (VVCAM_ISP_CID_DMSC_BASE + 0x0018) +#define VVCAM_ISP_CID_DMSC_AUTO_SHARPEN_R3 (VVCAM_ISP_CID_DMSC_BASE + 0x0019) +#define VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_SAT_SHRINK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001A) +#define VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_CBCR_MODE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001B) +#define VVCAM_ISP_CID_DMSC_AUTO_DEPURPLE_THRESHOLD \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001C) +#define VVCAM_ISP_CID_DMSC_MANU_THRESHOLD \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001D) +#define VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MAX \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001E) +#define VVCAM_ISP_CID_DMSC_MANU_DIR_THR_MIN \ + (VVCAM_ISP_CID_DMSC_BASE + 0x001F) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0020) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_T2_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0021) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0022) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_R2 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0023) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0024) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_R2 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0025) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0026) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_EDGE_T2_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0027) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_AREA_THR \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0028) +#define VVCAM_ISP_CID_DMSC_MANU_DEMOIRE_SAT_SHRINK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0029) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_BLACK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002A) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_CLIP_WHITE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002B) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_BLACK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002C) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_FACTOR_WHITE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002D) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002E) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R2 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x002F) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_R3 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0030) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0031) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T3 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0032) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_SIZE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0033) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T2_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0034) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_T4_SHIFT \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0035) +#define VVCAM_ISP_CID_DMSC_MANU_DENOISE_STRENGTH \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0036) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0037) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_R2 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0038) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_STRENGTH \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0039) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THRESHOLD \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003A) +#define VVCAM_ISP_CID_DMSC_MANU_SHARPEN_LINE_THR_SHIFT1 \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003B) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MAX \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003C) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_CB_THR_MIN \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003D) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MAX \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003E) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_CR_THR_MIN \ + (VVCAM_ISP_CID_DMSC_BASE + 0x003F) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MAX \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0040) +#define VVCAM_ISP_CID_DMSC_MANU_SKIN_Y_THR_MIN \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0041) +#define VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_CBCR_MODE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0042) +#define VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_SAT_SHRINK \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0043) +#define VVCAM_ISP_CID_DMSC_MANU_DEPURPLE_THR \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0044) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_A_BLUE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0045) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_A_RED (VVCAM_ISP_CID_DMSC_BASE + 0x0046) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_B_BLUE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0047) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_B_RED (VVCAM_ISP_CID_DMSC_BASE + 0x0048) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_C_BLUE \ + (VVCAM_ISP_CID_DMSC_BASE + 0x0049) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_C_RED (VVCAM_ISP_CID_DMSC_BASE + 0x004A) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_H_OFFSET \ + (VVCAM_ISP_CID_DMSC_BASE + 0x004B) +#define VVCAM_ISP_CID_DMSC_MANU_CAC_CENTER_V_OFFSET \ + (VVCAM_ISP_CID_DMSC_BASE + 0x004C) + +int vvcam_isp_dmsc_ctrl_count(void); +int vvcam_isp_dmsc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.c new file mode 100644 index 0000000..860af38 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.c @@ -0,0 +1,525 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_dpcc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_dpcc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DPCC_ENABLE: + case VVCAM_ISP_CID_DPCC_RESET: + case VVCAM_ISP_CID_DPCC_MODE: + case VVCAM_ISP_CID_DPCC_AUTO_LEVEL: + case VVCAM_ISP_CID_DPCC_AUTO_GAIN: + case VVCAM_ISP_CID_DPCC_AUTO_LINE_MAD_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_LINE_THRESHOLD: + case VVCAM_ISP_CID_DPCC_AUTO_METHODS_SET: + case VVCAM_ISP_CID_DPCC_AUTO_OUT_MODE: + case VVCAM_ISP_CID_DPCC_AUTO_PG_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_RG_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_RND_OFFSETS: + case VVCAM_ISP_CID_DPCC_AUTO_RND_THRESHOLD: + case VVCAM_ISP_CID_DPCC_AUTO_RO_LIMITS: + case VVCAM_ISP_CID_DPCC_AUTO_SET_USE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_ENABLE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_NUM: + case VVCAM_ISP_CID_DPCC_MANU_BPT_OUT_MODE: + case VVCAM_ISP_CID_DPCC_MANU_OUT_MODE: + case VVCAM_ISP_CID_DPCC_MANU_SET_USE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_POS_X: + case VVCAM_ISP_CID_DPCC_MANU_BPT_POS_Y: + case VVCAM_ISP_CID_DPCC_MANU_METHODS_SET: + case VVCAM_ISP_CID_DPCC_MANU_LINE_MAD_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_LINE_THRESHOLD: + case VVCAM_ISP_CID_DPCC_MANU_PG_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_RG_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_RND_OFFSETS: + case VVCAM_ISP_CID_DPCC_MANU_RND_THRESHOLD: + case VVCAM_ISP_CID_DPCC_MANU_RO_LIMITS: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_dpcc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DPCC_ENABLE: + case VVCAM_ISP_CID_DPCC_RESET: + case VVCAM_ISP_CID_DPCC_MODE: + case VVCAM_ISP_CID_DPCC_AUTO_LEVEL: + case VVCAM_ISP_CID_DPCC_AUTO_GAIN: + case VVCAM_ISP_CID_DPCC_AUTO_LINE_MAD_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_LINE_THRESHOLD: + case VVCAM_ISP_CID_DPCC_AUTO_METHODS_SET: + case VVCAM_ISP_CID_DPCC_AUTO_OUT_MODE: + case VVCAM_ISP_CID_DPCC_AUTO_PG_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_RG_FACTOR: + case VVCAM_ISP_CID_DPCC_AUTO_RND_OFFSETS: + case VVCAM_ISP_CID_DPCC_AUTO_RND_THRESHOLD: + case VVCAM_ISP_CID_DPCC_AUTO_RO_LIMITS: + case VVCAM_ISP_CID_DPCC_AUTO_SET_USE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_ENABLE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_NUM: + case VVCAM_ISP_CID_DPCC_MANU_BPT_OUT_MODE: + case VVCAM_ISP_CID_DPCC_MANU_OUT_MODE: + case VVCAM_ISP_CID_DPCC_MANU_SET_USE: + case VVCAM_ISP_CID_DPCC_MANU_BPT_POS_X: + case VVCAM_ISP_CID_DPCC_MANU_BPT_POS_Y: + case VVCAM_ISP_CID_DPCC_MANU_METHODS_SET: + case VVCAM_ISP_CID_DPCC_MANU_LINE_MAD_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_LINE_THRESHOLD: + case VVCAM_ISP_CID_DPCC_MANU_PG_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_RG_FACTOR: + case VVCAM_ISP_CID_DPCC_MANU_RND_OFFSETS: + case VVCAM_ISP_CID_DPCC_MANU_RND_THRESHOLD: + case VVCAM_ISP_CID_DPCC_MANU_RO_LIMITS: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_dpcc_ctrl_ops = { + .s_ctrl = vvcam_isp_dpcc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_dpcc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_dpcc_ctrls[] = { + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* 0: Manual 1: Auto */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_LINE_MAD_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_line_mad_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_LINE_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_line_threshold", + .step = 1, + .min = 0, + .max = 255, + .dims = {20, 2, 3, 0}, + }, + { + /* uint16_t 20x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_METHODS_SET, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_methods_set", + .step = 1, + .min = 0, + .max = 8191, + .dims = {20, 3, 0, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_OUT_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_out_mode", + .step = 1, + .min = 0, + .max = 15, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_PG_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_pg_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_RG_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_rg_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_RND_OFFSETS, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_rnd_offsets", + .step = 1, + .min = 0, + .max = 3, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_RND_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_rnd_threshold", + .step = 1, + .min = 0, + .max = 63, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x2x3 array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_RO_LIMITS, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_ro_limits", + .step = 1, + .min = 0, + .max = 3, + .dims = {20, 2, 3, 0}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_AUTO_SET_USE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_auto_set_use", + .step = 1, + .min = 0, + .max = 15, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_BPT_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_bpt_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_BPT_NUM, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_bpt_num", + .step = 1, + .min = 0, + .max = 2048, + .dims = {1}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_BPT_OUT_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_bpt_out_mode", + .step = 1, + .min = 0, + .max = 14, + .dims = {1}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_OUT_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_out_mode", + .step = 1, + .min = 0, + .max = 15, + .dims = {1}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_SET_USE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_set_use", + .step = 1, + .min = 0, + .max = 15, + .dims = {1}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_BPT_POS_X, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_bpt_pos_x", + .step = 1, + .min = 0, + .max = 65535, + .dims = {2048}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_BPT_POS_Y, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_bpt_pos_y", + .step = 1, + .min = 0, + .max = 65535, + .dims = {2048}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_METHODS_SET, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_methods_set", + .step = 1, + .min = 0, + .max = 8191, + .dims = {3}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_LINE_MAD_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_line_mad_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_LINE_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_line_threshold", + .step = 1, + .min = 0, + .max = 255, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_PG_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_pg_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_RG_FACTOR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_rg_factor", + .step = 1, + .min = 0, + .max = 63, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_RND_OFFSETS, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_rnd_offsets", + .step = 1, + .min = 0, + .max = 3, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_RND_THRESHOLD, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_rnd_threshold", + .step = 1, + .min = 0, + .max = 63, + .dims = {2, 3, 0, 0}, + }, + { + .ops = &vvcam_isp_dpcc_ctrl_ops, + .id = VVCAM_ISP_CID_DPCC_MANU_RO_LIMITS, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpcc_manu_ro_limits", + .step = 1, + .min = 0, + .max = 3, + .dims = {2, 3, 0, 0}, + }, +}; + +int vvcam_isp_dpcc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_dpcc_ctrls); +} + +int vvcam_isp_dpcc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_dpcc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_dpcc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp dpcc ctrl %s failed %d.\n", + vvcam_isp_dpcc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.h new file mode 100644 index 0000000..69c8a0c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpcc/dpcc/vvcam_isp_dpcc.h @@ -0,0 +1,98 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DPCC_H__ +#define __VVCAM_ISP_DPCC_H__ + +#define VVCAM_ISP_CID_DPCC_ENABLE (VVCAM_ISP_CID_DPCC_BASE + 0x0000) +#define VVCAM_ISP_CID_DPCC_RESET (VVCAM_ISP_CID_DPCC_BASE + 0x0001) +#define VVCAM_ISP_CID_DPCC_MODE (VVCAM_ISP_CID_DPCC_BASE + 0x0002) +#define VVCAM_ISP_CID_DPCC_AUTO_LEVEL (VVCAM_ISP_CID_DPCC_BASE + 0x0003) +#define VVCAM_ISP_CID_DPCC_AUTO_GAIN (VVCAM_ISP_CID_DPCC_BASE + 0x0004) +#define VVCAM_ISP_CID_DPCC_AUTO_LINE_MAD_FACTOR \ + (VVCAM_ISP_CID_DPCC_BASE + 0x0005) +#define VVCAM_ISP_CID_DPCC_AUTO_LINE_THRESHOLD \ + (VVCAM_ISP_CID_DPCC_BASE + 0x0006) +#define VVCAM_ISP_CID_DPCC_AUTO_METHODS_SET (VVCAM_ISP_CID_DPCC_BASE + 0x0007) +#define VVCAM_ISP_CID_DPCC_AUTO_OUT_MODE (VVCAM_ISP_CID_DPCC_BASE + 0x0008) +#define VVCAM_ISP_CID_DPCC_AUTO_PG_FACTOR (VVCAM_ISP_CID_DPCC_BASE + 0x0009) +#define VVCAM_ISP_CID_DPCC_AUTO_RG_FACTOR (VVCAM_ISP_CID_DPCC_BASE + 0x000A) +#define VVCAM_ISP_CID_DPCC_AUTO_RND_OFFSETS (VVCAM_ISP_CID_DPCC_BASE + 0x000B) +#define VVCAM_ISP_CID_DPCC_AUTO_RND_THRESHOLD \ + (VVCAM_ISP_CID_DPCC_BASE + 0x000C) +#define VVCAM_ISP_CID_DPCC_AUTO_RO_LIMITS (VVCAM_ISP_CID_DPCC_BASE + 0x000D) +#define VVCAM_ISP_CID_DPCC_AUTO_SET_USE (VVCAM_ISP_CID_DPCC_BASE + 0x000E) +#define VVCAM_ISP_CID_DPCC_MANU_BPT_ENABLE (VVCAM_ISP_CID_DPCC_BASE + 0x000F) +#define VVCAM_ISP_CID_DPCC_MANU_BPT_NUM (VVCAM_ISP_CID_DPCC_BASE + 0x0010) +#define VVCAM_ISP_CID_DPCC_MANU_BPT_OUT_MODE \ + (VVCAM_ISP_CID_DPCC_BASE + 0x0011) +#define VVCAM_ISP_CID_DPCC_MANU_OUT_MODE (VVCAM_ISP_CID_DPCC_BASE + 0x0012) +#define VVCAM_ISP_CID_DPCC_MANU_SET_USE (VVCAM_ISP_CID_DPCC_BASE + 0x0013) +#define VVCAM_ISP_CID_DPCC_MANU_BPT_POS_X (VVCAM_ISP_CID_DPCC_BASE + 0x0014) +#define VVCAM_ISP_CID_DPCC_MANU_BPT_POS_Y (VVCAM_ISP_CID_DPCC_BASE + 0x0015) +#define VVCAM_ISP_CID_DPCC_MANU_METHODS_SET (VVCAM_ISP_CID_DPCC_BASE + 0x0016) +#define VVCAM_ISP_CID_DPCC_MANU_LINE_MAD_FACTOR \ + (VVCAM_ISP_CID_DPCC_BASE + 0x0017) +#define VVCAM_ISP_CID_DPCC_MANU_LINE_THRESHOLD \ + (VVCAM_ISP_CID_DPCC_BASE + 0x0018) +#define VVCAM_ISP_CID_DPCC_MANU_PG_FACTOR (VVCAM_ISP_CID_DPCC_BASE + 0x0019) +#define VVCAM_ISP_CID_DPCC_MANU_RG_FACTOR (VVCAM_ISP_CID_DPCC_BASE + 0x001A) +#define VVCAM_ISP_CID_DPCC_MANU_RND_OFFSETS (VVCAM_ISP_CID_DPCC_BASE + 0x001B) +#define VVCAM_ISP_CID_DPCC_MANU_RND_THRESHOLD \ + (VVCAM_ISP_CID_DPCC_BASE + 0x001C) +#define VVCAM_ISP_CID_DPCC_MANU_RO_LIMITS (VVCAM_ISP_CID_DPCC_BASE + 0x001D) + +int vvcam_isp_dpcc_ctrl_count(void); +int vvcam_isp_dpcc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.c new file mode 100644 index 0000000..8ef453d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.c @@ -0,0 +1,399 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_dpf.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_dpf_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DPF_ENABLE: + case VVCAM_ISP_CID_DPF_RESET: + case VVCAM_ISP_CID_DPF_MODE: + case VVCAM_ISP_CID_DPF_AUTO_LEVEL: + case VVCAM_ISP_CID_DPF_AUTO_GAIN: + case VVCAM_ISP_CID_DPF_AUTO_GRADIENT: + case VVCAM_ISP_CID_DPF_AUTO_OFFSET: + case VVCAM_ISP_CID_DPF_AUTO_MIN: + case VVCAM_ISP_CID_DPF_AUTO_DIV: + case VVCAM_ISP_CID_DPF_AUTO_SIGMA_G: + case VVCAM_ISP_CID_DPF_AUTO_SIGMA_RB: + case VVCAM_ISP_CID_DPF_AUTO_NOISE_CURVE: + case VVCAM_ISP_CID_DPF_MANU_GAIN: + case VVCAM_ISP_CID_DPF_MANU_GRADIENT: + case VVCAM_ISP_CID_DPF_MANU_OFFSET: + case VVCAM_ISP_CID_DPF_MANU_MIN: + case VVCAM_ISP_CID_DPF_MANU_DIV: + case VVCAM_ISP_CID_DPF_MANU_SIGMA_G: + case VVCAM_ISP_CID_DPF_MANU_SIGMA_RB: + case VVCAM_ISP_CID_DPF_MANU_NOISE_CURVE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_dpf_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_DPF_ENABLE: + case VVCAM_ISP_CID_DPF_RESET: + case VVCAM_ISP_CID_DPF_MODE: + case VVCAM_ISP_CID_DPF_AUTO_LEVEL: + case VVCAM_ISP_CID_DPF_AUTO_GAIN: + case VVCAM_ISP_CID_DPF_AUTO_GRADIENT: + case VVCAM_ISP_CID_DPF_AUTO_OFFSET: + case VVCAM_ISP_CID_DPF_AUTO_MIN: + case VVCAM_ISP_CID_DPF_AUTO_DIV: + case VVCAM_ISP_CID_DPF_AUTO_SIGMA_G: + case VVCAM_ISP_CID_DPF_AUTO_SIGMA_RB: + case VVCAM_ISP_CID_DPF_AUTO_NOISE_CURVE: + case VVCAM_ISP_CID_DPF_MANU_GAIN: + case VVCAM_ISP_CID_DPF_MANU_GRADIENT: + case VVCAM_ISP_CID_DPF_MANU_OFFSET: + case VVCAM_ISP_CID_DPF_MANU_MIN: + case VVCAM_ISP_CID_DPF_MANU_DIV: + case VVCAM_ISP_CID_DPF_MANU_SIGMA_G: + case VVCAM_ISP_CID_DPF_MANU_SIGMA_RB: + case VVCAM_ISP_CID_DPF_MANU_NOISE_CURVE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_dpf_ctrl_ops = { + .s_ctrl = vvcam_isp_dpf_s_ctrl, + .g_volatile_ctrl = vvcam_isp_dpf_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_dpf_ctrls[] = { + { + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* 0: Manual 1: Auto */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_GRADIENT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_gradient", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_OFFSET, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_offset", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_MIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_min", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_DIV, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_div", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_SIGMA_G, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_sigma_g", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_SIGMA_RB, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_sigma_rb", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float 20x17 array */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_AUTO_NOISE_CURVE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_auto_noise_curve", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 17, 0, 0}, + }, + /* + { + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_gain", + .step = 1, + .min = 10, + .max = 10000, + },*/ + { + /* float 0.1 ~ 128.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_GRADIENT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_gradient", + .step = 1, + .min = 1, + .max = 1280, + .def = 1, + }, + { + /* float 0.0 ~ 128.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_OFFSET, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_offset", + .step = 1, + .min = 0, + .max = 1280, + }, + { + /* float 1.0 ~ 128.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_MIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_min", + .step = 1, + .min = 10, + .max = 1280, + .def = 10, + }, + { + /* float 1.0 ~ 64.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_DIV, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_div", + .step = 1, + .min = 10, + .max = 640, + .def = 10, + }, + { + /* float 1.0 ~ 128.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_SIGMA_G, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_sigma_g", + .step = 1, + .min = 10, + .max = 1280, + .def = 10, + }, + { + /* float 1.0 ~ 128.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_SIGMA_RB, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_sigma_rb", + .step = 1, + .min = 10, + .max = 1280, + .def = 10, + }, + { + /* float 17x array 0.0 ~ 4095.0 */ + .ops = &vvcam_isp_dpf_ctrl_ops, + .id = VVCAM_ISP_CID_DPF_MANU_NOISE_CURVE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_dpf_manu_noise_curve", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {17, 0, 0, 0}, + }, +}; + +int vvcam_isp_dpf_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_dpf_ctrls); +} + +int vvcam_isp_dpf_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_dpf_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_dpf_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp dpf ctrl %s failed %d.\n", + vvcam_isp_dpf_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.h new file mode 100644 index 0000000..feb15a1 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/dpf/dpf_v1/vvcam_isp_dpf.h @@ -0,0 +1,81 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DPF_H__ +#define __VVCAM_ISP_DPF_H__ + +#define VVCAM_ISP_CID_DPF_ENABLE (VVCAM_ISP_CID_DPF_BASE + 0x0000) +#define VVCAM_ISP_CID_DPF_RESET (VVCAM_ISP_CID_DPF_BASE + 0x0001) +#define VVCAM_ISP_CID_DPF_MODE (VVCAM_ISP_CID_DPF_BASE + 0x0002) +#define VVCAM_ISP_CID_DPF_AUTO_LEVEL (VVCAM_ISP_CID_DPF_BASE + 0x0003) +#define VVCAM_ISP_CID_DPF_AUTO_GAIN (VVCAM_ISP_CID_DPF_BASE + 0x0004) +#define VVCAM_ISP_CID_DPF_AUTO_GRADIENT (VVCAM_ISP_CID_DPF_BASE + 0x0005) +#define VVCAM_ISP_CID_DPF_AUTO_OFFSET (VVCAM_ISP_CID_DPF_BASE + 0x0006) +#define VVCAM_ISP_CID_DPF_AUTO_MIN (VVCAM_ISP_CID_DPF_BASE + 0x0007) +#define VVCAM_ISP_CID_DPF_AUTO_DIV (VVCAM_ISP_CID_DPF_BASE + 0x0008) +#define VVCAM_ISP_CID_DPF_AUTO_SIGMA_G (VVCAM_ISP_CID_DPF_BASE + 0x0009) +#define VVCAM_ISP_CID_DPF_AUTO_SIGMA_RB (VVCAM_ISP_CID_DPF_BASE + 0x000A) +#define VVCAM_ISP_CID_DPF_AUTO_NOISE_CURVE (VVCAM_ISP_CID_DPF_BASE + 0x000B) +#define VVCAM_ISP_CID_DPF_MANU_GAIN (VVCAM_ISP_CID_DPF_BASE + 0x000C) +#define VVCAM_ISP_CID_DPF_MANU_GRADIENT (VVCAM_ISP_CID_DPF_BASE + 0x000D) +#define VVCAM_ISP_CID_DPF_MANU_OFFSET (VVCAM_ISP_CID_DPF_BASE + 0x000E) +#define VVCAM_ISP_CID_DPF_MANU_MIN (VVCAM_ISP_CID_DPF_BASE + 0x000F) +#define VVCAM_ISP_CID_DPF_MANU_DIV (VVCAM_ISP_CID_DPF_BASE + 0x0010) +#define VVCAM_ISP_CID_DPF_MANU_SIGMA_G (VVCAM_ISP_CID_DPF_BASE + 0x0011) +#define VVCAM_ISP_CID_DPF_MANU_SIGMA_RB (VVCAM_ISP_CID_DPF_BASE + 0x0012) +#define VVCAM_ISP_CID_DPF_MANU_NOISE_CURVE (VVCAM_ISP_CID_DPF_BASE + 0x0013) + +int vvcam_isp_dpf_ctrl_count(void); +int vvcam_isp_dpf_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.c new file mode 100644 index 0000000..5745d31 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.c @@ -0,0 +1,353 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_ee.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_ee_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EE_ENABLE: + case VVCAM_ISP_CID_EE_RESET: + case VVCAM_ISP_CID_EE_MODE: + case VVCAM_ISP_CID_EE_AUTO_LEVEL: + case VVCAM_ISP_CID_EE_AUTO_GAIN: + case VVCAM_ISP_CID_EE_AUTO_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_AUTO_UV_GAIN: + case VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_UV_GAIN: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_ee_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EE_ENABLE: + case VVCAM_ISP_CID_EE_RESET: + case VVCAM_ISP_CID_EE_MODE: + case VVCAM_ISP_CID_EE_AUTO_LEVEL: + case VVCAM_ISP_CID_EE_AUTO_GAIN: + case VVCAM_ISP_CID_EE_AUTO_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_AUTO_UV_GAIN: + case VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_UV_GAIN: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_ee_ctrl_ops = { + .s_ctrl = vvcam_isp_ee_s_ctrl, + .g_volatile_ctrl = vvcam_isp_ee_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_ee_ctrls[] = { + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float 20 * 32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_src_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_y_gain_up", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_y_gain_down", + .step = 1, + .min = 0, + .max = 65535, + .dims = {20, 0, 0, 0}, + }, + { + /* uint16_t array 20*16bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_UV_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_uv_gain", + .step = 1, + .min = 0, + .max = 65535, + .dims = {20, 0, 0, 0}, + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_edge_gain", + .step = 1, + .min = 0, + .max = 65535, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_EDGE_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_edge_gain", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_src_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_UV_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_uv_gain", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_y_gain_up", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_y_gain_down", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1, 0, 0, 0}, + }, +}; + +int vvcam_isp_ee_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_ee_ctrls); +} + +int vvcam_isp_ee_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_ee_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_ee_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp ee ctrl %s failed %d.\n", + vvcam_isp_ee_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.h new file mode 100644 index 0000000..8ec7bc0 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v1/vvcam_isp_ee.h @@ -0,0 +1,79 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_EE_H__ +#define __VVCAM_ISP_EE_H__ + +#define VVCAM_ISP_CID_EE_ENABLE (VVCAM_ISP_CID_EE_BASE + 0x0000) +#define VVCAM_ISP_CID_EE_RESET (VVCAM_ISP_CID_EE_BASE + 0x0001) +#define VVCAM_ISP_CID_EE_MODE (VVCAM_ISP_CID_EE_BASE + 0x0002) +#define VVCAM_ISP_CID_EE_AUTO_LEVEL (VVCAM_ISP_CID_EE_BASE + 0x0003) +#define VVCAM_ISP_CID_EE_AUTO_GAIN (VVCAM_ISP_CID_EE_BASE + 0x0004) +#define VVCAM_ISP_CID_EE_AUTO_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x0005) +#define VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x0006) +#define VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP (VVCAM_ISP_CID_EE_BASE + 0x0007) +#define VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN (VVCAM_ISP_CID_EE_BASE + 0x0008) +#define VVCAM_ISP_CID_EE_AUTO_UV_GAIN (VVCAM_ISP_CID_EE_BASE + 0x0009) +#define VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN (VVCAM_ISP_CID_EE_BASE + 0x000A) +#define VVCAM_ISP_CID_EE_MANU_EDGE_GAIN (VVCAM_ISP_CID_EE_BASE + 0x000B) +#define VVCAM_ISP_CID_EE_MANU_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x000C) +#define VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH \ + (VVCAM_ISP_CID_EE_BASE + 0x000D) +#define VVCAM_ISP_CID_EE_MANU_UV_GAIN (VVCAM_ISP_CID_EE_BASE + 0x000E) +#define VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP (VVCAM_ISP_CID_EE_BASE + 0x000F) +#define VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN (VVCAM_ISP_CID_EE_BASE + 0x0010) + +int vvcam_isp_ee_ctrl_count(void); +int vvcam_isp_ee_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.c new file mode 100644 index 0000000..ad0986b --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.c @@ -0,0 +1,485 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_ee.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_ee_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EE_ENABLE: + case VVCAM_ISP_CID_EE_RESET: + case VVCAM_ISP_CID_EE_ENABLE_CURVE: + case VVCAM_ISP_CID_EE_ENABLE_CA: + case VVCAM_ISP_CID_EE_ENABLE_DCI: + case VVCAM_ISP_CID_EE_MODE: + case VVCAM_ISP_CID_EE_AUTO_LEVEL: + case VVCAM_ISP_CID_EE_AUTO_GAIN: + case VVCAM_ISP_CID_EE_AUTO_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_AUTO_UV_GAIN: + case VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN: + case VVCAM_ISP_CID_EE_AUTO_CA_ENABLE_TBL: + case VVCAM_ISP_CID_EE_AUTO_CA_CURVE: + case VVCAM_ISP_CID_EE_AUTO_DCI_ENABLE_TBL: + case VVCAM_ISP_CID_EE_AUTO_DCI_CURVE: + case VVCAM_ISP_CID_EE_MANU_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_UV_GAIN: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_MANU_CA_MODE: + case VVCAM_ISP_CID_EE_MANU_CA_CURVE: + case VVCAM_ISP_CID_EE_MANU_DCI_CURVE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_ee_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EE_ENABLE: + case VVCAM_ISP_CID_EE_RESET: + case VVCAM_ISP_CID_EE_ENABLE_CURVE: + case VVCAM_ISP_CID_EE_ENABLE_CA: + case VVCAM_ISP_CID_EE_ENABLE_DCI: + case VVCAM_ISP_CID_EE_MODE: + case VVCAM_ISP_CID_EE_AUTO_LEVEL: + case VVCAM_ISP_CID_EE_AUTO_GAIN: + case VVCAM_ISP_CID_EE_AUTO_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_AUTO_UV_GAIN: + case VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN: + case VVCAM_ISP_CID_EE_AUTO_CA_ENABLE_TBL: + case VVCAM_ISP_CID_EE_AUTO_CA_CURVE: + case VVCAM_ISP_CID_EE_AUTO_DCI_ENABLE_TBL: + case VVCAM_ISP_CID_EE_AUTO_DCI_CURVE: + case VVCAM_ISP_CID_EE_MANU_EDGE_GAIN: + case VVCAM_ISP_CID_EE_MANU_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH: + case VVCAM_ISP_CID_EE_MANU_UV_GAIN: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP: + case VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN: + case VVCAM_ISP_CID_EE_MANU_CA_MODE: + case VVCAM_ISP_CID_EE_MANU_CA_CURVE: + case VVCAM_ISP_CID_EE_MANU_DCI_CURVE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_ee_ctrl_ops = { + .s_ctrl = vvcam_isp_ee_s_ctrl, + .g_volatile_ctrl = vvcam_isp_ee_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_ee_ctrls[] = { + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_ENABLE_CURVE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_enable_curve", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_ENABLE_CA, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_enable_ca", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_ENABLE_DCI, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_enable_dci", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float 20 * 32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* uint8_t array 20*8bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_src_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_y_gain_up", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_y_gain_down", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* uint16_t array 20*16bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_UV_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_uv_gain", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20} + }, + { + /* uint32_t array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_edge_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* uint32_t bool array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_CA_ENABLE_TBL, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_ca_enable_tbl", + .step = 1, + .min = 0, + .max = 0x1, + .dims = {20}, + }, + { + // uint16_t array 20*16bit + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_CA_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_ca_curve", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 65}, + }, + { + /* uint32_t bool array 20*32bit */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_DCI_ENABLE_TBL, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_dci_enable_tbl", + .step = 1, + .min = 0, + .max = 0x1, + .dims = {20}, + }, + { + // uint16_t array 20*16bit + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_AUTO_DCI_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_auto_dci_curve", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 65}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_EDGE_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_edge_gain", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_src_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_UV_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_uv_gain", + .step = 1, + .min = 0, + .max = 1024, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_y_gain_up", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_y_gain_down", + .step = 1, + .min = 0, + .max = 65535, + .dims = {1}, + }, + { + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_CA_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_ca_mode", + .step = 1, + .min = 0, + .max = 2, + }, + { + /* uint16_t 65x array */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_CA_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_ca_curve", + .step = 1, + .min = 0, + .max = 1024, + .dims = {65}, + }, + { + /* uint16_t 65x array */ + .ops = &vvcam_isp_ee_ctrl_ops, + .id = VVCAM_ISP_CID_EE_MANU_DCI_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ee_manu_dci_curve", + .step = 1, + .min = 0, + .max = 1024, + .dims = {65}, + }, +}; + +int vvcam_isp_ee_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_ee_ctrls); +} + +int vvcam_isp_ee_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_ee_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_ee_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp ee ctrl %s failed %d.\n", + vvcam_isp_ee_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.h new file mode 100644 index 0000000..c355457 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ee/ee_v2/vvcam_isp_ee.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_EE_H__ +#define __VVCAM_ISP_EE_H__ + +#define VVCAM_ISP_CID_EE_ENABLE (VVCAM_ISP_CID_EE_BASE + 0x0000) +#define VVCAM_ISP_CID_EE_RESET (VVCAM_ISP_CID_EE_BASE + 0x0001) +#define VVCAM_ISP_CID_EE_ENABLE_CURVE (VVCAM_ISP_CID_EE_BASE + 0x0002) +#define VVCAM_ISP_CID_EE_ENABLE_CA (VVCAM_ISP_CID_EE_BASE + 0x0003) +#define VVCAM_ISP_CID_EE_ENABLE_DCI (VVCAM_ISP_CID_EE_BASE + 0x0004) +#define VVCAM_ISP_CID_EE_MODE (VVCAM_ISP_CID_EE_BASE + 0x0005) +#define VVCAM_ISP_CID_EE_AUTO_LEVEL (VVCAM_ISP_CID_EE_BASE + 0x0006) +#define VVCAM_ISP_CID_EE_AUTO_GAIN (VVCAM_ISP_CID_EE_BASE + 0x0007) +#define VVCAM_ISP_CID_EE_AUTO_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x0008) +#define VVCAM_ISP_CID_EE_AUTO_SRC_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x0009) +#define VVCAM_ISP_CID_EE_AUTO_Y_GAIN_UP (VVCAM_ISP_CID_EE_BASE + 0x000A) +#define VVCAM_ISP_CID_EE_AUTO_Y_GAIN_DOWN (VVCAM_ISP_CID_EE_BASE + 0x000B) +#define VVCAM_ISP_CID_EE_AUTO_UV_GAIN (VVCAM_ISP_CID_EE_BASE + 0x000C) +#define VVCAM_ISP_CID_EE_AUTO_EDGE_GAIN (VVCAM_ISP_CID_EE_BASE + 0x000D) +#define VVCAM_ISP_CID_EE_AUTO_CA_ENABLE_TBL (VVCAM_ISP_CID_EE_BASE + 0x000E) +#define VVCAM_ISP_CID_EE_AUTO_CA_CURVE (VVCAM_ISP_CID_EE_BASE + 0x000F) +#define VVCAM_ISP_CID_EE_AUTO_DCI_ENABLE_TBL \ + (VVCAM_ISP_CID_EE_BASE + 0x0010) +#define VVCAM_ISP_CID_EE_AUTO_DCI_CURVE (VVCAM_ISP_CID_EE_BASE + 0x0011) +#define VVCAM_ISP_CID_EE_MANU_EDGE_GAIN (VVCAM_ISP_CID_EE_BASE + 0x0012) +#define VVCAM_ISP_CID_EE_MANU_STRENGTH (VVCAM_ISP_CID_EE_BASE + 0x0013) +#define VVCAM_ISP_CID_EE_MANU_SRC_STRENGTH \ + (VVCAM_ISP_CID_EE_BASE + 0x0014) +#define VVCAM_ISP_CID_EE_MANU_UV_GAIN (VVCAM_ISP_CID_EE_BASE + 0x0015) +#define VVCAM_ISP_CID_EE_MANU_Y_GAIN_UP (VVCAM_ISP_CID_EE_BASE + 0x0016) +#define VVCAM_ISP_CID_EE_MANU_Y_GAIN_DOWN (VVCAM_ISP_CID_EE_BASE + 0x0017) +#define VVCAM_ISP_CID_EE_MANU_CA_MODE (VVCAM_ISP_CID_EE_BASE + 0x0018) +#define VVCAM_ISP_CID_EE_MANU_CA_CURVE (VVCAM_ISP_CID_EE_BASE + 0x0019) +#define VVCAM_ISP_CID_EE_MANU_DCI_CURVE (VVCAM_ISP_CID_EE_BASE + 0x001A) + +int vvcam_isp_ee_ctrl_count(void); +int vvcam_isp_ee_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.c new file mode 100644 index 0000000..757f94b --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.c @@ -0,0 +1,267 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_exp.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_exp_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EXP_ENABLE: + case VVCAM_ISP_CID_EXP_RESET: + case VVCAM_ISP_CID_EXP_R_WEIGHT: + case VVCAM_ISP_CID_EXP_GR_WEIGHT: + case VVCAM_ISP_CID_EXP_GB_WEIGHT: + case VVCAM_ISP_CID_EXP_B_WEIGHT: + // case VVCAM_ISP_CID_EXP_SIZE_RATIO: + case VVCAM_ISP_CID_EXP_INPUT_SELECT: + case VVCAM_ISP_CID_EXP_MEASURE_WINDOW: + case VVCAM_ISP_CID_EXP_STATISTIC: + case VVCAM_ISP_CID_EXP_STATISTIC_TYPE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_exp_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_EXP_ENABLE: + case VVCAM_ISP_CID_EXP_RESET: + case VVCAM_ISP_CID_EXP_R_WEIGHT: + case VVCAM_ISP_CID_EXP_GR_WEIGHT: + case VVCAM_ISP_CID_EXP_GB_WEIGHT: + case VVCAM_ISP_CID_EXP_B_WEIGHT: + // case VVCAM_ISP_CID_EXP_SIZE_RATIO: + case VVCAM_ISP_CID_EXP_INPUT_SELECT: + case VVCAM_ISP_CID_EXP_MEASURE_WINDOW: + case VVCAM_ISP_CID_EXP_STATISTIC: + case VVCAM_ISP_CID_EXP_STATISTIC_TYPE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_exp_ctrl_ops = { + .s_ctrl = vvcam_isp_exp_s_ctrl, + .g_volatile_ctrl = vvcam_isp_exp_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_exp_ctrls[] = { + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_R_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_r_weight", + .step = 1, + .min = 0, + .max = 63, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_GR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_gr_weight", + .step = 1, + .min = 0, + .max = 63, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_GB_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_gb_weight", + .step = 1, + .min = 0, + .max = 63, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_B_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_b_weight", + .step = 1, + .min = 0, + .max = 63, + .dims = {1, 0, 0, 0}, + }, + /*{ + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_SIZE_RATIO, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_size_ratio", + .step = 1, + .min = 0, + .max = 100000, + },*/ + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_INPUT_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_input_select", + .step = 1, + .min = 0, + .max = 3, + }, + { + /* uint16_t array 4x16bit */ + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_MEASURE_WINDOW, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_measure_window", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + // uint32_t array 32*32*4*32bit + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_STATISTIC, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_statistic", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {32, 32, 4, 0}, + }, + { + .ops = &vvcam_isp_exp_ctrl_ops, + .id = VVCAM_ISP_CID_EXP_STATISTIC_TYPE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_exp_statistic_type", + .step = 1, + .min = 0, + .max = 2, + }, +}; + +int vvcam_isp_exp_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_exp_ctrls); +} + +int vvcam_isp_exp_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_exp_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_exp_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp exp ctrl %s failed %d.\n", + vvcam_isp_exp_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.h new file mode 100644 index 0000000..5b14a91 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/exp/exp_v2/vvcam_isp_exp.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_EXP_H__ +#define __VVCAM_ISP_EXP_H__ + +#define VVCAM_ISP_CID_EXP_ENABLE (VVCAM_ISP_CID_EXP_BASE + 0x0000) +#define VVCAM_ISP_CID_EXP_RESET (VVCAM_ISP_CID_EXP_BASE + 0x0001) +#define VVCAM_ISP_CID_EXP_R_WEIGHT (VVCAM_ISP_CID_EXP_BASE + 0x0002) +#define VVCAM_ISP_CID_EXP_GR_WEIGHT (VVCAM_ISP_CID_EXP_BASE + 0x0003) +#define VVCAM_ISP_CID_EXP_GB_WEIGHT (VVCAM_ISP_CID_EXP_BASE + 0x0004) +#define VVCAM_ISP_CID_EXP_B_WEIGHT (VVCAM_ISP_CID_EXP_BASE + 0x0005) +// #define VVCAM_ISP_CID_EXP_SIZE_RATIO (VVCAM_ISP_CID_EXP_BASE + 0x0006) +#define VVCAM_ISP_CID_EXP_INPUT_SELECT (VVCAM_ISP_CID_EXP_BASE + 0x0007) +#define VVCAM_ISP_CID_EXP_MEASURE_WINDOW (VVCAM_ISP_CID_EXP_BASE + 0x0008) +#define VVCAM_ISP_CID_EXP_STATISTIC (VVCAM_ISP_CID_EXP_BASE + 0x0009) +#define VVCAM_ISP_CID_EXP_STATISTIC_TYPE (VVCAM_ISP_CID_EXP_BASE + 0x000A) + +int vvcam_isp_exp_ctrl_count(void); +int vvcam_isp_exp_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.c new file mode 100644 index 0000000..95b8cff --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_gc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_gc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GC_ENABLE: + case VVCAM_ISP_CID_GC_RESET: + case VVCAM_ISP_CID_GC_MANU_USE_STD: + case VVCAM_ISP_CID_GC_MANU_STD_VAL: + case VVCAM_ISP_CID_GC_MANU_CURVE: + case VVCAM_ISP_CID_GC_MANU_CURVE_MODE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_gc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GC_ENABLE: + case VVCAM_ISP_CID_GC_RESET: + case VVCAM_ISP_CID_GC_MANU_USE_STD: + case VVCAM_ISP_CID_GC_MANU_STD_VAL: + case VVCAM_ISP_CID_GC_MANU_CURVE: + case VVCAM_ISP_CID_GC_MANU_CURVE_MODE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_gc_ctrl_ops = { + .s_ctrl = vvcam_isp_gc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_gc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_gc_ctrls[] = { + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_USE_STD, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_use_std", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float 1.0 ~ 4.0 */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_STD_VAL, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_std_val", + .step = 1, + .min = 100, + .max = 400, + .def = 220, + }, + { + /* uint16_t 17*16bit */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_curve", + .step = 1, + .min = 0, + .max = 1023, + .dims = {17, 0, 0, 0}, + }, + { + /* uint32_t array 64*32bit */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_CURVE_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_curve_mode", + .step = 1, + .min = 0, + .max = 1, + }, +}; + +int vvcam_isp_gc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_gc_ctrls); +} + +int vvcam_isp_gc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_gc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_gc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp gc ctrl %s failed %d.\n", + vvcam_isp_gc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.h new file mode 100644 index 0000000..400bd52 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v1/vvcam_isp_gc.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_GC_H__ +#define __VVCAM_ISP_GC_H__ + +#define VVCAM_ISP_CID_GC_ENABLE (VVCAM_ISP_CID_GC_BASE + 0x0000) +#define VVCAM_ISP_CID_GC_RESET (VVCAM_ISP_CID_GC_BASE + 0x0001) +#define VVCAM_ISP_CID_GC_MANU_USE_STD (VVCAM_ISP_CID_GC_BASE + 0x0002) +#define VVCAM_ISP_CID_GC_MANU_STD_VAL (VVCAM_ISP_CID_GC_BASE + 0x0003) +#define VVCAM_ISP_CID_GC_MANU_CURVE (VVCAM_ISP_CID_GC_BASE + 0x0004) +#define VVCAM_ISP_CID_GC_MANU_CURVE_MODE (VVCAM_ISP_CID_GC_BASE + 0x0005) + +int vvcam_isp_gc_ctrl_count(void); +int vvcam_isp_gc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.c new file mode 100644 index 0000000..9fe788f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.c @@ -0,0 +1,270 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_gc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_gc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GC_ENABLE: + case VVCAM_ISP_CID_GC_RESET: + case VVCAM_ISP_CID_GC_MODE: + case VVCAM_ISP_CID_GC_AUTO_LEVEL: + case VVCAM_ISP_CID_GC_AUTO_GAIN: + case VVCAM_ISP_CID_GC_AUTO_CURVE: + case VVCAM_ISP_CID_GC_MANU_USE_STD: + case VVCAM_ISP_CID_GC_MANU_STD_VAL: + case VVCAM_ISP_CID_GC_MANU_CURVE: + case VVCAM_ISP_CID_GC_MANU_USER_X: + case VVCAM_ISP_CID_GC_MANU_CURVE_X: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_gc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GC_ENABLE: + case VVCAM_ISP_CID_GC_MODE: + case VVCAM_ISP_CID_GC_AUTO_LEVEL: + case VVCAM_ISP_CID_GC_AUTO_GAIN: + case VVCAM_ISP_CID_GC_AUTO_CURVE: + case VVCAM_ISP_CID_GC_MANU_USE_STD: + case VVCAM_ISP_CID_GC_MANU_STD_VAL: + case VVCAM_ISP_CID_GC_MANU_CURVE: + case VVCAM_ISP_CID_GC_MANU_USER_X: + case VVCAM_ISP_CID_GC_MANU_CURVE_X: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_gc_ctrl_ops = { + .s_ctrl = vvcam_isp_gc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_gc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_gc_ctrls[] = { + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1}, + }, + { + /* float array 20*32bit */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + // uint16_t 20 * 64 * 16bit + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_AUTO_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_auto_curve", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 64, 0, 0} + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_USE_STD, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_use_std", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float 1.0 ~ 4.0 */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_STD_VAL, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_std_val", + .step = 1, + .min = 100, + .max = 400, + .def = 220, + }, + { + /* uint16_t 64*16bit */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_curve", + .step = 1, + .min = 0, + .max = 1023, + .dims = {64}, + }, + { + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_USER_X, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_use_user_x", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* uint32_t array 64*32bit */ + .ops = &vvcam_isp_gc_ctrl_ops, + .id = VVCAM_ISP_CID_GC_MANU_CURVE_X, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gc_manu_curve_x", + .step = 1, + .min = 0, + .max = 12, + .dims = {64}, + }, +}; + +int vvcam_isp_gc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_gc_ctrls); +} + +int vvcam_isp_gc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_gc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_gc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp gc ctrl %s failed %d.\n", + vvcam_isp_gc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.h new file mode 100644 index 0000000..90dce88 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gc/gc_v2/vvcam_isp_gc.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_GC_H__ +#define __VVCAM_ISP_GC_H__ + +#define VVCAM_ISP_CID_GC_ENABLE (VVCAM_ISP_CID_GC_BASE + 0x0000) +#define VVCAM_ISP_CID_GC_RESET (VVCAM_ISP_CID_GC_BASE + 0x0001) +#define VVCAM_ISP_CID_GC_MODE (VVCAM_ISP_CID_GC_BASE + 0x0002) +#define VVCAM_ISP_CID_GC_AUTO_LEVEL (VVCAM_ISP_CID_GC_BASE + 0x0003) +#define VVCAM_ISP_CID_GC_AUTO_GAIN (VVCAM_ISP_CID_GC_BASE + 0x0004) +#define VVCAM_ISP_CID_GC_AUTO_CURVE (VVCAM_ISP_CID_GC_BASE + 0x0005) +#define VVCAM_ISP_CID_GC_MANU_USE_STD (VVCAM_ISP_CID_GC_BASE + 0x0006) +#define VVCAM_ISP_CID_GC_MANU_STD_VAL (VVCAM_ISP_CID_GC_BASE + 0x0007) +#define VVCAM_ISP_CID_GC_MANU_CURVE (VVCAM_ISP_CID_GC_BASE + 0x0008) +#define VVCAM_ISP_CID_GC_MANU_USER_X (VVCAM_ISP_CID_GC_BASE + 0x0009) +#define VVCAM_ISP_CID_GC_MANU_CURVE_X (VVCAM_ISP_CID_GC_BASE + 0x000A) + +int vvcam_isp_gc_ctrl_count(void); +int vvcam_isp_gc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.c new file mode 100644 index 0000000..f637b69 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.c @@ -0,0 +1,162 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_ge.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_ge_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GE_ENABLE: + case VVCAM_ISP_CID_GE_RESET: + case VVCAM_ISP_CID_GE_THRESHOLD: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_ge_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GE_ENABLE: + case VVCAM_ISP_CID_GE_RESET: + case VVCAM_ISP_CID_GE_THRESHOLD: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_ge_ctrl_ops = { + .s_ctrl = vvcam_isp_ge_s_ctrl, + .g_volatile_ctrl = vvcam_isp_ge_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_ge_ctrls[] = { + { + .ops = &vvcam_isp_ge_ctrl_ops, + .id = VVCAM_ISP_CID_GE_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ge_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_ge_ctrl_ops, + .id = VVCAM_ISP_CID_GE_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ge_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float 0.0 ~ 511.992 */ + .ops = &vvcam_isp_ge_ctrl_ops, + .id = VVCAM_ISP_CID_GE_THRESHOLD, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_ge_threshold", + .step = 1, + .min = 0, + .max = 65535, + }, +}; + +int vvcam_isp_ge_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_ge_ctrls); +} + +int vvcam_isp_ge_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_ge_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_ge_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp ge ctrl %s failed %d.\n", + vvcam_isp_ge_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.h new file mode 100644 index 0000000..65e232c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/ge/ge/vvcam_isp_ge.h @@ -0,0 +1,64 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_GE_H__ +#define __VVCAM_ISP_GE_H__ + +#define VVCAM_ISP_CID_GE_ENABLE (VVCAM_ISP_CID_GE_BASE + 0x0000) +#define VVCAM_ISP_CID_GE_RESET (VVCAM_ISP_CID_GE_BASE + 0x0001) +#define VVCAM_ISP_CID_GE_THRESHOLD (VVCAM_ISP_CID_GE_BASE + 0x0002) + +int vvcam_isp_ge_ctrl_count(void); +int vvcam_isp_ge_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.c new file mode 100644 index 0000000..fc4aa49 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.c @@ -0,0 +1,787 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_gtm.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_gtm_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GTM_ENABLE: + case VVCAM_ISP_CID_GTM_BW_CORRECTION_ENABLE: + case VVCAM_ISP_CID_GTM_RESET: + case VVCAM_ISP_CID_GTM_MODE: + case VVCAM_ISP_CID_GTM_AUTO_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_SELECT: + case VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MIN_LOG: + case VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MAX_LOG: + case VVCAM_ISP_CID_GTM_AUTO_HIST_CONTRAST_LIMIT_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_HIST_HLC_FACTOR: + case VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_PRESERVE_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_HIST_MAX_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_HIST_MIN_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_HIST_STRENGTH: + case VVCAM_ISP_CID_GTM_AUTO_COLOR_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_USER_CURVE: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_MODE: + case VVCAM_ISP_CID_GTM_AUTO_EDR_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_CONTRAST_LIMIT_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_THR_LOG: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_HLC_FACTOR: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_PRESERVE_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_COMPRESS_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MAX_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MIN_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_STRENGTH: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_DAMP_COEF: + case VVCAM_ISP_CID_GTM_AUTO_EDR: + case VVCAM_ISP_CID_GTM_MANU_RGB_COEF: + case VVCAM_ISP_CID_GTM_MANU_LIGHTNESS_WEIGHT: + case VVCAM_ISP_CID_GTM_MANU_COLOR_WEIGHT: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MODE: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MIN_LOG: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MAX_LOG: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_DAMP_COEF: + case VVCAM_ISP_CID_GTM_MANU_CURVE_SELECT: + case VVCAM_ISP_CID_GTM_MANU_CURVE_SHIFT_BIT: + case VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_X_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_Y_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_MAX_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_MIN_LOG: + case VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_X_LOG: + case VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_SLOPE: + case VVCAM_ISP_CID_GTM_MANU_USER_CURVE: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_MIN: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_MAX: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_DATA: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_gtm_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GTM_ENABLE: + case VVCAM_ISP_CID_GTM_BW_CORRECTION_ENABLE: + case VVCAM_ISP_CID_GTM_RESET: + case VVCAM_ISP_CID_GTM_MODE: + case VVCAM_ISP_CID_GTM_AUTO_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_SELECT: + case VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MIN_LOG: + case VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MAX_LOG: + case VVCAM_ISP_CID_GTM_AUTO_HIST_CONTRAST_LIMIT_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_HIST_HLC_FACTOR: + case VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_PRESERVE_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_HIST_MAX_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_HIST_MIN_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_HIST_STRENGTH: + case VVCAM_ISP_CID_GTM_AUTO_COLOR_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_USER_CURVE: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_MODE: + case VVCAM_ISP_CID_GTM_AUTO_EDR_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_CONTRAST_LIMIT_LEVEL: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_THR_LOG: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_HLC_FACTOR: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_PRESERVE_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_COMPRESS_WEIGHT: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MAX_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MIN_GAIN: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_STRENGTH: + case VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_DAMP_COEF: + case VVCAM_ISP_CID_GTM_AUTO_EDR: + case VVCAM_ISP_CID_GTM_MANU_RGB_COEF: + case VVCAM_ISP_CID_GTM_MANU_LIGHTNESS_WEIGHT: + case VVCAM_ISP_CID_GTM_MANU_COLOR_WEIGHT: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MODE: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MIN_LOG: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_MAX_LOG: + case VVCAM_ISP_CID_GTM_MANU_BW_COR_DAMP_COEF: + case VVCAM_ISP_CID_GTM_MANU_CURVE_SELECT: + case VVCAM_ISP_CID_GTM_MANU_CURVE_SHIFT_BIT: + case VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_X_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_Y_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_MAX_LOG: + case VVCAM_ISP_CID_GTM_MANU_PWL_MIN_LOG: + case VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_X_LOG: + case VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_SLOPE: + case VVCAM_ISP_CID_GTM_MANU_USER_CURVE: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_MIN: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_MAX: + case VVCAM_ISP_CID_GTM_HIST_STATISTIC_DATA: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_gtm_ctrl_ops = { + .s_ctrl = vvcam_isp_gtm_s_ctrl, + .g_volatile_ctrl = vvcam_isp_gtm_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_gtm_ctrls[] = { + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_BW_CORRECTION_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_bw_cor_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* 0: Manual 1: Auto */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1, 0, 0, 0}, + }, + { + /* float array 20x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_select", + .step = 1, + .min = 0, + .max = 3, + }, + { + /* uint8_t array 20x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MIN_LOG, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_bw_cor_min_log", + .step = 1, + .min = 0, + .max = 128, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t array 20x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MAX_LOG, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_bw_cor_max_log", + .step = 1, + .min = 0, + .max = 128, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t array 20x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_CONTRAST_LIMIT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_cll", + .step = 1, + .min = 0, + .max = 16, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20x 0.0 ~ 10.0*/ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_HLC_FACTOR, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_hf", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20x 0.0 ~ 1.0*/ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_PRESERVE_WEIGHT, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_lpw", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20x 0.0 ~ 1048575.0*/ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_MAX_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_maxg", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20x 0.0 ~ 1048575.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_MIN_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_ming", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 0, 0, 0}, + }, + { + /* float array 20x20 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_STRENGTH, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_str", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 20, 0, 0}, + }, + { + /* uint8_t array 20x3 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_color_weight", + .step = 1, + .min = 0, + .max = 128, + .dims = {20, 3, 0, 0}, + }, + { + /* uint16_t array 20x4 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_WEIGHT, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_hist_luma_weight", + .step = 1, + .min = 0, + .max = 1024, + .dims = {20, 4, 0, 0}, + }, + { + // uint32_t array 20x129 0~1048575 + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_USER_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_user_curve", + .step = 1, + .min = 0, + .max = 1048575, + .dims = {20, 129, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_mode", + .step = 1, + .min = 0, + .max = 2, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_EDR_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_edr_level", + .step = 1, + .min = 0, + .max = 20, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_CONTRAST_LIMIT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_cll", + .step = 1, + .min = 0, + .max = 16, + .dims = {1, 0, 0, 0}, + }, + { + /* uint8_t array 4x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_THR_LOG, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_ltl", + .step = 1, + .min = 0, + .max = 24, + .dims = {4, 0, 0, 0}, + }, + { + /* uint16_t array 4x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_WEIGHT, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_lw", + .step = 1, + .min = 0, + .max = 1024, + .dims = {4, 0, 0, 0}, + }, + { + /* float 0.0 ~ 10.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_HLC_FACTOR, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_hf", + .step = 1, + .min = 0, + .max = 100, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_PRESERVE_WEIGHT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_lpw", + .step = 1, + .min = 0, + .max = 10, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_COMPRESS_WEIGHT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_cw", + .step = 1, + .min = 0, + .max = 10, + }, + { + /* float 0.0 ~ 1048575.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MAX_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_maxg", + .step = 1, + .min = 0, + .max = 10485750, + }, + { + /* float 0.0 ~ 1048575.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MIN_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_ming", + .step = 1, + .min = 0, + .max = 10485750, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_STRENGTH, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_str", + .step = 1, + .min = 0, + .max = 10, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_DAMP_COEF, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_curve_hist_dc", + .step = 1, + .min = 0, + .max = 10, + }, + { + /* float 20x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_AUTO_EDR, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_auto_edr", + .step = 1, + .min = 0, + .max = 128, + .dims = {20, 0, 0, 0}, + }, + { + /* uint8_t 3x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_RGB_COEF, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_rgb_coef", + .step = 1, + .min = 0, + .max = 128, + .dims = {3, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_LIGHTNESS_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_lightness_weight", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + /* uint8_t 3x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_color_weight", + .step = 1, + .min = 0, + .max = 128, + .dims = {3, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_BW_COR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_bw_cor_mode", + .step = 1, + .min = 0, + .max = 2, + }, + { + /* double 0.0 ~ 24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_BW_COR_MIN_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_bw_cor_min_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* double 0.0 ~ 24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_BW_COR_MAX_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_bw_cor_max_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* double 0.0 ~ 1.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_BW_COR_DAMP_COEF, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_bw_cor_damp_coef", + .step = 1, + .min = 0, + .max = 10, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_CURVE_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_curve_select", + .step = 1, + .min = 0, + .max = 3, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_CURVE_SHIFT_BIT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_curve_shift_bit", + .step = 1, + .min = 0, + .max = 4, + }, + { + /* double 0~24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_X_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_pwl_knee_x_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* double 0~20.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_Y_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_pwl_knee_y_log", + .step = 1, + .min = 0, + .max = 200, + }, + { + /* double 0~24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_PWL_MAX_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_pwl_max_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* double 0~24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_PWL_MIN_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_pwl_min_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* float 0~24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_X_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_log_knee_x_log", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* float 0~24.0 */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_SLOPE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_log_knee_slope", + .step = 1, + .min = 0, + .max = 240, + }, + { + /* uint32_t array 129x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_MANU_USER_CURVE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_manu_user_curve", + .step = 1, + .min = 0, + .max = 1048575, + .dims = {129, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_HIST_STATISTIC_MIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_hist_statistic_min", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + }, + { + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_HIST_STATISTIC_MAX, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_hist_statistic_max", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + }, + { + /* uint32_t array 128x */ + .ops = &vvcam_isp_gtm_ctrl_ops, + .id = VVCAM_ISP_CID_GTM_HIST_STATISTIC_DATA, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gtm_hist_statistic_data", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {128, 0, 0, 0}, + }, +}; + +int vvcam_isp_gtm_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_gtm_ctrls); +} + +int vvcam_isp_gtm_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_gtm_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_gtm_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp gtm ctrl %s failed %d.\n", + vvcam_isp_gtm_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.h new file mode 100644 index 0000000..8a51ff2 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gtm/gtm_v1/vvcam_isp_gtm.h @@ -0,0 +1,148 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_GTM_H__ +#define __VVCAM_ISP_GTM_H__ + +#define VVCAM_ISP_CID_GTM_ENABLE (VVCAM_ISP_CID_GTM_BASE + 0x0000) +#define VVCAM_ISP_CID_GTM_BW_CORRECTION_ENABLE \ + (VVCAM_ISP_CID_GTM_BASE + 0x0001) +#define VVCAM_ISP_CID_GTM_RESET (VVCAM_ISP_CID_GTM_BASE + 0x0002) +#define VVCAM_ISP_CID_GTM_MODE (VVCAM_ISP_CID_GTM_BASE + 0x0003) +#define VVCAM_ISP_CID_GTM_AUTO_LEVEL (VVCAM_ISP_CID_GTM_BASE + 0x0004) +#define VVCAM_ISP_CID_GTM_AUTO_GAIN (VVCAM_ISP_CID_GTM_BASE + 0x0005) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_SELECT (VVCAM_ISP_CID_GTM_BASE + 0x0006) +#define VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MIN_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0007) +#define VVCAM_ISP_CID_GTM_AUTO_BW_CORRECTION_MAX_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0008) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_CONTRAST_LIMIT_LEVEL \ + (VVCAM_ISP_CID_GTM_BASE + 0x0009) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_HLC_FACTOR \ + (VVCAM_ISP_CID_GTM_BASE + 0x000A) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_PRESERVE_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x000B) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_MAX_GAIN \ + (VVCAM_ISP_CID_GTM_BASE + 0x000C) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_MIN_GAIN \ + (VVCAM_ISP_CID_GTM_BASE + 0x000D) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_STRENGTH \ + (VVCAM_ISP_CID_GTM_BASE + 0x000E) +#define VVCAM_ISP_CID_GTM_AUTO_COLOR_WEIGHT (VVCAM_ISP_CID_GTM_BASE + 0x000F) +#define VVCAM_ISP_CID_GTM_AUTO_HIST_LUMA_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0010) +#define VVCAM_ISP_CID_GTM_AUTO_USER_CURVE (VVCAM_ISP_CID_GTM_BASE + 0x0011) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_MODE (VVCAM_ISP_CID_GTM_BASE + 0x0012) +#define VVCAM_ISP_CID_GTM_AUTO_EDR_LEVEL (VVCAM_ISP_CID_GTM_BASE + 0x0013) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_CONTRAST_LIMIT_LEVEL \ + (VVCAM_ISP_CID_GTM_BASE + 0x0014) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_THR_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0015) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0016) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_HLC_FACTOR \ + (VVCAM_ISP_CID_GTM_BASE + 0x0017) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_LUMA_PRESERVE_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0018) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_COMPRESS_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0019) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MAX_GAIN \ + (VVCAM_ISP_CID_GTM_BASE + 0x001A) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_MIN_GAIN \ + (VVCAM_ISP_CID_GTM_BASE + 0x001B) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_STRENGTH \ + (VVCAM_ISP_CID_GTM_BASE + 0x001C) +#define VVCAM_ISP_CID_GTM_AUTO_CURVE_HIST_DAMP_COEF \ + (VVCAM_ISP_CID_GTM_BASE + 0x001D) +#define VVCAM_ISP_CID_GTM_AUTO_EDR (VVCAM_ISP_CID_GTM_BASE + 0x001E) +#define VVCAM_ISP_CID_GTM_MANU_RGB_COEF (VVCAM_ISP_CID_GTM_BASE + 0x001F) +#define VVCAM_ISP_CID_GTM_MANU_LIGHTNESS_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0020) +#define VVCAM_ISP_CID_GTM_MANU_COLOR_WEIGHT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0021) +#define VVCAM_ISP_CID_GTM_MANU_BW_COR_MODE \ + (VVCAM_ISP_CID_GTM_BASE + 0x0022) +#define VVCAM_ISP_CID_GTM_MANU_BW_COR_MIN_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0023) +#define VVCAM_ISP_CID_GTM_MANU_BW_COR_MAX_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0024) +#define VVCAM_ISP_CID_GTM_MANU_BW_COR_DAMP_COEF \ + (VVCAM_ISP_CID_GTM_BASE + 0x0025) +#define VVCAM_ISP_CID_GTM_MANU_CURVE_SELECT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0026) +#define VVCAM_ISP_CID_GTM_MANU_CURVE_SHIFT_BIT \ + (VVCAM_ISP_CID_GTM_BASE + 0x0027) +#define VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_X_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0028) +#define VVCAM_ISP_CID_GTM_MANU_PWL_KNEE_Y_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x0029) +#define VVCAM_ISP_CID_GTM_MANU_PWL_MAX_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x002A) +#define VVCAM_ISP_CID_GTM_MANU_PWL_MIN_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x002B) +#define VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_X_LOG \ + (VVCAM_ISP_CID_GTM_BASE + 0x002C) +#define VVCAM_ISP_CID_GTM_MANU_LOG_KNEE_SLOPE \ + (VVCAM_ISP_CID_GTM_BASE + 0x002D) +#define VVCAM_ISP_CID_GTM_MANU_USER_CURVE (VVCAM_ISP_CID_GTM_BASE + 0x002E) +#define VVCAM_ISP_CID_GTM_HIST_STATISTIC_MIN \ + (VVCAM_ISP_CID_GTM_BASE + 0x002F) +#define VVCAM_ISP_CID_GTM_HIST_STATISTIC_MAX \ + (VVCAM_ISP_CID_GTM_BASE + 0x0030) +#define VVCAM_ISP_CID_GTM_HIST_STATISTIC_DATA \ + (VVCAM_ISP_CID_GTM_BASE + 0x0031) + +int vvcam_isp_gtm_ctrl_count(void); +int vvcam_isp_gtm_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.c new file mode 100644 index 0000000..83a5d8e --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.c @@ -0,0 +1,217 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_gwdr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_gwdr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GWDR_ENABLE: + case VVCAM_ISP_CID_GWDR_RESET: + case VVCAM_ISP_CID_GWDR_MANU_MODE: + case VVCAM_ISP_CID_GWDR_MANU_RGB_OFFSET: + case VVCAM_ISP_CID_GWDR_MANU_LUM_OFFSET: + case VVCAM_ISP_CID_GWDR_MANU_GAMMA: + case VVCAM_ISP_CID_GWDR_MANU_CURVE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_gwdr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_GWDR_ENABLE: + case VVCAM_ISP_CID_GWDR_RESET: + case VVCAM_ISP_CID_GWDR_MANU_MODE: + case VVCAM_ISP_CID_GWDR_MANU_RGB_OFFSET: + case VVCAM_ISP_CID_GWDR_MANU_LUM_OFFSET: + case VVCAM_ISP_CID_GWDR_MANU_GAMMA: + case VVCAM_ISP_CID_GWDR_MANU_CURVE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_gwdr_ctrl_ops = { + .s_ctrl = vvcam_isp_gwdr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_gwdr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_gwdr_ctrls[] = { + { + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + /*{ + // why enum type use 0x87A ?? + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_MANU_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_manu_mode", + .step = 1, + .min = 0, + .max = 1, + },*/ + { + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_MANU_RGB_OFFSET, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_manu_rgb_offset", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_MANU_LUM_OFFSET, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_manu_lum_offset", + .step = 1, + .min = 0, + .max = 4095, + .dims = {1, 0, 0, 0}, + }, + { + /* float 1.0 ~ 4.0 */ + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_MANU_GAMMA, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_manu_gamma", + .step = 1, + .min = 100, + .max = 400, + .def = 220, + }, + { + /* uint16_t 33x array */ + .ops = &vvcam_isp_gwdr_ctrl_ops, + .id = VVCAM_ISP_CID_GWDR_MANU_CURVE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_gwdr_auto_manu_curve", + .step = 1, + .min = 0, + .max = 4095, + .dims = {33, 0, 0, 0}, + }, +}; + +int vvcam_isp_gwdr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_gwdr_ctrls); +} + +int vvcam_isp_gwdr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_gwdr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_gwdr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp gwdr ctrl %s failed %d.\n", + vvcam_isp_gwdr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.h new file mode 100644 index 0000000..f490de8 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/gwdr/gwdr_v1/vvcam_isp_gwdr.h @@ -0,0 +1,68 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_GWDR_H__ +#define __VVCAM_ISP_GWDR_H__ + +#define VVCAM_ISP_CID_GWDR_ENABLE (VVCAM_ISP_CID_GWDR_BASE + 0x0000) +#define VVCAM_ISP_CID_GWDR_RESET (VVCAM_ISP_CID_GWDR_BASE + 0x0001) +#define VVCAM_ISP_CID_GWDR_MANU_MODE (VVCAM_ISP_CID_GWDR_BASE + 0x0002) +#define VVCAM_ISP_CID_GWDR_MANU_RGB_OFFSET (VVCAM_ISP_CID_GWDR_BASE + 0x0003) +#define VVCAM_ISP_CID_GWDR_MANU_LUM_OFFSET (VVCAM_ISP_CID_GWDR_BASE + 0x0004) +#define VVCAM_ISP_CID_GWDR_MANU_GAMMA (VVCAM_ISP_CID_GWDR_BASE + 0x0005) +#define VVCAM_ISP_CID_GWDR_MANU_CURVE (VVCAM_ISP_CID_GWDR_BASE + 0x0006) + +int vvcam_isp_gwdr_ctrl_count(void); +int vvcam_isp_gwdr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.c new file mode 100644 index 0000000..06bfd7d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.c @@ -0,0 +1,219 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_hdr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_hdr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_HDR_ENABLE: + case VVCAM_ISP_CID_HDR_RESET: + case VVCAM_ISP_CID_HDR_BYPASS_SELECT: + case VVCAM_ISP_CID_HDR_COLOR_WEIGHT: + case VVCAM_ISP_CID_HDR_RATIO: + case VVCAM_ISP_CID_HDR_TRANS_RANGE: + case VVCAM_ISP_CID_HDR_EXTEND_BIT: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_hdr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_HDR_ENABLE: + case VVCAM_ISP_CID_HDR_RESET: + case VVCAM_ISP_CID_HDR_BYPASS_SELECT: + case VVCAM_ISP_CID_HDR_COLOR_WEIGHT: + case VVCAM_ISP_CID_HDR_RATIO: + case VVCAM_ISP_CID_HDR_TRANS_RANGE: + case VVCAM_ISP_CID_HDR_EXTEND_BIT: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_hdr_ctrl_ops = { + .s_ctrl = vvcam_isp_hdr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_hdr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_hdr_ctrls[] = { + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_BYPASS_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_bypass_select", + .step = 1, + .min = 0, + .max = 2, + }, + { + /* uint8_t 3x array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_color_weight", + .step = 1, + .min = 0, + .max = 255, + .dims = {3, 0, 0, 0}, + }, + { + /* float 2x array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_RATIO, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_ratio", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {2, 0, 0, 0}, + }, + { + /* float 2x2 array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_TRANS_RANGE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_trans_range", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {2, 2, 0, 0}, + }, + { + /* int8_t 2x array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_EXTEND_BIT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_extend_bit", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {2, 0, 0, 0}, + }, +}; + +int vvcam_isp_hdr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_hdr_ctrls); +} + +int vvcam_isp_hdr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_hdr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_hdr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp hdr ctrl %s failed %d.\n", + vvcam_isp_hdr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.h new file mode 100644 index 0000000..2ab05a9 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v1_3/vvcam_isp_hdr.h @@ -0,0 +1,68 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_HDR_H__ +#define __VVCAM_ISP_HDR_H__ + +#define VVCAM_ISP_CID_HDR_ENABLE (VVCAM_ISP_CID_HDR_BASE + 0x0000) +#define VVCAM_ISP_CID_HDR_RESET (VVCAM_ISP_CID_HDR_BASE + 0x0001) +#define VVCAM_ISP_CID_HDR_BYPASS_SELECT (VVCAM_ISP_CID_HDR_BASE + 0x0002) +#define VVCAM_ISP_CID_HDR_COLOR_WEIGHT (VVCAM_ISP_CID_HDR_BASE + 0x0003) +#define VVCAM_ISP_CID_HDR_RATIO (VVCAM_ISP_CID_HDR_BASE + 0x0004) +#define VVCAM_ISP_CID_HDR_TRANS_RANGE (VVCAM_ISP_CID_HDR_BASE + 0x0005) +#define VVCAM_ISP_CID_HDR_EXTEND_BIT (VVCAM_ISP_CID_HDR_BASE + 0x0006) + +int vvcam_isp_hdr_ctrl_count(void); +int vvcam_isp_hdr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.c new file mode 100644 index 0000000..1d9b693 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_hdr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_hdr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_HDR_ENABLE: + case VVCAM_ISP_CID_HDR_RESET: + case VVCAM_ISP_CID_HDR_BYPASS_SELECT: + case VVCAM_ISP_CID_HDR_COLOR_WEIGHT: + case VVCAM_ISP_CID_HDR_RATIO: + case VVCAM_ISP_CID_HDR_TRANS_RANGE: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_hdr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_HDR_ENABLE: + case VVCAM_ISP_CID_HDR_RESET: + case VVCAM_ISP_CID_HDR_BYPASS_SELECT: + case VVCAM_ISP_CID_HDR_COLOR_WEIGHT: + case VVCAM_ISP_CID_HDR_RATIO: + case VVCAM_ISP_CID_HDR_TRANS_RANGE: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_hdr_ctrl_ops = { + .s_ctrl = vvcam_isp_hdr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_hdr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_hdr_ctrls[] = { + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_BYPASS_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_bypass_select", + .step = 1, + .min = 0, + .max = 3, + }, + { + /* uint8_t 3x array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_color_weight", + .step = 1, + .min = 0, + .max = 255, + .dims = {3, 0, 0, 0}, + }, + { + /* float 3x array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_RATIO, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_ratio", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {3, 0, 0, 0}, + }, + { + /* float 6x2 array */ + .ops = &vvcam_isp_hdr_ctrl_ops, + .id = VVCAM_ISP_CID_HDR_TRANS_RANGE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_hdr_trans_range", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {6, 2, 0, 0}, + }, +}; + +int vvcam_isp_hdr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_hdr_ctrls); +} + +int vvcam_isp_hdr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_hdr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_hdr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp hdr ctrl %s failed %d.\n", + vvcam_isp_hdr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.h new file mode 100644 index 0000000..c27ccb4 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/hdr/hdr_v3_1/vvcam_isp_hdr.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_HDR_H__ +#define __VVCAM_ISP_HDR_H__ + +#define VVCAM_ISP_CID_HDR_ENABLE (VVCAM_ISP_CID_HDR_BASE + 0x0000) +#define VVCAM_ISP_CID_HDR_RESET (VVCAM_ISP_CID_HDR_BASE + 0x0001) +#define VVCAM_ISP_CID_HDR_BYPASS_SELECT (VVCAM_ISP_CID_HDR_BASE + 0x0002) +#define VVCAM_ISP_CID_HDR_COLOR_WEIGHT (VVCAM_ISP_CID_HDR_BASE + 0x0003) +#define VVCAM_ISP_CID_HDR_RATIO (VVCAM_ISP_CID_HDR_BASE + 0x0004) +#define VVCAM_ISP_CID_HDR_TRANS_RANGE (VVCAM_ISP_CID_HDR_BASE + 0x0005) + +int vvcam_isp_hdr_ctrl_count(void); +int vvcam_isp_hdr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.c new file mode 100644 index 0000000..198b8ce --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.c @@ -0,0 +1,193 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_lsc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_lsc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_LSC_ENABLE: + case VVCAM_ISP_CID_LSC_RESET: + case VVCAM_ISP_CID_LSC_MODE: + case VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_DATA_TBL: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_lsc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_LSC_ENABLE: + case VVCAM_ISP_CID_LSC_RESET: + case VVCAM_ISP_CID_LSC_MODE: + case VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_DATA_TBL: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_lsc_ctrl_ops = { + .s_ctrl = vvcam_isp_lsc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_lsc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_lsc_ctrls[] = { + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_x_size_tbl", + .step = 1, + .min = 1, + .max = 0xFFFF, + .def = 1, + .dims = {8}, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_y_size_tbl", + .step = 1, + .min = 1, + .max = 0xFFFF, + .def = 1, + .dims = {8}, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_DATA_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_data_tbl", + .step = 1, + .min = 1024, + .max = 16383, + .def = 1024, + .dims = {4, 17, 17, 0}, + }, +}; + +int vvcam_isp_lsc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_lsc_ctrls); +} + +int vvcam_isp_lsc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_lsc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_lsc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp lsc ctrl %s failed %d.\n", + vvcam_isp_lsc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.h new file mode 100644 index 0000000..f4cdd1c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v1/vvcam_isp_lsc.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_LSC_H__ +#define __VVCAM_ISP_LSC_H__ + +#define VVCAM_ISP_CID_LSC_ENABLE (VVCAM_ISP_CID_LSC_BASE + 0x0000) +#define VVCAM_ISP_CID_LSC_RESET (VVCAM_ISP_CID_LSC_BASE + 0x0001) +#define VVCAM_ISP_CID_LSC_MODE (VVCAM_ISP_CID_LSC_BASE + 0x0002) +#define VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0007) +#define VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0008) +#define VVCAM_ISP_CID_LSC_MANU_DATA_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0009) + +int vvcam_isp_lsc_ctrl_count(void); +int vvcam_isp_lsc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.c new file mode 100644 index 0000000..afe5e7c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.c @@ -0,0 +1,258 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_lsc.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_lsc_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_LSC_ENABLE: + case VVCAM_ISP_CID_LSC_RESET: + case VVCAM_ISP_CID_LSC_MODE: + case VVCAM_ISP_CID_LSC_AUTO_LEVEL: + case VVCAM_ISP_CID_LSC_AUTO_DAMPING: + case VVCAM_ISP_CID_LSC_AUTO_GAIN: + case VVCAM_ISP_CID_LSC_AUTO_STRENGTH: + case VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_DATA_TBL: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_lsc_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_LSC_ENABLE: + case VVCAM_ISP_CID_LSC_RESET: + case VVCAM_ISP_CID_LSC_MODE: + case VVCAM_ISP_CID_LSC_AUTO_LEVEL: + case VVCAM_ISP_CID_LSC_AUTO_DAMPING: + case VVCAM_ISP_CID_LSC_AUTO_GAIN: + case VVCAM_ISP_CID_LSC_AUTO_STRENGTH: + case VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL: + case VVCAM_ISP_CID_LSC_MANU_DATA_TBL: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_lsc_ctrl_ops = { + .s_ctrl = vvcam_isp_lsc_s_ctrl, + .g_volatile_ctrl = vvcam_isp_lsc_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_lsc_ctrls[] = { + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* manual/auto */ + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + }, + { + /* float 0~1 */ + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_AUTO_DAMPING, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_auto_damping", + .step = 1, + .min = 0, + .max = 100, + }, + { + /* float 20x */ + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* float 20x 0~1 */ + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_AUTO_STRENGTH, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_auto_strength", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_x_size_tbl", + .step = 1, + .min = 1, + .max = 0xFFFF, + .def = 1, + .dims = {32}, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_y_size_tbl", + .step = 1, + .min = 1, + .max = 0xFFFF, + .def = 1, + .dims = {16}, + }, + { + .ops = &vvcam_isp_lsc_ctrl_ops, + .id = VVCAM_ISP_CID_LSC_MANU_DATA_TBL, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_lsc_manu_data_tbl", + .step = 1, + .min = 1024, + .max = 16383, + .def = 1024, + .dims = {4, 33, 33, 0}, + }, +}; + +int vvcam_isp_lsc_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_lsc_ctrls); +} + +int vvcam_isp_lsc_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_lsc_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_lsc_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp lsc ctrl %s failed %d.\n", + vvcam_isp_lsc_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.h new file mode 100644 index 0000000..1df051a --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/lsc/lsc_v3/vvcam_isp_lsc.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_LSC_H__ +#define __VVCAM_ISP_LSC_H__ + +#define VVCAM_ISP_CID_LSC_ENABLE (VVCAM_ISP_CID_LSC_BASE + 0x0000) +#define VVCAM_ISP_CID_LSC_RESET (VVCAM_ISP_CID_LSC_BASE + 0x0001) +#define VVCAM_ISP_CID_LSC_MODE (VVCAM_ISP_CID_LSC_BASE + 0x0002) +#define VVCAM_ISP_CID_LSC_AUTO_LEVEL (VVCAM_ISP_CID_LSC_BASE + 0x0003) +#define VVCAM_ISP_CID_LSC_AUTO_DAMPING (VVCAM_ISP_CID_LSC_BASE + 0x0004) +#define VVCAM_ISP_CID_LSC_AUTO_GAIN (VVCAM_ISP_CID_LSC_BASE + 0x0005) +#define VVCAM_ISP_CID_LSC_AUTO_STRENGTH (VVCAM_ISP_CID_LSC_BASE + 0x0006) +#define VVCAM_ISP_CID_LSC_MANU_X_SIZE_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0007) +#define VVCAM_ISP_CID_LSC_MANU_Y_SIZE_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0008) +#define VVCAM_ISP_CID_LSC_MANU_DATA_TBL (VVCAM_ISP_CID_LSC_BASE + 0x0009) + +int vvcam_isp_lsc_ctrl_count(void); +int vvcam_isp_lsc_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.c new file mode 100644 index 0000000..98d0e6d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.c @@ -0,0 +1,266 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_rgbir.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_rgbir_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_RGBIR_ENABLE: + case VVCAM_ISP_CID_RGBIR_RCCC_ENABLE: + case VVCAM_ISP_CID_RGBIR_RAW_OUT_ENABLE: + case VVCAM_ISP_CID_RGBIR_RESET: + case VVCAM_ISP_CID_RGBIR_CC_MATRIX: + case VVCAM_ISP_CID_RGBIR_DPCC_MIDDLE_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_DPCC_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_IR_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_L_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_OUT_PATTERN: + case VVCAM_ISP_CID_RGBIR_SP1_IR_SELECT: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_rgbir_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_RGBIR_ENABLE: + case VVCAM_ISP_CID_RGBIR_RCCC_ENABLE: + case VVCAM_ISP_CID_RGBIR_RAW_OUT_ENABLE: + case VVCAM_ISP_CID_RGBIR_RESET: + case VVCAM_ISP_CID_RGBIR_CC_MATRIX: + case VVCAM_ISP_CID_RGBIR_DPCC_MIDDLE_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_DPCC_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_IR_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_L_THRESHOLD: + case VVCAM_ISP_CID_RGBIR_OUT_PATTERN: + case VVCAM_ISP_CID_RGBIR_SP1_IR_SELECT: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_rgbir_ctrl_ops = { + .s_ctrl = vvcam_isp_rgbir_s_ctrl, + .g_volatile_ctrl = vvcam_isp_rgbir_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_rgbir_ctrls[] = { + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_RCCC_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_rccc_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_RAW_OUT_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_raw_out_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float array 12x [-4,4]*/ + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_CC_MATRIX, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_cc_matrix", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {12, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_DPCC_MIDDLE_THRESHOLD, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_dpcc_middle_threshold", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_DPCC_THRESHOLD, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_dpcc_threshold", + .step = 1, + .min = 0, + .max = 65535, + .dims = {4, 0, 0, 0}, + }, + { + /* 12bit: 4095 24bit: 16777215*/ + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_IR_THRESHOLD, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_ir_threshold", + .step = 1, + .min = 0, + .max = 16777215, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_L_THRESHOLD, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_l_threshold", + .step = 1, + .min = 0, + .max = 16777215, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_OUT_PATTERN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_out_pattern", + .step = 1, + .min = 0, + .max = 3, + }, + { + .ops = &vvcam_isp_rgbir_ctrl_ops, + .id = VVCAM_ISP_CID_RGBIR_SP1_IR_SELECT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_rgbir_sp1_ir_select", + .step = 1, + .min = 0, + .max = 1, + }, +}; + +int vvcam_isp_rgbir_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_rgbir_ctrls); +} + +int vvcam_isp_rgbir_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_rgbir_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_rgbir_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp rgbir ctrl %s failed %d.\n", + vvcam_isp_rgbir_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; + +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.h new file mode 100644 index 0000000..8ba2b3c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/rgbir/rgbir_v2/vvcam_isp_rgbir.h @@ -0,0 +1,73 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_RGBIR_H__ +#define __VVCAM_ISP_RGBIR_H__ + +#define VVCAM_ISP_CID_RGBIR_ENABLE (VVCAM_ISP_CID_RGBIR_BASE + 0x0000) +#define VVCAM_ISP_CID_RGBIR_RCCC_ENABLE (VVCAM_ISP_CID_RGBIR_BASE + 0x0001) +#define VVCAM_ISP_CID_RGBIR_RAW_OUT_ENABLE (VVCAM_ISP_CID_RGBIR_BASE + 0x0002) +#define VVCAM_ISP_CID_RGBIR_RESET (VVCAM_ISP_CID_RGBIR_BASE + 0x0003) +#define VVCAM_ISP_CID_RGBIR_CC_MATRIX (VVCAM_ISP_CID_RGBIR_BASE + 0x0004) +#define VVCAM_ISP_CID_RGBIR_DPCC_MIDDLE_THRESHOLD \ + (VVCAM_ISP_CID_RGBIR_BASE + 0x0005) +#define VVCAM_ISP_CID_RGBIR_DPCC_THRESHOLD (VVCAM_ISP_CID_RGBIR_BASE + 0x0006) +#define VVCAM_ISP_CID_RGBIR_IR_THRESHOLD (VVCAM_ISP_CID_RGBIR_BASE + 0x0007) +#define VVCAM_ISP_CID_RGBIR_L_THRESHOLD (VVCAM_ISP_CID_RGBIR_BASE + 0x0008) +#define VVCAM_ISP_CID_RGBIR_OUT_PATTERN (VVCAM_ISP_CID_RGBIR_BASE + 0x0009) +#define VVCAM_ISP_CID_RGBIR_SP1_IR_SELECT (VVCAM_ISP_CID_RGBIR_BASE + 0x000A) + +int vvcam_isp_rgbir_ctrl_count(void); +int vvcam_isp_rgbir_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.c new file mode 100644 index 0000000..f50ff02 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.c @@ -0,0 +1,387 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" + +#if defined(ISP_AE_V3) +#include "vvcam_isp_ae.h" +#endif + +#if defined(ISP_AWB_V3) +#include "vvcam_isp_awb.h" +#endif + +#if defined(ISP_GC_V1) || defined(ISP_GC_V2) +#include "vvcam_isp_gc.h" +#endif + +#if defined(ISP_2DNR_V3) || defined(ISP_2DNR_V5_2) +#include "vvcam_isp_2dnr.h" +#endif + +#if defined(ISP_EE_V1) || defined(ISP_EE_V2) +#include "vvcam_isp_ee.h" +#endif + +#if defined(ISP_CPROC) +#include "vvcam_isp_cproc.h" +#endif + +#if defined(ISP_WDR_V3) || defined(ISP_WDR_V5_2) +#include "vvcam_isp_wdr.h" +#endif + +#if defined(ISP_BLS) +#include "vvcam_isp_bls.h" +#endif + +#if defined(ISP_CCM) +#include "vvcam_isp_ccm.h" +#endif + +#if defined(ISP_DPCC) +#include "vvcam_isp_dpcc.h" +#endif + +#if defined(ISP_GE) +#include "vvcam_isp_ge.h" +#endif + +#if defined(ISP_LSC_V1) || defined(ISP_LSC_V3) +#include "vvcam_isp_lsc.h" +#endif + +#if defined(ISP_WB) +#include "vvcam_isp_wb.h" +#endif + +#if defined(ISP_3DNR_V1_2) || defined(ISP_3DNR_V2_1) +#include "vvcam_isp_3dnr.h" +#endif + +#if defined(ISP_AF_V3) +#include "vvcam_isp_af.h" +#endif + +#if defined(ISP_AFM_V1) +#include "vvcam_isp_afm.h" +#endif + +#if defined(ISP_DMSC_V1) || defined(ISP_DMSC_V2) +#include "vvcam_isp_dmsc.h" +#endif + +#if defined(ISP_EXP_V2) +#include "vvcam_isp_exp.h" +#endif + +#if defined(ISP_GTM_V1) +#include "vvcam_isp_gtm.h" +#endif + +#if defined(ISP_HDR_V1_3) || defined(ISP_HDR_V3_1) +#include "vvcam_isp_hdr.h" +#endif + +#if defined(ISP_RGBIR_V2) +#include "vvcam_isp_rgbir.h" +#endif + +#if defined(ISP_DG) +#include "vvcam_isp_dg.h" +#endif + +#if defined(ISP_CPD) +#include "vvcam_isp_cpd.h" +#endif + +#if defined(ISP_DPF_V1) +#include "vvcam_isp_dpf.h" +#endif + +#if defined(ISP_CNR_V1) +#include "vvcam_isp_cnr.h" +#endif + +#if defined(ISP_GWDR_V1) +#include "vvcam_isp_gwdr.h" +#endif + +int vvcam_isp_ctrl_init(struct vvcam_isp_dev *isp_dev) +{ + uint32_t ctrl_count = 0; + +#if defined(ISP_AE_V3) + ctrl_count += vvcam_isp_ae_ctrl_count(); +#endif + +#if defined(ISP_AWB_V3) + ctrl_count += vvcam_isp_awb_ctrl_count(); +#endif + +#if defined(ISP_GC_V1) || defined(ISP_GC_V2) + ctrl_count += vvcam_isp_gc_ctrl_count(); +#endif + +#if defined(ISP_2DNR_V3) || defined(ISP_2DNR_V5_2) + ctrl_count += vvcam_isp_2dnr_ctrl_count(); +#endif + +#if defined(ISP_EE_V1) || defined(ISP_EE_V2) + ctrl_count += vvcam_isp_ee_ctrl_count(); +#endif + +#if defined(ISP_CPROC) + ctrl_count += vvcam_isp_cproc_ctrl_count(); +#endif + +#if defined(ISP_WDR_V3) || defined(ISP_WDR_V5_2) + ctrl_count += vvcam_isp_wdr_ctrl_count(); +#endif + +#if defined(ISP_BLS) + ctrl_count += vvcam_isp_bls_ctrl_count(); +#endif + +#if defined(ISP_CCM) + ctrl_count += vvcam_isp_ccm_ctrl_count(); +#endif + +#if defined(ISP_DPCC) + ctrl_count += vvcam_isp_dpcc_ctrl_count(); +#endif + +#if defined(ISP_GE) + ctrl_count += vvcam_isp_ge_ctrl_count(); +#endif + +#if defined(ISP_LSC_V1) || defined(ISP_LSC_V3) + ctrl_count += vvcam_isp_lsc_ctrl_count(); +#endif + +#if defined(ISP_WB) + ctrl_count += vvcam_isp_wb_ctrl_count(); +#endif + +#if defined(ISP_3DNR_V2_1) + ctrl_count += vvcam_isp_3dnr_ctrl_count(); +#endif + +#if defined(ISP_AF_V3) + ctrl_count += vvcam_isp_af_ctrl_count(); +#endif + +#if defined(ISP_AFM_V1) + ctrl_count += vvcam_isp_afm_ctrl_count(); +#endif + +#if defined(ISP_DMSC_V1) || defined(ISP_DMSC_V2) + ctrl_count += vvcam_isp_dmsc_ctrl_count(); +#endif + +#if defined(ISP_EXP_V2) + ctrl_count += vvcam_isp_exp_ctrl_count(); +#endif + +#if defined(ISP_GTM_V1) + ctrl_count += vvcam_isp_gtm_ctrl_count(); +#endif + +#if defined(ISP_HDR_V1_3) || defined(ISP_HDR_V3_1) + ctrl_count += vvcam_isp_hdr_ctrl_count(); +#endif + +#if defined(ISP_RGBIR_V2) + ctrl_count += vvcam_isp_rgbir_ctrl_count(); +#endif + +#if defined(ISP_DG) + ctrl_count += vvcam_isp_dg_ctrl_count(); +#endif + +#if defined(ISP_CPD) + ctrl_count += vvcam_isp_cpd_ctrl_count(); +#endif + +#if defined(ISP_DPF_V1) + ctrl_count += vvcam_isp_dpf_ctrl_count(); +#endif + +#if defined(ISP_CNR_V1) + ctrl_count += vvcam_isp_cnr_ctrl_count(); +#endif + +#if defined(ISP_GWDR_V1) + ctrl_count += vvcam_isp_gwdr_ctrl_count(); +#endif + + v4l2_ctrl_handler_init(&isp_dev->ctrl_handler, ctrl_count); + +#if defined(ISP_AE_V3) + vvcam_isp_ae_ctrl_create(isp_dev); +#endif + +#if defined(ISP_AWB_V3) + vvcam_isp_awb_ctrl_create(isp_dev); +#endif + +#if defined(ISP_GC_V1) || defined(ISP_GC_V2) + vvcam_isp_gc_ctrl_create(isp_dev); +#endif + +#if defined(ISP_2DNR_V3) || defined(ISP_2DNR_V5_2) + vvcam_isp_2dnr_ctrl_create(isp_dev); +#endif + +#if defined(ISP_EE_V1) || defined(ISP_EE_V2) + vvcam_isp_ee_ctrl_create(isp_dev); +#endif + +#if defined(ISP_CPROC) + vvcam_isp_cproc_ctrl_create(isp_dev); +#endif + +#if defined(ISP_WDR_V3) || defined(ISP_WDR_V5_2) + vvcam_isp_wdr_ctrl_create(isp_dev); +#endif + +#if defined(ISP_BLS) + vvcam_isp_bls_ctrl_create(isp_dev); +#endif + +#if defined(ISP_CCM) + vvcam_isp_ccm_ctrl_create(isp_dev); +#endif + +#if defined(ISP_DPCC) + vvcam_isp_dpcc_ctrl_create(isp_dev); +#endif + +#if defined(ISP_GE) + vvcam_isp_ge_ctrl_create(isp_dev); +#endif + +#if defined(ISP_LSC_V1) || defined(ISP_LSC_V3) + vvcam_isp_lsc_ctrl_create(isp_dev); +#endif + +#if defined(ISP_WB) + vvcam_isp_wb_ctrl_create(isp_dev); +#endif + +#if defined(ISP_3DNR_V2_1) + vvcam_isp_3dnr_ctrl_create(isp_dev); +#endif + +#if defined(ISP_AF_V3) + vvcam_isp_af_ctrl_create(isp_dev); +#endif + +#if defined(ISP_AFM_V1) + vvcam_isp_afm_ctrl_create(isp_dev); +#endif + +#if defined(ISP_DMSC_V1) || defined(ISP_DMSC_V2) + vvcam_isp_dmsc_ctrl_create(isp_dev); +#endif + +#if defined(ISP_EXP_V2) + vvcam_isp_exp_ctrl_create(isp_dev); +#endif + +#if defined(ISP_GTM_V1) + vvcam_isp_gtm_ctrl_create(isp_dev); +#endif + +#if defined(ISP_HDR_V1_3) || defined(ISP_HDR_V3_1) + vvcam_isp_hdr_ctrl_create(isp_dev); +#endif + +#if defined(ISP_RGBIR_V2) + vvcam_isp_rgbir_ctrl_create(isp_dev); +#endif + +#if defined(ISP_DG) + vvcam_isp_dg_ctrl_create(isp_dev); +#endif + +#if defined(ISP_CPD) + vvcam_isp_cpd_ctrl_create(isp_dev); +#endif + +#if defined(ISP_DPF_V1) + vvcam_isp_dpf_ctrl_create(isp_dev); +#endif + +#if defined(ISP_CNR_V1) + vvcam_isp_cnr_ctrl_create(isp_dev); +#endif + +#if defined(ISP_GWDR_V1) + vvcam_isp_gwdr_ctrl_create(isp_dev); +#endif + + isp_dev->sd.ctrl_handler = &isp_dev->ctrl_handler; + + return 0; +} + +int vvcam_isp_ctrl_destroy(struct vvcam_isp_dev *isp_dev) +{ + v4l2_ctrl_handler_free(&isp_dev->ctrl_handler); + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.h new file mode 100644 index 0000000..05e3059 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/vvcam_isp_ctrl.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_CTRL_H__ +#define __VVCAM_ISP_CTRL_H__ +#include "vvcam_isp_driver.h" + +#define VVCAM_ISP_CID_AE_BASE (V4L2_CID_USER_BASE + 0x2000) +#define VVCAM_ISP_CID_AWB_BASE (V4L2_CID_USER_BASE + 0x2100) +#define VVCAM_ISP_CID_GC_BASE (V4L2_CID_USER_BASE + 0x2200) +#define VVCAM_ISP_CID_2DNR_BASE (V4L2_CID_USER_BASE + 0x2300) +#define VVCAM_ISP_CID_3DNR_BASE (V4L2_CID_USER_BASE + 0x2400) +#define VVCAM_ISP_CID_BLS_BASE (V4L2_CID_USER_BASE + 0x2500) +#define VVCAM_ISP_CID_CCM_BASE (V4L2_CID_USER_BASE + 0x2600) +#define VVCAM_ISP_CID_CNR_BASE (V4L2_CID_USER_BASE + 0x2700) +#define VVCAM_ISP_CID_CPD_BASE (V4L2_CID_USER_BASE + 0x2800) +#define VVCAM_ISP_CID_CPROC_BASE (V4L2_CID_USER_BASE + 0x2900) +#define VVCAM_ISP_CID_DG_BASE (V4L2_CID_USER_BASE + 0x2A00) +#define VVCAM_ISP_CID_DMSC_BASE (V4L2_CID_USER_BASE + 0x2B00) +#define VVCAM_ISP_CID_DPCC_BASE (V4L2_CID_USER_BASE + 0x2C00) +#define VVCAM_ISP_CID_DPF_BASE (V4L2_CID_USER_BASE + 0x2D00) +#define VVCAM_ISP_CID_EE_BASE (V4L2_CID_USER_BASE + 0x2E00) +#define VVCAM_ISP_CID_GE_BASE (V4L2_CID_USER_BASE + 0x2F00) +#define VVCAM_ISP_CID_GTM_BASE (V4L2_CID_USER_BASE + 0x3000) +#define VVCAM_ISP_CID_HDR_BASE (V4L2_CID_USER_BASE + 0x3100) +#define VVCAM_ISP_CID_LSC_BASE (V4L2_CID_USER_BASE + 0x3200) +#define VVCAM_ISP_CID_LUT3D_BASE (V4L2_CID_USER_BASE + 0x3300) +#define VVCAM_ISP_CID_PDAF_BASE (V4L2_CID_USER_BASE + 0x3400) +#define VVCAM_ISP_CID_AF_BASE (V4L2_CID_USER_BASE + 0x3500) +#define VVCAM_ISP_CID_RGBIR_BASE (V4L2_CID_USER_BASE + 0x3600) +#define VVCAM_ISP_CID_WB_BASE (V4L2_CID_USER_BASE + 0x3700) +#define VVCAM_ISP_CID_WDR_BASE (V4L2_CID_USER_BASE + 0x3800) +#define VVCAM_ISP_CID_YNR_BASE (V4L2_CID_USER_BASE + 0x3900) +#define VVCAM_ISP_CID_AFM_BASE (V4L2_CID_USER_BASE + 0x3A00) +#define VVCAM_ISP_CID_EXP_BASE (V4L2_CID_USER_BASE + 0x3B00) +#define VVCAM_ISP_CID_GWDR_BASE (V4L2_CID_USER_BASE + 0x3C00) + +int vvcam_isp_ctrl_init(struct vvcam_isp_dev *isp_dev); +int vvcam_isp_ctrl_destroy(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.c new file mode 100644 index 0000000..3264c58 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.c @@ -0,0 +1,201 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_wb.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_wb_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WB_ENABLE: + case VVCAM_ISP_CID_WB_RESET: + case VVCAM_ISP_CID_WB_R_GAIN: + case VVCAM_ISP_CID_WB_GR_GAIN: + case VVCAM_ISP_CID_WB_GB_GAIN: + case VVCAM_ISP_CID_WB_B_GAIN: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_wb_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WB_ENABLE: + case VVCAM_ISP_CID_WB_RESET: + case VVCAM_ISP_CID_WB_R_GAIN: + case VVCAM_ISP_CID_WB_GR_GAIN: + case VVCAM_ISP_CID_WB_GB_GAIN: + case VVCAM_ISP_CID_WB_B_GAIN: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_wb_ctrl_ops = { + .s_ctrl = vvcam_isp_wb_s_ctrl, + .g_volatile_ctrl = vvcam_isp_wb_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_wb_ctrls[] = { + { + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + /* float 0.0 ~ 15.0 */ + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_R_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_r_gain", + .step = 1, + .min = 0, + .max = 3840, + }, + { + /* float 0.0 ~ 15.0 */ + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_GR_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_gr_gain", + .step = 1, + .min = 0, + .max = 3840, + }, + { + /* float 0.0 ~ 15.0 */ + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_GB_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_gb_gain", + .step = 1, + .min = 0, + .max = 3840, + }, + { + /* float 0.0 ~ 15.0 */ + .ops = &vvcam_isp_wb_ctrl_ops, + .id = VVCAM_ISP_CID_WB_B_GAIN, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wb_b_gain", + .step = 1, + .min = 0, + .max = 3840, + }, +}; + +int vvcam_isp_wb_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_wb_ctrls); +} + +int vvcam_isp_wb_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_wb_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_wb_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp wb ctrl %s failed %d.\n", + vvcam_isp_wb_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.h new file mode 100644 index 0000000..d07b5fc --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wb/wb/vvcam_isp_wb.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_WB_H__ +#define __VVCAM_ISP_WB_H__ + +#define VVCAM_ISP_CID_WB_ENABLE (VVCAM_ISP_CID_WB_BASE + 0x0000) +#define VVCAM_ISP_CID_WB_RESET (VVCAM_ISP_CID_WB_BASE + 0x0001) +#define VVCAM_ISP_CID_WB_R_GAIN (VVCAM_ISP_CID_WB_BASE + 0x0002) +#define VVCAM_ISP_CID_WB_GR_GAIN (VVCAM_ISP_CID_WB_BASE + 0x0003) +#define VVCAM_ISP_CID_WB_GB_GAIN (VVCAM_ISP_CID_WB_BASE + 0x0004) +#define VVCAM_ISP_CID_WB_B_GAIN (VVCAM_ISP_CID_WB_BASE + 0x0005) + +int vvcam_isp_wb_ctrl_count(void); +int vvcam_isp_wb_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.c new file mode 100644 index 0000000..f34a518 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.c @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_wdr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_wdr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WDR_ENABLE: + case VVCAM_ISP_CID_WDR_RESET: + case VVCAM_ISP_CID_WDR_MANU_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_GLOBAL_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_MAX_GAIN: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_wdr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WDR_ENABLE: + case VVCAM_ISP_CID_WDR_RESET: + case VVCAM_ISP_CID_WDR_MANU_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_GLOBAL_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_MAX_GAIN: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_wdr_ctrl_ops = { + .s_ctrl = vvcam_isp_wdr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_wdr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_wdr_ctrls[] = { + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_GLOBAL_STRENGTH, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_global_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_MAX_GAIN, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_max_gain", + .step = 1, + .min = 0, + .max = 128, + .dims = {1, 0, 0, 0}, + }, +}; + +int vvcam_isp_wdr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_wdr_ctrls); +} + +int vvcam_isp_wdr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_wdr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_wdr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp wdr ctrl %s failed %d.\n", + vvcam_isp_wdr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.h new file mode 100644 index 0000000..aed995b --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v3/vvcam_isp_wdr.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_WDR_H__ +#define __VVCAM_ISP_WDR_H__ + +#define VVCAM_ISP_CID_WDR_ENABLE (VVCAM_ISP_CID_WDR_BASE + 0x0000) +#define VVCAM_ISP_CID_WDR_RESET (VVCAM_ISP_CID_WDR_BASE + 0x0001) +#define VVCAM_ISP_CID_WDR_MANU_STRENGTH (VVCAM_ISP_CID_WDR_BASE + 0x0002) +#define VVCAM_ISP_CID_WDR_MANU_GLOBAL_STRENGTH \ + (VVCAM_ISP_CID_WDR_BASE + 0x0003) +#define VVCAM_ISP_CID_WDR_MANU_MAX_GAIN (VVCAM_ISP_CID_WDR_BASE + 0x0004) + +int vvcam_isp_wdr_ctrl_count(void); +int vvcam_isp_wdr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.c b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.c new file mode 100644 index 0000000..8759873 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.c @@ -0,0 +1,1372 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_wdr.h" +#include "vvcam_isp_event.h" + +static int vvcam_isp_wdr_s_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WDR_ENABLE: + case VVCAM_ISP_CID_WDR_RESET: + case VVCAM_ISP_CID_WDR_HALO_COLOR_FADING_ENABLE: + case VVCAM_ISP_CID_WDR_MODE: + case VVCAM_ISP_CID_WDR_AUTO_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_GAIN: + case VVCAM_ISP_CID_WDR_AUTO_H_STRENGTH: + case VVCAM_ISP_CID_WDR_AUTO_L_STRENGTH: + case VVCAM_ISP_CID_WDR_AUTO_ENTROPY_BASE: + case VVCAM_ISP_CID_WDR_AUTO_LUMA_THR: + case VVCAM_ISP_CID_WDR_AUTO_ENTROPY_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_SAT_RANGE: + case VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_DOWN: + case VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_UP: + case VVCAM_ISP_CID_WDR_AUTO_DEGAMMA: + case VVCAM_ISP_CID_WDR_AUTO_HLC_BASE_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_L_THR: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_H_THR: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_R_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_G_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_B_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_Y_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_C_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_M_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_EDR_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_EDR: + case VVCAM_ISP_CID_WDR_AUTO_CONTRAST: + case VVCAM_ISP_CID_WDR_AUTO_FIXED_WEIGHT: + case VVCAM_ISP_CID_WDR_AUTO_LOG_WEIGHT: + case VVCAM_ISP_CID_WDR_AUTO_ANCHOR_X_LOG: + case VVCAM_ISP_CID_WDR_AUTO_ANCHOR_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_MAX_GAIN: + case VVCAM_ISP_CID_WDR_AUTO_HLC_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_ENABLE_TBL: + case VVCAM_ISP_CID_WDR_AUTO_COLOR_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_H_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_L_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_CONTRAST: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_ENABLE: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_BASE: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_SLOPE: + case VVCAM_ISP_CID_WDR_MANU_LUMA_THR: + case VVCAM_ISP_CID_WDR_MANU_FLAT_MODE: + case VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL_INC: + case VVCAM_ISP_CID_WDR_MANU_DARK_ATT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_FIXED_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_WDR_CURVE: + case VVCAM_ISP_CID_WDR_MANU_LOG_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_ANCHOR_X_LOG: + case VVCAM_ISP_CID_WDR_MANU_ANCHOR_SLOPE: + case VVCAM_ISP_CID_WDR_MANU_RATIO: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_THR: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_L_SAT: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_L_FAC: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_H_FAC: + case VVCAM_ISP_CID_WDR_MANU_GLOBAL_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_DEGAMMA: + case VVCAM_ISP_CID_WDR_MANU_MAX_GAIN: + case VVCAM_ISP_CID_WDR_MANU_MIN_GAIN: + case VVCAM_ISP_CID_WDR_MANU_H_DIFF: + case VVCAM_ISP_CID_WDR_MANU_L_DIFF: + case VVCAM_ISP_CID_WDR_MANU_SAT_RANGE: + case VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_DOWN: + case VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_UP: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_L_THR: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_H_THR: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_R_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_G_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_B_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_Y_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_C_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_M_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_HLC_BASE_LOG: + case VVCAM_ISP_CID_WDR_MANU_HLC_SLOPE: + // case VVCAM_ISP_CID_WDR_MANU_LIGHT_ENABLE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_MODE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_COEF: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MAX: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MIN: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_COEF: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MAX: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MIN: + case VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_DEC_LIMIT: + case VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_INC_LIMIT: + case VVCAM_ISP_CID_WDR_MANU_DAMP_FILTER_SIZE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_H_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_DAMP_L_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_RGB_COEF: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_COLOR_WEIGHT: + ret = vvcam_isp_s_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static int vvcam_isp_wdr_g_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = + container_of(ctrl->handler, struct vvcam_isp_dev, ctrl_handler); + + switch (ctrl->id) + { + case VVCAM_ISP_CID_WDR_ENABLE: + case VVCAM_ISP_CID_WDR_RESET: + case VVCAM_ISP_CID_WDR_HALO_COLOR_FADING_ENABLE: + case VVCAM_ISP_CID_WDR_MODE: + case VVCAM_ISP_CID_WDR_AUTO_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_GAIN: + case VVCAM_ISP_CID_WDR_AUTO_H_STRENGTH: + case VVCAM_ISP_CID_WDR_AUTO_L_STRENGTH: + case VVCAM_ISP_CID_WDR_AUTO_ENTROPY_BASE: + case VVCAM_ISP_CID_WDR_AUTO_LUMA_THR: + case VVCAM_ISP_CID_WDR_AUTO_ENTROPY_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_SAT_RANGE: + case VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_DOWN: + case VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_UP: + case VVCAM_ISP_CID_WDR_AUTO_DEGAMMA: + case VVCAM_ISP_CID_WDR_AUTO_HLC_BASE_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_L_THR: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_H_THR: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_R_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_G_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_B_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_Y_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_C_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_M_THR_LOG: + case VVCAM_ISP_CID_WDR_AUTO_EDR_LEVEL: + case VVCAM_ISP_CID_WDR_AUTO_EDR: + case VVCAM_ISP_CID_WDR_AUTO_CONTRAST: + case VVCAM_ISP_CID_WDR_AUTO_FIXED_WEIGHT: + case VVCAM_ISP_CID_WDR_AUTO_LOG_WEIGHT: + case VVCAM_ISP_CID_WDR_AUTO_ANCHOR_X_LOG: + case VVCAM_ISP_CID_WDR_AUTO_ANCHOR_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_MAX_GAIN: + case VVCAM_ISP_CID_WDR_AUTO_HLC_SLOPE: + case VVCAM_ISP_CID_WDR_AUTO_LIGHT_ENABLE_TBL: + case VVCAM_ISP_CID_WDR_AUTO_COLOR_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_H_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_L_STRENGTH: + case VVCAM_ISP_CID_WDR_MANU_CONTRAST: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_ENABLE: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_BASE: + case VVCAM_ISP_CID_WDR_MANU_ENTROPY_SLOPE: + case VVCAM_ISP_CID_WDR_MANU_LUMA_THR: + case VVCAM_ISP_CID_WDR_MANU_FLAT_MODE: + case VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL_INC: + case VVCAM_ISP_CID_WDR_MANU_DARK_ATT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_FIXED_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_WDR_CURVE: + case VVCAM_ISP_CID_WDR_MANU_LOG_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_ANCHOR_X_LOG: + case VVCAM_ISP_CID_WDR_MANU_ANCHOR_SLOPE: + case VVCAM_ISP_CID_WDR_MANU_RATIO: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_THR: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_L_SAT: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_L_FAC: + case VVCAM_ISP_CID_WDR_MANU_CURVE2_H_FAC: + case VVCAM_ISP_CID_WDR_MANU_GLOBAL_FLAT_LEVEL: + case VVCAM_ISP_CID_WDR_MANU_DEGAMMA: + case VVCAM_ISP_CID_WDR_MANU_MAX_GAIN: + case VVCAM_ISP_CID_WDR_MANU_MIN_GAIN: + case VVCAM_ISP_CID_WDR_MANU_H_DIFF: + case VVCAM_ISP_CID_WDR_MANU_L_DIFF: + case VVCAM_ISP_CID_WDR_MANU_SAT_RANGE: + case VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_DOWN: + case VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_UP: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_L_THR: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_H_THR: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_R_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_G_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_B_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_Y_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_C_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_M_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_HLC_BASE_LOG: + case VVCAM_ISP_CID_WDR_MANU_HLC_SLOPE: + // case VVCAM_ISP_CID_WDR_MANU_LIGHT_ENABLE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_MODE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_COEF: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MAX: + case VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MIN: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_COEF: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MAX: + case VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MIN: + case VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_DEC_LIMIT: + case VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_INC_LIMIT: + case VVCAM_ISP_CID_WDR_MANU_DAMP_FILTER_SIZE: + case VVCAM_ISP_CID_WDR_MANU_DAMP_H_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_DAMP_L_THR_LOG: + case VVCAM_ISP_CID_WDR_MANU_RGB_COEF: + case VVCAM_ISP_CID_WDR_MANU_LIGHT_WEIGHT: + case VVCAM_ISP_CID_WDR_MANU_COLOR_WEIGHT: + ret = vvcam_isp_g_ctrl_event(isp_dev, isp_dev->ctrl_pad, ctrl); + break; + + default: + dev_err(isp_dev->dev, "unknow v4l2 ctrl id %d\n", ctrl->id); + return -EACCES; + } + + return ret; +} + +static const struct v4l2_ctrl_ops vvcam_isp_wdr_ctrl_ops = { + .s_ctrl = vvcam_isp_wdr_s_ctrl, + .g_volatile_ctrl = vvcam_isp_wdr_g_ctrl, +}; + +const struct v4l2_ctrl_config vvcam_isp_wdr_ctrls[] = { + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_RESET, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_reset", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_HALO_COLOR_FADING_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_halo_color_fading_en", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MODE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_level", + .step = 1, + .min = 1, + .max = 20, + .def = 1, + .dims = {1} + }, + { + /* float 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_GAIN, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_gain", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20} + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_H_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_high_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_L_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_low_strength", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_ENTROPY_BASE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_entropy_base", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20} + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LUMA_THR, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_luma_threshold", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20} + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_ENTROPY_SLOPE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_entropy_slope", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_FLAT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_flat_level", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_SAT_RANGE, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_sat_range", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_sat_thr_gain_down", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20}, + }, + { + /* uint16_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_UP, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_sat_thr_gain_up", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_DEGAMMA, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_degamma", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_HLC_BASE_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_hlc_base_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_L_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_sat_low_thr", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* uint8_t 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_H_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_sat_high_thr", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20} + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_R_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_r_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4} + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_G_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_g_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4} + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_B_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_b_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4} + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_Y_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_y_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4} + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_C_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_c_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4}, + }, + { + /* float 20x4 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_M_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_m_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 4}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_EDR_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_edr_level", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1}, + }, + { + /* float 20x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_EDR, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_edr", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20}, + }, + { + /* uint16_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_CONTRAST, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_contrast", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 20}, + }, + { + /* uint16_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_FIXED_WEIGHT, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_fixed_weight", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 20}, + }, + { + /* uint8_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LOG_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_log_weight", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20, 20}, + }, + { + /* float 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_ANCHOR_X_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_anchor_x_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {20, 20}, + }, + { + /* uint16_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_ANCHOR_SLOPE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_anchor_slope", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 20}, + }, + { + /* uint16_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_MAX_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_max_gain", + .step = 1, + .min = 0, + .max = 0xFFFF, + .dims = {20, 20}, + }, + { + /* uint8_t 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_HLC_SLOPE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_hlc_slope", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {20, 20}, + }, + { + /* bool 20x20 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_LIGHT_ENABLE_TBL, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_light_enable_tbl", + .step = 1, + .min = 0, + .max = 1, + .dims = {20, 20}, + }, + { + /* uint8_t 20x20x3 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_AUTO_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_auto_color_weight", + .step = 1, + .min = 0, + .max = 1, + .dims = {20, 20, 3}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_H_STRENGTH, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_high_strength", + .step = 1, + .min = 0, + .max = 128, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_L_STRENGTH, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_low_strength", + .step = 1, + .min = 0, + .max = 256, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_CONTRAST, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_contrast", + .step = 1, + .min = -1023, + .max = 1023, + .def = 500, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_ENTROPY_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_entropy_enable", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_ENTROPY_BASE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_entropy_base", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1} + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_ENTROPY_SLOPE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_entropy_slope", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1} + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LUMA_THR, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_luma_thr", + .step = 1, + .min = 1, + .max = 1023, + .def = 1, + .dims = {1} + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_FLAT_MODE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_flat_mode", + .step = 1, + .min = 0, + .max = 1, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_flat_level", + .step = 1, + .min = 0, + .max = 15, + .dims = {1}, + }, + { + /* uint8_t 4x17 array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL_INC, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_flat_level_inc", + .step = 1, + .min = 0, + .max = 15, + .dims = {4,17}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DARK_ATT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_dark_atten_level", + .step = 1, + .min = 0, + .max = 14, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_FIXED_WEIGHT, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_fixed_weight", + .step = 1, + .min = 0, + .max = 1023, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_WDR_CURVE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_wdr_curve", + .step = 1, + .min = 0, + .max = 2, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LOG_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_log_weight", + .step = 1, + .min = 0, + .max = 10, + .dims = {1}, + }, + { + /* float 0.0 ~ 20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_ANCHOR_X_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_anchor_x_log", + .step = 1, + .min = 0, + .max = 2000, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_ANCHOR_SLOPE, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_anchor_slope", + .step = 1, + .min = 0, + .max = 4096, + .def = 16, + .dims = {1}, + }, + { + /* float 0.0 ~ 2.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_RATIO, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_actual_ratio", + .step = 1, + .min = 0, + .max = 200, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_CURVE2_THR, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_curve2_threshold", + .step = 1, + .min = 0, + .max = 100, + }, + { + /* float 0.0 ~ 1.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_CURVE2_L_SAT, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_curve2_low_sat", + .step = 1, + .min = 0, + .max = 100, + }, + { + /* float 0.0 ~ 2.2 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_CURVE2_L_FAC, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_curve2_low_fac", + .step = 1, + .min = 0, + .max = 220, + }, + { + /* float 0.0 ~ 2.2 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_CURVE2_H_FAC, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_curve2_high_fac", + .step = 1, + .min = 0, + .max = 220, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_GLOBAL_FLAT_LEVEL, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_global_flat_lv", + .step = 1, + .min = 0, + .max = 15, + .dims = {1}, + }, + { + /* float 0~3.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DEGAMMA, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_degamma", + .step = 1, + .min = 0, + .max = 300, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_MAX_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_max_gain", + .step = 1, + .min = 0, + .max = 4096, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_MIN_GAIN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_min_gain", + .step = 1, + .min = 0, + .max = 4096, + .dims = {1}, + }, + { + /* float 0~100.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_H_DIFF, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_high_diff", + .step = 1, + .min = 0, + .max = 10000, + }, + { + /* float 0~100.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_L_DIFF, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_low_diff", + .step = 1, + .min = 0, + .max = 10000, + }, + { + /* float 0~1 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_SAT_RANGE, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_sat_range", + .step = 1, + .min = 0, + .max = 100, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_DOWN, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_sat_thr_gain_down", + .step = 1, + .min = 0, + .max = 256, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_UP, + .type = V4L2_CTRL_TYPE_U16, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_sat_thr_gain_up", + .step = 1, + .min = 0, + .max = 256, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_L_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_sat_l_thr", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_H_THR, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_sat_h_thr", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_R_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_r_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_G_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_g_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_B_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_b_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_Y_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_y_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_C_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_c_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float 4x array 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_M_THR_LOG, + .type = V4L2_CTRL_TYPE_U32, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_m_thr_log", + .step = 1, + .min = 0, + .max = 0xFFFFFFFF, + .dims = {4}, + }, + { + /* float */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_HLC_BASE_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_hlc_base_log", + .step = 1, + .min = 0, + .max = 1900, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_HLC_SLOPE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_hlc_slope", + .step = 1, + .min = 0, + .max = 0xFF, + .dims = {1}, + }, +/* + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_ENABLE, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_light_enable", + .step = 1, + .min = 0, + .max = 1, + }, +*/ + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_MODE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_mode", + .step = 1, + .min = 0, + .max = 1, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_COEF, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_curve_coef", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MAX, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_curve_max", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MIN, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_curve_min", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_COEF, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_avg_coef", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MAX, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_avg_max", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MIN, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_avg_min", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_DEC_LIMIT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_coef_dec_lt", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_INC_LIMIT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_coef_inc_lt", + .step = 1, + .min = 0, + .max = 127, + .dims = {1}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_FILTER_SIZE, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_filter_size", + .step = 1, + .min = 0, + .max = 16, + .dims = {1}, + }, + { + /* float 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_H_THR_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_h_thr_log", + .step = 1, + .min = 0, + .max = 2000, + }, + { + /* float 0~20.0 */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_DAMP_L_THR_LOG, + .type = V4L2_CTRL_TYPE_INTEGER, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_damp_l_thr_log", + .step = 1, + .min = 0, + .max = 2000, + }, + { + /* uint8_t 3x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_RGB_COEF, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_rgb_coef", + .step = 1, + .min = 0, + .max = 128, + .dims = {3}, + }, + { + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_LIGHT_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_lightness_weight", + .step = 1, + .min = 0, + .max = 128, + .dims = {1}, + }, + { + /* uint8_t 3x array */ + .ops = &vvcam_isp_wdr_ctrl_ops, + .id = VVCAM_ISP_CID_WDR_MANU_COLOR_WEIGHT, + .type = V4L2_CTRL_TYPE_U8, + .flags= V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_EXECUTE_ON_WRITE, + .name = "isp_wdr_manu_color_weight", + .step = 1, + .min = 0, + .max = 128, + .dims = {3}, + }, +}; + +int vvcam_isp_wdr_ctrl_count(void) +{ + return ARRAY_SIZE(vvcam_isp_wdr_ctrls); +} + +int vvcam_isp_wdr_ctrl_create(struct vvcam_isp_dev *isp_dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(vvcam_isp_wdr_ctrls); i++) { + v4l2_ctrl_new_custom(&isp_dev->ctrl_handler, + &vvcam_isp_wdr_ctrls[i], NULL); + if (isp_dev->ctrl_handler.error) { + dev_err( isp_dev->dev, "reigster isp wdr ctrl %s failed %d.\n", + vvcam_isp_wdr_ctrls[i].name, isp_dev->ctrl_handler.error); + } + } + + return 0; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.h b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.h new file mode 100644 index 0000000..8eba320 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/isp_ctrl/wdr/wdr_v5_2/vvcam_isp_wdr.h @@ -0,0 +1,211 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_WDR_H__ +#define __VVCAM_ISP_WDR_H__ + +#define VVCAM_ISP_CID_WDR_ENABLE (VVCAM_ISP_CID_WDR_BASE + 0x0000) +#define VVCAM_ISP_CID_WDR_RESET (VVCAM_ISP_CID_WDR_BASE + 0x0001) +#define VVCAM_ISP_CID_WDR_HALO_COLOR_FADING_ENABLE \ + (VVCAM_ISP_CID_WDR_BASE + 0x0002) +#define VVCAM_ISP_CID_WDR_MODE (VVCAM_ISP_CID_WDR_BASE + 0x0003) +#define VVCAM_ISP_CID_WDR_AUTO_LEVEL (VVCAM_ISP_CID_WDR_BASE + 0x0004) +#define VVCAM_ISP_CID_WDR_AUTO_GAIN (VVCAM_ISP_CID_WDR_BASE + 0x0005) +#define VVCAM_ISP_CID_WDR_AUTO_H_STRENGTH (VVCAM_ISP_CID_WDR_BASE + 0x0006) +#define VVCAM_ISP_CID_WDR_AUTO_L_STRENGTH (VVCAM_ISP_CID_WDR_BASE + 0x0007) +#define VVCAM_ISP_CID_WDR_AUTO_ENTROPY_BASE (VVCAM_ISP_CID_WDR_BASE + 0x0008) +#define VVCAM_ISP_CID_WDR_AUTO_LUMA_THR (VVCAM_ISP_CID_WDR_BASE + 0x0009) +#define VVCAM_ISP_CID_WDR_AUTO_ENTROPY_SLOPE \ + (VVCAM_ISP_CID_WDR_BASE + 0x000A) +#define VVCAM_ISP_CID_WDR_AUTO_FLAT_LEVEL (VVCAM_ISP_CID_WDR_BASE + 0x000B) +#define VVCAM_ISP_CID_WDR_AUTO_SAT_RANGE (VVCAM_ISP_CID_WDR_BASE + 0x000C) +#define VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_DOWN \ + (VVCAM_ISP_CID_WDR_BASE + 0x000D) +#define VVCAM_ISP_CID_WDR_AUTO_SAT_THR_GAIN_UP \ + (VVCAM_ISP_CID_WDR_BASE + 0x000E) +#define VVCAM_ISP_CID_WDR_AUTO_DEGAMMA (VVCAM_ISP_CID_WDR_BASE + 0x000F) +#define VVCAM_ISP_CID_WDR_AUTO_HLC_BASE_LOG (VVCAM_ISP_CID_WDR_BASE + 0x0010) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_L_THR \ + (VVCAM_ISP_CID_WDR_BASE + 0x0011) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_SAT_H_THR \ + (VVCAM_ISP_CID_WDR_BASE + 0x0012) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_R_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0013) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_G_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0014) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_B_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0015) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_Y_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0016) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_C_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0017) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_M_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0018) +#define VVCAM_ISP_CID_WDR_AUTO_EDR_LEVEL (VVCAM_ISP_CID_WDR_BASE + 0x0019) +#define VVCAM_ISP_CID_WDR_AUTO_EDR (VVCAM_ISP_CID_WDR_BASE + 0x001A) +#define VVCAM_ISP_CID_WDR_AUTO_CONTRAST (VVCAM_ISP_CID_WDR_BASE + 0x001B) +#define VVCAM_ISP_CID_WDR_AUTO_FIXED_WEIGHT (VVCAM_ISP_CID_WDR_BASE + 0x001C) +#define VVCAM_ISP_CID_WDR_AUTO_LOG_WEIGHT (VVCAM_ISP_CID_WDR_BASE + 0x001D) +#define VVCAM_ISP_CID_WDR_AUTO_ANCHOR_X_LOG (VVCAM_ISP_CID_WDR_BASE + 0x001E) +#define VVCAM_ISP_CID_WDR_AUTO_ANCHOR_SLOPE \ + (VVCAM_ISP_CID_WDR_BASE + 0x001F) +#define VVCAM_ISP_CID_WDR_AUTO_MAX_GAIN (VVCAM_ISP_CID_WDR_BASE + 0x0020) +#define VVCAM_ISP_CID_WDR_AUTO_HLC_SLOPE (VVCAM_ISP_CID_WDR_BASE + 0x0021) +#define VVCAM_ISP_CID_WDR_AUTO_LIGHT_ENABLE_TBL \ + (VVCAM_ISP_CID_WDR_BASE + 0x0022) +#define VVCAM_ISP_CID_WDR_AUTO_COLOR_WEIGHT (VVCAM_ISP_CID_WDR_BASE + 0x0023) + +#define VVCAM_ISP_CID_WDR_MANU_STRENGTH (VVCAM_ISP_CID_WDR_BASE + 0x0024) +#define VVCAM_ISP_CID_WDR_MANU_H_STRENGTH \ + (VVCAM_ISP_CID_WDR_BASE + 0x0025) +#define VVCAM_ISP_CID_WDR_MANU_L_STRENGTH \ + (VVCAM_ISP_CID_WDR_BASE + 0x0026) +#define VVCAM_ISP_CID_WDR_MANU_CONTRAST (VVCAM_ISP_CID_WDR_BASE + 0x0027) +#define VVCAM_ISP_CID_WDR_MANU_ENTROPY_ENABLE \ + (VVCAM_ISP_CID_WDR_BASE + 0x0028) +#define VVCAM_ISP_CID_WDR_MANU_ENTROPY_BASE \ + (VVCAM_ISP_CID_WDR_BASE + 0x0029) +#define VVCAM_ISP_CID_WDR_MANU_ENTROPY_SLOPE \ + (VVCAM_ISP_CID_WDR_BASE + 0x002A) +#define VVCAM_ISP_CID_WDR_MANU_LUMA_THR (VVCAM_ISP_CID_WDR_BASE + 0x002B) +#define VVCAM_ISP_CID_WDR_MANU_FLAT_MODE (VVCAM_ISP_CID_WDR_BASE + 0x002C) +#define VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL (VVCAM_ISP_CID_WDR_BASE + 0x002D) +#define VVCAM_ISP_CID_WDR_MANU_FLAT_LEVEL_INC \ + (VVCAM_ISP_CID_WDR_BASE + 0x002E) +#define VVCAM_ISP_CID_WDR_MANU_DARK_ATT_LEVEL \ + (VVCAM_ISP_CID_WDR_BASE + 0x002F) +#define VVCAM_ISP_CID_WDR_MANU_FIXED_WEIGHT \ + (VVCAM_ISP_CID_WDR_BASE + 0x0030) +#define VVCAM_ISP_CID_WDR_MANU_WDR_CURVE (VVCAM_ISP_CID_WDR_BASE + 0x0031) +#define VVCAM_ISP_CID_WDR_MANU_LOG_WEIGHT (VVCAM_ISP_CID_WDR_BASE + 0x0032) +#define VVCAM_ISP_CID_WDR_MANU_ANCHOR_X_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0033) +#define VVCAM_ISP_CID_WDR_MANU_ANCHOR_SLOPE \ + (VVCAM_ISP_CID_WDR_BASE + 0x0034) +#define VVCAM_ISP_CID_WDR_MANU_RATIO (VVCAM_ISP_CID_WDR_BASE + 0x0035) +#define VVCAM_ISP_CID_WDR_MANU_CURVE2_THR (VVCAM_ISP_CID_WDR_BASE + 0x0036) +#define VVCAM_ISP_CID_WDR_MANU_CURVE2_L_SAT \ + (VVCAM_ISP_CID_WDR_BASE + 0x0037) +#define VVCAM_ISP_CID_WDR_MANU_CURVE2_L_FAC \ + (VVCAM_ISP_CID_WDR_BASE + 0x0038) +#define VVCAM_ISP_CID_WDR_MANU_CURVE2_H_FAC \ + (VVCAM_ISP_CID_WDR_BASE + 0x0039) +#define VVCAM_ISP_CID_WDR_MANU_GLOBAL_FLAT_LEVEL \ + (VVCAM_ISP_CID_WDR_BASE + 0x003A) +#define VVCAM_ISP_CID_WDR_MANU_DEGAMMA (VVCAM_ISP_CID_WDR_BASE + 0x003B) +#define VVCAM_ISP_CID_WDR_MANU_MAX_GAIN (VVCAM_ISP_CID_WDR_BASE + 0x003C) +#define VVCAM_ISP_CID_WDR_MANU_MIN_GAIN (VVCAM_ISP_CID_WDR_BASE + 0x003D) +#define VVCAM_ISP_CID_WDR_MANU_H_DIFF (VVCAM_ISP_CID_WDR_BASE + 0x003E) +#define VVCAM_ISP_CID_WDR_MANU_L_DIFF (VVCAM_ISP_CID_WDR_BASE + 0x003F) +#define VVCAM_ISP_CID_WDR_MANU_SAT_RANGE (VVCAM_ISP_CID_WDR_BASE + 0x0040) +#define VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_DOWN \ + (VVCAM_ISP_CID_WDR_BASE + 0x0041) +#define VVCAM_ISP_CID_WDR_MANU_SAT_THR_GAIN_UP \ + (VVCAM_ISP_CID_WDR_BASE + 0x0042) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_L_THR \ + (VVCAM_ISP_CID_WDR_BASE + 0x0043) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_SAT_H_THR \ + (VVCAM_ISP_CID_WDR_BASE + 0x0044) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_R_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0045) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_G_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0046) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_B_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0047) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_Y_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0048) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_C_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0049) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_M_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x004A) +#define VVCAM_ISP_CID_WDR_MANU_HLC_BASE_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x004B) +#define VVCAM_ISP_CID_WDR_MANU_HLC_SLOPE \ + (VVCAM_ISP_CID_WDR_BASE + 0x004C) +/* +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_ENABLE \ + (VVCAM_ISP_CID_WDR_BASE + 0x004D) +*/ +#define VVCAM_ISP_CID_WDR_MANU_DAMP_MODE (VVCAM_ISP_CID_WDR_BASE + 0x004E) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_COEF \ + (VVCAM_ISP_CID_WDR_BASE + 0x004F) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MAX \ + (VVCAM_ISP_CID_WDR_BASE + 0x0050) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_CURVE_MIN \ + (VVCAM_ISP_CID_WDR_BASE + 0x0051) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_COEF \ + (VVCAM_ISP_CID_WDR_BASE + 0x0052) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MAX \ + (VVCAM_ISP_CID_WDR_BASE + 0x0053) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_AVG_MIN \ + (VVCAM_ISP_CID_WDR_BASE + 0x0054) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_DEC_LIMIT \ + (VVCAM_ISP_CID_WDR_BASE + 0x0055) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_COEF_INC_LIMIT \ + (VVCAM_ISP_CID_WDR_BASE + 0x0056) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_FILTER_SIZE \ + (VVCAM_ISP_CID_WDR_BASE + 0x0057) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_H_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0058) +#define VVCAM_ISP_CID_WDR_MANU_DAMP_L_THR_LOG \ + (VVCAM_ISP_CID_WDR_BASE + 0x0059) +#define VVCAM_ISP_CID_WDR_MANU_RGB_COEF (VVCAM_ISP_CID_WDR_BASE + 0x005A) +#define VVCAM_ISP_CID_WDR_MANU_LIGHT_WEIGHT \ + (VVCAM_ISP_CID_WDR_BASE + 0x005B) +#define VVCAM_ISP_CID_WDR_MANU_COLOR_WEIGHT \ + (VVCAM_ISP_CID_WDR_BASE + 0x005C) + +int vvcam_isp_wdr_ctrl_count(void); +int vvcam_isp_wdr_ctrl_create(struct vvcam_isp_dev *isp_dev); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.c b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.c new file mode 100644 index 0000000..2ae8941 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.c @@ -0,0 +1,970 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "linux/dev_printk.h" +#include "media/v4l2-async.h" +#include "vvcam_v4l2_common.h" +#include "vvcam_isp_driver.h" +#include "vvcam_isp_event.h" +#include "vvcam_isp_ctrl.h" +#include "vvcam_isp_procfs.h" +#ifdef VVCAM_PLATFORM_REGISTER +#include "vvcam_isp_platform.h" +#endif + +#ifdef VVCAM_PLATFORM_REGISTER +#define VVCAM_ISP_DEFAULT_SENSOR "imx335" +#define VVCAM_ISP_DEFAULT_SENSOR_MODE 0 +#define VVCAM_ISP_DEFAULT_SENSOR_XML "OV2775.xml" +#define VVCAM_ISP_DEFAULT_SENSOR_MANU_JSON "vvbcfg/simulator/ISP8000_V2201/ISP8000_V2201.manual_ext.json" +#define VVCAM_ISP_DEFAULT_SENSOR_AUTO_JSON "vvbcfg/simulator/ISP8000_V2201/ISP8000_V2201.auto.json" +#endif + +struct vvcam_isp_mbus_fmt vvcam_isp_mp_fmts[] = { + { + .code = MEDIA_BUS_FMT_YUYV8_2X8, /*NV16*/ + }, + { + .code = MEDIA_BUS_FMT_YUYV8_1_5X8, /*NV12*/ + }, + { + .code = MEDIA_BUS_FMT_YUYV8_1X16, /*YUYV*/ + } +}; + +struct vvcam_isp_mbus_fmt vvcam_isp_sp_fmts[] = { + { + .code = MEDIA_BUS_FMT_YUYV8_2X8, /*NV16*/ + }, + { + .code = MEDIA_BUS_FMT_YUYV8_1_5X8, /*NV12*/ + }, + { + .code = MEDIA_BUS_FMT_YUYV8_1X16, /*YUYV*/ + } +}; + +static int vvcam_isp_querycap(struct v4l2_subdev *sd, void *arg) +{ + struct v4l2_capability *cap = (struct v4l2_capability *)arg; + + strlcpy(cap->driver, sd->name, sizeof(cap->driver)); + strlcpy(cap->card, sd->name, sizeof(cap->card)); + snprintf(cap->bus_info, sizeof(cap->bus_info), + "platform:%s", sd->name); + + return 0; +} + +static int vvcam_isp_pad_requbufs(struct v4l2_subdev *sd, void *arg) +{ + struct vvcam_pad_reqbufs *pad_requbufs = (struct vvcam_pad_reqbufs *)arg; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + + return vvcam_isp_requebus_event(isp_dev, pad_requbufs->pad, pad_requbufs->num_buffers); +} + +static int vvcam_isp_pad_buf_queue(struct v4l2_subdev *sd, void *arg) +{ + struct vvcam_pad_buf *pad_buf = (struct vvcam_pad_buf *)arg; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + int ret; + unsigned long flags; + struct vvcam_isp_pad_data *cur_pad; + + cur_pad = &isp_dev->pad_data[pad_buf->pad]; + + spin_lock_irqsave(&cur_pad->qlock, flags); + + list_add_tail(&pad_buf->buf->list, &cur_pad->queue); + + spin_unlock_irqrestore(&cur_pad->qlock, flags); + + ret = vvcam_isp_qbuf_event(isp_dev, pad_buf->pad, pad_buf->buf); + + return ret; +} + +static int vvcam_isp_pad_s_stream(struct v4l2_subdev *sd, void *arg) +{ + struct vvcam_pad_stream_status *pad_stream = (struct vvcam_pad_stream_status *)arg; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + int ret; + + isp_dev->pad_data[pad_stream->pad].stream = pad_stream->status; + + if (pad_stream->status == 0 ) { + INIT_LIST_HEAD(&isp_dev->pad_data[pad_stream->pad].queue); + } + ret = vvcam_isp_s_stream_event(isp_dev, pad_stream->pad, pad_stream->status); + + return ret; +} + +static int vvcam_isp_buf_done(struct v4l2_subdev *sd, void *arg) +{ + struct vvcam_isp_buf ubuf; + struct vvcam_isp_pad_data *cur_pad; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + unsigned long flags; + struct vvcam_vb2_buffer *pos, *next; + struct vvcam_vb2_buffer *buf = NULL; + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct video_device *video; + struct vvcam_pad_buf pad_buf; + int ret; + + memcpy(&ubuf, arg, sizeof(struct vvcam_isp_buf)); + + cur_pad = &isp_dev->pad_data[ubuf.pad]; + + if (list_empty(&cur_pad->queue) || (cur_pad->stream == 0)) + return -EINVAL; + + spin_lock_irqsave(&cur_pad->qlock, flags); + list_for_each_entry_safe(pos, next, &cur_pad->queue, list) { + if (pos && (pos->sequence == ubuf.index)) { + buf = pos; + list_del(&pos->list); + break; + } + } + spin_unlock_irqrestore(&cur_pad->qlock, flags); + + if (buf) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&isp_dev->pads[ubuf.pad]); +#else + pad = media_entity_remote_pad(&isp_dev->pads[ubuf.pad]); +#endif + if (!pad) + return -EINVAL; + if (is_media_entity_v4l2_subdev(pad->entity)) { + + subdev = media_entity_to_v4l2_subdev(pad->entity); + pad_buf.pad = pad->index; + pad_buf.buf = buf; + ret = v4l2_subdev_call(subdev, core, ioctl, VVCAM_PAD_BUF_DONE, &pad_buf); + if (ret) + return ret; + + } else if (is_media_entity_v4l2_video_device(pad->entity)){ + video = media_entity_to_video_device(pad->entity); + if (buf->sequence < video->queue->num_buffers) { + if (buf->vb.vb2_buf.state == VB2_BUF_STATE_ACTIVE) { + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + } + } + } + } + + return 0; +} + +static int vvcam_isp_queryctrl(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_queryctrl *pad_querctrl = + (struct vvcam_pad_queryctrl *)arg; + ret = v4l2_queryctrl(&isp_dev->ctrl_handler, pad_querctrl->query_ctrl); + + return ret; +} + +static int vvcam_isp_query_ext_ctrl(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_query_ext_ctrl *pad_quer_ext_ctrl = + (struct vvcam_pad_query_ext_ctrl *)arg; + ret = v4l2_query_ext_ctrl(&isp_dev->ctrl_handler, + pad_quer_ext_ctrl->query_ext_ctrl); + + return ret; +} + +static int vvcam_isp_querymenu(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_querymenu *pad_quermenu = + (struct vvcam_pad_querymenu *)arg; + ret = v4l2_querymenu(&isp_dev->ctrl_handler, + pad_quermenu->querymenu); + + return ret; +} + +static int vvcam_isp_g_ctrl(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_control *pad_ctrl = (struct vvcam_pad_control *)arg; + + mutex_lock(&isp_dev->ctrl_lock); + isp_dev->ctrl_pad = pad_ctrl->pad; + ret = v4l2_g_ctrl(&isp_dev->ctrl_handler, pad_ctrl->control); + mutex_unlock(&isp_dev->ctrl_lock); + + return ret; +} + +static int vvcam_isp_s_ctrl(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_control *pad_ctrl = (struct vvcam_pad_control *)arg; + + mutex_lock(&isp_dev->ctrl_lock); + isp_dev->ctrl_pad = pad_ctrl->pad; + ret = v4l2_s_ctrl(NULL, &isp_dev->ctrl_handler, pad_ctrl->control); + mutex_unlock(&isp_dev->ctrl_lock); + + return ret; +} + +static int vvcam_isp_g_ext_ctrls(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_ext_controls *pad_ext_ctrls = + (struct vvcam_pad_ext_controls *)arg; + + mutex_lock(&isp_dev->ctrl_lock); + isp_dev->ctrl_pad = pad_ext_ctrls->pad; + ret = v4l2_g_ext_ctrls(&isp_dev->ctrl_handler, sd->devnode, + sd->v4l2_dev->mdev, + pad_ext_ctrls->ext_controls); + mutex_unlock(&isp_dev->ctrl_lock); + + return ret; +} + +static int vvcam_isp_s_ext_ctrls(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_ext_controls *pad_ext_ctrls = + (struct vvcam_pad_ext_controls *)arg; + + mutex_lock(&isp_dev->ctrl_lock); + isp_dev->ctrl_pad = pad_ext_ctrls->pad; + ret = v4l2_s_ext_ctrls(NULL, &isp_dev->ctrl_handler, sd->devnode, + sd->v4l2_dev->mdev, + pad_ext_ctrls->ext_controls); + mutex_unlock(&isp_dev->ctrl_lock); + + return ret; +} + +static int vvcam_isp_try_ext_ctrls(struct v4l2_subdev *sd,void *arg) +{ + int ret; + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_pad_ext_controls *pad_ext_ctrls = + (struct vvcam_pad_ext_controls *)arg; + ret = v4l2_try_ext_ctrls(&isp_dev->ctrl_handler, sd->devnode, + sd->v4l2_dev->mdev, + pad_ext_ctrls->ext_controls); + + return ret; +} + +static long vvcam_isp_priv_ioctl(struct v4l2_subdev *sd, + unsigned int cmd, void *arg) +{ + int ret = -EINVAL; + switch (cmd) { + case VIDIOC_QUERYCAP: + ret = vvcam_isp_querycap(sd, arg); + break; + case VVCAM_PAD_REQUBUFS: + ret = vvcam_isp_pad_requbufs(sd, arg); + break; + case VVCAM_PAD_BUF_QUEUE: + ret = vvcam_isp_pad_buf_queue(sd, arg); + break; + case VVCAM_PAD_S_STREAM: + ret = vvcam_isp_pad_s_stream(sd, arg); + break; + case VVCAM_ISP_IOC_BUFDONE: + ret = vvcam_isp_buf_done(sd, arg); + break; + case VVCAM_PAD_QUERYCTRL: + ret = vvcam_isp_queryctrl(sd, arg); + break; + case VVCAM_PAD_QUERY_EXT_CTRL: + ret = vvcam_isp_query_ext_ctrl(sd, arg); + break; + case VVCAM_PAD_G_CTRL: + ret = vvcam_isp_g_ctrl(sd, arg); + break; + case VVCAM_PAD_S_CTRL: + ret = vvcam_isp_s_ctrl(sd, arg); + break; + case VVCAM_PAD_G_EXT_CTRLS: + ret = vvcam_isp_g_ext_ctrls(sd, arg); + break; + case VVCAM_PAD_S_EXT_CTRLS: + ret = vvcam_isp_s_ext_ctrls(sd, arg); + break; + case VVCAM_PAD_TRY_EXT_CTRLS: + ret = vvcam_isp_try_ext_ctrls(sd, arg); + break; + case VVCAM_PAD_QUERYMENU: + ret = vvcam_isp_querymenu(sd, arg); + break; + default: + break; + } + + return ret; +} + +int vvcam_isp_subscribe_event(struct v4l2_subdev *sd, + struct v4l2_fh *fh, + struct v4l2_event_subscription *sub) +{ + switch (sub->type) { + case V4L2_EVENT_CTRL: + return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub); + case VVCAM_ISP_DEAMON_EVENT: + return v4l2_event_subscribe(fh, sub, 2, NULL); + default: + return -EINVAL; + } + +} + +static struct v4l2_subdev_core_ops vvcam_isp_core_ops = { + .ioctl = vvcam_isp_priv_ioctl, + .subscribe_event = vvcam_isp_subscribe_event, + .unsubscribe_event = v4l2_event_subdev_unsubscribe, +}; + +static struct v4l2_subdev_video_ops vvcam_isp_video_ops = { + /*.s_stream = vvcam_isp_s_stream,*/ +}; + +static int vvcam_isp_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_format *format) +{ + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + uint32_t w, h; + uint32_t sink_pad_index; + struct vvcam_isp_pad_data *cur_pad = &isp_dev->pad_data[format->pad]; + struct vvcam_isp_pad_data *sink_pad; + struct vvcam_isp_pad_data *source_pad; + int i; + int ret; + + sink_pad_index = format->pad - (format->pad % VVCAM_ISP_CHN_MAX); + sink_pad = &isp_dev->pad_data[sink_pad_index]; + + if (sink_pad == cur_pad) { + cur_pad->sink_detected = 1; + cur_pad->format = format->format; + for (i = 1; i < VVCAM_ISP_CHN_MAX; i++) { + source_pad = &isp_dev->pad_data[sink_pad_index + i]; + source_pad->sink_detected = 1; + source_pad->format = format->format; + source_pad->format.code = source_pad->mbus_fmt[0].code; + source_pad->format.field = V4L2_FIELD_NONE; + source_pad->format.quantization = V4L2_QUANTIZATION_DEFAULT; + source_pad->format.colorspace = V4L2_COLORSPACE_DEFAULT; + } + + return 0; + } + + w = ALIGN(format->format.width, VVCAM_ISP_WIDTH_ALIGN); + h = ALIGN(format->format.height, VVCAM_ISP_HEIGHT_ALIGN); + w = clamp_t(uint32_t, w, VVCAM_ISP_WIDTH_MIN, sink_pad->format.width); + h = clamp_t(uint32_t, h, VVCAM_ISP_HEIGHT_MIN, sink_pad->format.height); + + format->format.width = w; + format->format.height = h; + + for (i = 0; i < cur_pad->num_formats; i++) { + if (format->format.code == cur_pad->mbus_fmt[i].code) + break; + } + + if (i >= cur_pad->num_formats) { + format->format.code = cur_pad->mbus_fmt[0].code; + } + + ret = vvcam_isp_set_fmt_event(isp_dev, format->pad, &format->format); + if (ret) + return ret; + + cur_pad->format = format->format; + + return 0; +} + +static int vvcam_isp_get_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_format *format) +{ + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_isp_pad_data *pad_data = &isp_dev->pad_data[format->pad]; + + if (pad_data->sink_detected) { + format->format = pad_data->format; + } else { + return -EINVAL; + } + + return 0; +} + +static int vvcam_isp_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) +{ + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + struct vvcam_isp_pad_data *pad_data = &isp_dev->pad_data[code->pad]; + + if (code->index >= pad_data->num_formats) { + return -EINVAL; + } + + code->code = pad_data->mbus_fmt[code->index].code; + + return 0; +} + +static const struct v4l2_subdev_pad_ops vvcam_isp_pad_ops = { + .set_fmt = vvcam_isp_set_fmt, + .get_fmt = vvcam_isp_get_fmt, + .enum_mbus_code = vvcam_isp_enum_mbus_code, +}; + +struct v4l2_subdev_ops vvcam_isp_subdev_ops = { + .core = &vvcam_isp_core_ops, + .video = &vvcam_isp_video_ops, + .pad = &vvcam_isp_pad_ops, +}; + +static int vvcam_isp_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + + mutex_lock(&isp_dev->mlock); + + isp_dev->refcnt++; + pm_runtime_get_sync(sd->dev); + + mutex_unlock(&isp_dev->mlock); + return 0; +} + +static int vvcam_isp_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + struct vvcam_isp_dev *isp_dev = v4l2_get_subdevdata(sd); + + mutex_lock(&isp_dev->mlock); + + isp_dev->refcnt--; + pm_runtime_put_sync(sd->dev); + + mutex_unlock(&isp_dev->mlock); + + return 0; +} + + +static struct v4l2_subdev_internal_ops vvcam_isp_internal_ops = { + .open = vvcam_isp_open, + .close = vvcam_isp_close, +}; + +static int vvcam_isp_link_setup(struct media_entity *entity, + const struct media_pad *local, + const struct media_pad *remote, u32 flags) +{ + return 0; +} + +static const struct media_entity_operations vvcam_isp_entity_ops = { + .link_setup = vvcam_isp_link_setup, + .link_validate = v4l2_subdev_link_validate, + .get_fwnode_pad = v4l2_subdev_get_fwnode_pad_1_to_1, + +}; + +static int vvcam_isp_notifier_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, + struct v4l2_async_connection *asc) +{ + int ret = 0; + struct vvcam_isp_dev *isp_dev = container_of(notifier, + struct vvcam_isp_dev, notifier); + struct device *dev = isp_dev->dev; + + struct fwnode_handle *ep = NULL; + struct v4l2_fwnode_link link; + struct media_entity *source, *sink; + unsigned int source_pad, sink_pad; + + while(1) { + ep = fwnode_graph_get_next_endpoint(sd->fwnode, ep); + if (!ep) + break; + + ret = v4l2_fwnode_parse_link(ep, &link); + if (ret < 0) { + dev_err(dev, "failed to parse link for %pOF: %d\n", + to_of_node(ep), ret); + continue; + } + + if (sd->entity.pads[link.local_port].flags == MEDIA_PAD_FL_SINK) + continue; + + source = &sd->entity; + source_pad = link.remote_port; + sink = &isp_dev->sd.entity; + sink_pad = link.local_port; + v4l2_fwnode_put_link(&link); + ret = media_create_pad_link(source, source_pad, + sink, sink_pad, MEDIA_LNK_FL_ENABLED); + if (ret) { + dev_err(dev, "failed to create %s:%u -> %s:%u link\n", + source->name, source_pad, + sink->name, sink_pad); + break; + } + + } + + fwnode_handle_put(ep); + + return ret; +} + +static void vvcam_isp_notifier_unbound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, + struct v4l2_async_connection *asc) +{ + return; +} + +static const struct v4l2_async_notifier_operations vvcam_isp_notify_ops = { + .bound = vvcam_isp_notifier_bound, + .unbind = vvcam_isp_notifier_unbound, +}; + +static int vvcam_isp_async_notifier(struct vvcam_isp_dev *isp_dev) +{ + struct fwnode_handle *ep; + struct fwnode_handle *remote_ep; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + struct v4l2_async_connection *asc; +#else + struct v4l2_async_subdev asd; +#endif + struct device *dev = isp_dev->dev; + int ret = 0; + int pad = 0; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_subdev_nf_init(&isp_dev->notifier, &isp_dev->sd); +#else + v4l2_async_notifier_init(&isp_dev->notifier); +#endif + + isp_dev->notifier.ops = &vvcam_isp_notify_ops; + + if (dev_fwnode(isp_dev->dev) == NULL) + return 0; + + for (pad = 0; pad < VVCAM_ISP_PAD_NR; pad++) { + + if (isp_dev->pads[pad].flags != MEDIA_PAD_FL_SINK) + continue; + + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), + pad, 0, FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + continue; + remote_ep = fwnode_graph_get_remote_endpoint(ep); + if (!remote_ep) { + fwnode_handle_put(ep); + continue; + } + fwnode_handle_put(remote_ep); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + asc = v4l2_async_nf_add_fwnode_remote(&isp_dev->notifier, + ep, struct v4l2_async_connection); +#else + // asd = v4l2_async_notifier_add_fwnode_remote_subdev(&isp_dev->notifier, ep, struct v4l2_async_subdev); + ret = v4l2_async_notifier_add_fwnode_remote_subdev(&isp_dev->notifier, ep, &asd); +#endif + + fwnode_handle_put(ep); + + if (ret /*IS_ERR(asd)*/) { + // ret = PTR_ERR(asd); + if (ret != -EEXIST) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&isp_dev->notifier); +#else + v4l2_async_notifier_cleanup(&isp_dev->notifier); +#endif + return ret; + } + } + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + ret = v4l2_async_nf_register(&isp_dev->notifier); +#else + ret = v4l2_async_subdev_notifier_register(&isp_dev->sd, + &isp_dev->notifier); +#endif + if (ret) { + dev_err(isp_dev->dev, "Async notifier register error\n"); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&isp_dev->notifier); +#else + v4l2_async_notifier_cleanup(&isp_dev->notifier); +#endif + } + + return ret; +} + +static int vvcam_isp_pads_init(struct vvcam_isp_dev *isp_dev) +{ + int pad = 0; + for (pad = 0; pad < VVCAM_ISP_PAD_NR; pad++) { + if (pad % VVCAM_ISP_CHN_MAX == 0) { + isp_dev->pads[pad].flags = MEDIA_PAD_FL_SINK; + } else { + isp_dev->pads[pad].flags = MEDIA_PAD_FL_SOURCE; + } + } + + for (pad = 0; pad < VVCAM_ISP_PAD_NR; pad++) { + if (pad % VVCAM_ISP_CHN_MAX == 1) { + isp_dev->pad_data[pad].num_formats = ARRAY_SIZE(vvcam_isp_mp_fmts); + isp_dev->pad_data[pad].mbus_fmt = vvcam_isp_mp_fmts; + } else if (pad % VVCAM_ISP_CHN_MAX != 0) { + isp_dev->pad_data[pad].num_formats = ARRAY_SIZE(vvcam_isp_sp_fmts); + isp_dev->pad_data[pad].mbus_fmt = vvcam_isp_mp_fmts; + } + INIT_LIST_HEAD(&isp_dev->pad_data[pad].queue); + spin_lock_init(&isp_dev->pad_data[pad].qlock); + } + + return 0; +} + +static int vvcam_isp_parse_params(struct vvcam_isp_dev *isp_dev, + struct platform_device *pdev) +{ + +#ifdef VVCAM_PLATFORM_REGISTER + int port = 0; + isp_dev->id = pdev->id; + for (port = 0; port < VVCAM_ISP_CHN_MAX; port++) { + strncpy(isp_dev->sensor_info[port].sensor, VVCAM_ISP_DEFAULT_SENSOR, + strlen(VVCAM_ISP_DEFAULT_SENSOR)); + strncpy(isp_dev->sensor_info[port].xml, VVCAM_ISP_DEFAULT_SENSOR_XML, + strlen(VVCAM_ISP_DEFAULT_SENSOR_XML)); + isp_dev->sensor_info[port].mode = VVCAM_ISP_DEFAULT_SENSOR_MODE; + strncpy(isp_dev->sensor_info[port].manu_json, VVCAM_ISP_DEFAULT_SENSOR_MANU_JSON, + strlen(VVCAM_ISP_DEFAULT_SENSOR_MANU_JSON)); + strncpy(isp_dev->sensor_info[port].auto_json, VVCAM_ISP_DEFAULT_SENSOR_AUTO_JSON, + strlen(VVCAM_ISP_DEFAULT_SENSOR_AUTO_JSON)); + } +#else + fwnode_property_read_u32(of_fwnode_handle(pdev->dev.of_node), + "id", &isp_dev->id); +#endif + return 0; +} + +#ifdef VVCAM_PLATFORM_REGISTER +struct v4l2_subdev *g_vvcam_isp_subdev[VVCAM_ISP_DEV_MAX] = {NULL}; +EXPORT_SYMBOL_GPL(g_vvcam_isp_subdev); +#endif + +static int vvcam_isp_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct vvcam_isp_dev *isp_dev; + int ret; + + dev_info(dev, "%s\n", __func__); + + isp_dev = devm_kzalloc(&pdev->dev, + sizeof(struct vvcam_isp_dev), GFP_KERNEL); + if (!isp_dev) + return -ENOMEM; + + mutex_init(&isp_dev->mlock); + mutex_init(&isp_dev->ctrl_lock); + isp_dev->dev = &pdev->dev; + platform_set_drvdata(pdev, isp_dev); + + ret = vvcam_isp_parse_params(isp_dev, pdev); + if (ret) { + dev_err(&pdev->dev, "failed to parse params\n"); + return -EINVAL; + } + + v4l2_subdev_init(&isp_dev->sd, &vvcam_isp_subdev_ops); + snprintf(isp_dev->sd.name, V4L2_SUBDEV_NAME_SIZE, + "%s.%d",VVCAM_ISP_NAME, isp_dev->id); + + isp_dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + isp_dev->sd.flags |= V4L2_SUBDEV_FL_HAS_EVENTS; + isp_dev->sd.dev = &pdev->dev; + isp_dev->sd.owner = THIS_MODULE; + isp_dev->sd.internal_ops = &vvcam_isp_internal_ops; + isp_dev->sd.entity.ops = &vvcam_isp_entity_ops; + isp_dev->sd.entity.function = MEDIA_ENT_F_IO_V4L; + isp_dev->sd.entity.obj_type = MEDIA_ENTITY_TYPE_V4L2_SUBDEV; + isp_dev->sd.entity.name = isp_dev->sd.name; + v4l2_set_subdevdata(&isp_dev->sd, isp_dev); + + vvcam_isp_pads_init(isp_dev); + ret = media_entity_pads_init(&isp_dev->sd.entity, + VVCAM_ISP_PAD_NR, isp_dev->pads); + if (ret) + return ret; + + ret = vvcam_isp_async_notifier(isp_dev); + if (ret) + goto err_async_notifier; +#ifdef VVCAM_PLATFORM_REGISTER + isp_dev->sd.fwnode = &isp_dev->fwnode; + g_vvcam_isp_subdev[isp_dev->id] = &isp_dev->sd; +#endif + ret = v4l2_async_register_subdev(&isp_dev->sd); + if (ret) { + dev_err(dev, "register subdev error\n"); + goto error_regiter_subdev; + } + + ret = vvcam_isp_procfs_register(isp_dev, &isp_dev->pde); + if (ret) { + dev_err(dev, "register procfs failed.\n"); + goto err_register_procfs; + } + + isp_dev->event_shm.virt_addr = (void *)__get_free_pages(GFP_KERNEL, 3); + isp_dev->event_shm.size = PAGE_SIZE * 8; + memset(isp_dev->event_shm.virt_addr, 0, isp_dev->event_shm.size); + isp_dev->event_shm.phy_addr = virt_to_phys(isp_dev->event_shm.virt_addr); + mutex_init(&isp_dev->event_shm.event_lock); + + pm_runtime_enable(&pdev->dev); + vvcam_isp_ctrl_init(isp_dev); + + dev_info(&pdev->dev, "vvcam isp driver probe success\n"); + + return 0; + +err_register_procfs: + v4l2_async_unregister_subdev(&isp_dev->sd); + +error_regiter_subdev: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_unregister(&isp_dev->notifier); + v4l2_async_nf_cleanup(&isp_dev->notifier); +#else + v4l2_async_notifier_unregister(&isp_dev->notifier); + v4l2_async_notifier_cleanup(&isp_dev->notifier); +#endif +err_async_notifier: + media_entity_cleanup(&isp_dev->sd.entity); + + return ret; +} + +static int vvcam_isp_remove(struct platform_device *pdev) +{ + struct vvcam_isp_dev *isp_dev; + + isp_dev = platform_get_drvdata(pdev); + + vvcam_isp_procfs_unregister(isp_dev->pde); + v4l2_async_unregister_subdev(&isp_dev->sd); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_unregister(&isp_dev->notifier); + v4l2_async_nf_cleanup(&isp_dev->notifier); +#else + v4l2_async_notifier_unregister(&isp_dev->notifier); + v4l2_async_notifier_cleanup(&isp_dev->notifier); +#endif + media_entity_cleanup(&isp_dev->sd.entity); + pm_runtime_disable(&pdev->dev); + free_pages((unsigned long)isp_dev->event_shm.virt_addr, 3); + vvcam_isp_ctrl_destroy(isp_dev); + dev_info(&pdev->dev, "vvcam isp driver remove\n"); + + return 0; +} + +static int vvcam_isp_system_suspend(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_suspend(dev); + if (ret) { + dev_err(dev, "force suspend %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_isp_system_resume(struct device *dev) +{ + int ret = 0; + ret = pm_runtime_force_resume(dev); + if (ret) { + dev_err(dev, "force resume %s failed\n", dev_name(dev)); + return ret; + } + return ret; +} + +static int vvcam_isp_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int vvcam_isp_runtime_resume(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops vvcam_isp_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(vvcam_isp_system_suspend, vvcam_isp_system_resume) + SET_RUNTIME_PM_OPS(vvcam_isp_runtime_suspend, vvcam_isp_runtime_resume, NULL) +}; + +static const struct of_device_id vvcam_isp_of_match[] = { + {.compatible = "verisilicon,isp-v4l2",}, + { /* sentinel */ }, +}; + +static struct platform_driver vvcam_isp_driver = { + .probe = vvcam_isp_probe, + .remove = vvcam_isp_remove, + .driver = { + .name = VVCAM_ISP_NAME, + .owner = THIS_MODULE, + .of_match_table = vvcam_isp_of_match, + .pm = &vvcam_isp_pm_ops, + } +}; + +static int __init vvcam_isp_init_module(void) +{ + int ret; + ret = platform_driver_register(&vvcam_isp_driver); + if (ret) { + printk(KERN_ERR "Failed to register isp driver\n"); + return ret; + } +#ifdef VVCAM_PLATFORM_REGISTER + ret = vvcam_isp_platform_device_register(); + if (ret) { + platform_driver_unregister(&vvcam_isp_driver); + printk(KERN_ERR "Failed to register vvcam isp platform devices\n"); + return ret; + } +#endif + return ret; +} + +static void __exit vvcam_isp_exit_module(void) +{ + platform_driver_unregister(&vvcam_isp_driver); +#ifdef VVCAM_PLATFORM_REGISTER + vvcam_isp_platform_device_unregister(); +#endif +} + +module_init(vvcam_isp_init_module); +module_exit(vvcam_isp_exit_module); + +MODULE_DESCRIPTION("Verisilicon isp v4l2 driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.h b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.h new file mode 100644 index 0000000..8a30750 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_driver.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_DRIVER_H__ +#define __VVCAM_ISP_DRIVER_H__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vvcam_v4l2_common.h" + +#define VVCAM_ISP_NAME "vvcam-isp-subdev" + +#define VVCAM_ISP_WIDTH_ALIGN 16 +#define VVCAM_ISP_HEIGHT_ALIGN 8 +#define VVCAM_ISP_WIDTH_MIN 32 +#define VVCAM_ISP_HEIGHT_MIN 16 + +#define VVCAM_ISP_CHN_MAX 4 +enum vvcam_isp_pad_e { + VVCAM_ISP_PAD_SINK_P0, + VVCAM_ISP_PAD_SOURCE_P0MP, + VVCAM_ISP_PAD_SOURCE_P0SP1, + VVCAM_ISP_PAD_SOURCE_P0SP2, + VVCAM_ISP_PAD_SINK_P1, + VVCAM_ISP_PAD_SOURCE_P1MP, + VVCAM_ISP_PAD_SOURCE_P1SP1, + VVCAM_ISP_PAD_SOURCE_P1SP2, + VVCAM_ISP_PAD_SINK_P2, + VVCAM_ISP_PAD_SOURCE_P2MP, + VVCAM_ISP_PAD_SOURCE_P2SP1, + VVCAM_ISP_PAD_SOURCE_P2SP2, + VVCAM_ISP_PAD_SINK_P3, + VVCAM_ISP_PAD_SOURCE_P3MP, + VVCAM_ISP_PAD_SOURCE_P3SP1, + VVCAM_ISP_PAD_SOURCE_P3SP2, + VVCAM_ISP_PAD_NR, +}; + +struct vvcam_isp_mbus_fmt { + uint32_t code; +}; + +struct vvcam_isp_pad_data { + uint32_t sink_detected; + struct v4l2_mbus_framefmt format; + struct v4l2_fract frmival_min; + struct v4l2_fract frmival_max; + uint32_t num_formats; + struct vvcam_isp_mbus_fmt *mbus_fmt; + struct list_head queue; + spinlock_t qlock; + uint32_t stream; +}; + +struct vvcam_isp_event_shm { + struct mutex event_lock; + uint64_t phy_addr; + void *virt_addr; + uint32_t size; +}; + +struct vvcam_isp_sensor_info { + char sensor[32]; + uint8_t mode; + char xml[64]; + char manu_json[128]; + char auto_json[128]; +}; + +struct vvcam_isp_dev { + phys_addr_t paddr; + uint32_t regs_size; + void __iomem *base; + void __iomem *reset; + int id; + int fe_irq; + int isp_irq; + int mi_irq; + struct device *dev; + struct mutex mlock; + uint32_t refcnt; + struct v4l2_subdev sd; + struct media_pad pads[VVCAM_ISP_PAD_NR]; + struct v4l2_async_notifier notifier; +#ifdef VVCAM_PLATFORM_REGISTER + struct fwnode_handle fwnode; +#endif + struct vvcam_isp_pad_data pad_data[VVCAM_ISP_PAD_NR]; + + struct vvcam_isp_event_shm event_shm; + struct v4l2_ctrl_handler ctrl_handler; + struct mutex ctrl_lock; + uint32_t ctrl_pad; + + unsigned long pde; + struct vvcam_isp_sensor_info sensor_info[VVCAM_ISP_CHN_MAX]; + +}; + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.c b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.c new file mode 100644 index 0000000..07a515e --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.c @@ -0,0 +1,293 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#include +#include +#include +#include "vvcam_isp_event.h" +#include "vvcam_isp_driver.h" + +static bool vvcam_isp_event_subscribed(struct v4l2_subdev *sd, + uint32_t type, uint32_t id) +{ + struct v4l2_fh *fh; + unsigned long flags; + struct v4l2_subscribed_event *sev; + bool subscribed = false; + + spin_lock_irqsave(&sd->devnode->fh_lock, flags); + + list_for_each_entry(fh, &sd->devnode->fh_list, list) { + list_for_each_entry(sev, &fh->subscribed, list) { + if (sev->type == type && sev->id == id) { + subscribed = true; + break; + } + } + if (subscribed) + break; + } + + spin_unlock_irqrestore(&sd->devnode->fh_lock, flags); + + return subscribed; +} + +int vvcam_isp_post_event(struct v4l2_subdev *sd, struct vvcam_isp_event_pkg *event_pkg) +{ + struct v4l2_event event; + int timeout_ms = 200000; + int i = 0; + + memset(&event, 0, sizeof(event)); + + event.type = VVCAM_ISP_DEAMON_EVENT; + event.id = event_pkg->head.eid; + memcpy(event.u.data, &event_pkg->head, sizeof(event_pkg->head)); + + if (!vvcam_isp_event_subscribed(sd, event.type, event.id)) { + dev_err(sd->dev, "post event %d not subscribed\n", event.id); + return -EINVAL; + } + + v4l2_event_queue(sd->devnode, &event); + + for (i = 0; i < timeout_ms; i++) { + if (event_pkg->ack) { + break; + } + usleep_range(5, 10); + } + + if (event_pkg->ack == 0) { + dev_err(sd->dev, "post event %d time out\n", event.id); + return -EIO; + } + + if (event_pkg->result) { + dev_err(sd->dev, "post event %d return error\n", event.id); + return -EINVAL; + } + + return 0; +} + +int vvcam_isp_set_fmt_event(struct vvcam_isp_dev *isp_dev, int pad, struct v4l2_mbus_framefmt *format) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret; + + mutex_lock(&isp_dev->event_shm.event_lock); + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + event_pkg->head.eid = VVCAM_ISP_EVENT_SET_FMT; + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = sizeof(struct v4l2_mbus_framefmt); + event_pkg->ack = 0; + event_pkg->result = 0; + memcpy(event_pkg->data, format, sizeof(struct v4l2_mbus_framefmt)); + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + mutex_unlock(&isp_dev->event_shm.event_lock); + + return ret; +} + +int vvcam_isp_requebus_event(struct vvcam_isp_dev *isp_dev, int pad, uint32_t num_buffers) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret; + + mutex_lock(&isp_dev->event_shm.event_lock); + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + event_pkg->head.eid = VVCAM_ISP_EVENT_REQBUFS; + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = sizeof(num_buffers); + event_pkg->ack = 0; + event_pkg->result = 0; + memcpy(event_pkg->data, &num_buffers, sizeof(num_buffers)); + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + mutex_unlock(&isp_dev->event_shm.event_lock); + + return ret; +} + +int vvcam_isp_qbuf_event(struct vvcam_isp_dev *isp_dev, int pad, struct vvcam_vb2_buffer *buf) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret = 0; + struct vvcam_isp_buf user_buf; + int i; + + user_buf.pad = pad; + user_buf.index = buf->sequence; + user_buf.num_planes = buf->num_planes; + for (i = 0; i < user_buf.num_planes; i++) { + user_buf.planes[i].dma_addr = buf->planes[i].dma_addr; + user_buf.planes[i].size = buf->planes[i].size; + } + + mutex_lock(&isp_dev->event_shm.event_lock); + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + event_pkg->head.eid = VVCAM_ISP_EVENT_QBUF; + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = sizeof(struct vvcam_isp_buf); + event_pkg->ack = 0; + event_pkg->result = 0; + memcpy(event_pkg->data, &user_buf, sizeof(struct vvcam_isp_buf)); + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + mutex_unlock(&isp_dev->event_shm.event_lock); + return ret; +} + +int vvcam_isp_s_stream_event(struct vvcam_isp_dev *isp_dev, int pad, uint32_t status) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret = 0; + + mutex_lock(&isp_dev->event_shm.event_lock); + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + if (status) { + event_pkg->head.eid = VVCAM_ISP_EVENT_STREAMON; + } else { + event_pkg->head.eid = VVCAM_ISP_EVENT_STREAMOFF; + } + + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = 0; + event_pkg->ack = 0; + event_pkg->result = 0; + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + mutex_unlock(&isp_dev->event_shm.event_lock); + return ret; +} + +int vvcam_isp_s_ctrl_event(struct vvcam_isp_dev *isp_dev, + int pad, struct v4l2_ctrl *ctrl) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret; + struct vvcam_isp_ctrl *isp_ctrl; + + mutex_lock(&isp_dev->event_shm.event_lock); + + isp_ctrl = (struct vvcam_isp_ctrl *)event_pkg->data; + isp_ctrl->cid = ctrl->id; + isp_ctrl->size = ctrl->elem_size * ctrl->elems; + memcpy(isp_ctrl->data, ctrl->p_new.p_u8, isp_ctrl->size); + + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + event_pkg->head.eid = VVCAM_ISP_EVENT_S_CTRL; + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = sizeof(isp_ctrl) + isp_ctrl->size; + event_pkg->ack = 0; + event_pkg->result = 0; + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + mutex_unlock(&isp_dev->event_shm.event_lock); + + return ret; +} + +int vvcam_isp_g_ctrl_event(struct vvcam_isp_dev *isp_dev, + int pad, struct v4l2_ctrl *ctrl) +{ + struct vvcam_isp_event_pkg *event_pkg = isp_dev->event_shm.virt_addr; + int ret = 0; + struct vvcam_isp_ctrl *isp_ctrl; + + dev_info(isp_dev->dev, "%s:%d\n", __func__, __LINE__); + + mutex_lock(&isp_dev->event_shm.event_lock); + + isp_ctrl = (struct vvcam_isp_ctrl *)event_pkg->data; + isp_ctrl->cid = ctrl->id; + isp_ctrl->size = ctrl->elem_size * ctrl->elems; + + event_pkg->head.pad = pad; + event_pkg->head.dev = isp_dev->id; + event_pkg->head.eid = VVCAM_ISP_EVENT_G_CTRL; + event_pkg->head.shm_addr = isp_dev->event_shm.phy_addr; + event_pkg->head.shm_size = isp_dev->event_shm.size; + event_pkg->head.data_size = sizeof(isp_ctrl) + isp_ctrl->size; + event_pkg->ack = 0; + event_pkg->result = 0; + + ret = vvcam_isp_post_event(&isp_dev->sd, event_pkg); + + if (ret == 0) { + memcpy(ctrl->p_new.p_u8, event_pkg->data + sizeof(isp_ctrl), + isp_ctrl->size); + } + + mutex_unlock(&isp_dev->event_shm.event_lock); + + return ret; +} + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.h b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.h new file mode 100644 index 0000000..7fcc263 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_event.h @@ -0,0 +1,122 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_EVENT_H__ +#define __VVCAM_ISP_EVENT_H__ + +#define VVCAM_ISP_DEAMON_EVENT (V4L2_EVENT_PRIVATE_START + 2000) + +enum vvcam_isp_vevent_id { + VVCAM_ISP_EVENT_SET_FMT, + VVCAM_ISP_EVENT_REQBUFS, + VVCAM_ISP_EVENT_QBUF, + VVCAM_ISP_EVENT_BUF_DONE, + VVCAM_ISP_EVENT_STREAMON, + VVCAM_ISP_EVENT_STREAMOFF, + VVCAM_ISP_EVENT_S_CTRL, + VVCAM_ISP_EVENT_G_CTRL, + VVCAM_ISP_EVENT_MAX, +}; + +struct vvcam_isp_plane { + uint32_t dma_addr; + uint32_t size; +}; + +struct vvcam_isp_buf { + uint32_t pad; + uint32_t index; + uint32_t num_planes; + struct vvcam_isp_plane planes[VIDEO_MAX_PLANES]; +}; + +struct vvcam_isp_ctrl { + uint32_t cid; + uint32_t size; +#ifdef __KERNEL__ + uint8_t data[0]; +#endif +}; + +struct vvcam_isp_event_pkg_head { + uint32_t pad; + uint8_t dev; + uint32_t eid; + uint64_t shm_addr; + uint32_t shm_size; + uint32_t data_size; +}; + +struct vvcam_isp_event_pkg { + struct vvcam_isp_event_pkg_head head; + uint8_t ack; + int32_t result; + uint8_t data[2048]; +}; + +#define VVCAM_ISP_IOC_BUFDONE _IOWR('I', BASE_VIDIOC_PRIVATE + 0, struct vvcam_isp_buf) + +#ifdef __KERNEL__ +#include "vvcam_isp_driver.h" + +int vvcam_isp_set_fmt_event(struct vvcam_isp_dev *isp_dev, int pad, struct v4l2_mbus_framefmt *format); +int vvcam_isp_requebus_event(struct vvcam_isp_dev *isp_dev, int pad, uint32_t num_buffers); +int vvcam_isp_qbuf_event(struct vvcam_isp_dev *isp_dev, int pad, struct vvcam_vb2_buffer *buf); +int vvcam_isp_s_stream_event(struct vvcam_isp_dev *isp_dev, int pad, uint32_t status); +int vvcam_isp_s_ctrl_event(struct vvcam_isp_dev *isp_dev, int pad, struct v4l2_ctrl *ctrl); +int vvcam_isp_g_ctrl_event(struct vvcam_isp_dev *isp_dev, int pad, struct v4l2_ctrl *ctrl); + +#endif + + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.c b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.c new file mode 100644 index 0000000..afa226f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.c @@ -0,0 +1,239 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#include +#include +#include + +#include "vvcam_isp_platform.h" + +static int devices_mask = 0x01; +MODULE_PARM_DESC(devices_mask, "vvcam isp devices mask"); + +static void vvcam_isp_pdev_release(struct device *dev) +{ + dev_info(dev, "%s\n", __func__); + return; +} + +static struct resource vvcam_isp0_resource[] = { + [0] = { + .start = VVCAM_ISP0_BASE, + .end = VVCAM_ISP0_BASE + VVCAM_ISP_REG_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = VVCAM_TPG0, + .end = VVCAM_TPG0 + VVCAM_TPG_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = VVCAM_ISP0_IRQ, + .end = VVCAM_ISP0_IRQ, + .flags = IORESOURCE_IRQ, + }, + [3] = { + .start = VVCAM_ISP0_MI_IRQ, + .end = VVCAM_ISP0_MI_IRQ, + .flags = IORESOURCE_IRQ, + }, + [4] = { + .start = VVCAM_ISP0_FE_IRQ, + .end = VVCAM_ISP0_FE_IRQ, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device vvcam_isp0_pdev = { + .name = "vvcam-isp-subdev", + .id = 0, + .resource = vvcam_isp0_resource, + .num_resources = ARRAY_SIZE(vvcam_isp0_resource), + .dev.release = vvcam_isp_pdev_release, +}; + + +static struct resource vvcam_isp1_resource[] = { + [0] = { + .start = VVCAM_ISP1_BASE, + .end = VVCAM_ISP1_BASE + VVCAM_ISP_REG_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = VVCAM_TPG1, + .end = VVCAM_TPG1 + VVCAM_TPG_SIZE - 1, + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = VVCAM_ISP1_IRQ, + .end = VVCAM_ISP1_IRQ, + .flags = IORESOURCE_IRQ, + }, + [3] = { + .start = VVCAM_ISP1_MI_IRQ, + .end = VVCAM_ISP1_MI_IRQ, + .flags = IORESOURCE_IRQ, + }, + [4] = { + .start = VVCAM_ISP1_FE_IRQ, + .end = VVCAM_ISP1_FE_IRQ, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device vvcam_isp1_pdev = { + .name = "vvcam-isp-subdev", + .id = 1, + .resource = vvcam_isp1_resource, + .num_resources = ARRAY_SIZE(vvcam_isp1_resource), + .dev.release = vvcam_isp_pdev_release, +}; + +int vvcam_isp_platform_device_register(void) +{ + int ret = 0; + int devs_mask = 0; + + if (devices_mask & 0x01) { + ret = platform_device_register(&vvcam_isp0_pdev); + if (ret) { + goto err_register; + } + devs_mask |= 0x01; + } + + if (devices_mask & 0x02) { + ret = platform_device_register(&vvcam_isp1_pdev); + if (ret) { + goto err_register; + } + devs_mask |= 0x02; + } + + return ret; + +err_register: + if (devs_mask & 0x01) + platform_device_unregister(&vvcam_isp0_pdev); + if (devs_mask & 0x02) + platform_device_unregister(&vvcam_isp1_pdev); + + return ret; +} + +void vvcam_isp_platform_device_unregister(void) +{ + if (devices_mask & 0x01) + platform_device_unregister(&vvcam_isp0_pdev); + if (devices_mask & 0x02) + platform_device_unregister(&vvcam_isp1_pdev); + + return; +} + +module_param(devices_mask, int, 0644); + + + diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.h b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.h new file mode 100644 index 0000000..fe8342d --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_platform.h @@ -0,0 +1,60 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_ISP_PLATFORM_H__ +#define __VVCAM_ISP_PLATFORM_H__ + +int vvcam_isp_platform_device_register(void); +void vvcam_isp_platform_device_unregister(void); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.c b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.c new file mode 100644 index 0000000..aaac55c --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.c @@ -0,0 +1,353 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "vvcam_isp_driver.h" +#include "vvcam_isp_procfs.h" + +struct vvcam_isp_procfs { + struct proc_dir_entry *pde; + struct vvcam_isp_dev *isp_dev; + struct mutex lock; +}; + +static int vvcam_isp_procfs_info_show(struct seq_file *sfile, void *offset) +{ + struct vvcam_isp_procfs *isp_proc; + struct vvcam_isp_dev *isp_dev; + struct media_pad *pad = NULL; + int pad_idx = 0; + int port = -1; + + isp_proc = (struct vvcam_isp_procfs *) sfile->private; + + mutex_lock(&isp_proc->lock); + isp_dev = isp_proc->isp_dev; + + seq_printf(sfile, "/******sensor configuration******/\n"); + for (pad_idx = 0; pad_idx < VVCAM_ISP_PAD_NR; pad_idx++) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&isp_dev->pads[pad_idx]); +#else + pad = media_entity_remote_pad(&isp_dev->pads[pad_idx]); +#endif + + if (pad && (port != (pad_idx / VVCAM_ISP_CHN_MAX))) { + port = pad_idx / VVCAM_ISP_CHN_MAX; + seq_printf(sfile, "isp%d port%d:\n", isp_dev->id, port); + seq_printf(sfile, "sensor : %s\n", isp_dev->sensor_info[port].sensor); + seq_printf(sfile, "mode : %d\n", isp_dev->sensor_info[port].mode); + seq_printf(sfile, "xml : %s\n", isp_dev->sensor_info[port].xml); + seq_printf(sfile, "manu_json: %s\n", isp_dev->sensor_info[port].manu_json); + seq_printf(sfile, "auto_json: %s\n", isp_dev->sensor_info[port].auto_json); + } + } + + mutex_unlock(&isp_proc->lock); + + return 0; +} + +static int vvcam_isp_procfs_open(struct inode *inode, struct file *file) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + return single_open(file, vvcam_isp_procfs_info_show, PDE_DATA(inode)); +#else + return single_open(file, vvcam_isp_procfs_info_show, pde_data(inode)); +#endif +} + +static int32_t vvcam_isp_proc_process(struct seq_file *sfile, + struct vvcam_isp_procfs *isp_proc, char *str_buf) +{ + struct vvcam_isp_dev *isp_dev; + char *token = NULL, *cur = str_buf; + char *val = NULL, *kv_cur = NULL, *end = NULL; + char *const delim = " "; + char *const kv_delim = "="; + int port = 0; + + isp_dev = isp_proc->isp_dev; + + mutex_lock(&isp_proc->lock); + + while((token = strsep(&cur, delim))) { + if (isdigit(*token)) { + port = *token - '0'; + continue; + } + + if ((port > VVCAM_ISP_CHN_MAX) || (port < 0)) { + continue; + } + + kv_cur = token; + val = strsep(&kv_cur, kv_delim); + if (val) { + if (strcmp(val, "sensor") == 0) { + val = strsep(&kv_cur, kv_delim); + if (val) { + memset(isp_dev->sensor_info[port].sensor, 0, \ + sizeof(isp_dev->sensor_info[port].sensor)); + strncpy(isp_dev->sensor_info[port].sensor, val, strlen(val)); + } + } else if (strcmp(val, "mode") == 0) { + val = strsep(&kv_cur, kv_delim); + if (val && isdigit(*val)) { + isp_dev->sensor_info[port].mode = (uint32_t)simple_strtoul(val, &end, 0); + } + } else if (strcmp(val, "xml") == 0) { + val = strsep(&kv_cur, kv_delim); + if (val) { + memset(isp_dev->sensor_info[port].xml, 0, \ + sizeof(isp_dev->sensor_info[port].xml)); + strncpy(isp_dev->sensor_info[port].xml, val, strlen(val)); + } + } else if (strcmp(val, "manu_json") == 0) { + val = strsep(&kv_cur, kv_delim); + if (val) { + memset(isp_dev->sensor_info[port].manu_json, 0, \ + sizeof(isp_dev->sensor_info[port].manu_json)); + strncpy(isp_dev->sensor_info[port].manu_json, val, strlen(val)); + } + } else if (strcmp(val, "auto_json") == 0) { + val = strsep(&kv_cur, kv_delim); + if (val) { + memset(isp_dev->sensor_info[port].auto_json, 0, \ + sizeof(isp_dev->sensor_info[port].auto_json)); + strncpy(isp_dev->sensor_info[port].auto_json, val, strlen(val)); + } + } + } + } + + mutex_unlock(&isp_proc->lock); + + return 0; +} + +static ssize_t vvcam_isp_procfs_write(struct file *file, + const char __user *buffer, size_t count, loff_t *ppos) +{ + struct vvcam_isp_procfs *isp_proc; + struct seq_file *sfile; + char *str_buf; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + isp_proc = (struct vvcam_isp_procfs *) PDE_DATA(file_inode(file)); +#else + isp_proc = (struct vvcam_isp_procfs *) pde_data(file_inode(file)); +#endif + sfile = file->private_data; + + str_buf = (char *)kzalloc(count, GFP_KERNEL); + if (!str_buf) + return -ENOMEM; + + if (copy_from_user(str_buf, buffer, count)) + return -EFAULT; + + *(str_buf + count - 1) = '\0'; + + vvcam_isp_proc_process(sfile, isp_proc, str_buf); + + kfree(str_buf); + + return count; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0) +static const struct file_operations vvcam_isp_procfs_ops = { + .open = vvcam_isp_procfs_open, + .release = seq_release, + .read = seq_read, + .write = vvcam_isp_procfs_write, + .llseek = seq_lseek, +}; +#else +static const struct proc_ops vvcam_isp_procfs_ops = { + .proc_open = vvcam_isp_procfs_open, + .proc_release = seq_release, + .proc_read = seq_read, + .proc_write = vvcam_isp_procfs_write, + .proc_lseek = seq_lseek, +}; +#endif + +struct finddir_callback { + struct dir_context ctx; + const char *name; + int32_t files_cnt; + bool found; +}; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) +static int readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return 0; + + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return 0; +} + +#else +static bool readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return true; + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return true; +} +#endif + +static int find_proc_dir_by_name(const char *root, + const char *name, bool *found, int32_t *files_cnt) { + struct file *pfile; + int ret = 0; + struct finddir_callback fc = { + .ctx.actor = readdir_callback, + .name = name, + .found = false, + .files_cnt = -2, + }; + + pfile = filp_open(root, O_RDONLY | O_DIRECTORY, 0); + if (pfile->f_op->iterate_shared) { + ret = pfile->f_op->iterate_shared(pfile, &fc.ctx); + } else { + // ret = pfile->f_op->iterate(pfile, &fc.ctx); + } + + if (ret == 0) { + *found = fc.found; + } + + if (files_cnt != NULL) { + *files_cnt = fc.files_cnt; + } + + filp_close(pfile, NULL); + return ret; +} + +int vvcam_isp_procfs_register(struct vvcam_isp_dev *isp_dev, unsigned long *pde) +{ + struct vvcam_isp_procfs *isp_proc; + char isp_proc_name[32]; + int ret = 0; + bool found = false; + + if (!isp_dev) + return -1; + sprintf(isp_proc_name, "vsi/isp_subdev%d", isp_dev->id); + + isp_proc = devm_kzalloc(isp_dev->dev, + sizeof(struct vvcam_isp_procfs), GFP_KERNEL); + + if (!isp_proc) + return -ENOMEM; + + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (!found) + proc_mkdir("vsi", NULL); + } else { + return -EFAULT; + } + + isp_proc->isp_dev = isp_dev; + isp_proc->pde = proc_create_data(isp_proc_name, 0664, NULL, + &vvcam_isp_procfs_ops, isp_proc); + if (!isp_proc->pde) + return -EFAULT; + *pde = (unsigned long)&isp_proc->pde; + + mutex_init(&(isp_proc->lock)); + return 0; +} + +void vvcam_isp_procfs_unregister(unsigned long pde) +{ + int ret = 0; + bool found = false; + int32_t files_cnt; + struct vvcam_isp_procfs *isp_proc = (struct vvcam_isp_procfs*)pde; + + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (found) { + proc_remove(isp_proc->pde); + ret = find_proc_dir_by_name("/proc/vsi", "", &found, &files_cnt); + if (files_cnt == 0) { + remove_proc_subtree("vsi", NULL); + } + } + } +} diff --git a/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.h b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.h new file mode 100644 index 0000000..019b84f --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/isp/vvcam_isp_procfs.h @@ -0,0 +1,63 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + + +#ifndef __VVCAM_ISP_PROCFS_H__ +#define __VVCAM_ISP_PROCFS_H__ + +int vvcam_isp_procfs_register(struct vvcam_isp_dev *isp_dev, + unsigned long *pde); +void vvcam_isp_procfs_unregister(unsigned long pde); + +#endif + diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_pipeline_link.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_pipeline_link.h new file mode 100644 index 0000000..c82d735 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_pipeline_link.h @@ -0,0 +1,110 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + #ifndef __VVCAM_PIPELINE_LINK_H__ + #define __VVCAM_PIPELINE_LINK_H__ + +extern struct v4l2_subdev *g_vvcam_isp_subdev[VVCAM_ISP_DEV_MAX]; + +static struct vvcam_v4l2_link pipeline0[] = { + { + .local_is_video = true, + .video_index = 0, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[0], + .remote_pad = 1, + }, + #if 0 + { + .local_is_video = true, + .video_index = 1, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[0], + .remote_pad = 2, + }, + { + .local_is_video = true, + .video_index = 2, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[0], + .remote_pad = 3, + }, + #endif +}; + +static struct vvcam_v4l2_link pipeline1[] = { + { + .local_is_video = true, + .video_index = 0, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[1], + .remote_pad = 1, + }, + #if 0 + { + .local_is_video = true, + .video_index = 1, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[1], + .remote_pad = 2, + }, + { + .local_is_video = true, + .video_index = 2, + .local_pad = 0, + .remote_subdev = &g_vvcam_isp_subdev[1], + .remote_pad = 3, + }, + #endif +}; + + #endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video.h new file mode 100644 index 0000000..e00e561 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video.h @@ -0,0 +1,57 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VIDEO_HAL_H__ +#define __VVCAM_VIDEO_HAL_H__ + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.c b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.c new file mode 100644 index 0000000..f6d14f5 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.c @@ -0,0 +1,582 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_video_driver.h" +#include "vvcam_video_register.h" +#ifdef VVCAM_PLATFORM_REGISTER +#include "vvcam_video_platform.h" +#include "vvcam_pipeline_link.h" +#endif + +static int vvcam_video_register_ports(struct vvcam_media_dev *vvcam_mdev) +{ + int i = 0; + int ret = 0; + for (i = 0; i < vvcam_mdev->ports; i++) { + if (vvcam_mdev->video_params[i].m2m == false) { + ret = vvcam_video_register(vvcam_mdev, i); + if (ret) { + goto err_register_video; + } + } + } + return 0; + +err_register_video: + for (i = 0; i < vvcam_mdev->ports; i++) { + if (vvcam_mdev->video_params[i].m2m == false) + vvcam_video_unregister(vvcam_mdev, i); + } + + return ret; +} + +static int vvcam_video_unregister_ports(struct vvcam_media_dev *vvcam_mdev) +{ + int i; + + for (i = 0; i < vvcam_mdev->ports; i++) { + if (vvcam_mdev->video_params[i].m2m == false) + vvcam_video_unregister(vvcam_mdev, i); + } + + return 0; +} + +#ifdef VVCAM_PLATFORM_REGISTER +static int vvcam_video_notifier_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_connection *asc) +{ + struct vvcam_media_dev *vvcam_mdev = container_of(notifier, + struct vvcam_media_dev, notifier); + struct device *dev = vvcam_mdev->dev; + struct v4l2_subdev *remote_subdev; + struct v4l2_subdev *local_subdev; + struct video_device *vdev; + uint32_t port; + struct media_entity *source, *sink; + unsigned int source_pad, sink_pad; + int i = 0; + int ret; + + for (i = 0; i < vvcam_mdev->pipeline_link_size; i++) { + if (vvcam_mdev->pipeline_link[i].remote_subdev) { + remote_subdev = *vvcam_mdev->pipeline_link[i].remote_subdev; + if (remote_subdev) { + if (sd == remote_subdev) { + if (vvcam_mdev->pipeline_link[i].local_is_video) { + port = vvcam_mdev->pipeline_link[i].video_index; + vdev = vvcam_mdev->video_devs[port]->video; + source = &sd->entity; + source_pad = vvcam_mdev->pipeline_link[i].remote_pad; + sink =&vdev->entity; + sink_pad = 0; + + } else { + local_subdev = *vvcam_mdev->pipeline_link[i].local_subdev; + source = &sd->entity; + source_pad = vvcam_mdev->pipeline_link[i].remote_pad; + sink =&local_subdev->entity; + sink_pad = vvcam_mdev->pipeline_link[i].local_pad; + } + + ret = media_create_pad_link(source, source_pad, sink, sink_pad, MEDIA_LNK_FL_ENABLED); + if (ret) { + dev_err(dev, "failed to create %s:%u -> %s:%u link\n", + source->name, source_pad, sink->name, sink_pad); + break; + } + } + } + } + } + return 0; +} + +#else +static int vvcam_video_notifier_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_connection *asc) +{ + struct vvcam_media_dev *vvcam_mdev = container_of(notifier, + struct vvcam_media_dev, notifier); + struct device *dev = vvcam_mdev->dev; + struct fwnode_handle *ep = NULL; + struct v4l2_fwnode_link link; + struct media_entity *source, *sink; + unsigned int source_pad, sink_pad; + struct vvcam_video_dev *vvcam_vdev; + struct video_device *vdev; + int ret; + + while (1) { + ep = fwnode_graph_get_next_endpoint(sd->fwnode, ep); + if (!ep) + break; + ret = v4l2_fwnode_parse_link(ep, &link); + if (ret < 0) { + dev_err(dev, "failed to parse link for %pOF: %d\n", to_of_node(ep), ret); + continue; + } + + if (sd->entity.pads[link.local_port].flags == MEDIA_PAD_FL_SINK) + continue; + + vvcam_vdev = vvcam_mdev->video_devs[link.remote_port]; + vdev = vvcam_vdev->video; + source = &sd->entity; + source_pad = link.local_port; + sink = &vdev->entity; + sink_pad = 0; + v4l2_fwnode_put_link(&link); + ret = media_create_pad_link(source, source_pad, sink, sink_pad, MEDIA_LNK_FL_ENABLED); + if (ret) { + dev_err(dev, "failed to create %s:%u -> %s:%u link\n", source->name, source_pad, sink->name, sink_pad); + break; + } + dev_info(vvcam_mdev->dev, "create link %s:%u -> %s:%u\n", source->name, source_pad, sink->name, sink_pad); + } + fwnode_handle_put(ep); + + return 0; +} +#endif + +static void vvcam_video_notifier_unbound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_connection *asc) +{ + return; +} + +static int vvcam_video_notifier_complete(struct v4l2_async_notifier *notifier) +{ + struct vvcam_media_dev *vvcam_mdev = container_of(notifier, + struct vvcam_media_dev, notifier); + + return v4l2_device_register_subdev_nodes(&vvcam_mdev->v4l2_dev); +} + +static const struct v4l2_async_notifier_operations vvcam_video_async_nf_ops = { + .bound = vvcam_video_notifier_bound, + .unbind = vvcam_video_notifier_unbound, + .complete = vvcam_video_notifier_complete, +}; + +#ifdef VVCAM_PLATFORM_REGISTER +static int vvcam_video_async_register_subdev(struct vvcam_media_dev *vvcam_mdev) +{ + int ret; + int i = 0; + struct v4l2_subdev *remote_subdev; + struct v4l2_async_connection *asc; + + vvcam_mdev->notifier.ops = &vvcam_video_async_nf_ops; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_init(&vvcam_mdev->notifier, &vvcam_mdev->v4l2_dev); +#else + v4l2_async_notifier_init(&vvcam_mdev->notifier); +#endif + + for (i = 0; i < vvcam_mdev->pipeline_link_size; i++) { + if (vvcam_mdev->pipeline_link[i].remote_subdev) { + remote_subdev = *vvcam_mdev->pipeline_link[i].remote_subdev; + if (remote_subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + asc = v4l2_async_nf_add_fwnode(&vvcam_mdev->notifier, + remote_subdev->fwnode, + struct v4l2_async_connection); +#else + asd = v4l2_async_notifier_add_fwnode_subdev( + &vvcam_mdev->notifier, + remote_subdev->fwnode, + sizeof(struct v4l2_async_subdev)); +#endif + if (IS_ERR(asc)) { + ret = PTR_ERR(asc); + if (ret != -EEXIST) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&vvcam_mdev->notifier); +#else + v4l2_async_notifier_cleanup(&vvcam_mdev->notifier); +#endif + return ret; + } + } + } + } + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + ret = v4l2_async_nf_register(&vvcam_mdev->notifier); +#else + ret = v4l2_async_notifier_register(&vvcam_mdev->v4l2_dev, &vvcam_mdev->notifier); +#endif + if (ret) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&vvcam_mdev->notifier); +#else + v4l2_async_notifier_cleanup(&vvcam_mdev->notifier); +#endif + dev_err(vvcam_mdev->dev, "v4l2 async notifier register error\n"); + return ret; + } + + return 0; +} +#else + +static struct v4l2_async_connection * +vvcam_video_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif, + struct fwnode_handle *endpoint, + unsigned int asd_struct_size) +{ + struct v4l2_async_connection *asc; + struct fwnode_handle *remote; + + remote = fwnode_graph_get_remote_port_parent(endpoint); + if (!remote) + return ERR_PTR(-ENOTCONN); + + asc = __v4l2_async_nf_add_fwnode(notif, remote, asd_struct_size); + fwnode_handle_put(remote); + + return asc; +} + +static int vvcam_video_async_register_subdev(struct vvcam_media_dev *vvcam_mdev) +{ + int ret = 0; + struct fwnode_handle *ep; + struct v4l2_async_connection* asc; + unsigned int port_id = 0; + + vvcam_mdev->notifier.ops = &vvcam_video_async_nf_ops; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_init(&vvcam_mdev->notifier, &vvcam_mdev->v4l2_dev); +#else + v4l2_async_notifier_init(&vvcam_mdev->notifier); +#endif + + while (1) { + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vvcam_mdev->dev), + port_id, 0, FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + break; + + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + asc = vvcam_video_async_nf_add_fwnode_remote(&vvcam_mdev->notifier, + ep, sizeof(struct v4l2_async_connection)); +#else + // FIXME + ret = v4l2_async_notifier_add_fwnode_remote_subdev(&vvcam_mdev->notifier, + ep, &asd); +#endif + fwnode_handle_put(ep); + + if (ret/*IS_ERR(asd)*/) { + // ret = PTR_ERR(asd); + if (ret != -EEXIST) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&vvcam_mdev->notifier); +#else + v4l2_async_notifier_cleanup(&vvcam_mdev->notifier); +#endif + return ret; + } + } + dev_info(vvcam_mdev->dev, "register subdev port %d, subdev: %p\n", port_id, ep->dev); + port_id++; + } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + ret = v4l2_async_nf_register(&vvcam_mdev->notifier); +#else + ret = v4l2_async_notifier_register(&vvcam_mdev->v4l2_dev, &vvcam_mdev->notifier); +#endif + if (0) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_cleanup(&vvcam_mdev->notifier); +#else + v4l2_async_notifier_cleanup(&vvcam_mdev->notifier); +#endif + dev_err(vvcam_mdev->dev, "v4l2 async notifier register error\n"); + return ret; + } + + return 0; +} +#endif + +static int vvcam_video_async_unregister_subdev(struct vvcam_media_dev *vvcam_mdev) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + v4l2_async_nf_unregister(&vvcam_mdev->notifier); + v4l2_async_nf_cleanup(&vvcam_mdev->notifier); +#else + dev_info(vvcam_mdev->dev, "%s:%d\n", __func__, __LINE__); + v4l2_async_notifier_unregister(&vvcam_mdev->notifier); + dev_info(vvcam_mdev->dev, "%s:%d\n", __func__, __LINE__); + // FIXME: cause error + // v4l2_async_notifier_cleanup(&vvcam_mdev->notifier); +#endif + + return 0; +} + +static const struct media_device_ops vvcam_video_media_ops = { + .link_notify = v4l2_pipeline_link_notify, +}; + +static int vvcam_video_parse_params(struct vvcam_media_dev *vvcam_mdev, + struct platform_device *pdev) +{ +#ifdef VVCAM_PLATFORM_REGISTER + int ports = 0; + int i; + vvcam_mdev->id = pdev->id; + switch(vvcam_mdev->id) { + case 0: + vvcam_mdev->pipeline_link = pipeline0; + vvcam_mdev->pipeline_link_size = ARRAY_SIZE(pipeline0); + break; + case 1: + vvcam_mdev->pipeline_link = pipeline1; + vvcam_mdev->pipeline_link_size = ARRAY_SIZE(pipeline1); + break; + default: + break; + } + + for (i = 0; i < vvcam_mdev->pipeline_link_size; i++) { + if (vvcam_mdev->pipeline_link[i].local_is_video) { + if ((vvcam_mdev->pipeline_link[i].video_index + 1) > ports) { + ports = vvcam_mdev->pipeline_link[i].video_index + 1; + } + } + } + vvcam_mdev->ports = ports; + +#else + unsigned int port_id = 0; + struct fwnode_handle *ep; + fwnode_property_read_u32(of_fwnode_handle(pdev->dev.of_node), + "id", &vvcam_mdev->id); + + while (1) { + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vvcam_mdev->dev), + port_id, 0, FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + break; + + port_id++; + } + + vvcam_mdev->ports = port_id; +#endif + return 0; +} + +static int vvcam_video_probe(struct platform_device *pdev) +{ + int ret = 0; + struct media_device *mdev; + struct device *dev = &pdev->dev; + struct vvcam_media_dev *vvcam_mdev; + + dev_info(dev, "%s 1\n", __func__); + + vvcam_mdev = devm_kzalloc(dev, sizeof(struct vvcam_media_dev), GFP_KERNEL); + if (!vvcam_mdev) + return -ENOMEM; + + vvcam_mdev->dev = dev; + platform_set_drvdata(pdev, vvcam_mdev); + + ret = vvcam_video_parse_params(vvcam_mdev, pdev); + if (ret) { + dev_err(dev, "parse device params error\n"); + return ret; + } + + mdev = &vvcam_mdev->mdev; + mdev->dev = dev; + mdev->ops = &vvcam_video_media_ops; + strscpy(mdev->model, "verisilicon_media", sizeof(mdev->model)); + media_device_init(mdev); + + vvcam_mdev->v4l2_dev.mdev = mdev; + ret = v4l2_device_register(dev, &vvcam_mdev->v4l2_dev); + if (ret) { + dev_err(dev, "register v4l2 device error\n"); + return ret; + } + + ret = vvcam_video_register_ports(vvcam_mdev); + if (ret) { + dev_err(dev, "register video device nodes error\n"); + goto err_unregister_v4l2_device; + } + + ret = vvcam_video_async_register_subdev(vvcam_mdev); + if (ret) { + dev_err(dev, "register v4l2 async notifier error\n"); + goto err_unregister_video_ports; + } + + ret = media_device_register(mdev); + if (ret) { + dev_err(dev, "register media device error\n"); + goto err_unregister_subdev; + } + dev_info(&pdev->dev, "vvcam video driver probe success\n"); + return 0; + +err_unregister_subdev: + vvcam_video_async_unregister_subdev(vvcam_mdev); +err_unregister_video_ports: + vvcam_video_unregister_ports(vvcam_mdev); +err_unregister_v4l2_device: + v4l2_device_unregister(&vvcam_mdev->v4l2_dev); + + return ret; +} + +static int vvcam_video_remove(struct platform_device *pdev) +{ + struct vvcam_media_dev *vvcam_mdev; + + vvcam_mdev = platform_get_drvdata(pdev); + dev_info(&pdev->dev, "%s:%d\n", __func__, __LINE__); + media_device_unregister(&vvcam_mdev->mdev); + dev_info(&pdev->dev, "%s:%d\n", __func__, __LINE__); + vvcam_video_async_unregister_subdev(vvcam_mdev); + dev_info(&pdev->dev, "%s:%d\n", __func__, __LINE__); + vvcam_video_unregister_ports(vvcam_mdev); + dev_info(&pdev->dev, "%s:%d\n", __func__, __LINE__); + v4l2_device_unregister(&vvcam_mdev->v4l2_dev); + dev_info(&pdev->dev, "vvcam video driver remove\n"); + + return 0; +} + +static const struct of_device_id vvcam_video_of_match[] = { + {.compatible = "verisilicon,video",}, + { /* sentinel */ }, +}; + +MODULE_DEVICE_TABLE(of, vvcam_video_of_match); + +static struct platform_driver vvcam_video_driver = { + .probe = vvcam_video_probe, + .remove = vvcam_video_remove, + .driver = { + .name = VVCAM_VIDEO_NAME, + .owner = THIS_MODULE, + .of_match_table = vvcam_video_of_match, + }, +}; + +static int __init vvcam_video_init_module(void) +{ + int ret; + ret = platform_driver_register(&vvcam_video_driver); + if (ret) { + printk(KERN_ERR "Failed to register video driver\n"); + return ret; + } + +#ifdef VVCAM_PLATFORM_REGISTER + ret = vvcam_video_platform_device_register(); + if (ret) { + platform_driver_unregister(&vvcam_video_driver); + printk(KERN_ERR "Failed to register vvcam video platform devices\n"); + return ret; + } +#endif + + return ret; +} + +static void __exit vvcam_video_exit_module(void) +{ + platform_driver_unregister(&vvcam_video_driver); +#ifdef VVCAM_PLATFORM_REGISTER + vvcam_video_platform_device_unregister(); +#endif + + return; +} + +module_init(vvcam_video_init_module); +module_exit(vvcam_video_exit_module); + +MODULE_DESCRIPTION("Verisilicon isp driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); + diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.h new file mode 100644 index 0000000..6a222b8 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_driver.h @@ -0,0 +1,130 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VIDEO_DRIVER_H__ +#define __VVCAM_VIDEO_DRIVER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef VVCAM_PLATFORM_REGISTER + struct vvcam_v4l2_link { + struct v4l2_subdev **local_subdev; + bool local_is_video; + uint32_t video_index; + int local_pad; + struct v4l2_subdev **remote_subdev; + int remote_pad; + }; +#endif + +#define VVCAM_VIDEO_NAME "vvcam-video" +#define VVCAM_VIDEO_PORT_MAX 64 + +#define VVCAM_VIDEO_WIDTH_ALIGN 16 +#define VVCAM_VIDEO_HEIGHT_ALIGN 8 + +#define VVCAM_VIDEO_MIN_WIDTH 32 +#define VVCAM_VIDEO_MIN_HEIGHT 16 + +struct vvcam_video_params { + bool m2m; +}; + +struct vvcam_video_event_shm { + struct mutex event_lock; + uint64_t phy_addr; + void *virt_addr; + uint32_t size; +}; + +struct vvcam_video_dev { + struct vvcam_video_params video_params; + struct vvcam_media_dev *vvcam_mdev; + struct video_device *video; + struct media_pad pad; + struct vb2_queue queue; + struct mutex video_lock; + struct v4l2_format format; + uint32_t pipeline; + struct vvcam_video_event_shm event_shm; +}; + +struct vvcam_media_dev { + int id; + struct device *dev; + struct media_device mdev; + struct v4l2_device v4l2_dev; + struct v4l2_async_notifier notifier; + int ports; + struct vvcam_video_params video_params[VVCAM_VIDEO_PORT_MAX]; + struct vvcam_video_dev *video_devs[VVCAM_VIDEO_PORT_MAX]; +#ifdef VVCAM_PLATFORM_REGISTER + struct vvcam_v4l2_link *pipeline_link; + uint32_t pipeline_link_size; +#endif +}; + +struct vvcam_video_fmt_info { + uint32_t fourcc; + uint32_t mbus; +}; + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.c b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.c new file mode 100644 index 0000000..7a62777 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.c @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include "vvcam_video_event.h" + +static bool vvcam_video_event_subscribed(struct vvcam_video_dev *vvcam_vdev, + uint32_t type, uint32_t id) +{ + struct v4l2_fh *fh; + unsigned long flags; + struct v4l2_subscribed_event *sev; + bool subscribed = false; + + spin_lock_irqsave(&vvcam_vdev->video->fh_lock, flags); + + list_for_each_entry(fh, &vvcam_vdev->video->fh_list, list) { + list_for_each_entry(sev, &fh->subscribed, list) { + if (sev->type == type && sev->id == id) { + subscribed = true; + break; + } + } + if (subscribed) + break; + } + + spin_unlock_irqrestore(&vvcam_vdev->video->fh_lock, flags); + + return subscribed; +} + +int vvcam_video_post_event(struct vvcam_video_dev *vvcam_vdev, + struct vvcam_video_event_pkg *event_pkg) +{ + struct v4l2_event event; + int timeout_ms = 200000; + int i = 0; + + memset(&event, 0, sizeof(event)); + + event.type = VVCAM_VIDEO_DEAMON_EVENT; + event.id = event_pkg->head.eid; + memcpy(event.u.data, &event_pkg->head, sizeof(event_pkg->head)); + + if (!vvcam_video_event_subscribed(vvcam_vdev, event.type, event.id)) + return -EINVAL; + + v4l2_event_queue(vvcam_vdev->video, &event); + + for (i = 0; i < timeout_ms; i++) { + if (event_pkg->ack) { + break; + } + usleep_range(5, 10); + } + + if (event_pkg->ack == 0) { + dev_err(vvcam_vdev->vvcam_mdev->dev, + "%s post event %d time out\n", + vvcam_vdev->video->name, event.id); + return -EIO; + } + + if (event_pkg->result) { + return -EINVAL; + } + + return 0; +} + +int vvcam_video_create_pipeline_event(struct vvcam_video_dev *vvcam_vdev) +{ + struct vvcam_video_event_pkg *event_pkg = vvcam_vdev->event_shm.virt_addr; + int ret; + + mutex_lock(&vvcam_vdev->event_shm.event_lock); + + event_pkg->head.eid = VVCAM_VEVENT_CREATE_PIPELINE; + event_pkg->head.shm_addr = vvcam_vdev->event_shm.phy_addr; + event_pkg->head.shm_size = vvcam_vdev->event_shm.size; + event_pkg->head.data_size = 0; + event_pkg->ack = 0; + event_pkg->result = 0; + + ret = vvcam_video_post_event(vvcam_vdev, event_pkg); + + mutex_unlock(&vvcam_vdev->event_shm.event_lock); + + return ret; +} + +int vvcam_video_destroy_pipeline_event(struct vvcam_video_dev *vvcam_vdev) +{ + struct vvcam_video_event_pkg *event_pkg = vvcam_vdev->event_shm.virt_addr; + int ret; + + mutex_lock(&vvcam_vdev->event_shm.event_lock); + + event_pkg->head.eid = VVCAM_VEVENT_DESTROY_PIPELINE; + event_pkg->head.shm_addr = vvcam_vdev->event_shm.phy_addr; + event_pkg->head.shm_size = vvcam_vdev->event_shm.size; + event_pkg->head.data_size = 0; + event_pkg->ack = 0; + event_pkg->result = 0; + + ret = vvcam_video_post_event(vvcam_vdev, event_pkg); + + mutex_unlock(&vvcam_vdev->event_shm.event_lock); + + return ret; +} + + diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.h new file mode 100644 index 0000000..bedbeec --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_event.h @@ -0,0 +1,85 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VIDEO_EVENT_H__ +#define __VVCAM_VIDEO_EVENT_H__ + +#define VVCAM_VIDEO_DEAMON_EVENT (V4L2_EVENT_PRIVATE_START + 1000) + +enum vvcam_video_event_id { + VVCAM_VEVENT_CREATE_PIPELINE = 0, + VVCAM_VEVENT_DESTROY_PIPELINE, + VVCAM_VEVENT_MAX, +}; + +struct vvcam_video_event_pkg_head { + uint32_t eid; + uint64_t shm_addr; + uint32_t shm_size; + uint32_t data_size; +}; + +struct vvcam_video_event_pkg { + struct vvcam_video_event_pkg_head head; + uint8_t ack; + int32_t result; + uint8_t data[2048]; +}; + +#ifdef __KERNEL__ +#include "vvcam_video_driver.h" +int vvcam_video_create_pipeline_event(struct vvcam_video_dev *vvcam_vdev); +int vvcam_video_destroy_pipeline_event(struct vvcam_video_dev *vvcam_vdev); +#endif + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.c b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.c new file mode 100644 index 0000000..3085421 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.c @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.h new file mode 100644 index 0000000..3085421 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_m2m_register.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.c b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.c new file mode 100644 index 0000000..9121cce --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.c @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include "vvcam_video_platform.h" + +static int devices_mask = 0x01; +MODULE_PARM_DESC(devices_mask, "vvcam video devices mask"); + +static void vvcam_video_pdev_release(struct device *dev) +{ + dev_info(dev, "%s\n", __func__); + return; +} + +static struct platform_device vvcam_video0_pdev = { + .name = "vvcam-video", + .id = 0, + .dev.release = vvcam_video_pdev_release, +}; + +static struct platform_device vvcam_video1_pdev = { + .name = "vvcam-video", + .id = 1, + .dev.release = vvcam_video_pdev_release, +}; + +int vvcam_video_platform_device_register(void) +{ + int ret = 0; + int devs_mask = 0; + + if (devices_mask & 0x01) { + ret = platform_device_register(&vvcam_video0_pdev); + if (ret) { + goto err_register; + } + devs_mask |= 0x01; + } + + if (devices_mask & 0x02) { + ret = platform_device_register(&vvcam_video1_pdev); + if (ret) { + goto err_register; + } + devs_mask |= 0x02; + } + + return ret; + +err_register: + if (devs_mask & 0x01) + platform_device_unregister(&vvcam_video0_pdev); + if (devs_mask & 0x02) + platform_device_unregister(&vvcam_video1_pdev); + + return ret; +} + +void vvcam_video_platform_device_unregister(void) +{ + if (devices_mask & 0x01) + platform_device_unregister(&vvcam_video0_pdev); + + if (devices_mask & 0x02) + platform_device_unregister(&vvcam_video1_pdev); + + return; +} + +module_param(devices_mask, int, 0644); diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.h new file mode 100644 index 0000000..4b25a10 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_platform.h @@ -0,0 +1,60 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VIDEO_PLATFORM_H__ +#define __VVCAM_VIDEO_PLATFORM_H__ + +int vvcam_video_platform_device_register(void); +void vvcam_video_platform_device_unregister(void); + +#endif diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.c b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.c new file mode 100644 index 0000000..3b0c141 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.c @@ -0,0 +1,1098 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vvcam_video_register.h" +#include "vvcam_v4l2_common.h" +#include "vvcam_video_event.h" + +static struct vvcam_video_fmt_info vvcam_formats_info[] = { + { + .fourcc = V4L2_PIX_FMT_NV16, + .mbus = MEDIA_BUS_FMT_YUYV8_2X8, + }, + { + .fourcc = V4L2_PIX_FMT_NV12, + .mbus = MEDIA_BUS_FMT_YUYV8_1_5X8, + }, + { + .fourcc = V4L2_PIX_FMT_YUYV, + .mbus = MEDIA_BUS_FMT_YUYV8_1X16, + }, +}; + +static int vvcam_video_mbus_to_fourcc(uint32_t mbus, uint32_t *fourcc) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(vvcam_formats_info); i++) { + if (vvcam_formats_info[i].mbus == mbus) { + *fourcc = vvcam_formats_info[i].fourcc; + return 0; + } + } + + return -EINVAL; +} + +static int vvcam_video_fourcc_to_mbus(uint32_t fourcc, uint32_t *mbus) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(vvcam_formats_info); i++) { + if (vvcam_formats_info[i].fourcc == fourcc) { + *mbus = vvcam_formats_info[i].mbus; + return 0; + } + } + + return -EINVAL; +} + +static int vvcam_video_vfmt_to_mfmt(struct v4l2_format *f, struct v4l2_subdev_format *mfmt) +{ + int ret; + + mfmt->format.width = f->fmt.pix.width; + mfmt->format.height = f->fmt.pix.height; + mfmt->format.field = f->fmt.pix.field; + mfmt->format.colorspace = f->fmt.pix.colorspace; + mfmt->format.quantization = f->fmt.pix.quantization; + + ret = vvcam_video_fourcc_to_mbus(f->fmt.pix.pixelformat, &mfmt->format.code); + + return ret; + +} + +static int vvcam_video_mfmt_to_vfmt( struct v4l2_subdev_format *mfmt, struct v4l2_format *f) +{ + int ret; + const struct v4l2_format_info *info; + uint32_t bytesperline; + uint32_t sizeimage = 0; + uint32_t width; + uint32_t height; + int i; + + f->fmt.pix.width = mfmt->format.width; + f->fmt.pix.height = mfmt->format.height; + f->fmt.pix.field = mfmt->format.field; + f->fmt.pix.colorspace = mfmt->format.colorspace; + f->fmt.pix.quantization = mfmt->format.quantization; + ret = vvcam_video_mbus_to_fourcc(mfmt->format.code, &f->fmt.pix.pixelformat); + if (ret) + return ret; + + width = f->fmt.pix.width; + height = f->fmt.pix.height; + info = v4l2_format_info(f->fmt.pix.pixelformat); + bytesperline = info->bpp[0] * width; + sizeimage = bytesperline * height; + + if (info->comp_planes == 1) { + f->fmt.pix.bytesperline = bytesperline; + f->fmt.pix.sizeimage = sizeimage; + return 0; + } + + f->fmt.pix.bytesperline = bytesperline; + f->fmt.pix.sizeimage = sizeimage; + for (i = 1; i < info->comp_planes; i++) { + bytesperline = info->bpp[i] * DIV_ROUND_UP(width, info->hdiv); + sizeimage = bytesperline * DIV_ROUND_UP(height, info->vdiv); + + f->fmt.pix.sizeimage += sizeimage; + } + + return 0; +} + +static struct v4l2_subdev *vvcam_video_remote_subdev(struct vvcam_video_dev *vvcam_vdev) +{ + struct media_pad *pad; + struct v4l2_subdev *subdev; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + if (!pad || !is_media_entity_v4l2_subdev(pad->entity)) + return NULL; + + subdev = media_entity_to_v4l2_subdev(pad->entity); + + return subdev; +} + +static int vvcam_video_try_create_pipeline(struct vvcam_video_dev *vvcam_vdev) +{ + int ret; + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct v4l2_subdev_format sd_fmt; + struct v4l2_subdev_pad_config pad_cfg; + struct v4l2_subdev_state sd_state = { + .pads = &pad_cfg + }; + + if (vvcam_vdev->pipeline) { + return 0; + } + ret = vvcam_video_create_pipeline_event(vvcam_vdev); + if (ret) + return ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (!subdev) + return -EINVAL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + + sd_fmt.pad = pad->index; + sd_fmt.which = V4L2_SUBDEV_FORMAT_TRY; + + ret = v4l2_subdev_call(subdev, pad, get_fmt, &sd_state, &sd_fmt); + if (ret) + return ret; + + ret = vvcam_video_mfmt_to_vfmt(&sd_fmt, &vvcam_vdev->format); + if (ret) + return ret; + + vvcam_vdev->pipeline = 1; + return 0; +} + +static int vvcam_video_destroy_pipeline(struct vvcam_video_dev *vvcam_vdev) +{ + vvcam_vdev->pipeline = 0; + vvcam_video_destroy_pipeline_event(vvcam_vdev); + return 0; +} + +static int vvcam_videoc_querycap(struct file *file, void *priv, + struct v4l2_capability *cap) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + strlcpy(cap->driver, vvcam_vdev->video->name, sizeof(cap->driver)); + strlcpy(cap->card, vvcam_vdev->video->name, sizeof(cap->card)); + snprintf(cap->bus_info, sizeof(cap->bus_info), + "platform:%s", vvcam_vdev->video->name); + + return 0; +} + +static int vvcam_videoc_enum_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_fmtdesc *f) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct v4l2_subdev_mbus_code_enum mbus_code; + struct v4l2_subdev_pad_config pad_cfg; + struct v4l2_subdev_state sd_state = { + .pads = &pad_cfg + }; + int ret = -EINVAL; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + memset(&mbus_code, 0, sizeof(mbus_code)); + mbus_code.pad = pad->index; + mbus_code.index = f->index; + ret = v4l2_subdev_call(subdev, pad, enum_mbus_code, &sd_state, &mbus_code); + if (ret) + return ret; + + ret = vvcam_video_mbus_to_fourcc(mbus_code.code, &f->pixelformat); + if (ret) + return ret; + } + + return ret; +} + +static int vvcam_videoc_try_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct v4l2_subdev_format sd_fmt; + struct v4l2_subdev_pad_config pad_cfg; + struct v4l2_subdev_state sd_state = { + .pads = &pad_cfg + }; + int ret; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + ret = vvcam_video_try_create_pipeline(vvcam_vdev); + if (ret) + return ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (!subdev) + return -EINVAL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + + sd_fmt.pad = pad->index; + sd_fmt.which = V4L2_SUBDEV_FORMAT_TRY; + + vvcam_video_vfmt_to_mfmt(f, &sd_fmt); + ret = v4l2_subdev_call(subdev, pad, set_fmt, &sd_state, &sd_fmt); + if (ret) + return ret; + + ret = vvcam_video_mfmt_to_vfmt(&sd_fmt, f); + + return ret; +} + +static int vvcam_videoc_s_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct vb2_queue *queue = &vvcam_vdev->queue; + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct v4l2_subdev_format sd_fmt; + struct v4l2_subdev_pad_config pad_cfg; + struct v4l2_subdev_state sd_state = { + .pads = &pad_cfg + }; + int ret; + + if (vb2_is_busy(queue)) + return -EBUSY; + ret = vvcam_videoc_try_fmt_vid_cap(file, priv, f); + if (ret) + return ret; + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (!subdev) + return -EINVAL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + sd_fmt.pad = pad->index; + sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; + + vvcam_video_vfmt_to_mfmt(f, &sd_fmt); + + ret = v4l2_subdev_call(subdev, pad, set_fmt, &sd_state, &sd_fmt); + if (ret) + return ret; + + vvcam_vdev->format = *f; + printk("%d x %d size %d fmt %s \n", + f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.sizeimage, (char *)&f->fmt.pix.pixelformat); + + return 0; +} + +static int vvcam_videoc_g_fmt_vid_cap(struct file *file, void *fh, + struct v4l2_format *f) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + + int ret; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + ret = vvcam_video_try_create_pipeline(vvcam_vdev); + if (ret) + return ret; + + *f = vvcam_vdev->format; + + return 0; +} + +static int vvcam_videoc_reqbufs(struct file *file, void *priv, + struct v4l2_requestbuffers *p) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_reqbufs pad_requbufs; + + int ret; + + ret = vvcam_video_try_create_pipeline(vvcam_vdev); + if (ret) + return ret; + + ret = vb2_ioctl_reqbufs(file, priv, p); + if (ret) + return ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_requbufs.pad = pad->index; + pad_requbufs.num_buffers = p->count; + v4l2_subdev_call(subdev, core, ioctl, VVCAM_PAD_REQUBUFS, &pad_requbufs); + } + + return ret; +} + +static int vvcam_videoc_enum_input(struct file *file, void *fh, + struct v4l2_input *input) +{ + if (input->index > 0) + return -EINVAL; + + strscpy(input->name, "camera", sizeof(input->name)); + input->type = V4L2_INPUT_TYPE_CAMERA; + + return 0; +} + +static int vvcam_videoc_g_input(struct file *file, void *fh, unsigned int *input) +{ + *input = 0; + return 0; +} + +static int vvcam_videoc_s_input(struct file *file, void *fh, unsigned int input) +{ + return input == 0 ? 0 : -EINVAL; +} + +static int vvcam_videoc_queryctrl(struct file *file, void *fh, + struct v4l2_queryctrl *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_queryctrl pad_query_ctrl; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_query_ctrl.pad = pad->index; + pad_query_ctrl.query_ctrl = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_QUERYCTRL, &pad_query_ctrl); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_videoc_query_ext_ctrl(struct file *file, void *fh, + struct v4l2_query_ext_ctrl *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_query_ext_ctrl pad_query_ext_ctrl; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_query_ext_ctrl.pad = pad->index; + pad_query_ext_ctrl.query_ext_ctrl = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_QUERY_EXT_CTRL, &pad_query_ext_ctrl); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_g_ctrl(struct file *file, void *fh, + struct v4l2_control *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_control pad_control; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_control.pad = pad->index; + pad_control.control = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_G_CTRL, &pad_control); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_s_ctrl(struct file *file, void *fh, + struct v4l2_control *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_control pad_control; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_control.pad = pad->index; + pad_control.control = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_S_CTRL, &pad_control); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_g_ext_ctrls(struct file *file, void *fh, + struct v4l2_ext_controls *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_ext_controls pad_ext_controls; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_ext_controls.pad = pad->index; + pad_ext_controls.ext_controls = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_G_EXT_CTRLS, &pad_ext_controls); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_s_ext_ctrls(struct file *file, void *fh, + struct v4l2_ext_controls *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_ext_controls pad_ext_controls; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_ext_controls.pad = pad->index; + pad_ext_controls.ext_controls = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_S_EXT_CTRLS, &pad_ext_controls); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_try_ext_ctrls(struct file *file, void *fh, + struct v4l2_ext_controls *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_ext_controls pad_ext_controls; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_ext_controls.pad = pad->index; + pad_ext_controls.ext_controls = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_TRY_EXT_CTRLS, &pad_ext_controls); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_vidioc_querymenu(struct file *file, void *fh, + struct v4l2_querymenu *a) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_querymenu pad_querymenu; + int ret; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_querymenu.pad = pad->index; + pad_querymenu.querymenu = a; + ret = v4l2_subdev_call(subdev, core, ioctl, + VVCAM_PAD_QUERYMENU, &pad_querymenu); + + } else { + return -ENOTTY; + } + + return ret; +} + +static int vvcam_videoc_subscribe_event(struct v4l2_fh *fh, + const struct v4l2_event_subscription *sub) +{ + int ret; + switch (sub->type) { + case V4L2_EVENT_CTRL: + ret = v4l2_ctrl_subscribe_event(fh, sub); + break; + case VVCAM_VIDEO_DEAMON_EVENT: + ret = v4l2_event_subscribe(fh, sub, 2, NULL); + break; + default: + ret = -EINVAL; + break; + } + + return ret; +} + +static const struct v4l2_ioctl_ops vvcam_video_ioctl_ops = { + .vidioc_querycap = vvcam_videoc_querycap, + .vidioc_enum_fmt_vid_cap = vvcam_videoc_enum_fmt_vid_cap, + .vidioc_try_fmt_vid_cap = vvcam_videoc_try_fmt_vid_cap, + .vidioc_g_fmt_vid_cap = vvcam_videoc_g_fmt_vid_cap, + .vidioc_s_fmt_vid_cap = vvcam_videoc_s_fmt_vid_cap, + + .vidioc_reqbufs = vvcam_videoc_reqbufs, + .vidioc_querybuf = vb2_ioctl_querybuf, + .vidioc_create_bufs = vb2_ioctl_create_bufs, + .vidioc_qbuf = vb2_ioctl_qbuf, + .vidioc_expbuf = vb2_ioctl_expbuf, + .vidioc_dqbuf = vb2_ioctl_dqbuf, + .vidioc_prepare_buf = vb2_ioctl_prepare_buf, + .vidioc_streamon = vb2_ioctl_streamon, + .vidioc_streamoff = vb2_ioctl_streamoff, + + .vidioc_enum_input = vvcam_videoc_enum_input, + .vidioc_g_input = vvcam_videoc_g_input, + .vidioc_s_input = vvcam_videoc_s_input, + /*.vidioc_g_selection = vvcam_videoc_g_selection, + .vidioc_s_selection = vvcam_videoc_s_selection, + .vidioc_g_parm = vvcam_videoc_g_parm, + .vidioc_s_parm = vvcam_videoc_s_parm, + .vidioc_enum_framesizes = vvcam_videoc_enum_framesizes, + .vidioc_enum_frameintervals = vvcam_videoc_enum_frmaeintervals,*/ + .vidioc_queryctrl = vvcam_videoc_queryctrl, + .vidioc_query_ext_ctrl = vvcam_videoc_query_ext_ctrl, + .vidioc_g_ctrl = vvcam_vidioc_g_ctrl, + .vidioc_s_ctrl = vvcam_vidioc_s_ctrl, + .vidioc_g_ext_ctrls = vvcam_vidioc_g_ext_ctrls, + .vidioc_s_ext_ctrls = vvcam_vidioc_s_ext_ctrls, + .vidioc_try_ext_ctrls = vvcam_vidioc_try_ext_ctrls, + .vidioc_querymenu = vvcam_vidioc_querymenu, + .vidioc_subscribe_event = vvcam_videoc_subscribe_event, + .vidioc_unsubscribe_event = v4l2_event_unsubscribe, +}; + +static __poll_t vvcam_video_poll(struct file *file, + struct poll_table_struct *wait) +{ + struct v4l2_fh *fh = file->private_data; + if (!list_empty(&fh->subscribed)) { + return v4l2_ctrl_poll(file, wait); + } else { + return vb2_fop_poll(file, wait); + } +} + +static int vvcam_video_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + struct v4l2_fh *fh = file->private_data; + int ret; + + if (vvcam_vdev->video->queue->owner && + (vvcam_vdev->video->queue->owner == fh)) { + return vb2_fop_mmap(file, vma); + } else { + ret = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, + vma->vm_end - vma->vm_start, + vma->vm_page_prot); + return ret; + } +} + +static int vvcam_video_open(struct file *file) +{ + return v4l2_fh_open(file); +} + +static int vvcam_video_release(struct file *file) +{ + struct vvcam_video_dev *vvcam_vdev = video_drvdata(file); + int ret; + + ret = vb2_fop_release(file); + if (vvcam_vdev->video->queue->owner == NULL) { + if (vvcam_vdev->pipeline) { + vvcam_video_destroy_pipeline(vvcam_vdev); + } + } + + return ret; +} + +static const struct v4l2_file_operations vvcam_video_fops = { + .owner = THIS_MODULE, + .open = vvcam_video_open, + .release = vvcam_video_release, + .poll = vvcam_video_poll, + .unlocked_ioctl = video_ioctl2, + .mmap = vvcam_video_mmap, +}; + +static int vvcam_video_vb2_queue_setup(struct vb2_queue *queue, + unsigned int *num_buffers, + unsigned int *num_planes, + unsigned int sizes[], + struct device *alloc_devs[]) +{ + struct vvcam_video_dev *vvcam_vdev = queue->drv_priv; + struct v4l2_format *format = &vvcam_vdev->format; + unsigned int i; + + if (format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { + if (*num_planes) { + if (*num_planes != 1) + return -EINVAL; + if (sizes[0] < format->fmt.pix.sizeimage) + return -EINVAL; + } else { + *num_planes = 1; + sizes[0] = format->fmt.pix.sizeimage; + } + } else if (format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + if (*num_planes) { + if (*num_planes != format->fmt.pix_mp.num_planes) + return -EINVAL; + for (i = 0; i < format->fmt.pix_mp.num_planes; i++) { + if (sizes[i] < format->fmt.pix_mp.plane_fmt[i].sizeimage) + return -EINVAL; + } + } else { + *num_planes = format->fmt.pix_mp.num_planes; + for (i = 0; i < format->fmt.pix_mp.num_planes; i++) { + sizes[i] = format->fmt.pix_mp.plane_fmt[i].sizeimage; + } + } + } else { + return -EINVAL; + } + + return 0; +} + +static int vvcam_video_vb2_buf_prepare(struct vb2_buffer *vb) +{ + struct vvcam_video_dev *vvcam_vdev = vb->vb2_queue->drv_priv; + struct v4l2_format *format = &vvcam_vdev->format; + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct vvcam_vb2_buffer *buf = container_of(vbuf, + struct vvcam_vb2_buffer, vb); + int i; + + if (format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { + if (vb2_plane_size(vb, 0) < format->fmt.pix.sizeimage) + return -EINVAL; + + buf->num_planes = 1; + buf->planes[0].dma_addr = vb2_dma_contig_plane_dma_addr(vb, 0); + buf->planes[0].size = format->fmt.pix.sizeimage; + buf->sequence = vb->index; + + vb2_set_plane_payload(vb, 0, buf->planes[0].size); + + } else if (format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { + buf->num_planes = format->fmt.pix_mp.num_planes; + buf->sequence = vb->index; + for (i = 0; i < format->fmt.pix_mp.num_planes; i++) { + if (vb2_plane_size(vb, i) < format->fmt.pix_mp.plane_fmt[i].sizeimage) + return -EINVAL; + + buf->planes[i].dma_addr = vb2_dma_contig_plane_dma_addr(vb, i); + buf->planes[i].size = format->fmt.pix_mp.plane_fmt[i].sizeimage; + + vb2_set_plane_payload(vb, i, buf->planes[i].size); + } + } else { + return -EINVAL; + } + + return 0; +} + +static void vvcam_video_vb2_buf_queue(struct vb2_buffer *vb) +{ + struct vvcam_video_dev *vvcam_vdev = vb->vb2_queue->drv_priv; + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct vvcam_vb2_buffer *buf = container_of(vbuf, + struct vvcam_vb2_buffer, vb); + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_buf pad_buf; + + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + pad_buf.pad = pad->index; + pad_buf.buf = buf; + v4l2_subdev_call(subdev, core, ioctl, VVCAM_PAD_BUF_QUEUE, &pad_buf); + } + + return; +} + +static int vvcam_video_vb2_start_streaming(struct vb2_queue *queue, + unsigned int count) +{ + struct vvcam_video_dev *vvcam_vdev = queue->drv_priv; + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_stream_status stream_status; + int ret = -EINVAL; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + stream_status.pad = pad->index; + stream_status.status = 1; + ret = v4l2_subdev_call(subdev, core, ioctl, VVCAM_PAD_S_STREAM, &stream_status); + } + + return ret; +} + +static void vvcam_video_vb2_stop_streaming(struct vb2_queue *queue) +{ + struct vvcam_video_dev *vvcam_vdev = queue->drv_priv; + struct media_pad *pad; + struct v4l2_subdev *subdev; + struct vvcam_pad_stream_status stream_status; + int i; + + subdev = vvcam_video_remote_subdev(vvcam_vdev); + if (subdev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + pad = media_pad_remote_pad_first(&vvcam_vdev->pad); +#else + pad = media_entity_remote_pad(&vvcam_vdev->pad); +#endif + stream_status.pad = pad->index; + stream_status.status = 0; + v4l2_subdev_call(subdev, core, ioctl, VVCAM_PAD_S_STREAM, &stream_status); + } + + for(i = 0; i < queue->num_buffers; i++) { + if(queue->bufs[i]->state == VB2_BUF_STATE_ACTIVE) + vb2_buffer_done(queue->bufs[i], VB2_BUF_STATE_ERROR); + } + + return; +} + +static const struct vb2_ops vvcam_video_queue_ops = { + .queue_setup = vvcam_video_vb2_queue_setup, + .buf_prepare = vvcam_video_vb2_buf_prepare, + .buf_queue = vvcam_video_vb2_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, + .start_streaming = vvcam_video_vb2_start_streaming, + .stop_streaming = vvcam_video_vb2_stop_streaming, +}; + +static int vvcam_video_queue_init(struct vvcam_video_dev *vvcam_vdev) +{ + int ret = 0; + struct vb2_queue *queue; + + queue = &vvcam_vdev->queue; + queue->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + queue->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; + queue->drv_priv = vvcam_vdev; + queue->ops = &vvcam_video_queue_ops; + queue->mem_ops = &vb2_dma_contig_memops; + queue->buf_struct_size = sizeof(struct vvcam_vb2_buffer); + queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; + queue->lock = &vvcam_vdev->video_lock; + queue->dev = vvcam_vdev->vvcam_mdev->dev; + + ret = vb2_queue_init(queue); + if (ret) { + dev_err(vvcam_vdev->vvcam_mdev->dev, "vb2 queue init failed\n"); + return ret; + } + vvcam_vdev->video->queue = queue; + + return 0; +} + +static int vvcam_video_link_setup(struct media_entity *entity, + const struct media_pad *local, + const struct media_pad *remote, u32 flags) +{ + return 0; +} + + +static const struct media_entity_operations vvcam_video_entity_ops = { + .link_setup = vvcam_video_link_setup, + .link_validate = v4l2_subdev_link_validate, +}; + +int vvcam_video_register(struct vvcam_media_dev *vvcam_mdev, int port) +{ + int ret = 0; + struct vvcam_video_dev *vvcam_vdev; + + vvcam_vdev = devm_kzalloc(vvcam_mdev->dev, + sizeof(struct vvcam_video_dev), GFP_KERNEL); + if (!vvcam_vdev) + return -ENOMEM; + + mutex_init(&vvcam_vdev->video_lock); + vvcam_vdev->vvcam_mdev = vvcam_mdev; + vvcam_vdev->video_params = vvcam_mdev->video_params[port]; + + vvcam_vdev->video = video_device_alloc(); + if (!vvcam_vdev->video) { + dev_err(vvcam_mdev->dev, "could not alloc video device\n"); + ret = -ENOMEM; + goto error_free_vvcam_vdev; + } + + snprintf(vvcam_vdev->video->name, sizeof(vvcam_vdev->video->name), + "%s.%d.%d", VVCAM_VIDEO_NAME, vvcam_mdev->id, port); + + vvcam_vdev->video->fops = &vvcam_video_fops; + vvcam_vdev->video->ioctl_ops = &vvcam_video_ioctl_ops; + vvcam_vdev->video->release = video_device_release_empty; + vvcam_vdev->video->v4l2_dev = &vvcam_mdev->v4l2_dev; + //vvcam_vdev->video->lock = &vvcam_vdev->video_lock; + vvcam_vdev->video->device_caps = V4L2_CAP_VIDEO_CAPTURE | + V4L2_CAP_STREAMING; + vvcam_vdev->video->minor = -1; + + video_set_drvdata(vvcam_vdev->video, vvcam_vdev); + + vvcam_vdev->video->entity.name = vvcam_vdev->video->name; + vvcam_vdev->video->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE; + vvcam_vdev->video->entity.function = MEDIA_ENT_F_IO_V4L; + vvcam_vdev->video->entity.ops = &vvcam_video_entity_ops; + vvcam_vdev->pad.flags = MEDIA_PAD_FL_SINK; + + ret = media_entity_pads_init(&vvcam_vdev->video->entity, 1, &vvcam_vdev->pad); + if (ret) { + dev_err(vvcam_mdev->dev, "entity pad init error\n"); + goto error_video_device_release; + } + + ret = vvcam_video_queue_init(vvcam_vdev); + if (ret) { + dev_err(vvcam_mdev->dev, "queue init error\n"); + goto err_media_entity_cleanup; + } + + ret = video_register_device(vvcam_vdev->video, VFL_TYPE_VIDEO, -1); + if (ret) { + dev_err(vvcam_mdev->dev, "video register device error\n"); + goto err_media_entity_cleanup; + } + + vvcam_vdev->event_shm.virt_addr = (void *)__get_free_pages(GFP_KERNEL, 0); + vvcam_vdev->event_shm.size = PAGE_SIZE; + memset(vvcam_vdev->event_shm.virt_addr, 0, vvcam_vdev->event_shm.size); + vvcam_vdev->event_shm.phy_addr = virt_to_phys(vvcam_vdev->event_shm.virt_addr); + mutex_init(&vvcam_vdev->event_shm.event_lock); + + vvcam_mdev->video_devs[port] = vvcam_vdev; + + return 0; + +err_media_entity_cleanup: + media_entity_cleanup(&vvcam_vdev->video->entity); + +error_video_device_release: + video_device_release(vvcam_vdev->video); + vvcam_vdev->video = NULL; + +error_free_vvcam_vdev: + devm_kfree(vvcam_mdev->dev,vvcam_vdev); + + return ret; +} + +int vvcam_video_unregister(struct vvcam_media_dev *vvcam_mdev, int port) +{ + struct vvcam_video_dev *vvcam_vdev = vvcam_mdev->video_devs[port]; + + if (vvcam_vdev == NULL) + return 0; + + video_unregister_device(vvcam_vdev->video); + media_entity_cleanup(&vvcam_vdev->video->entity); + video_device_release(vvcam_vdev->video); + devm_kfree(vvcam_mdev->dev,vvcam_vdev); + vvcam_mdev->video_devs[port] = NULL; + + free_pages((unsigned long)vvcam_vdev->event_shm.virt_addr, 0); + + return 0; +} + +MODULE_DESCRIPTION("Verisilicon video driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); diff --git a/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.h b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.h new file mode 100644 index 0000000..de44418 --- /dev/null +++ b/buildroot-overlay/package/vvcam/v4l2/video/vvcam_video_register.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VIDEO_REGISTER_H__ +#define __VVCAM_VIDEO_REGISTER_H__ +#include "vvcam_video_driver.h" + +int vvcam_video_register(struct vvcam_media_dev *vvcam_mdev, int port); +int vvcam_video_unregister(struct vvcam_media_dev *vvcam_mdev, int port); + +#endif \ No newline at end of file diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_cma.c b/buildroot-overlay/package/vvcam/vb/vvcam_cma.c new file mode 100644 index 0000000..b16e2cb --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_cma.c @@ -0,0 +1,231 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_cma.h" +#include "vvcam_vb_driver.h" + +static int vvcam_cma_alloc(struct file *file, + unsigned long *paddr, unsigned long size, char *name); +static int vvcam_cma_mmap(struct file *file, struct vm_area_struct *vma); +static int vvcam_cma_free(struct file *file, unsigned long paddr); +static int vvcam_cma_free_all(struct file *file); + +static void *vvcam_alloc_cma_buf_attr(struct vvcam_cma *cma) +{ + return devm_kzalloc(cma->dev, sizeof(struct vvcam_cma_buf), GFP_KERNEL); +} + +static void vvcam_free_cma_buf_attr(struct vvcam_cma *cma, + struct vvcam_cma_buf *cma_buf) +{ + devm_kfree(cma->dev, cma_buf); +} + +int vvcam_cma_create(void *allocator, struct device *dev) +{ + struct vvcam_cma *cma; + struct vvcam_vb_mm_allocator *pallocator = + (struct vvcam_vb_mm_allocator *)allocator; + int ret = 0; + + cma = (struct vvcam_cma *)devm_kzalloc(dev, sizeof(struct vvcam_cma), GFP_KERNEL); + if (!cma) + return -ENOMEM; + cma->dev = dev; + + if (!dev->dma_mask) + dev->dma_mask = &dev->coherent_dma_mask; + ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); + if (ret) { + return ret; + } + + INIT_LIST_HEAD(&cma->buf_list); + + pallocator->mm_dev = cma; + pallocator->alloc = vvcam_cma_alloc; + pallocator->mmap = vvcam_cma_mmap; + pallocator->free = vvcam_cma_free; + pallocator->free_all = vvcam_cma_free_all; + return 0; +} + +int vvcam_cma_alloc(struct file *file, + unsigned long *paddr, unsigned long size, char *name) +{ + struct vvcam_cma *cma; + struct vvcam_vb_dev *vb_dev; + struct vvcam_cma_buf *cma_buf = NULL; + + vb_dev = file->private_data; + cma = vb_dev->allocator.mm_dev; + + cma_buf = vvcam_alloc_cma_buf_attr(cma); + if (!cma_buf) + return -ENOMEM; + + cma_buf->virt_addr = + dma_alloc_coherent(cma->dev, size, &(cma_buf->phys_addr), GFP_KERNEL); + if (!cma_buf->virt_addr) { + vvcam_free_cma_buf_attr(cma, cma_buf); + return -ENOMEM; + } + cma_buf->size = size; + strncpy(cma_buf->name, name, strlen(name)); + cma_buf->private = file; + list_add_tail(&cma_buf->list, &cma->buf_list); + + *paddr = cma_buf->phys_addr; + + return 0; +} + +static int vvcam_cma_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned long size = 0; + struct vvcam_vb_dev *vb_dev; + struct vvcam_cma *cma; + struct vvcam_cma_buf *cma_buf = NULL; + + vb_dev = file->private_data; + cma = vb_dev->allocator.mm_dev; + + if (list_empty(&cma->buf_list)) + return -1; + + size = vma->vm_end - vma->vm_start; + + list_for_each_entry(cma_buf, &cma->buf_list, list) { + if (!cma_buf) { + continue; + } + if ((cma_buf->phys_addr >> PAGE_SHIFT) == vma->vm_pgoff) { + break; + } + } + + if (!cma_buf) + return -EAGAIN; + + vma->vm_pgoff = 0; + return dma_mmap_coherent(cma->dev, vma, cma_buf->virt_addr, + cma_buf->phys_addr, size); +} + +static int vvcam_cma_free(struct file *file, unsigned long paddr) +{ + struct vvcam_vb_dev *vb_dev; + struct vvcam_cma *cma; + struct vvcam_cma_buf *cma_buf = NULL; + + vb_dev = file->private_data; + cma = vb_dev->allocator.mm_dev; + + if (list_empty(&cma->buf_list)) + return -1; + + list_for_each_entry(cma_buf, &cma->buf_list, list) { + if (cma_buf->phys_addr == paddr) { + break; + } + } + + if (cma_buf == NULL) + return -1; + + list_del(&cma_buf->list); + dma_free_coherent(cma->dev, cma_buf->size, + cma_buf->virt_addr, cma_buf->phys_addr); + vvcam_free_cma_buf_attr(cma, cma_buf); + + return 0; +} + +int vvcam_cma_free_all(struct file *file) +{ + struct vvcam_vb_dev *vb_dev; + struct vvcam_cma *cma; + struct vvcam_cma_buf *cma_buf = NULL, *tmp_cma_buf; + + vb_dev = file->private_data; + cma = vb_dev->allocator.mm_dev; + + if (list_empty(&cma->buf_list)) + return 0; + + list_for_each_entry_safe(cma_buf, tmp_cma_buf, &cma->buf_list, list) { + if (!cma) + continue; + if (cma_buf->private == file) { + list_del(&cma_buf->list); + dma_free_coherent(cma->dev, cma_buf->size, + cma_buf->virt_addr, cma_buf->phys_addr); + vvcam_free_cma_buf_attr(cma, cma_buf); + } + } + + return 0; +} diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_cma.h b/buildroot-overlay/package/vvcam/vb/vvcam_cma.h new file mode 100644 index 0000000..d19eba2 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_cma.h @@ -0,0 +1,75 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_CMA_H__ +#define __VVCAM_CMA_H__ + +#define VVCAM_CMA_BUF_NAME_LEN 32 + +struct vvcam_cma_buf { + char name[VVCAM_CMA_BUF_NAME_LEN]; + struct list_head list; + dma_addr_t phys_addr; + unsigned long size; + void *virt_addr; + void *private; +}; + +struct vvcam_cma { + struct device *dev; + struct list_head buf_list; + spinlock_t lock; +}; + +int vvcam_cma_create(void *allocator, struct device *dev); +#endif diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_mmz.c b/buildroot-overlay/package/vvcam/vb/vvcam_mmz.c new file mode 100644 index 0000000..aa2a95b --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_mmz.c @@ -0,0 +1,376 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_mmz.h" +#include "vvcam_vb_driver.h" + +static int vvcam_mmz_alloc(struct file *file, + unsigned long *paddr, unsigned long size, char *name); +static int vvcam_mmz_mmap(struct file *file, struct vm_area_struct *vma); +static int vvcam_mmz_free(struct file *file, unsigned long paddr); +static int vvcam_mmz_free_all(struct file *file); + +static void *vvcam_alloc_mmb_attr(struct vvcam_mmz *mmz) +{ + return devm_kzalloc(mmz->dev, sizeof(struct vvcam_mmb), GFP_KERNEL); +} + +static void vvcam_free_mmb_attr(struct vvcam_mmz *mmz, struct vvcam_mmb *mmb) +{ + devm_kfree(mmz->dev, mmb); +} + +static int vvcam_get_order(unsigned long size) +{ + int order; + unsigned long pfn = (size >> PAGE_SHIFT); + + order = -1; + do { + pfn >>= 1; + order++; + } while(pfn); + + return order; +} + +int vvcam_mmz_create(void *allocator, struct device *dev, + const unsigned long phys_addr, const unsigned long size) +{ + int i; + unsigned int order; + struct vvcam_mmb *mmb; + struct vvcam_mmz *mmz; + struct vvcam_vb_mm_allocator *pmm_agent = + (struct vvcam_vb_mm_allocator *)allocator; + + mmz =(struct vvcam_mmz *)devm_kzalloc(dev, + sizeof(struct vvcam_mmz), GFP_KERNEL); + if (!mmz) + return -ENOMEM; + mmz->dev = dev; + + mmz->size = size; + mmz->paddr = phys_addr; + + mmz->zone_start_pfn = (phys_addr >> PAGE_SHIFT); + mmz->spanned_pages = (size >> PAGE_SHIFT); + + order = vvcam_get_order(size); + if (order >= VVCAM_MAX_ORDER) + return -1; + + mmz->managed_pages = (1UL << order); + for (i = 0; i < VVCAM_MAX_ORDER; i++) { + INIT_LIST_HEAD(&mmz->free_area[i].free_list); + mmz->free_area[i].nr_free = 0; + } + + INIT_LIST_HEAD(&mmz->mmb_list); + spin_lock_init(&mmz->lock); + + mmb = vvcam_alloc_mmb_attr(mmz); + if (mmb == NULL) + return -ENOMEM; + + mmb->mmz = mmz; + mmb->phys_addr = phys_addr; + mmb->size = (mmz->managed_pages << PAGE_SHIFT); + mmb->order = order; + + list_add_tail(&mmb->list, &mmz->free_area[mmb->order].free_list); + mmz->free_area[mmb->order].nr_free += 1; + + pmm_agent->mm_dev = mmz; + pmm_agent->alloc = vvcam_mmz_alloc; + pmm_agent->mmap = vvcam_mmz_mmap; + pmm_agent->free = vvcam_mmz_free; + pmm_agent->free_all = vvcam_mmz_free_all; + return 0; +} + +static int vvcam_mmz_split_block(struct vvcam_mmz *mmz, struct vvcam_mmb *mmb) +{ + unsigned int order; + unsigned long size; + struct vvcam_mmb *block; + + if (mmb->order == VVCAM_MIN_ORDER) + return -1; + + order = mmb->order - 1; + size = mmb->size / 2; + + block = vvcam_alloc_mmb_attr(mmz); + if (block == NULL) + return -ENOMEM; + + block->mmz = mmz; + block->phys_addr = mmb->phys_addr + size; + block->size = size; + block->order = order; + + mmb->size = size; + mmb->order = order; + + list_add_tail(&mmb->list, &mmz->free_area[mmb->order].free_list); + mmz->free_area[mmb->order].nr_free += 1; + + list_add_tail(&block->list, &mmz->free_area[block->order].free_list); + mmz->free_area[block->order].nr_free += 1; + + return 0; +} + +static struct vvcam_mmb *vvcam_mmz_alloc_block(struct vvcam_mmz *mmz, int order) +{ + struct vvcam_mmb *mmb = NULL; + struct vvcam_mmb *block = NULL; + int i = 0; + + if (order >= VVCAM_MAX_ORDER) + return NULL; + + if (mmz->free_area[order].nr_free) { + mmb = list_first_entry(&mmz->free_area[order].free_list, + struct vvcam_mmb, list); + list_del(&mmb->list); + mmz->free_area[order].nr_free--; + return mmb; + } else { + block = NULL; + + for (i = order; i < VVCAM_MAX_ORDER; i++) { + if (mmz->free_area[i].nr_free) { + block = list_first_entry(&mmz->free_area[i].free_list, + struct vvcam_mmb, list); + list_del(&block->list); + mmz->free_area[i].nr_free--; + break; + } + } + if (block == NULL) + return NULL; + + vvcam_mmz_split_block(mmz, block); + mmb = vvcam_mmz_alloc_block(mmz, order); + return mmb; + } +} + +struct vvcam_mmb * vvcam_mmz_get_buddy(struct vvcam_mmb *mmb) +{ + struct vvcam_mmz *mmz = mmb->mmz; + unsigned int block_index; + unsigned int buddy_index; + unsigned long buddy_phys_addr; + struct vvcam_mmb *block = NULL, *buddy_block = NULL; + + block_index = ((mmb->phys_addr >> PAGE_SHIFT) - mmz->zone_start_pfn) / (1 << mmb->order); + buddy_index = block_index ^ 0x01; + + buddy_phys_addr = ((buddy_index * (1 << mmb->order) + mmz->zone_start_pfn) << PAGE_SHIFT); + + if (mmz->free_area[mmb->order].nr_free) { + list_for_each_entry(block, &mmz->free_area[mmb->order].free_list, list) { + if (!block) { + break; + } + if (block->phys_addr == buddy_phys_addr) { + buddy_block = block; + break; + } + } + } + + return buddy_block; +} + +static void vvcam_mmz_free_block(struct vvcam_mmz *mmz, struct vvcam_mmb *mmb) +{ + struct vvcam_mmb *buddy_block = NULL; + + buddy_block = vvcam_mmz_get_buddy(mmb); + + if (buddy_block == NULL) { + list_add_tail(&mmb->list, &mmz->free_area[mmb->order].free_list); + mmz->free_area[mmb->order].nr_free++; + return; + } + + list_del(&buddy_block->list); + mmz->free_area[buddy_block->order].nr_free--; + + //merge block; + mmb->phys_addr = (buddy_block->phys_addr > mmb->phys_addr) ? + mmb->phys_addr : buddy_block->phys_addr; + mmb->size = mmb->size * 2; + mmb->order += 1; + vvcam_free_mmb_attr(mmz, buddy_block); + + vvcam_mmz_free_block(mmz, mmb); + return; +} + +static int vvcam_mmz_alloc(struct file *file, + unsigned long *paddr, unsigned long size, char *name) +{ + struct vvcam_mmz *mmz; + struct vvcam_vb_dev *vb_dev; + struct vvcam_mmb *mmb; + int order; + + vb_dev = file->private_data; + mmz = vb_dev->allocator.mm_dev; + + if (size < (1UL << PAGE_SHIFT)) + size = (1UL << PAGE_SHIFT); + + order = vvcam_get_order(size); + + if (size > (1 << order) << PAGE_SHIFT) { + order += 1; + } + + mmb = vvcam_mmz_alloc_block(mmz, order); + if (mmb == NULL) + return -1; + + strncpy(mmb->name, name, strlen(name)); + mmb->private = file; + list_add_tail(&mmb->list, &mmz->mmb_list); + + *paddr = mmb->phys_addr; + return 0; +} + +static int vvcam_mmz_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned long start = 0; + unsigned long pfn = 0; + unsigned long vm_len = 0; + + pfn = (start >> PAGE_SHIFT) + vma->vm_pgoff; + vm_len = vma->vm_end - vma->vm_start; + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + + return remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_prot); +} + +static int vvcam_mmz_free(struct file *file, unsigned long paddr) +{ + struct vvcam_mmz *mmz; + struct vvcam_vb_dev *vb_dev; + struct vvcam_mmb *mmb = NULL, *block = NULL; + + vb_dev = file->private_data; + mmz = vb_dev->allocator.mm_dev; + + if (list_empty(&mmz->mmb_list)) + return -1; + + list_for_each_entry(block, &mmz->mmb_list, list) { + if (block->phys_addr == paddr) { + mmb = block; + break; + } + } + + if (mmb == NULL) + return -1; + + list_del(&mmb->list); + + vvcam_mmz_free_block(mmz, mmb); + + return 0; +} + +int vvcam_mmz_free_all(struct file *file) +{ + struct vvcam_mmz *mmz; + struct vvcam_vb_dev *vb_dev; + struct vvcam_mmb *mmb = NULL, *block; + + vb_dev = file->private_data; + mmz = vb_dev->allocator.mm_dev; + + if (list_empty(&mmz->mmb_list)) + return 0; + + list_for_each_entry_safe(mmb, block, &mmz->mmb_list, list) { + if (mmb->private == file) { + list_del(&mmb->list); + vvcam_mmz_free_block(mmz, mmb); + } + } + + return 0; +} + + + + + diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_mmz.h b/buildroot-overlay/package/vvcam/vb/vvcam_mmz.h new file mode 100644 index 0000000..0cbb87e --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_mmz.h @@ -0,0 +1,96 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_MMZ_H__ +#define __VVCAM_MMZ_H__ + +#define VVCAM_MMB_NAME_LEN 32 +#define VVCAM_MAX_ORDER 18 +#define VVCAM_MIN_ORDER 0 + +struct vvcam_free_area { + struct list_head free_list; + unsigned long nr_free; +}; + +struct vvcam_mmb { + char name[VVCAM_MMB_NAME_LEN]; + struct vvcam_mmz *mmz; + struct list_head list; + unsigned long phys_addr; + unsigned long size; + unsigned int order; + + void *private; +}; + +struct vvcam_mmz { + struct device *dev; + unsigned long paddr; + unsigned long size; + /* + * zone_start_pfn = zone_start_pfn >> PAGE_SHIFT + * managed_pages = zone_end_pfn - zone_start_pfn + */ + unsigned long zone_start_pfn; + unsigned long spanned_pages; + unsigned long managed_pages; + + struct vvcam_free_area free_area[VVCAM_MAX_ORDER]; + struct list_head mmb_list; + spinlock_t lock; +}; + +int vvcam_mmz_create(void *allocator, struct device *dev, + const unsigned long phys_addr, const unsigned long size); +#endif diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb.h b/buildroot-overlay/package/vvcam/vb/vvcam_vb.h new file mode 100644 index 0000000..28060c4 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ +#ifndef __VVCAM_VB_H__ +#define __VVCAM_VB_H__ + +#define VVCAM_VB_NAME_LEN 32 + +typedef struct { + unsigned long paddr; + unsigned long size; + void *mapped; + char name[VVCAM_VB_NAME_LEN]; +} vvcam_vb_t; + +#define VVCAM_VB_IOC_MAGIC 'v' +#define VVCAM_VB_ALLOC _IOWR(VVCAM_VB_IOC_MAGIC, 0x01, vvcam_vb_t) +#define VVCAM_VB_FREE _IOWR(VVCAM_VB_IOC_MAGIC, 0x02, vvcam_vb_t) +#define VVCAM_VB_CACHE_FLUSH _IOWR(VVCAM_VB_IOC_MAGIC, 0x03, vvcam_vb_t) +#define VVCAM_VB_CACHE_INVALID _IOWR(VVCAM_VB_IOC_MAGIC, 0x04, vvcam_vb_t) + +#endif diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.c b/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.c new file mode 100644 index 0000000..58dc37c --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.c @@ -0,0 +1,407 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_vb_driver.h" +#include "vvcam_vb.h" +#include "vvcam_vb_platform.h" +#include "vvcam_mmz.h" +#include "vvcam_cma.h" +#include "vvcam_vb_procfs.h" + +static int enable_cma = 1; + +static int vvcam_vb_alloc(struct file *file, vvcam_vb_t *vb_mem) +{ + struct vvcam_vb_dev *vb_dev; + + vb_dev = file->private_data; + if (!vb_dev->allocator.mm_dev || !vb_dev->allocator.alloc) + return -EPERM; + + return vb_dev->allocator.alloc(file, + &vb_mem->paddr, vb_mem->size, vb_mem->name); +} + +static int vvcam_vb_free(struct file *file, vvcam_vb_t *vb_mem) +{ + struct vvcam_vb_dev *vb_dev; + + vb_dev = file->private_data; + if (!vb_dev->allocator.mm_dev || !vb_dev->allocator.free) + return -EPERM; + + return vb_dev->allocator.free(file, vb_mem->paddr); +} + +static int vvcam_vb_cache_flush(struct file *file, vvcam_vb_t *vb_mem) +{ + struct vvcam_vb_dev *vb_dev = file->private_data; + unsigned long pfn = __phys_to_pfn(vb_mem->paddr); + struct page *page = pfn_to_page(pfn); + unsigned long offset = offset_in_page(vb_mem->paddr); + size_t size = PAGE_ALIGN(vb_mem->size); + dma_addr_t dma_addr = 0; + + dma_addr = dma_map_page(vb_dev->dev, page, offset, size, DMA_TO_DEVICE); + if (dma_mapping_error(vb_dev->dev, dma_addr)) { + dev_err(vb_dev->dev, "ma map page failed.\n"); + return -EINVAL; + } + + dma_sync_single_for_device(vb_dev->dev, dma_addr, size, DMA_TO_DEVICE); + + dma_unmap_page(vb_dev->dev, dma_addr, size, DMA_TO_DEVICE); + + return 0; +} + +static int vvcam_vb_cache_invalid(struct file *file, vvcam_vb_t *vb_mem) +{ + struct vvcam_vb_dev *vb_dev = file->private_data; + unsigned long pfn = __phys_to_pfn(vb_mem->paddr); + struct page *page = pfn_to_page(pfn); + unsigned long offset = offset_in_page(vb_mem->paddr); + size_t size = PAGE_ALIGN(vb_mem->size); + dma_addr_t dma_addr = 0; + + dma_addr = dma_map_page(vb_dev->dev, page, offset, size, DMA_FROM_DEVICE); + if (dma_mapping_error(vb_dev->dev, dma_addr)) { + dev_err(vb_dev->dev, "ma map page failed.\n"); + return -EINVAL; + } + + dma_sync_single_for_cpu(vb_dev->dev, dma_addr, size, DMA_FROM_DEVICE); + + dma_unmap_page(vb_dev->dev, dma_addr, size, DMA_FROM_DEVICE); + + return 0; +} + +static int vvcam_vb_open(struct inode *inode, struct file *file) +{ + struct vvcam_vb_dev *vb_dev; + struct miscdevice *pmisc_dev = file->private_data; + + vb_dev = container_of(pmisc_dev, struct vvcam_vb_dev, miscdev); + if (!vb_dev) + return -ENOMEM; + + file->private_data = vb_dev; + + return 0; +} + +static int vvcam_vb_release(struct inode *inode, struct file *file) +{ + struct vvcam_vb_dev *vb_dev; + + vb_dev = file->private_data; + if (!vb_dev->allocator.mm_dev || !vb_dev->allocator.free_all) + return -EPERM; + + mutex_lock(&vb_dev->mlock); + vb_dev->allocator.free_all(file); + mutex_unlock(&vb_dev->mlock); + + return 0; +} + +static long vvcam_vb_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct vvcam_vb_dev *vb_dev; + vvcam_vb_t vb_mem; + int ret = 0; + + vb_dev = file->private_data; + + mutex_lock(&vb_dev->mlock); + + switch(cmd) { + case VVCAM_VB_ALLOC: + ret = copy_from_user(&vb_mem, (void __user *)arg, sizeof(vb_mem)); + if (ret) + break; + ret = vvcam_vb_alloc(file, &vb_mem); + if (ret) + break; + ret = copy_to_user((void __user *)arg, &vb_mem, sizeof(vb_mem)); + break; + case VVCAM_VB_FREE: + ret = copy_from_user(&vb_mem, (void __user *)arg, sizeof(vb_mem)); + if (ret) + break; + ret = vvcam_vb_free(file, &vb_mem); + break; + case VVCAM_VB_CACHE_FLUSH: + ret = copy_from_user(&vb_mem, (void __user *)arg, sizeof(vb_mem)); + if (ret) + break; + ret = vvcam_vb_cache_flush(file, &vb_mem); + break; + case VVCAM_VB_CACHE_INVALID: + ret = copy_from_user(&vb_mem, (void __user *)arg, sizeof(vb_mem)); + if (ret) + break; + ret = vvcam_vb_cache_invalid(file, &vb_mem); + break; + default: + ret = -EINVAL; + break; + } + + mutex_unlock(&vb_dev->mlock); + + return ret; +} + +int vvcam_vb_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct vvcam_vb_dev *vb_dev; + int ret = 0; + + vb_dev = file->private_data; + if (!vb_dev->allocator.mm_dev || !vb_dev->allocator.mmap) + return -EPERM; + + mutex_lock(&vb_dev->mlock); + ret = vb_dev->allocator.mmap(file, vma); + mutex_unlock(&vb_dev->mlock); + + return ret; +} + +static struct file_operations vvcam_vb_fops = { + .owner = THIS_MODULE, + .open = vvcam_vb_open, + .release = vvcam_vb_release, + .unlocked_ioctl = vvcam_vb_ioctl, + .mmap = vvcam_vb_mmap, +}; + +static int vvcam_vb_create_mm_allocator(struct platform_device *pdev, + struct vvcam_vb_mm_allocator *allocator, const int type) +{ + int ret = 0; + struct resource *res; + + switch (type) + { + case VVCAM_VB_MMZ: + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "can't fetch device resource info\n"); + return -EIO; + } + + ret = vvcam_mmz_create(allocator, &pdev->dev, + res->start, resource_size(res)); + if (ret) { + dev_err(&pdev->dev, "failed to create mmz\n"); + return ret; + } + break; + + case VVCAM_VB_CMA: + ret = vvcam_cma_create(allocator, &pdev->dev); + if (ret) { + dev_err(&pdev->dev, "failed to create mmz\n"); + return ret; + } + break; + + default: + break; + } + return 0; +} + +static int vvcam_vb_probe(struct platform_device *pdev) +{ + struct vvcam_vb_dev *vb_dev; + int ret = 0; + + if (!pdev->dev.dma_mask) { + pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask; + } + + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) { + dev_err(&pdev->dev, "failed to setup dma.\n"); + return ret; + } + + vb_dev = devm_kzalloc(&pdev->dev, + sizeof(struct vvcam_vb_dev), GFP_KERNEL); + if (!vb_dev) + return -ENOMEM; + + if (!enable_cma) { + vb_dev->type = VVCAM_VB_MMZ; + ret = vvcam_vb_create_mm_allocator(pdev, + &vb_dev->allocator, VVCAM_VB_MMZ); + if (ret) { + dev_err(&pdev->dev, "create vb mmz failed.\n"); + return ret; + } + } else { + vb_dev->type = VVCAM_VB_CMA; + ret = vvcam_vb_create_mm_allocator(pdev, + &vb_dev->allocator, VVCAM_VB_CMA); + if (ret) { + dev_err(&pdev->dev, "create vb cma failed.\n"); + return ret; + } + } + + mutex_init(&vb_dev->mlock); + vb_dev->dev = &pdev->dev; + platform_set_drvdata(pdev, vb_dev); + + ret = vvcam_vb_procfs_register(vb_dev, &vb_dev->pde); + if (ret) { + dev_err(&pdev->dev, "vb failed to register procfs\n"); + return -EINVAL; + } + + vb_dev->miscdev.minor = MISC_DYNAMIC_MINOR; + vb_dev->miscdev.name = VVCAM_VB_NAME; + vb_dev->miscdev.fops = &vvcam_vb_fops; + + ret = misc_register(&vb_dev->miscdev); + if (ret) { + dev_err(&pdev->dev, "failed to register device\n"); + return -EINVAL; + } + + dev_info(&pdev->dev, "vvcam vb probe success\n"); + return 0; + +} + +static int vvcam_vb_remove(struct platform_device *pdev) +{ + struct vvcam_vb_dev *vb_dev; + vb_dev = platform_get_drvdata(pdev); + + vvcam_vb_procfs_unregister(&vb_dev->pde); + + misc_deregister(&vb_dev->miscdev); + + return 0; +} + +static const struct of_device_id vvcam_vb_of_match[] = { + {.compatible = "verislicon,vb",}, + { /* sentinel */ }, +}; + +static struct platform_driver vvcam_vb_driver = { + .probe = vvcam_vb_probe, + .remove = vvcam_vb_remove, + .driver = { + .name = VVCAM_VB_NAME, + .owner = THIS_MODULE, + .of_match_table = vvcam_vb_of_match, + } +}; + +static int __init vvcam_vb_init_module(void) +{ + int ret; + + ret = platform_driver_register(&vvcam_vb_driver); + if (ret) { + printk(KERN_ERR "Failed to register vb driver\n"); + return ret; + } + + ret = vvcam_vb_platform_device_register(); + if (ret) { + platform_driver_unregister(&vvcam_vb_driver); + printk(KERN_ERR "Failed to register vvcam vb platform devices\n"); + return ret; + } + + return ret; +} + +static void __exit vvcam_vb_exit_module(void) +{ + platform_driver_unregister(&vvcam_vb_driver); + vvcam_vb_platform_device_unregister(); +} + +module_init(vvcam_vb_init_module); +module_exit(vvcam_vb_exit_module); + +module_param(enable_cma, int, 0644); + +MODULE_DESCRIPTION("Verisilicon video buffer driver"); +MODULE_AUTHOR("Verisilicon ISP SW Team"); +MODULE_LICENSE("GPL"); diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.h b/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.h new file mode 100644 index 0000000..90139b6 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_driver.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VB_DRIVER_H__ +#define __VVCAM_VB_DRIVER_H__ + +#define VVCAM_VB_NAME "vvcam-vb" + +enum { + VVCAM_VB_MMZ, + VVCAM_VB_CMA +}; + +struct vvcam_vb_mm_allocator { + void *mm_dev; + int (*alloc)(struct file *file, unsigned long *phys_addr, + const unsigned long size, char *name); + int (*free)(struct file *file, const unsigned long phys_addr); + int (*mmap)(struct file *file, struct vm_area_struct *vma); + int (*free_all)(struct file *file); +}; + +struct vvcam_vb_dev { + phys_addr_t paddr; + uint32_t size; + struct device *dev; + struct miscdevice miscdev; + struct mutex mlock; + int32_t type; + struct vvcam_vb_mm_allocator allocator; + struct proc_dir_entry *pde; +}; + +#endif diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.c b/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.c new file mode 100644 index 0000000..5fd07b5 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.c @@ -0,0 +1,92 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include + +#include "vvcam_vb_platform.h" + +static void vvcam_vb_pdev_release(struct device *dev) +{ + dev_info(dev, "%s\n", __func__); + return; +} + +static struct resource vvcam_vb_resource[] = { + /*[0] = { + .start = VVCAM_RMEM_BASE, + .end = VVCAM_RMEM_BASE + VVCAM_RMEM_SIZE - 1, + .flags = IORESOURCE_MEM, + },*/ +}; + +static struct platform_device vvcam_vb_pdev = { + .name = "vvcam-vb", + .id = 0, + .resource = vvcam_vb_resource, + .num_resources = ARRAY_SIZE(vvcam_vb_resource), + .dev.release = vvcam_vb_pdev_release, +}; + +int vvcam_vb_platform_device_register(void) +{ + return platform_device_register(&vvcam_vb_pdev); +} + +void vvcam_vb_platform_device_unregister(void) +{ + platform_device_unregister(&vvcam_vb_pdev); + + return; +} diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.h b/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.h new file mode 100644 index 0000000..bf83211 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_platform.h @@ -0,0 +1,60 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VB_PLATFORM_H__ +#define __VVCAM_VB_PLATFORM_H__ + +int vvcam_vb_platform_device_register(void); +void vvcam_vb_platform_device_unregister(void); + +#endif diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.c b/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.c new file mode 100644 index 0000000..b9bb9a3 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.c @@ -0,0 +1,447 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vvcam_mmz.h" +#include "vvcam_cma.h" +#include "vvcam_vb_driver.h" +#include "vvcam_vb_procfs.h" + +struct mmb_info { + char name[32]; + unsigned long size; + unsigned long paddr; + struct list_head list; +}; + +struct filed_mmb { + void *private; + struct list_head mbi_list; + struct list_head list; +}; + +struct vvcam_vb_proc { + struct proc_dir_entry *pde; + struct vvcam_vb_dev *vb_dev; +}; + + +static void release_mmlist(struct list_head *mm_list) +{ + struct mmb_info *mbi = NULL, *old_mbi = NULL; + struct filed_mmb *fmb = NULL, *old_fmb = NULL; + if (!list_empty(mm_list)) { + list_for_each_entry(fmb, mm_list, list) { + list_for_each_entry(mbi, &fmb->mbi_list, list) { + if (old_mbi) { + list_del(&old_mbi->list); + kfree(old_mbi); + old_mbi = NULL; + } + old_mbi = mbi; + } + + if (old_fmb) { + list_del(&old_fmb->list); + kfree(old_fmb); + old_fmb = NULL; + } + old_fmb = fmb; + } + + if (old_mbi) { + list_del(&old_mbi->list); + kfree(old_mbi); + old_mbi = NULL; + } + + if (old_fmb) { + list_del(&old_fmb->list); + kfree(old_fmb); + old_fmb = NULL; + } + } +} + +static int vvcam_vb_get_mmz_info(struct vvcam_mmz *mmz, + struct list_head *mm_list, unsigned long *base, + unsigned long *size, unsigned long *used) +{ + struct vvcam_mmb *mmb = NULL; + struct mmb_info *mbi = NULL; + struct filed_mmb *fmb = NULL, *t_fmb = NULL; + + *size = mmz->size; + *base = mmz->paddr; + + list_for_each_entry(mmb, &mmz->mmb_list, list) { + fmb = NULL; + if (!mmb) { + break; + } + list_for_each_entry(t_fmb, mm_list, list) { + if (!t_fmb) { + break; + } + if (t_fmb->private == mmb->private) { + fmb = t_fmb; + t_fmb = NULL; + break; + } + } + + if (!fmb) { + fmb = kzalloc(sizeof(struct filed_mmb), GFP_KERNEL); + if (!fmb) { + release_mmlist(mm_list); + return -ENOMEM; + } + INIT_LIST_HEAD(&fmb->mbi_list); + list_add_tail(&fmb->list, mm_list); + } + + mbi = kzalloc(sizeof(struct mmb_info), GFP_KERNEL); + if (!mbi) { + release_mmlist(mm_list); + return -ENOMEM; + } + + fmb->private = mmb->private; + memcpy(mbi->name, mmb->name, sizeof(mmb->name)); + mbi->paddr = mmb->phys_addr; + mbi->size = mmb->size; + *used += mbi->size; + + list_add_tail(&mbi->list, &fmb->mbi_list); + } + return 0; +} + +static int vvcam_vb_get_cma_info(struct vvcam_cma *cma, + struct list_head *mm_list, unsigned long *used) +{ + struct vvcam_cma_buf *cma_buf = NULL; + struct mmb_info *mbi = NULL; + struct filed_mmb *fmb = NULL, *tmp = NULL; + + list_for_each_entry(cma_buf, &cma->buf_list, list) { + fmb = NULL; + if (!cma_buf) { + break; + } + list_for_each_entry(tmp, mm_list, list) { + if (!tmp) { + break; + } + if (tmp->private == cma_buf->private) { + fmb = tmp; + tmp = NULL; + break; + } + } + + if (!fmb) { + fmb = kzalloc(sizeof(struct filed_mmb), GFP_KERNEL); + if (!fmb) { + release_mmlist(mm_list); + return -ENOMEM; + } + INIT_LIST_HEAD(&fmb->mbi_list); + list_add_tail(&fmb->list, mm_list); + } + + mbi = kzalloc(sizeof(struct mmb_info), GFP_KERNEL); + if (!mbi) { + release_mmlist(mm_list); + return -ENOMEM; + } + + fmb->private = cma_buf->private; + memcpy(mbi->name, cma_buf->name, sizeof(mbi->name)); + mbi->paddr = cma_buf->phys_addr; + mbi->size = cma_buf->size; + + *used += cma_buf->size; + + list_add_tail(&mbi->list, &fmb->mbi_list); + } + return 0; +} + +static int vvcam_vb_proc_info_show(struct seq_file *sfile, void *offset) +{ + struct vvcam_vb_proc *vb_proc; + struct list_head mm_list; + struct filed_mmb *fmb = NULL; + struct mmb_info *mbi = NULL; + + unsigned long size = 0; + unsigned long used = 0; + unsigned long base = 0; + int ret = 0; + + vb_proc = (struct vvcam_vb_proc *) sfile->private; + + INIT_LIST_HEAD(&mm_list); + + switch (vb_proc->vb_dev->type) + { + case VVCAM_VB_MMZ: + ret = vvcam_vb_get_mmz_info( + (struct vvcam_mmz*)vb_proc->vb_dev->allocator.mm_dev, + &mm_list, &base, &size, &used); + break; + + case VVCAM_VB_CMA: + ret = vvcam_vb_get_cma_info( + (struct vvcam_cma*)vb_proc->vb_dev->allocator.mm_dev, + &mm_list, &used); + break; + + default: + ret = -EINVAL; + break; + } + + if (ret) { + seq_printf(sfile, "get mm info failed\n"); + return 0; + } + + seq_printf(sfile, "DeviceName:\t%s\n", vb_proc->vb_dev->miscdev.name); + seq_printf(sfile, "VB Type:\t%s\n", + vb_proc->vb_dev->type == VVCAM_VB_MMZ ? "reserved mem" : "cma"); + if (vb_proc->vb_dev->type == VVCAM_VB_MMZ) { + seq_printf(sfile, "Base:\t\t0x%-8lx\n", base); + seq_printf(sfile, "Size:\t\t0x%-8lx\n", size); + seq_printf(sfile, "Free:\t\t0x%-8lx\n", size - used); + } + seq_printf(sfile, "Used:\t\t0x%-8lx\n", used); + + seq_printf(sfile, + "|------------------|----------------|---------------------|----------|\n"); + seq_printf(sfile, "|%-18s|%-16s|%-21s|%-10s|\n", + " File", " Name", " Range", " Size"); + seq_printf(sfile, + "|------------------|----------------|---------------------|----------|\n"); + if (!list_empty(&mm_list)) { + list_for_each_entry(fmb, &mm_list, list) { + list_for_each_entry(mbi, &fmb->mbi_list, list) { + seq_printf(sfile, "|0x%-16p|%-16s|0x%08lx~0x%08lx|0x%-8lx|\n", + fmb->private, mbi->name, + mbi->paddr, mbi->paddr + mbi->size, mbi->size); + } + seq_printf(sfile, + "|------------------|----------------|---------------------|----------|\n"); + } + } + + release_mmlist(&mm_list); + + return 0; +} + + +static int vvcam_vb_proc_open(struct inode *inode, struct file *file) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0) + return single_open(file, vvcam_vb_proc_info_show, PDE_DATA(inode)); +#else + return single_open(file, vvcam_vb_proc_info_show, pde_data(inode)); +#endif +} + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0) +static const struct file_operations vvcam_vb_proc_ops = { + .open = vvcam_vb_proc_open, + .release = seq_release, + .read = seq_read, + .llseek = seq_lseek, +}; +#else +static const struct proc_ops vvcam_vb_proc_ops = { + .proc_open = vvcam_vb_proc_open, + .proc_release = seq_release, + .proc_read = seq_read, + .proc_lseek = seq_lseek, +}; +#endif + +struct finddir_callback { + struct dir_context ctx; + const char *name; + int32_t files_cnt; + bool found; +}; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0) +static int readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return 0; + + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return 0; +} + +#else +static bool readdir_callback(struct dir_context *ctx, const char *name, + int namelen, loff_t offset, u64 ino, unsigned int d_type) { + + struct finddir_callback *fc = + container_of(ctx, struct finddir_callback, ctx); + if (fc->found) + return true; + if(strcmp(name, fc->name) == 0) { + fc->found = true; + } + fc->files_cnt++; + return true; +} +#endif + +static int find_proc_dir_by_name(const char *root, + const char *name, bool *found, int32_t *files_cnt) { + struct file *pfile; + int ret = 0; + struct finddir_callback fc = { + .ctx.actor = readdir_callback, + .name = name, + .found = false, + .files_cnt = -2, + }; + + pfile = filp_open(root, O_RDONLY | O_DIRECTORY, 0); + if (pfile->f_op->iterate_shared) { + ret = pfile->f_op->iterate_shared(pfile, &fc.ctx); + } else { + // ret = pfile->f_op->iterate(pfile, &fc.ctx); + } + + if (ret == 0) { + *found = fc.found; + } + + if (files_cnt != NULL) { + *files_cnt = fc.files_cnt; + } + + filp_close(pfile, NULL); + return ret; +} + +int vvcam_vb_procfs_register(struct vvcam_vb_dev *vb_dev, + struct proc_dir_entry **pde) +{ + struct vvcam_vb_proc *vb_proc; + struct platform_device *pdev = to_platform_device(vb_dev->dev); + char vb_proc_name[32]; + int ret = 0; + bool found = false; + + sprintf(vb_proc_name, "vsi/vb%d", pdev->id); + vb_proc = devm_kzalloc(vb_dev->dev, + sizeof(struct vvcam_vb_proc), GFP_KERNEL); + if (!vb_proc) + return -ENOMEM; + + vb_proc->vb_dev = vb_dev; + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (!found) + proc_mkdir("vsi", NULL); + } else { + return -EFAULT; + } + + vb_proc->vb_dev = vb_dev; + *pde = proc_create_data(vb_proc_name, 0664, NULL, + &vvcam_vb_proc_ops, vb_proc); + if (!*pde) + return -EFAULT; + + vb_proc->pde = *pde; + return 0; +} + +void vvcam_vb_procfs_unregister(struct proc_dir_entry **pde) +{ + int ret = 0; + bool found = false; + int32_t files_cnt; + + ret = find_proc_dir_by_name("/proc", "vsi", &found, NULL); + if (ret == 0) { + if (found) { + proc_remove(*pde); + ret = find_proc_dir_by_name("/proc/vsi", "", &found, &files_cnt); + if (files_cnt == 0) { + remove_proc_subtree("vsi", NULL); + } + } + } +} diff --git a/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.h b/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.h new file mode 100644 index 0000000..b55b682 --- /dev/null +++ b/buildroot-overlay/package/vvcam/vb/vvcam_vb_procfs.h @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * The MIT License (MIT) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * 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. + * + ***************************************************************************** + * + * The GPL License (GPL) + * + * Copyright (c) 2023 VeriSilicon Holdings Co., Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + ***************************************************************************** + * + * Note: This software is released under dual MIT and GPL licenses. A + * recipient may use this file under the terms of either the MIT license or + * GPL License. If you wish to use only one license not the other, you can + * indicate your decision by deleting one of the above license notices in your + * version of this file. + * + *****************************************************************************/ + +#ifndef __VVCAM_VB_PROCFS_H__ +#define __VVCAM_VB_PROCFS_H__ + +int vvcam_vb_procfs_register(struct vvcam_vb_dev *vb_dev, + struct proc_dir_entry **pde); +void vvcam_vb_procfs_unregister(struct proc_dir_entry **pde); + + +#endif diff --git a/buildroot-overlay/package/vvcam/vvcam.mk b/buildroot-overlay/package/vvcam/vvcam.mk index 8536c9d..d5bc671 100644 --- a/buildroot-overlay/package/vvcam/vvcam.mk +++ b/buildroot-overlay/package/vvcam/vvcam.mk @@ -11,5 +11,7 @@ VVCAM_SITE_METHOD = local VVCAM_INSTALL_STAGING = YES VVCAM_INSTALL_TARGET = YES VVCAM_DEPENDENCIES = mxml libmicrohttpd +VVCAM_SUPPORTS_IN_SOURCE_BUILD = NO +$(eval $(kernel-module)) $(eval $(cmake-package)) diff --git "a/docs/linux_sdk\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" "b/docs/linux_sdk\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" index 24051f4..8a9f1fb 100755 --- "a/docs/linux_sdk\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" +++ "b/docs/linux_sdk\345\277\253\351\200\237\345\205\245\351\227\250\346\214\207\345\215\227.md" @@ -8,7 +8,7 @@ k230系列芯片采用全新的多异构单元加速计算架构,集成了2个 ![K230_block_diagram](https://developer.canaan-creative.com/k230_canmv/main/_images/K230_block_diagram.png) ->k230和k230d的区别是k230d内部多一个128MB的lpddr4颗粒; +>k230和k230d的主要区别是k230d内部多一个128MB的lpddr4颗粒; ## 2.sdk源码及编译 @@ -17,40 +17,55 @@ k230系列芯片采用全新的多异构单元加速计算架构,集成了2个 参考如下命令下载sdk代码 ```bash -git clone git@gitee.com:kendryte/k230_linux_sdk.git +git clone git@github.com:kendryte/k230_linux_sdk.git # git clone git@gitee.com:kendryte/k230_linux_sdk.git cd k230_linux_sdk ``` ->github 上仓库地址是 git@gitee.com:kendryte/k230_linux_sdk.git +>github上仓库地址是 git@github.com:kendryte/k230_linux_sdk.git +> >gitee上仓库地址是 git@gitee.com:kendryte/k230_linux_sdk.git -### 安装依赖 - -安装如下软件的64位linux系统(推荐ubuntu20.04和ubuntu24.04), +### 安装交叉工具链 +下载Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1-20240712.tar.gz (下载地址1:https://www.xrvm.cn/community/download?id=4333581795569242112 ,下载地址2:https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1721095219235/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1-20240712.tar.gz)文件,并解压缩到/opt/toolchain目录 (参考命令如下): ```bash -git sed make binutils build-essential diffutils gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 libssl-dev +mkdir -p /opt/toolchain; +tar -zxvf Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1-20240712.tar.gz -C /opt/toolchain; ``` +> 安装新32位交叉工具链(下载地址:https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/releases/download/2024.06.25/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25-nightly.tar.gz)(可选, 只有k230d_canmv_ilp32_defconfig配置需要) +> +> wget -c https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/releases/download/2024.06.25/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25-nightly.tar.gz ; +> +> mkdir -p /opt/toolchain/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25/ ; +> +> tar -xvf riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25-nightly.tar.gz -C /opt/toolchain/riscv64ilp32-elf-ubuntu-22.04-gcc-nightly-2024.06.25/ +### 安装依赖 -ubuntu发行版参考如下命令进行安装上述软件 +需要安装如下软件的 ubuntu22.04 或者ubuntu 24.04系统(参考安装命令) ```bash -sudo apt-get inst wget all -y git sed make binutils build-essential diffutils gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 libssl-dev +sudo apt-get inst wget all -y git sed make binutils build-essential diffutils gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 libssl-dev gawk cmake bison flex bash-completion ``` +>依赖软件包见tools/docker/Dockerfile 文件,构建和进入docker环境参考如下命令: +> +>docker build -f tools/docker/Dockerfile -t wjx/d tools/docker #构建 +> +>docker run -it --rm -h k230 -e uid=\$(id -u) -e gid=\$(id -g) -e user=\${USER} -v \${HOME}:\${HOME} -w \$(pwd) wjx/d:latest #使用 + ### 编译 参考下面命令进行编译 ```bash -make CONF=k230d_canmv_defconfig #build k230d canmv image (kernel and rootfs both 64bit); +make CONF=k230d_canmv_defconfig #build k230d canmv image (kernel and rootfs both 64bit) +#make CONF=k230_canmv_01studio_defconfig # build 01studio canmv board # make CONF=k230_canmv_defconfig # build k230 canmv image -# make CONF=k230d_canmv_32bit_rootfs_defconfig #build k230d canmv 32bit rootfs; -# make CONF=k230d_canmv_64kernel_32rootfs_defconfig #build k230d 64bit kernel 32bit rootfs image +# make CONF=k230d_canmv_ilp32_defconfig #build k230d canmv 32bit rootfs; ``` ->k230d_canmv_defconfig是个例子,请替换为正确的配置文件,比如替换为k230_canmv_defconfig +>k230d_canmv_defconfig是个例子,需要替换为正确的配置文件,比如替换为k230_canmv_defconfig > >sdk支持的所有配置文件见buildroot-overlay/configs目录 > @@ -118,23 +133,37 @@ Windows下可通过rufus工具对TF卡进行烧录(rufus工具下载地址 `ht 电脑上的串口软件可以看到打印 ->板子连接及查看方法见后面 +>板子连接及串口查看方法见后面章节 ## 4.开发板连接 ->开发板有差异,请参考正确的章节连接各个开发板 +>开发板有差异,请参考对应章节连接各个开发板 -### 2.1k230d-canmv开发板连接 +### 说明 -1)参考下图连接k230d-canmv开发板 +本sdk主要支持的开发板及配置文件说明 -![](pic\CanMV-K230_front.png) +| 开发板 | 配置文件 | 说明 | +| -------------- | ----------------------------- | ------------------------------- | +| canmv | k230_canmv_defconfig | k230 canmv board | +| evb | k230_evb_defconfig | k230 evb board | +| canmv_01studio | k230_canmv_01studio_defconfig | 01studio canmv board | +| k230d_canmv | k230d_canmv_defconfig | k230d canmv board | +| k230d_canmv | k230d_canmv_ilp32_defconfig | k230d canmv board 32bit systerm | ->补充:需要硬件说明: +### k230-canmv开发板连接 + +1)参考下图使用Type-C连接k230-canmv开发板 + +使用Type-C线连接CanMV-K230如下图的位置,线另一端连接至电脑 + +![debug](https://gitee.com/kendryte/k230_docs/raw/main/zh/images/CanMV-K230_debug.png) + +>最少硬件: >typec usb线 ->tf卡; +>tf卡 @@ -150,7 +179,7 @@ USB-Enhanced-SERIAL-A CH342(COM80)为小核linux调试串口 USB-Enhanced-SERIAL-B CH342(COM81)为串口3--暂未使用 - +>windows下如果串口识别错误,请重新安装ch342驱动(下载地址:https://www.wch.cn/downloads/CH343SER_EXE.html) linux系统下串口显示如下: @@ -168,15 +197,13 @@ linux系统下串口显示如下: 使用串口软件查看开发板串口输出 - - ->开发板串口参数是 +>开发板默认串口参数:波特率115200,数据位 8,停止位1,奇偶检验 无,流控 无 >不插tf卡,按下reset按键,默认串口也会输出一行打印,看到打印说明cpu工作正常。 >推荐串口软件是putty,其他串口软件(比如moblxterm xshell securecrt等)也可以。 -### 2.2k230-canmv开发板连接 +### k230d-canmv开发板连接(待更新图片) 1)参考下图连接k230d-canmv开发板 @@ -202,7 +229,7 @@ USB-Enhanced-SERIAL-A CH342(COM80)为小核linux调试串口 USB-Enhanced-SERIAL-B CH342(COM81)为串口3--暂未使用 - +> windows下如果串口识别错误,请重新安装ch342驱动(下载地址:https://www.wch.cn/downloads/CH343SER_EXE.html) linux系统下串口显示如下: @@ -210,19 +237,15 @@ linux系统下串口显示如下: /dev/ttyACM1为 为串口3--暂未使用 - - >不插tf卡,也可以看到串口。 - - 3)查看串口输出 使用串口软件查看开发板串口输出 ->开发板默认串口参数是 115200 +>开发板默认串口参数:波特率115200,数据位 8,停止位1,奇偶检验 无,流控 无 >不插tf卡,按下reset按键,默认串口也会输出一行打印,看到打印说明cpu工作正常。 >推荐串口软件是putty,其他串口软件(比如moblxterm xshell securecrt等)也可以。 @@ -249,12 +272,12 @@ k230_linux_sdk/ │   └── package │   ├── libdrm #libdrm有修改的文件 │   ├── lvgl #lvgl有修改的文件 -│   ├── vg_lite +│   ├── vg_lite │   └── vvcam ├── docs #文档目录 ├── output #输出目录,包含最终使用的源码,及所有的输出文件 │   ├── buildroot-2024.02.1 #最后使用的buildroot目录 -│   └── k230d_canmv_defconfig #编译输出目录,所有源代及编译输出文件 +│   └── k230d_canmv_defconfig #编译输出目录,所有源代及编译输出文件 ├── Makefile #主makefile文件 ├── README.md #readme文件 └── tools #一些脚本工具 @@ -302,42 +325,193 @@ int main() printf("Hello, World!\n"); return 0; } - ``` 编译程序 ```shell -output/k230d_canmv_defconfig/host/bin/riscv64-linux-gcc hello.c -o hello +/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1/bin/riscv64-unknown-linux-gnu-gcc hello.c -o hello ``` -把hello文件复制到开发板上,并执行,可以看到打印 +把hello文件复制到开发板上,并执行,可以看到打印正确 ``` +[root@canaan ~ ]#./hello +Hello, World! +[root@canaan ~ ]# +``` +>可以通过scp或者rz命令复制到开发板上 + + +### gpio (未完成) + + + +### uart + +说明: + +向对应串口发送数据,并且读取串口返回的数据,类似发送AT指令,并且读取AT指令返回值 + + + +代码 + +```c +//uart.c文件内容 +#include "stdio.h" +#include "string.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // 包含 open 函数 +#include // 包含 read 和 write 函数 +#include + + + +int main(int argc ,char * argv[]) +{ + int fd; + char *devname=(char*)"/dev/ttyS3"; + char sendcmd[1024]= "AT\r"; + //char *sendcmd = (char*)"AT\r\n" ;//"AT+QCFG=\"usbnet\" \r\n"; + char read_buf[1024]; + int n_read; + int n_written ; + + struct termios options,options_bak; // 串口配置结构体 + + if(argc > 1) + devname=argv[1]; + if(argc >2) + snprintf(sendcmd, sizeof(sendcmd), "%s\r", argv[2]); + + + fd = open(devname, O_RDWR|O_NONBLOCK|O_NOCTTY|O_SYNC|O_NDELAY ); // 打开串口,O_RDWR 表示读写模式 + // O_NOCTTY 不允许进程管理串口(不太理解,一般都选上); + // O_NDELAY 非阻塞(默认为阻塞,打开后也可以使用fcntl()重新设置) + if (fd < 0) { + perror("open_port: Unable to open /dev/ttyS0 - "); + return(-1); + } + + tcgetattr(fd,&options_bak); //获取当前设置 + memcpy(&options,&options_bak,sizeof(options)); + + //printf("i=%x %x %x \n",options.c_iflag,options.c_oflag,options.c_cflag); + + options.c_cflag |= B9600 | CLOCAL | CREAD; // 设置波特率,本地连接,接收使能 + options.c_cflag &= ~CSIZE; //屏蔽数据位 + options.c_cflag |= CS8; // 数据位为 8 ,CS7 for 7 + options.c_cflag &= ~CSTOPB; // 一位停止位, 两位停止为 |= CSTOPB + options.c_cflag &= ~PARENB; // 无校验 + options.c_cc[VTIME] = 0; // 等待时间,单位百毫秒 (读)。后有详细说明 + options.c_cc[VMIN] = 0; // 最小字节数 (读)。后有详细说明 + + + options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + + // 设置输入输出控制模式 + options.c_iflag &= ~(ICRNL | INLCR | IGNCR | IXON | IXOFF); // 关闭 INLCR, IGNCR, IXON, IXOFF + options.c_oflag &= ~(ONLCR); // 关闭 ONLCR + options.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON | ISIG | IEXTEN); // 关闭 ECHO, ECHOE, ECHOK, ECHONL, ICANON, ISIG, IEXTEN + + + + tcflush(fd, TCIOFLUSH); // TCIFLUSH刷清输入队列。 + tcsetattr(fd, TCSANOW, &options); // TCSANOW立即生效; + usleep(1000*1); + //printf("after i=%x %x %x \n",options.c_iflag,options.c_oflag,options.c_cflag); + + + n_written = write(fd, sendcmd, strlen(sendcmd)); + printf("f=%s l=%d %d,send:%s\n", __func__, __LINE__, n_written, sendcmd); + fsync(fd); + usleep(1000*300); + do{ + n_read = read(fd, read_buf, sizeof(read_buf)); + if(n_read<=0) + break; + read_buf[n_read] = '\0'; // 确保字符串以空字符结尾 + printf("%s\n", read_buf); + usleep(1000); + }while(1); + + tcflush(fd, TCIOFLUSH); // TCIFLUSH刷清输入队列。 + tcsetattr(fd, TCSANOW, &options_bak); // TCSANOW立即生效; + close(fd); + return 0; +} ``` -### linux gpio demo +### lvgl (未完成) +### vector向量 +RVV(RISC-V Vector Extension)是指RISC-V指令集架构的向量扩展。RISC-V是一种开源的指令集架构,它的设计简洁、可扩展性强,并且具有广泛的应用领域。RVV作为RISC-V的一个可选扩展,旨在支持向量处理和并行计算。RVV定义了一组新的指令,用于执行向量操作。这些指令允许同时处理多个数据元素,从而提高计算效率和吞吐量。向量操作可以在单个指令中执行,而不需要通过循环或逐个操作来处理每个数据元素。RVV支持不同的向量长度,可以根据应用的需求选择不同的向量长度。向量长度可以是固定的,也可以是可配置的。RVV还支持不同的数据类型,包括整数、浮点数和定点数等。 -### linux lvgl demo +RVV的引入为处理器提供了向量处理和并行计算的能力,可以加速各种应用,如图像处理、信号处理、机器学习、科学计算等。同时,RVV的开放和可扩展性也使得各个厂商和开发者根据自己的需求进行定制和优化。K230 采用的是玄铁C908双核处理器,其中大核C908带了RVV1.0扩展。 -### vector向量demo +代码 +```c +//保存文件为rvv.c +#include +#include +int main() { + int avl = 70; + int vl = vsetvl_e32m2(avl); + printf("vl: %d\n", vl); + return 0; +} +``` + +编译: + +```bash +/opt/toolchain/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V2.10.1/bin/riscv64-unknown-linux-gnu-gcc -march=rv64gcv_xtheadc rvv.c -o rvv +``` + +开发板上运行: + +```bash +[root@canaan ~ ]#scp wangjianxin@10.10.1.94:/home/wangjianxin/k230_linux_sdk/rvv . +wangjianxin@10.10.1.94's password: +rvv 100% 14KB 2.1MB/s 00:00 +[root@canaan ~ ]#./rvv +vl: 8 +[root@canaan ~ ]# + +``` -## 7.rootfs定制及源码修改 + +## 7.rootfs定制及源码修改(未完成) ### rootfs定制: @@ -366,8 +540,3 @@ https://developer.canaan-creative.com/k230_canmv/main/zh/CanMV-K230%E5%BF%AB%E9% https://d1.docs.aw-ol.com/d1_dev/ https://yoc.docs.t-head.cn/icebook/ - - - - - diff --git a/docs/jtag_load_kernel_dtb.md b/docs/to_plct.md similarity index 76% rename from docs/jtag_load_kernel_dtb.md rename to docs/to_plct.md index c6e06fd..cddd5fa 100755 --- a/docs/jtag_load_kernel_dtb.md +++ b/docs/to_plct.md @@ -1,4 +1,38 @@ -# jtag更新k230 内核和设备树方法 +## k230d新32位系统切换说明 + +### 编译 + +```bash +make CONF=k230d_canmv_ilp32_defconfig +#output output/k230d_canmv_ilp32_defconfig/images/sysimage-sdcard.img.gz +``` + +### 启动nuttx + +```bash +#uboot 命令行执行下面命令 +run bnuttx +``` + +### 启动64位内核+32位rootfs + +```bash +run blinux +``` + +### 启动32位新内核+32位rootfs + +```bash +run blinuxilp32 +``` + +### 启动nuttx和linux双系统 + +```bash +run bnuttx;run blinux +``` + +## jtag更新k230 内核和设备树方法 1.参考下面命令把内核 设备树 opensbi文件复制到tools目录下面; diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index f29d0b1..001b1c1 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -1,7 +1,8 @@ # 1. build image: -# docker build -f tools/Dockerfile -t wjx/linux_sdk_docker_tt tools/ -# docker run -it -h k230 -e uid=$(id -u) -e gid=$(id -g) -e user=${USER} -v $HOME:$HOME -w $(pwd) wjx/linux_sdk_docker_tt:latest - +# docker build -f tools/docker/Dockerfile -t wjx/d tools/docker +# 2. run +# docker run -it --rm -h k230 -e uid=$(id -u) -e gid=$(id -g) -e user=${USER} -v $HOME:$HOME -v /opt/toolchain:/opt/toolchain -w $(pwd) wjx/d:latest +# docker run -it --rm --entrypoint "/bin/bash" -h k230 -v /opt/toolchain:/opt/toolchain -v $HOME:$HOME -w $(pwd) wjx/d:latest FROM ubuntu:22.04 # LABEL verdor=Canaan @@ -26,7 +27,8 @@ RUN apt-get clean all && apt-get update RUN apt-get install -y --fix-broken --fix-missing --no-install-recommends sudo RUN apt-get install -y git sed make binutils build-essential diffutils gcc g++ bash patch gzip \ - bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 libssl-dev + bzip2 perl tar cpio unzip rsync file bc findutils wget libncurses-dev python3 \ + libssl-dev gawk cmake bison flex bash-completion RUN echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers COPY entrypoint.sh /entrypoint.sh