From 207686b18e762b464ee86d03492771d283e5116e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Han=C3=A7erli?= <burak.hancerli@qt.io> Date: Wed, 13 Mar 2024 14:06:39 +0000 Subject: [PATCH] QDS-11960 Create testing infrastructure for x86_64 --- .gitmodules | 3 + CMakeLists.txt | 85 +++------ cicd/android/android_release.keystore | Bin 0 -> 2804 bytes cicd/gitlab-ci.yml | 6 + cicd/stages/build.yml | 16 +- cicd/stages/release.yml | 12 +- cicd/stages/test.yml | 31 ++++ src/CMakeLists.txt | 39 +++++ {android => src/android}/AndroidManifest.xml | 15 +- .../android}/res/mipmap-hdpi/app_icon.png | Bin .../android}/res/mipmap-ldpi/app_icon.png | Bin .../android}/res/mipmap-mdpi/app_icon.png | Bin .../android}/res/mipmap-xhdpi/app_icon.png | Bin .../android}/res/mipmap-xxhdpi/app_icon.png | Bin .../android}/res/mipmap-xxxhdpi/app_icon.png | Bin src/{ => backend}/backend.cpp | 6 +- src/{ => backend}/backend.h | 0 src/{ => backend}/dsconnector.cpp | 0 src/{ => backend}/dsconnector.h | 0 src/{ => backend}/importdummy.qml | 0 src/{ => backend}/main.cpp | 0 src/{ => backend}/projectmanager.cpp | 0 src/{ => backend}/projectmanager.h | 0 src/{ => backend}/qrscanner.cpp | 0 src/{ => backend}/qrscanner.h | 0 src/{ => backend}/serviceconnector.cpp | 0 src/{ => backend}/serviceconnector.h | 0 {ui => src/ui}/AboutHeader.qml | 0 {ui => src/ui}/CMakeLists.txt | 0 {ui => src/ui}/DesignViewer.qmlproject | 0 src/ui/DesignViewer.qmlproject.qtds | 161 ++++++++++++++++++ {ui => src/ui}/ExamplesPage.qml | 0 {ui => src/ui}/HomePage.qml | 0 {ui => src/ui}/Logs.qml | 0 {ui => src/ui}/Network.qml | 0 {ui => src/ui}/SettingsPage.qml | 0 .../ui}/asset_imports/asset_imports.txt | 0 {ui => src/ui}/content/CMakeLists.txt | 0 {ui => src/ui}/content/fonts/fonts.txt | 0 {ui => src/ui}/content/images/appicon.png | Bin {ui => src/ui}/content/images/closed_eye.png | Bin {ui => src/ui}/content/images/open_eye.png | Bin {ui => src/ui}/i18n/qml_en.qm | Bin {ui => src/ui}/imports/CMakeLists.txt | 0 .../ui}/imports/DesignViewer/CMakeLists.txt | 0 .../ui}/imports/DesignViewer/Constants.qml | 0 .../DesignViewer/DirectoryFontLoader.qml | 0 .../imports/DesignViewer/EventListModel.qml | 0 .../DesignViewer/EventListSimulator.qml | 0 .../DesignViewer/designer/plugin.metainfo | 0 {ui => src/ui}/imports/DesignViewer/qmldir | 0 {ui => src/ui}/insight | 0 {ui => src/ui}/main.qml | 0 {ui => src/ui}/qmlcomponents | 0 {ui => src/ui}/qmlmodules | 0 {ui => src/ui}/qtquickcontrols2.conf | 0 {ui => src/ui}/resources.qrc | 0 {ui => src/ui}/src/app_environment.h | 0 .../ui}/src/import_qml_components_plugins.h | 0 {ui => src/ui}/src/import_qml_plugins.h | 0 {ui => src/ui}/src/main.cpp | 0 src/ui/translations.db | Bin 0 -> 77824 bytes tests/CMakeLists.txt | 16 ++ tests/android/AndroidManifest.xml | 29 ++++ tests/android/res/mipmap-hdpi/app_icon.png | Bin 0 -> 4461 bytes tests/android/res/mipmap-ldpi/app_icon.png | Bin 0 -> 798 bytes tests/android/res/mipmap-mdpi/app_icon.png | Bin 0 -> 1758 bytes tests/android/res/mipmap-xhdpi/app_icon.png | Bin 0 -> 6367 bytes tests/android/res/mipmap-xxhdpi/app_icon.png | Bin 0 -> 13363 bytes tests/android/res/mipmap-xxxhdpi/app_icon.png | Bin 0 -> 30716 bytes tests/unit/tst_qtuiviewer.cpp | 17 ++ tests/unit/tst_qtuiviewer.h | 11 ++ 72 files changed, 364 insertions(+), 83 deletions(-) create mode 100644 cicd/android/android_release.keystore create mode 100644 cicd/stages/test.yml create mode 100644 src/CMakeLists.txt rename {android => src/android}/AndroidManifest.xml (80%) rename {android => src/android}/res/mipmap-hdpi/app_icon.png (100%) rename {android => src/android}/res/mipmap-ldpi/app_icon.png (100%) rename {android => src/android}/res/mipmap-mdpi/app_icon.png (100%) rename {android => src/android}/res/mipmap-xhdpi/app_icon.png (100%) rename {android => src/android}/res/mipmap-xxhdpi/app_icon.png (100%) rename {android => src/android}/res/mipmap-xxxhdpi/app_icon.png (100%) rename src/{ => backend}/backend.cpp (98%) rename src/{ => backend}/backend.h (100%) rename src/{ => backend}/dsconnector.cpp (100%) rename src/{ => backend}/dsconnector.h (100%) rename src/{ => backend}/importdummy.qml (100%) rename src/{ => backend}/main.cpp (100%) rename src/{ => backend}/projectmanager.cpp (100%) rename src/{ => backend}/projectmanager.h (100%) rename src/{ => backend}/qrscanner.cpp (100%) rename src/{ => backend}/qrscanner.h (100%) rename src/{ => backend}/serviceconnector.cpp (100%) rename src/{ => backend}/serviceconnector.h (100%) rename {ui => src/ui}/AboutHeader.qml (100%) rename {ui => src/ui}/CMakeLists.txt (100%) rename {ui => src/ui}/DesignViewer.qmlproject (100%) create mode 100644 src/ui/DesignViewer.qmlproject.qtds rename {ui => src/ui}/ExamplesPage.qml (100%) rename {ui => src/ui}/HomePage.qml (100%) rename {ui => src/ui}/Logs.qml (100%) rename {ui => src/ui}/Network.qml (100%) rename {ui => src/ui}/SettingsPage.qml (100%) rename {ui => src/ui}/asset_imports/asset_imports.txt (100%) rename {ui => src/ui}/content/CMakeLists.txt (100%) rename {ui => src/ui}/content/fonts/fonts.txt (100%) rename {ui => src/ui}/content/images/appicon.png (100%) rename {ui => src/ui}/content/images/closed_eye.png (100%) rename {ui => src/ui}/content/images/open_eye.png (100%) rename {ui => src/ui}/i18n/qml_en.qm (100%) rename {ui => src/ui}/imports/CMakeLists.txt (100%) rename {ui => src/ui}/imports/DesignViewer/CMakeLists.txt (100%) rename {ui => src/ui}/imports/DesignViewer/Constants.qml (100%) rename {ui => src/ui}/imports/DesignViewer/DirectoryFontLoader.qml (100%) rename {ui => src/ui}/imports/DesignViewer/EventListModel.qml (100%) rename {ui => src/ui}/imports/DesignViewer/EventListSimulator.qml (100%) rename {ui => src/ui}/imports/DesignViewer/designer/plugin.metainfo (100%) rename {ui => src/ui}/imports/DesignViewer/qmldir (100%) rename {ui => src/ui}/insight (100%) rename {ui => src/ui}/main.qml (100%) rename {ui => src/ui}/qmlcomponents (100%) rename {ui => src/ui}/qmlmodules (100%) rename {ui => src/ui}/qtquickcontrols2.conf (100%) rename {ui => src/ui}/resources.qrc (100%) rename {ui => src/ui}/src/app_environment.h (100%) rename {ui => src/ui}/src/import_qml_components_plugins.h (100%) rename {ui => src/ui}/src/import_qml_plugins.h (100%) rename {ui => src/ui}/src/main.cpp (100%) create mode 100644 src/ui/translations.db create mode 100644 tests/CMakeLists.txt create mode 100644 tests/android/AndroidManifest.xml create mode 100644 tests/android/res/mipmap-hdpi/app_icon.png create mode 100644 tests/android/res/mipmap-ldpi/app_icon.png create mode 100644 tests/android/res/mipmap-mdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xhdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xxhdpi/app_icon.png create mode 100644 tests/android/res/mipmap-xxxhdpi/app_icon.png create mode 100644 tests/unit/tst_qtuiviewer.cpp create mode 100644 tests/unit/tst_qtuiviewer.h diff --git a/.gitmodules b/.gitmodules index 0406ca9..e3877e6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ url = https://git.qt.io/design-studio/kit-dependencies/qt-quickdesigner-componen [submodule "3rdparty/qtquickdesigner-components"] path = 3rdparty/qtquickdesigner-components url = https://git.qt.io/design-studio/kit-dependencies/qt-quickdesigner-components +[submodule "3rdparty/googletest"] + path = 3rdparty/googletest + url = https://github.com/google/googletest.git diff --git a/CMakeLists.txt b/CMakeLists.txt index de88c81..dd4c369 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) -project(qtdesignviewer-android LANGUAGES CXX) +project(qtuiviewer LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -11,83 +11,40 @@ set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - add_compile_options(-Wall -Wextra) +if(NOT EXISTS ${ANDROID_OPENSSL_PATH}) + message(WARNING "Cannot find OpenSSL for Android. Path: ${ANDROID_OPENSSL_PATH}") + message(FATAL_ERROR "Please set ANDROID_OPENSSL_PATH to the path of OpenSSL for Android.") endif() +message(STATUS "Found OpenSSL for Android. Path: ${ANDROID_OPENSSL_PATH}") + find_package( QT NAMES Qt6 - COMPONENTS Core Widgets Quick Gui Qml Multimedia MultimediaWidgets Concurrent - REQUIRED ) -find_package( - Qt6 - COMPONENTS Core Widgets Quick Gui Qml Multimedia MultimediaWidgets Concurrent - REQUIRED -) +find_package(Qt6 REQUIRED COMPONENTS Core) +qt_policy(SET QTP0002 NEW) -set(QT_MINIMUM_VERSION 6.3.0) +set(QT_MINIMUM_VERSION 6.6.1) if(QT_VERSION VERSION_LESS QT_MINIMUM_VERSION) message(FATAL_ERROR "Minimum supported Qt version: ${QT_MINIMUM_VERSION}") endif() - -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/zxing-cpp) - -qt_add_executable(${PROJECT_NAME} - src/importdummy.qml - src/main.cpp - src/backend.cpp src/backend.h - src/serviceconnector.cpp src/serviceconnector.h - src/projectmanager.cpp src/projectmanager.h - src/dsconnector.cpp src/dsconnector.h - src/qrscanner.cpp src/qrscanner.h - 3rdparty/zxing-cpp/example/ZXingQtReader.h - ui/main.qml - ui/resources.qrc -) - -target_link_libraries(${PROJECT_NAME} PRIVATE - Qt6::Core Qt6::Widgets - Qt6::Quick Qt6::Gui - Qt6::Qml Qt6::GuiPrivate - Qt6::Multimedia Qt6::MultimediaWidgets - Qt6::Concurrent - ZXing::ZXing -) - -set_property(TARGET ${PROJECT_NAME} - APPEND PROPERTY QT_WASM_INITIAL_MEMORY "50MB" -) - -set_property(TARGET ${PROJECT_NAME} -APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android -) - -if(NOT EXISTS ${ANDROID_OPENSSL_PATH}) - message(WARNING "Cannot find OpenSSL for Android. Path: ${ANDROID_OPENSSL_PATH}") - message(FATAL_ERROR "Please set ANDROID_OPENSSL_PATH to the path of OpenSSL for Android.") -endif() - -message(STATUS "Found OpenSSL for Android. Path: ${ANDROID_OPENSSL_PATH}") -set_property(TARGET ${PROJECT_NAME} PROPERTY QT_ANDROID_EXTRA_LIBS - ${ANDROID_OPENSSL_PATH}/libcrypto_3.so - ${ANDROID_OPENSSL_PATH}/libssl_3.so) - set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_INSTALL_PREFIX}) -set_property(TARGET ${PROJECT_NAME} PROPERTY QT_ANDROID_TARGET_SDK_VERSION 34) -qt6_import_qml_plugins(${PROJECT_NAME}) +execute_process(COMMAND git describe --always --tags OUTPUT_VARIABLE CMAKE_VAR_GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND git -C ${CMAKE_SOURCE_DIR}/3rdparty/qtquickdesigner-components describe --always --tags OUTPUT_VARIABLE CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND git -C ${CMAKE_SOURCE_DIR}/3rdparty/zxing-cpp describe --always --tags OUTPUT_VARIABLE CMAKE_VAR_ZXING_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND git describe --always --tags OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND git -C ${CMAKE_SOURCE_DIR}/3rdparty/qtquickdesigner-components describe --always --tags OUTPUT_VARIABLE QT_QUICK_COMPONENTS_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND git -C ${CMAKE_SOURCE_DIR}/3rdparty/zxing-cpp describe --always --tags OUTPUT_VARIABLE ZXING-CPP OUTPUT_STRIP_TRAILING_WHITESPACE) +add_definitions( -DCMAKE_VAR_GIT_VERSION="${CMAKE_VAR_GIT_VERSION}" ) +add_definitions( -DCMAKE_VAR_QT_QUICK_COMPONENTS_VERSION="${CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION}" ) +add_definitions( -DCMAKE_VAR_ZXING_VERSION="${CMAKE_VAR_ZXING_VERSION}" ) -add_definitions( -DGIT_VERSION="${GIT_VERSION}" ) -add_definitions( -DQT_QUICK_COMPONENTS_VERSION="${QT_QUICK_COMPONENTS_VERSION}" ) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/zxing-cpp) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests) -message(STATUS "PROJECT VERSION: ${GIT_VERSION}") +message(STATUS "PROJECT VERSION: ${CMAKE_VAR_GIT_VERSION}") message(STATUS "QT_VERSION: ${QT_VERSION}") -message(STATUS "QT_QUICK_COMPONENTS_VERSION: ${QT_QUICK_COMPONENTS_VERSION}") -message(STATUS "ZXING-CPP: ${ZXING-CPP}") +message(STATUS "QT_QUICK_COMPONENTS_VERSION: ${CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION}") +message(STATUS "ZXING-CPP: ${CMAKE_VAR_ZXING_VERSION}") diff --git a/cicd/android/android_release.keystore b/cicd/android/android_release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..b8d55ca7380da897a4df89fd9b6c524e2c4200f2 GIT binary patch literal 2804 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 literal 0 HcmV?d00001 diff --git a/cicd/gitlab-ci.yml b/cicd/gitlab-ci.yml index 1941f33..33bccd4 100644 --- a/cicd/gitlab-ci.yml +++ b/cicd/gitlab-ci.yml @@ -9,8 +9,14 @@ workflow: stages: - build + - test - deploy - release include: - local: "cicd/stages/*" + +.pipeline_common: + image: "git.qt.io:4567/design-studio/maintenance/docker-images/qt-full:${QDS_CI_QT_VERSION}" + tags: + - linux-blade diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml index 0bea391..79c476e 100644 --- a/cicd/stages/build.yml +++ b/cicd/stages/build.yml @@ -1,9 +1,8 @@ # QDS_CI_BUILD_QT_VERSION_ANDROID and QDS_CI_BUILD_QT_VERSION_WASM are the tags for the docker images. # https://git.qt.io/design-studio/maintenance/docker-images/container_registry build-android: + extends: .pipeline_common stage: build - tags: - - linux-blade rules: - if: $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web" parallel: @@ -17,18 +16,19 @@ build-android: - QDS_CI_JOB_TARGET_ARCH: "x86_64" QDS_CI_JOB_OPENSSL_PATH: "/opt/openssl/ssl_3/x86_64" variables: - QDS_CI_JOB_BUILD_PATH: "${CI_PROJECT_DIR}/outdir/build" + QDS_CI_JOB_BUILD_PATH: "${QDS_CI_CACHE_PATH}/${QDS_CI_JOB_TARGET_ARCH}/build" QDS_CI_JOB_TARGET_PLATFORM: "android" QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM}/${QDS_CI_JOB_TARGET_ARCH} + QDS_CI_JOB_ARTIFACTS_PATH_APP: ${QDS_CI_JOB_ARTIFACTS_PATH}/app + QDS_CI_JOB_ARTIFACTS_PATH_TEST: ${QDS_CI_JOB_ARTIFACTS_PATH}/test QDS_CI_JOB_QT_ANDROID_PATH: "${QDS_CI_QT_PATH}/${QDS_CI_QT_VERSION}/${QDS_CI_JOB_TARGET_PLATFORM}_${QDS_CI_JOB_TARGET_ARCH}" - image: "git.qt.io:4567/design-studio/maintenance/docker-images/qt-full:${QDS_CI_QT_VERSION}" artifacts: name: design-viewer-${CI_JOB_ID}-qt${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_PLATFORM}-${QDS_CI_JOB_TARGET_ARCH} expose_as: "build-artifacts" paths: - ${QDS_CI_ARTIFACTS_PATH} script: - - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH} + - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH_APP} ${QDS_CI_JOB_ARTIFACTS_PATH_TEST} - ls -l ${QDS_CI_JOB_OPENSSL_PATH} - pushd 3rdparty/qtquickdesigner-components - export @@ -58,4 +58,8 @@ build-android: -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_QT_ANDROID_PATH} \ -DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target all - - cp -r ${QDS_CI_JOB_BUILD_PATH}/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH} + - cp -r ${QDS_CI_JOB_BUILD_PATH}/src/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_APP} + - cp -r ${QDS_CI_JOB_BUILD_PATH}/tests/android-build/build/outputs/apk/release/* ${QDS_CI_JOB_ARTIFACTS_PATH_TEST} + - echo designviewer | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk + - echo designviewer | ${DOCKER_ENV_ANDROID_SDK_ROOT}/build-tools/30.0.3/apksigner sign -verbose -ks ${CI_PROJECT_DIR}/cicd/android/android_release.keystore -out ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk + - rm -f ${QDS_CI_JOB_ARTIFACTS_PATH_APP}/android-build-release-unsigned.apk ${QDS_CI_JOB_ARTIFACTS_PATH_TEST}/android-build-release-unsigned.apk diff --git a/cicd/stages/release.yml b/cicd/stages/release.yml index d49a611..9397cbb 100644 --- a/cicd/stages/release.yml +++ b/cicd/stages/release.yml @@ -1,26 +1,28 @@ create-packages: stage: release image: alpine:latest - tags: - - linux-blade + extends: .pipeline_common rules: - if: $CI_COMMIT_TAG needs: - - job: build-android + - job: test-x86_64 optional: false artifacts: true variables: QDS_PACKAGE_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/qt-ui-viewer/${CI_COMMIT_TAG}" script: - apk add tar curl - - cd ${QDS_CI_ARTIFACTS_PATH} + - cd ${QDS_CI_ARTIFACTS_PATH_APP} - | for platform in $(ls); do echo "Creating packages for platform $platform" cd "$platform" for arch in $(ls); do echo "Running for $platform-$arch. Compressing..." - cd "$arch" + # app folder contains the apk for the app + # test folder contains the apk for the tests + # we only need to compress the app folder + cd "$arch/app" tar -czf "$platform-$arch.tar.gz" * echo "Uploading $platform-$arch.tar.gz to GitLab Package Registry" curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${platform}-${arch}.tar.gz" ${QDS_PACKAGE_URL}/qt-ui-viewer-${CI_COMMIT_TAG}-qt${QDS_CI_QT_VERSION}-${platform}-${arch}.tar.gz diff --git a/cicd/stages/test.yml b/cicd/stages/test.yml new file mode 100644 index 0000000..2d1ee04 --- /dev/null +++ b/cicd/stages/test.yml @@ -0,0 +1,31 @@ +# todo: run the tests for all architectures +test-x86_64: + stage: test + extends: .pipeline_common + tags: + - qds-blade-server-shell + needs: + - job: build-android + optional: false + artifacts: true + variables: + GIT_SUBMODULE_STRATEGY: none + QDS_CI_JOB_TEST_RESULTS_PATH: ${CI_PROJECT_DIR}/test + script: + - | + export ANDROID_SDK_ROOT=/opt/android + export PATH=$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/ + export PATH=$PATH:${ANDROID_SDK_ROOT}/emulator + export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools + - cd ${QDS_CI_ARTIFACTS_PATH}/android/x86_64/test || exit 1 + - mkdir -p ${QDS_CI_JOB_TEST_RESULTS_PATH} + - adb install -r -g android-build-release.apk + - adb shell am start -e applicationArguments "'-o output.txt,txt -o output.xml,xml -o output.junitxml,junitxml'" -n io.qt.qtuiviewer.test/org.qtproject.qt.android.bindings.QtActivity + - adb shell "run-as io.qt.qtuiviewer.test cat /data/data/io.qt.qtuiviewer.test/files/output.junitxml" > output.junit.xml + - mv output.junit.xml ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml + artifacts: + paths: + - ${QDS_CI_JOB_TEST_RESULTS_PATH}/ + reports: + junit: ${QDS_CI_JOB_TEST_RESULTS_PATH}/test.junit.xml + expire_in: 1 week diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..cef94e9 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,39 @@ +find_package( + Qt6 + COMPONENTS Core Widgets Quick Gui Qml Multimedia MultimediaWidgets Concurrent + REQUIRED +) + +qt_add_executable(${PROJECT_NAME} + backend/importdummy.qml + backend/main.cpp + backend/backend.cpp backend/backend.h + backend/serviceconnector.cpp backend/serviceconnector.h + backend/projectmanager.cpp backend/projectmanager.h + backend/dsconnector.cpp backend/dsconnector.h + backend/qrscanner.cpp backend/qrscanner.h + ui/main.qml + ui/resources.qrc + ../3rdparty/zxing-cpp/example/ZXingQtReader.h +) + +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt6::Core Qt6::Widgets + Qt6::Quick Qt6::Gui + Qt6::Qml Qt6::GuiPrivate + Qt6::Multimedia Qt6::MultimediaWidgets + Qt6::Concurrent + ZXing::ZXing +) + +set_property(TARGET ${PROJECT_NAME} + APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android +) + +set_property(TARGET ${PROJECT_NAME} PROPERTY QT_ANDROID_EXTRA_LIBS + ${ANDROID_OPENSSL_PATH}/libcrypto_3.so + ${ANDROID_OPENSSL_PATH}/libssl_3.so +) + +set_property(TARGET ${PROJECT_NAME} PROPERTY QT_ANDROID_TARGET_SDK_VERSION 34) +qt6_import_qml_plugins(${PROJECT_NAME}) diff --git a/android/AndroidManifest.xml b/src/android/AndroidManifest.xml similarity index 80% rename from android/AndroidManifest.xml rename to src/android/AndroidManifest.xml index f8ea2fa..1b15bb4 100644 --- a/android/AndroidManifest.xml +++ b/src/android/AndroidManifest.xml @@ -1,14 +1,15 @@ <?xml version="1.0"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtdesignviewer" +<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtuiviewer" android:installLocation="auto" android:versionCode="27" android:versionName="1.2"> <!-- %%INSERT_PERMISSIONS --> <!-- %%INSERT_FEATURES --> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" /> - <application android:name="org.qtproject.qt.android.bindings.QtApplication" + <application android:icon="@mipmap/app_icon" + android:name="org.qtproject.qt.android.bindings.QtApplication" android:extractNativeLibs="true" android:hardwareAccelerated="true" android:label="Qt UI Viewer" android:requestLegacyExternalStorage="true" - android:allowNativeHeapPointerTagging="false" android:icon="@mipmap/app_icon"> + android:allowNativeHeapPointerTagging="false"> <profileable android:shell="true" android:enabled="true" /> <activity android:name="org.qtproject.qt.android.bindings.QtActivity" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" @@ -30,9 +31,11 @@ <category android:name="android.intent.category.DEFAULT" /> <data android:host="designviewer.qt.io" android:scheme="https" /> </intent-filter> - <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/> - <meta-data android:name="android.app.arguments" android:value="-- %%INSERT_APP_ARGUMENTS%% --"/> - <meta-data android:name="android.app.extract_android_style" android:value="minimal"/> + <meta-data android:name="android.app.lib_name" + android:value="-- %%INSERT_APP_LIB_NAME%% --" /> + <meta-data android:name="android.app.arguments" + android:value="-- %%INSERT_APP_ARGUMENTS%% --" /> + <meta-data android:name="android.app.extract_android_style" android:value="minimal" /> </activity> </application> </manifest> diff --git a/android/res/mipmap-hdpi/app_icon.png b/src/android/res/mipmap-hdpi/app_icon.png similarity index 100% rename from android/res/mipmap-hdpi/app_icon.png rename to src/android/res/mipmap-hdpi/app_icon.png diff --git a/android/res/mipmap-ldpi/app_icon.png b/src/android/res/mipmap-ldpi/app_icon.png similarity index 100% rename from android/res/mipmap-ldpi/app_icon.png rename to src/android/res/mipmap-ldpi/app_icon.png diff --git a/android/res/mipmap-mdpi/app_icon.png b/src/android/res/mipmap-mdpi/app_icon.png similarity index 100% rename from android/res/mipmap-mdpi/app_icon.png rename to src/android/res/mipmap-mdpi/app_icon.png diff --git a/android/res/mipmap-xhdpi/app_icon.png b/src/android/res/mipmap-xhdpi/app_icon.png similarity index 100% rename from android/res/mipmap-xhdpi/app_icon.png rename to src/android/res/mipmap-xhdpi/app_icon.png diff --git a/android/res/mipmap-xxhdpi/app_icon.png b/src/android/res/mipmap-xxhdpi/app_icon.png similarity index 100% rename from android/res/mipmap-xxhdpi/app_icon.png rename to src/android/res/mipmap-xxhdpi/app_icon.png diff --git a/android/res/mipmap-xxxhdpi/app_icon.png b/src/android/res/mipmap-xxxhdpi/app_icon.png similarity index 100% rename from android/res/mipmap-xxxhdpi/app_icon.png rename to src/android/res/mipmap-xxxhdpi/app_icon.png diff --git a/src/backend.cpp b/src/backend/backend.cpp similarity index 98% rename from src/backend.cpp rename to src/backend/backend.cpp index e88b71e..35afbe2 100644 --- a/src/backend.cpp +++ b/src/backend/backend.cpp @@ -63,8 +63,10 @@ Backend::Backend(QObject *parent) const QString buildType = "Release"; #endif m_buildInfo = QCoreApplication::applicationVersion() + "\nTechnology Preview - " - + QString(GIT_VERSION) + "\nQt " + QString(QT_VERSION_STR) + " - " + buildType - + " Build" + "\nQt Quick Components " + QString(QT_QUICK_COMPONENTS_VERSION) + + QString(CMAKE_VAR_GIT_VERSION) + "\nQt " + QString(QT_VERSION_STR) + " - " + + buildType + " Build" + "\nQt Quick Components " + + QString(CMAKE_VAR_QT_QUICK_COMPONENTS_VERSION) + + "\nZXing-Cpp: " + QString(CMAKE_VAR_ZXING_VERSION) + "\nOpenSSL support: " + QVariant(QSslSocket::supportsSsl()).toString(); const QRect screenGeometry = QGuiApplication::primaryScreen()->geometry(); diff --git a/src/backend.h b/src/backend/backend.h similarity index 100% rename from src/backend.h rename to src/backend/backend.h diff --git a/src/dsconnector.cpp b/src/backend/dsconnector.cpp similarity index 100% rename from src/dsconnector.cpp rename to src/backend/dsconnector.cpp diff --git a/src/dsconnector.h b/src/backend/dsconnector.h similarity index 100% rename from src/dsconnector.h rename to src/backend/dsconnector.h diff --git a/src/importdummy.qml b/src/backend/importdummy.qml similarity index 100% rename from src/importdummy.qml rename to src/backend/importdummy.qml diff --git a/src/main.cpp b/src/backend/main.cpp similarity index 100% rename from src/main.cpp rename to src/backend/main.cpp diff --git a/src/projectmanager.cpp b/src/backend/projectmanager.cpp similarity index 100% rename from src/projectmanager.cpp rename to src/backend/projectmanager.cpp diff --git a/src/projectmanager.h b/src/backend/projectmanager.h similarity index 100% rename from src/projectmanager.h rename to src/backend/projectmanager.h diff --git a/src/qrscanner.cpp b/src/backend/qrscanner.cpp similarity index 100% rename from src/qrscanner.cpp rename to src/backend/qrscanner.cpp diff --git a/src/qrscanner.h b/src/backend/qrscanner.h similarity index 100% rename from src/qrscanner.h rename to src/backend/qrscanner.h diff --git a/src/serviceconnector.cpp b/src/backend/serviceconnector.cpp similarity index 100% rename from src/serviceconnector.cpp rename to src/backend/serviceconnector.cpp diff --git a/src/serviceconnector.h b/src/backend/serviceconnector.h similarity index 100% rename from src/serviceconnector.h rename to src/backend/serviceconnector.h diff --git a/ui/AboutHeader.qml b/src/ui/AboutHeader.qml similarity index 100% rename from ui/AboutHeader.qml rename to src/ui/AboutHeader.qml diff --git a/ui/CMakeLists.txt b/src/ui/CMakeLists.txt similarity index 100% rename from ui/CMakeLists.txt rename to src/ui/CMakeLists.txt diff --git a/ui/DesignViewer.qmlproject b/src/ui/DesignViewer.qmlproject similarity index 100% rename from ui/DesignViewer.qmlproject rename to src/ui/DesignViewer.qmlproject diff --git a/src/ui/DesignViewer.qmlproject.qtds b/src/ui/DesignViewer.qmlproject.qtds new file mode 100644 index 0000000..55733ba --- /dev/null +++ b/src/ui/DesignViewer.qmlproject.qtds @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE QtCreatorProject> +<!-- Written by QtDesignStudio 4.3.2, 2024-02-26T09:55:47. --> +<qtcreator> + <data> + <variable>EnvironmentId</variable> + <value type="QByteArray">{ac7fba27-a706-4163-bcb3-981f191b8f80}</value> + </data> + <data> + <variable>ProjectExplorer.Project.ActiveTarget</variable> + <value type="qlonglong">1</value> + </data> + <data> + <variable>ProjectExplorer.Project.EditorSettings</variable> + <valuemap type="QVariantMap"> + <value type="bool" key="EditorConfiguration.AutoIndent">true</value> + <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> + <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> + <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> + <value type="QString" key="language">Cpp</value> + <valuemap type="QVariantMap" key="value"> + <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> + </valuemap> + </valuemap> + <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> + <value type="QString" key="language">QmlJS</value> + <valuemap type="QVariantMap" key="value"> + <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> + </valuemap> + </valuemap> + <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value> + <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> + <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> + <value type="int" key="EditorConfiguration.IndentSize">4</value> + <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> + <value type="int" key="EditorConfiguration.MarginColumn">80</value> + <value type="bool" key="EditorConfiguration.MouseHiding">true</value> + <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> + <value type="int" key="EditorConfiguration.PaddingMode">1</value> + <value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value> + <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value> + <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> + <value type="bool" key="EditorConfiguration.ShowMargin">false</value> + <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> + <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> + <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> + <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> + <value type="int" key="EditorConfiguration.TabSize">8</value> + <value type="bool" key="EditorConfiguration.UseGlobal">true</value> + <value type="bool" key="EditorConfiguration.UseIndenter">false</value> + <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> + <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> + <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> + <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> + <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> + <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> + <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> + <value type="bool" key="EditorConfiguration.tintMarginArea">true</value> + </valuemap> + </data> + <data> + <variable>ProjectExplorer.Project.Target.0</variable> + <valuemap type="QVariantMap"> + <value type="QString" key="DeviceType">Desktop</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Replacement for "Desktop Qt 5.15.5"</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Replacement for "Desktop Qt 5.15.5"</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{8994bd34-5ed9-4c45-8c0a-94c8f33eca4a}</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">-1</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> + <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">0</value> + <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> + <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> + <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> + </valuemap> + <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> + <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> + <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> + </valuemap> + <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> + <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> + <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> + <valuelist type="QVariantList" key="CustomOutputParsers"/> + <value type="int" key="PE.EnvironmentAspect.Base">0</value> + <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> + <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">QML Runtime</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmlProjectManager.QmlRunConfiguration.Qml</value> + <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value> + <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value> + <value type="QString" key="QmlProjectManager.QmlRunConfiguration.LastUsedLanguage">en</value> + <value type="QString" key="QmlProjectManager.QmlRunConfiguration.MainScript">CurrentFile</value> + <value type="bool" key="QmlProjectManager.QmlRunConfiguration.UseMultiLanguage">true</value> + <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> + <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> + <value type="QString" key="RunConfiguration.X11Forwarding">/private/tmp/com.apple.launchd.ddnxVkgmc6/org.xquartz:0</value> + </valuemap> + <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> + </valuemap> + </data> + <data> + <variable>ProjectExplorer.Project.Target.1</variable> + <valuemap type="QVariantMap"> + <value type="QString" key="DeviceType">Desktop</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.6.0</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.6.0</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{63f87550-2541-4163-9631-08b7fea781da}</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">-1</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> + <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> + <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">0</value> + <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> + <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> + <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> + </valuemap> + <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> + <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/> + <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> + </valuemap> + <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> + <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> + <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> + <valuelist type="QVariantList" key="CustomOutputParsers"/> + <value type="int" key="PE.EnvironmentAspect.Base">0</value> + <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> + <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">QML Runtime</value> + <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmlProjectManager.QmlRunConfiguration.Qml</value> + <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value> + <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value> + <value type="QString" key="QmlProjectManager.QmlRunConfiguration.LastUsedLanguage">en</value> + <value type="QString" key="QmlProjectManager.QmlRunConfiguration.MainScript">CurrentFile</value> + <value type="bool" key="QmlProjectManager.QmlRunConfiguration.UseMultiLanguage">true</value> + <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> + <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> + <value type="QString" key="RunConfiguration.X11Forwarding">/private/tmp/com.apple.launchd.ddnxVkgmc6/org.xquartz:0</value> + </valuemap> + <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value> + </valuemap> + </data> + <data> + <variable>ProjectExplorer.Project.TargetCount</variable> + <value type="qlonglong">2</value> + </data> + <data> + <variable>ProjectExplorer.Project.Updater.FileVersion</variable> + <value type="int">22</value> + </data> + <data> + <variable>Version</variable> + <value type="int">22</value> + </data> +</qtcreator> diff --git a/ui/ExamplesPage.qml b/src/ui/ExamplesPage.qml similarity index 100% rename from ui/ExamplesPage.qml rename to src/ui/ExamplesPage.qml diff --git a/ui/HomePage.qml b/src/ui/HomePage.qml similarity index 100% rename from ui/HomePage.qml rename to src/ui/HomePage.qml diff --git a/ui/Logs.qml b/src/ui/Logs.qml similarity index 100% rename from ui/Logs.qml rename to src/ui/Logs.qml diff --git a/ui/Network.qml b/src/ui/Network.qml similarity index 100% rename from ui/Network.qml rename to src/ui/Network.qml diff --git a/ui/SettingsPage.qml b/src/ui/SettingsPage.qml similarity index 100% rename from ui/SettingsPage.qml rename to src/ui/SettingsPage.qml diff --git a/ui/asset_imports/asset_imports.txt b/src/ui/asset_imports/asset_imports.txt similarity index 100% rename from ui/asset_imports/asset_imports.txt rename to src/ui/asset_imports/asset_imports.txt diff --git a/ui/content/CMakeLists.txt b/src/ui/content/CMakeLists.txt similarity index 100% rename from ui/content/CMakeLists.txt rename to src/ui/content/CMakeLists.txt diff --git a/ui/content/fonts/fonts.txt b/src/ui/content/fonts/fonts.txt similarity index 100% rename from ui/content/fonts/fonts.txt rename to src/ui/content/fonts/fonts.txt diff --git a/ui/content/images/appicon.png b/src/ui/content/images/appicon.png similarity index 100% rename from ui/content/images/appicon.png rename to src/ui/content/images/appicon.png diff --git a/ui/content/images/closed_eye.png b/src/ui/content/images/closed_eye.png similarity index 100% rename from ui/content/images/closed_eye.png rename to src/ui/content/images/closed_eye.png diff --git a/ui/content/images/open_eye.png b/src/ui/content/images/open_eye.png similarity index 100% rename from ui/content/images/open_eye.png rename to src/ui/content/images/open_eye.png diff --git a/ui/i18n/qml_en.qm b/src/ui/i18n/qml_en.qm similarity index 100% rename from ui/i18n/qml_en.qm rename to src/ui/i18n/qml_en.qm diff --git a/ui/imports/CMakeLists.txt b/src/ui/imports/CMakeLists.txt similarity index 100% rename from ui/imports/CMakeLists.txt rename to src/ui/imports/CMakeLists.txt diff --git a/ui/imports/DesignViewer/CMakeLists.txt b/src/ui/imports/DesignViewer/CMakeLists.txt similarity index 100% rename from ui/imports/DesignViewer/CMakeLists.txt rename to src/ui/imports/DesignViewer/CMakeLists.txt diff --git a/ui/imports/DesignViewer/Constants.qml b/src/ui/imports/DesignViewer/Constants.qml similarity index 100% rename from ui/imports/DesignViewer/Constants.qml rename to src/ui/imports/DesignViewer/Constants.qml diff --git a/ui/imports/DesignViewer/DirectoryFontLoader.qml b/src/ui/imports/DesignViewer/DirectoryFontLoader.qml similarity index 100% rename from ui/imports/DesignViewer/DirectoryFontLoader.qml rename to src/ui/imports/DesignViewer/DirectoryFontLoader.qml diff --git a/ui/imports/DesignViewer/EventListModel.qml b/src/ui/imports/DesignViewer/EventListModel.qml similarity index 100% rename from ui/imports/DesignViewer/EventListModel.qml rename to src/ui/imports/DesignViewer/EventListModel.qml diff --git a/ui/imports/DesignViewer/EventListSimulator.qml b/src/ui/imports/DesignViewer/EventListSimulator.qml similarity index 100% rename from ui/imports/DesignViewer/EventListSimulator.qml rename to src/ui/imports/DesignViewer/EventListSimulator.qml diff --git a/ui/imports/DesignViewer/designer/plugin.metainfo b/src/ui/imports/DesignViewer/designer/plugin.metainfo similarity index 100% rename from ui/imports/DesignViewer/designer/plugin.metainfo rename to src/ui/imports/DesignViewer/designer/plugin.metainfo diff --git a/ui/imports/DesignViewer/qmldir b/src/ui/imports/DesignViewer/qmldir similarity index 100% rename from ui/imports/DesignViewer/qmldir rename to src/ui/imports/DesignViewer/qmldir diff --git a/ui/insight b/src/ui/insight similarity index 100% rename from ui/insight rename to src/ui/insight diff --git a/ui/main.qml b/src/ui/main.qml similarity index 100% rename from ui/main.qml rename to src/ui/main.qml diff --git a/ui/qmlcomponents b/src/ui/qmlcomponents similarity index 100% rename from ui/qmlcomponents rename to src/ui/qmlcomponents diff --git a/ui/qmlmodules b/src/ui/qmlmodules similarity index 100% rename from ui/qmlmodules rename to src/ui/qmlmodules diff --git a/ui/qtquickcontrols2.conf b/src/ui/qtquickcontrols2.conf similarity index 100% rename from ui/qtquickcontrols2.conf rename to src/ui/qtquickcontrols2.conf diff --git a/ui/resources.qrc b/src/ui/resources.qrc similarity index 100% rename from ui/resources.qrc rename to src/ui/resources.qrc diff --git a/ui/src/app_environment.h b/src/ui/src/app_environment.h similarity index 100% rename from ui/src/app_environment.h rename to src/ui/src/app_environment.h diff --git a/ui/src/import_qml_components_plugins.h b/src/ui/src/import_qml_components_plugins.h similarity index 100% rename from ui/src/import_qml_components_plugins.h rename to src/ui/src/import_qml_components_plugins.h diff --git a/ui/src/import_qml_plugins.h b/src/ui/src/import_qml_plugins.h similarity index 100% rename from ui/src/import_qml_plugins.h rename to src/ui/src/import_qml_plugins.h diff --git a/ui/src/main.cpp b/src/ui/src/main.cpp similarity index 100% rename from ui/src/main.cpp rename to src/ui/src/main.cpp diff --git a/src/ui/translations.db b/src/ui/translations.db new file mode 100644 index 0000000000000000000000000000000000000000..c8306d07379f4b62c1a2ff52a3c57553e68bd10e GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..0733caf --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,16 @@ +set(TARGET_NAME ${PROJECT_NAME}_test) + +find_package(Qt6 REQUIRED COMPONENTS Test Core Quick Gui) + +enable_testing(true) +qt_add_executable(${TARGET_NAME} + unit/tst_qtuiviewer.cpp + unit/tst_qtuiviewer.h +) + +add_test(NAME ${TARGET_NAME} COMMAND qtuiviewer_test) +target_link_libraries(${TARGET_NAME} PRIVATE Qt::Test Qt::Core Qt::Quick Qt::Gui) + +set_property(TARGET ${TARGET_NAME} + APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android +) diff --git a/tests/android/AndroidManifest.xml b/tests/android/AndroidManifest.xml new file mode 100644 index 0000000..e3ad0a2 --- /dev/null +++ b/tests/android/AndroidManifest.xml @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtuiviewer.test" + android:installLocation="auto" android:versionCode="1" android:versionName="1"> + <!-- %%INSERT_PERMISSIONS --> + <!-- %%INSERT_FEATURES --> + <supports-screens android:anyDensity="true" android:largeScreens="true" + android:normalScreens="true" android:smallScreens="true" /> + <application android:icon="@mipmap/app_icon" android:debuggable="true" + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:extractNativeLibs="true" + android:hardwareAccelerated="true" android:label="Qt UI Viewer Test" + android:requestLegacyExternalStorage="true" android:allowNativeHeapPointerTagging="false"> + <profileable android:shell="true" android:enabled="true" /> + <activity android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:label="Qt UI Viewer Test" android:launchMode="singleTask" + android:screenOrientation="unspecified" android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + <meta-data android:name="android.app.lib_name" + android:value="-- %%INSERT_APP_LIB_NAME%% --" /> + <meta-data android:name="android.app.arguments" + android:value="-- %%INSERT_APP_ARGUMENTS%% --" /> + <meta-data android:name="android.app.extract_android_style" android:value="minimal" /> + </activity> + </application> +</manifest> diff --git a/tests/android/res/mipmap-hdpi/app_icon.png b/tests/android/res/mipmap-hdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..74a188d073456264ab840da9314a48447fc95fcf GIT binary patch literal 4461 zcmaJ__dgVl|3A5O%8bOxEGwrI=d6>RmC<FLmFr}6Mv-;0cPLI|@1lfDL>z~*g%b{0 z*_^%i$NLZXet&qrUcbE_ul0C6Uyo<Bk%1QDW$<MH0KllDt${rEw*LV{cW(c^_m(?% z^zPay4*-Da=YODiC(gtT0I>4uXs8<djI3B$Vy#+zPfz9bHU!B(%w_ROSkzUCPJ*lJ z6LuZ^+&@n31fYHb<z*-gs=w8HVa2lliguGs$OX+YJ)>_bM%%exXp{>sjsR4h6^m(P z-)SsA`E^xCObVK(k<dB&A_X_06v+46Wv(k@tfJP_;>!GWZRbdbxvm4~#96np2k2I! zwqW%CZ8qyKyX*uxG@LrH@yFs}umo@E%{A?D??hqMRhjWM^%HHdQI=dnpvmiv(12U7 z`VXC^wYtQrHGl5^{<wB_AbWEsW5i-M5El~sToN$P9R=zdFQK^X+IJ(_YR={-b;izK zRA(#aAnF4N1vHg>caQi&H-;CR*gctr83cofJ)8RxM+ei~a|iX@liNe}N@(dgTI%o4 z%=hR`4Jur(W3vp;z#8B<!~#s*X4&3iSQC|4?=PnrIM3$yuho6w$b=i6%hx%L;;SbQ zq5_!c<PKzdwort6>9SsRZlX5wQ;89Of$?R{#P(X9Lu+^C0hY~u)`ZJr>r!2kk&LWT z-{3ua?EsO6Lo!ghg;x7*on<i1*eFPUvRyW(T~Ft7Jje&xB1?MIrn;@Y#G4gW{O+_? zniN@oNDgBJo0Xevft%GkFUQdse)UeDY6ck6RfC%G?dvr0>5P021{e$tQj8k*ngM*9 zO4%=C8GJ)Gd+$y~M+xzO>x_fn>`sYsPGpF5t^Xu@(Cy))!-m%_u|aImIyv+xf;WO| z_~>|Db0IgKgqJsbU#G~xw=r3qiRfcOa7Bk@h*XgQt&e@4H`#+lejU!)&2s0_Bb+GU z&Ag-F7S~joc;&Nyz){YjlCs7~?5i=olbM+cMq0#}8O-YngXHe<Oj!3-YMAZ)aAqF+ zZ!?@BT#Q+2blCKkw8UvsGNl)hPNujrx^Ii)*|7c9pNcqiK1%pV&C`FZQ3t<{nyEH{ zagetvJJ`lJCl}0wMM#|UpgTOf5r9iV$w8ze<5g<a*dDA(o%Y5ld0(%pJ5c*_I-36K zcHwur^B(nb+})FpTcH5BhvVF~nYT@FxFcZHqfdK_HcP$}Yf5`M4BIY`bW7*Upp$XM zTpn?S^l>MfB0ZDq>!G@fUQRD*%j$Nk)G&cNY#-h2?A{=kurTcLz-MLGuN|%i7(V4X zz8?RXYEy;Nz3%}rHMOZxc^SbiUd};&#IGXRpL6)(gfC?&M@L7U$?uj@n#aG_CwXR_ zb)l$Wuu;nsK-uH>gTkY?4gHsj@A_}g<ad~-*t<<XKK0PeB^-G(PlflKhU_w&9nM{Y zK+3dA)zkVY4)^?T^t?JOfzOGTS#Rf?eIPjB3Llhb6|`98V6pX}oqdupDE;h&n|ry) zMEsh)q;#nD{_}dy8!xrI?@$Azced^|TmO{Qil4JuKEbs7+0NVe@kr}F!*neMx5qru zli82gimcpNEs!lwY*&1xc2eh%(7M(Em^sBi|6*GF<YxLxx1DLRF@)mPTv~o~>o5B* zMGiG#7b8G1dw}n|MSEfGuaz1Rz5H~O@UVFw-CQxl|9gHsix=VLm<=B<93Ca#DD-vi z8Eg_5jRtInW`-0Mjf!GjV;(4srT4hy3>KxJywFMj*jfZOYJEna#^H}SvH@8bkv;z7 zvlfYvpxu1aQyG;j!m9+(TUe@*tL4;4%zf+*jei$uc|WMc6EDCSt6LmP9kH136Anez z{BeZIT?i3uvN>d+wR*qaYF4!E>+GjmyPZH=OYm^#hXqj96%d&UQrJK3g{h+nO!@Z{ zmmGPt05W%hIxhS<56jTfDHWw-7EMjWmr1u}x}UvTGqM%Ng2W7Ap}B8qK9)k?Z;=S- zid?RQb<ZVA6#O^w0k7U?6ysU0Try3T0vynWzL_Rqhk0wy4{92@Pct;1e7Ckd<UuK@ zid$gqN;ouqOT%OK^R!ilb(qU?rU4)K03NE=k;tG5L^wqSy_SA`pB5Y)cH<h4I!pV< zE20HQjy_k__@C07C#w*Uzy5B5=T=K{j3A_{Wf|YEMwD14!|u)KOKLU^PikVGd328K zIJDeXpZ*LH>au5IUTd@sbOWA#rVDEfvYGMf4nf3;M>r<1fr5lU$t<U4x*!-h_TQZF zAbBy%KY(_?;tQ`1X4GD_QSLf}r02f`T1v96&h#?O6n@M_dki3rO22mLqm-gpDq&$< zS&%88hU*uTh4>-+pMRf^0c$T&nT48uQ4FkFQ4lmYG6rh(QLYTlS3bibIkM#Z`LEt- z(p7qiHRi^+<Odzprcz+0?GBkDXw>2lfxJmEp)ih%9H?Av0oc;Zj`<hbAI(bC&}=(? zMBX<S1rl2f^r0j;VkedGP^m$qJheXp<b(6el>m!3Kf2Chw;51De#&r_qh{PNfE^@w z)6RFN>Pc=;mxV%Qg7v&}VH3P!4C0^fh^;qj={i;lrC|b_4KE4C5WMI4Blf7hhlbsd zDou>M9~WB#hlVRxVkIWPrmekoD+J!N+@2X_OGl5qU45$kvt!V$(xOne@<PH_pBy(u z=N-D6#^g<+cpeycdU%01a7HDHJ`ONNq*IsKjim{gyr1k%Ek1F^%Cf2e^VY|OWx_?E zm&{$+fvhZVTCReuzH6eT-wfB(dSaem<4zaykZ4oEK&|?>Nb!vUh{Il9jB;vx7H>b} z+wK(iXJS0*ElUT5)1bGP)?-P?gg0vAYu^gPF6x0m_LNm%xTfw7m(gB$doLXwM34XR z?VDzh{MN7K-b4J@^wdUnlQ<=1C1!g^?tkZ7^4!Cza?w6P?7|28j5@Uis*$Q0Ea@+( zmzdqvo(d2kWGBs%68K~EF|%-iHvOdwjH4}?+jONw??||;Y@g#F7dG+sxtQwbI89ty z#Ty>1Mcm4${T-6N^<z-q%p8mZ8894j>&6W2WuDQ&srH8%%|W*~?C3#P2~ODcX4Ibp zqdBlTORhQPr-h%1-B5*BC6ea7OKNw9Ea@#KXu+A<p5I&!u@<^s+OsT^B@BZ<VEJKA zkLOiml@Bh+V6mY!SCi9`V;5tOd|0y_layfwJgCVx{St+Rhi;GDzW!R15*N{Jn<33P z*?VeDsqm2e3dY$}a|T5oLoi-wlV;qz7P#e8H&x*NIA2JfsLy7d^6besV2PxifW_jA z8g+QyY$;S56n;LVzvW-LkLk$I#0672huy4eoVM#L?(oR;Q7R&U2pJ+MeWk5C&wX=X zs<;yba*%pt95$-aW_fZ$#kru(i2b4=N5a~Pjd5XE4Oow#g{`A7ulisdQGbU2>@PwL zwjc^L_7)MqdXi=;P^;`AQ(~GxS`(YMH{=&?AR?D<QC+m%$3?01yOcEWF4l{~VM;+( z25p>W5$2v3giX=EtM0=Jm`}1+DKU4d^>K;k9U;<sljW)4rPg}uP*p)DLMkD0kNb-I zd|9_*&%zp4dVH5ghOc1GK&gKxGVEVU{YU)ji7pT*Zp#eMxb?U08`|RO6=<%dACu#+ zqSCHAazGWpaQ9Vv4pTstsv~KPy!-r+icvUb*EO-qwjA{Ok>qEBCt~9tGB~4RZz36| zQi|1eQy7iE3}rS(`!7(&8zkUy?{Xd8a}3)>n0RK*VY?kvwYQ|PvLB3yZ~4rh7q8VC zL(01u?Y%e?ZBDFIh-fW0j$iV|y)Wf0q%@Mq&Ax)^P-ppnZ43417b89<|K`yjnQ)=E z&}2*>#nX#zZx9Xx<6cl%s?nAQ{_&<}reY~$Mal|aEt{7CXNt<kz1H#yy>)b&ee1xI zNCp5v>;7KL2ZGIL?=B4$w@wpIg9>>&3i<VcpvzuOhfwkY-MXe4L5D1UQXJnYo9vDg zdhOh;GcrG(=~jdKvt*<?#Hzw-#Lj3KHhhr?malUVG2l_;^mw-tyHAB?fgDS=Up{k^ zfyWVHwVZih!|<(4hlQ*FIbSM2GC8O_cJ=|2nd^9q;`i0b&A4AdJ<nj$<GCRca>-<? z#mk5q7dPUT^t3zl?9^jH2PNSIQSosfVi9iG&~(ygrIu#m_Dr#0oRi<Zg=O%QR$Jxx zSn8e=wU`h(a{9|~ye4{f_Nkq8s&1ue@XAW<H(XK9Q78&sm_9l)b38Z8Eo$~`#K(}A zr_uXtLH79qY4yW$^c%!;&a&f0x2Z;+(6qe?8&qreuK`NBrZ*W?V!zd~TO<TDQ1<G5 zteC-zGcW#YkxUxke$CJFsZw|CoOL}9ZSsvFFfcg}@;f(Vb&#e5ZIW!Wce(nG=p@w! z-Z2-m-+H$1=D($v-5YWIS1bFcL)N|EHR5yD{;f`PbDL(r(x}MYRZ{Lr?Z%&t$c?Uk z5df*UV1&9V&H|LK-&$He?BtHv32U%yG+_5%#eDRiWswdz8oCz_J>7g{n|^n<yuy3Z z*o~*qnn(~0mLyeWcFcRU&2KHNEsHZ_C&nF6V)Ix>eE!jwPr1c|uO&mtCpew?xsx{r zqZ4(9H~ptl4A4Gn1}=YH#IE!N?lw#4@rQuQ+n~>~ao$W5M}38pZc>ivnh>4~SCTe% zw-NR08~x>}{<PFlnJ}Va<nasn+C7#oQ4{WJujTl!5tljqW6wVkv)d{BNYmNi+)I9b zepU1#L5mCbeki^#ywQk!5mKywTAeIDIdnEtJ91xFL`|c*GO1-q<dmk$<+~<^#&&50 z=Paf!h7a2<4JU2m^onG_3F(?P#+04=ZeFjfOG-=J(bA7yDRE!yRi%DLzT;J>=gunu z+Img#-aAo*Y6;I)Z}uq5MLGoTJ&hc%QpG5#cTHHU3tJkoXGvxJU9Z2>18Jdre;W;X zlv_TWVq@KSXz|1Ni^=;HABgBcTG)@^`LiJ{%|iW=9^|Bx(^H<ur-KvI(+=@dvRSXd zJ%|&z!>XNc#)p2TL4ikQo%<j8j+slxtu}84GnNH?O=k1-NlVLWF7u}rG#GYw>Aq^W zSCMSAZz)Wb7d8BY9l8TFtn~X5sD!6UC}L(}f*)R@d$AFJ%4s*V6-Y9IC!>6WCBNz4 zseCqeY?#a<=jYCsC5MQ$X5Pj)<}edSk)lbT+OBt0r?gKk^(2@3KySW$I^FkE&PB2w zLyGVg$s7G9@?;vX*I<uogwBp1*D9~J0rIoYIK*kIstLm?H>y<ot3(UGW1>V0ms46E z`r+X#TKj@&UBrX$Y}RC>=oqf1QVE|J9n8Sh>Jbi#YN2mTa6uZL3H62fT9^}rd&HuN zt<P??wfh~P_$5glW^pu+h3J@>UL*|uNuoUThgL4QXt-X}Gb_qtj$YzLNIovDtHmgw z1SC0eOXbeNIjM{mGz<mx@~uf$R{nS4Mu#D43raTR$>JS*R`o#iXnK17@!C&hKrGK) zXJ6NkT!>0Ov0HJUzyAsq2^EN4|H+f-D|Kfdq0XXjKM_@S>?4kTy!fedT2#p^%khHY zEg~ZybCzdeI^!SSIHB20=#K4m&Pk>uKH3m%<PYZ+(<6d&0c<OP4N;jb!hdER$uy;d zHvaG;(oO4HOqAn`leh*~%L9U7P`<fptX+X-%w5Cx3<Y!aCW`_-iH?wy>>2vBF3+N4 zb5`3Y0EKJ)_=kTH8^Iq48u-*9MYDhsjMxTekQh>%JaM9hx#%c$GV<7~@OY3#!|}Wp zX`e&eesgTXCWdSzEgpsRt8ML3c88hv+8st(=AXwTm5AgIifcYHaOBH6ZRj(<pkI2t p4y}4{@c#%7|H%=@H)aB9ezv5eG;aj@p6e$79Zds`QZ?I<{{a>WssjK3 literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-ldpi/app_icon.png b/tests/android/res/mipmap-ldpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a52520e2630446955333139ca069431c38b75376 GIT binary patch literal 798 zcmV+(1L6FMP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<T&`Cr=R9M69mOV^UQ54624+<?UAdpg!PZa`~sNiJ6K%5*+4C?Bl zMnmFGjIjn69bI5>(zqBCb#anJiHSxBjo*9-6tPHKT6jJv@AdUwhmuDhP%Vl&*#GqI zJtsN8oOAAZ2Xe~kf0vTUu<NMb4_y2cLC5d-t+;uAJNR1V{mbA0j`YLMZvSQA{NL;W z8-ThncgkH<tQR<)&hCR9bne~B*mRiwyH6}1Z>fjg6Ndn}cKZ?a)fF7++J}_TJ8++b zDJ<XJja8gH+zG(dTMwCye)}<iVI+Kp5hLGGK#jLVwl~+VYtn*(eA=690dTtti7qT! z=cbxUK2FVAz8x)fv^UohUrrF2*RtyYfTWo~*L4LzBn1d*W=i46=P-tu1fZ?4%4Tb8 zNS)tJ&X5!`dw_JA!Xy$6=f{^cq!jBw%w&?`KnQ@=MxV{rx+4Yfc6=uLSFn+!5Q?U0 z%!R}GOG}IE?C&Omselcu8SrlN;4SrR4S)rLRF>oM)l#kG_06XgK)tUVkE_sD4v`cL z2fl6%z*?#5yrM45i`OI5NC}DpEe$>!!02>@xMBVo003QI&YKE;ArK79RNbp(I>6hN z@@yJF)l#W0b-Qf$rNu?ocT8RFhZi3v6@aGdGR%ZdOPy~8VCL5VCW2uAS{kZ3+_fK% z+euZ$HclTo2tdL#nTgC>{;x&?0PJb1RSvY(<1Q*(X~1CilQ3O_&)?H?EJjUbIelll z>7(0bzxm)PNwGThUJg$IP+3;Om2<}dm<~l59h(%M;u7I<7dey-e!dwq5Z4WQuH4|+ zn=z!6w)^Y%9y4%f(B}Uo6eSe1kJ^{R0VFa{(^N+!Jj>#urb{7aGwuT=U1v5NSFS<_ z+r8z)b%Rh$MP!(2*)1T-Wp$|k!cR+(u4Titdg3>?pG)dczkf@g;pT!5__urx{7&$k ca>@zdJ4T%*rBq*(lmGw#07*qoM6N<$g4j)O-T(jq literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-mdpi/app_icon.png b/tests/android/res/mipmap-mdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..36a356c0cec907702d1ecd5562586ca8ee72325c GIT binary patch literal 1758 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 At^fc4 literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xhdpi/app_icon.png b/tests/android/res/mipmap-xhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f2e9dc1f2653cdb78f3392df37664615f811aa GIT binary patch literal 6367 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 LsHIe?U>){<VW;Fx literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxhdpi/app_icon.png b/tests/android/res/mipmap-xxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..652a8e9b7e4e7ebb31424805025b1a2bce8e708d GIT binary patch literal 13363 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 HM2G$lKY8wd literal 0 HcmV?d00001 diff --git a/tests/android/res/mipmap-xxxhdpi/app_icon.png b/tests/android/res/mipmap-xxxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7a404f6cbb8e0acc99545092319bea31c384ecca GIT binary patch literal 30716 zcmeFZXIGP5)Gm4_1QLpnfJhH9ARs7BngSXn(m_y~f^=!pL3#-S(!2C7Qk5p6pddkd zk*d;^-V~7zD(x(u{qD2R4>%w97&zhxcUf!JYhH6MBD6G>PSLQ_KoE3FMVWXTg5co4 za0o>OKDNC+{{tV?&dPV)Ac(&8<R2_qh@Jz2aF7b|x{lZQuSVO~mSeiuKiOVeJ$tXj zYs6o?axFPuTy|UcfnExkKpPTTeOHgiqSf@XV@5vP2%~|-6Gw$gRW{2YSX8r>UCX@~ z7);!bitR!)f-(4ccW-yT;L_hyf1ji+{mnVrz|Vf?a0zqkllKe{KeSCQoAi}-{C4SE zO;b%%;~or!fCmw9=>Plie?{>Bw-tm`QxpiZYBn6o2K=L2`XyP~Y;{zGypwiWeV(Ss z<+1qtV@tcYrh+1;@7N)dd}N9i&UxfAs2_Nz|3r7~B>yuq{prtpumHaB|Age*Dwy>% zy{bo@ZYVm~<JU{cSM#m&yT-GoUlo5^`vaWjcRdr;f2_}Jdme1F1<y&6)Gj(?^(4X^ z(?6u-){Raq`?IYXwc3l!z7lEpK{0WB-ZORb%a95EdSCIyxsPr85!CXWZ_%*Oj@P}& z{d#hvqK1z!UBK7HVBx*nIkeN$>M^MB{?KMx&TF#|uWmm=zg@e^-1ADFd!Fj^u52i_ zb=Lv&4_@)ly=XzPH15}8Bl*URwNW^PeiL*2_Hdicxq<I5jf(IQBavY4L7RR$?Cl-@ z4JGRhPf;21sHRqmXe`EAT1nk3PtGcNuJP%3mn0Lc1F40B3&&u7`+FMaNpQck#Bt(r zUDc<<$sWl1U$XPR`Kq;?@esnKo!jfv(M?nmO6J##S~ScvqvFFKCnnh4N|O9aDi1uR zI>F#iXar%+{B8!%C6<uALRBK!#YirkBq#Qb4?g5?`F=er-Em~;%Ph00aRVV(pD_Me zmF|r6;k7M3xOptkUXJ^e=O0{{%l9oN7^~yl+F$%AE2r&OktJrW`v-;dFo&pXPZwZK zYi}d<31!(C4e&`fGo5*uV+L&jFN0_Tw?AXhdIP*bm;nvLb#esevz#^eCYYD6OPs&n zN==%F1-h9b=7Vsv2)RbM&jM^lCJ45<5{CLCUTbk3@p5;nQsfDWJjx#ED1M|qqrt)D zO>oO1{Y~j@nO3e2I7KAb&Uo^`Umekp)#DmOPU<nfP(5moYiC;9=+4i&U`d9Q>xT z+;R;9w_Q#)bZfR%<C<LplFCDo2%#Rgn*?mE1!4}mDAb!re(Rsyp7)Arn}c8U&#S2a z<mfD`@!sgZ3w+WT79j((tt7~}z{@sC-;8kHggzl0D?j>9B@}h{G!8==Wj|)fo#Cwf zG5qAvm$F?j2F<<@RISNF*C!<U)HWo?I4FD`R!$_RmL_|}&!ixMjTl8=^VM*FqvA_B zdzwG*lMvd%8@KE7zcxhJBsIv9TYohQdz0nu3AR@a8sTDz$obRKO0)C)G4Uv<`AqSL z)fQ{IK4S~U_eR-7!WW@weocbC*;Cu4@E(c}TOF&O_0><2X`j(C@p7ie?kyq=%4g;h z?FxL@^Iz!`6xh#Vpd0;v3hqpf?Ck8NIc!E<Q^v;oS(b?}hq2yHzJ8ejqszvL^d_Mo zw&Rgj6N5zLa}63@w&?R1^muA)K=So|WS(H~oYn)d8n(a)O25zHq?QjEWpr1B9a5_E z1%t(FBFpG#_O9x(Jq;)bBVciGbnV9RS0E=vrLEMjva58N`}SKr46S9|dDD*<e=>u| z&8|Kd4Bm8s%bP3fQZ0lNyo`ffQh~IH4hLpK2lcDAl{AX6^RV+tH*~2~uz3pMpAW=z z9%!Yb&@fitxoZZK`k^Q<UrJ>xdeRVVf)bBgS&Pr6eX7WsEGKHLOC_%-{z;cA0*c@8 zy!8EW^92^4cks%$5#^3b5WvJsrh;erm|S_KOXbiA=VhQP)d$;OJ-BHia&eR7rPHm| zLow%$0)nAy6(Z<TUDu_e;D-~Tb{dhum9TzRuDSlxyT!Z=%8W3|N=TROvj)QQkn5FO z&^)Y6T;^988Utgcon!dWxV3cS^0RN5C;>0Z8>Qkl-k6f^y#MolRb48jH{GW3#z9r| zXYp{+&Gsqp8GRg_#yCi;jLvSGMl1RH&6DS!p17#yLkaHX#*2z}NixE2iezk?#>C1I z5ICB-wfgm*%yWrI-UyOZC4p6!ikan2bqZ1-W*}i5Ji!G&J;OZUg2G@(7^$PIImx>W z9v2p1sysjg<HM-(m&s*xkxZ~3SH%PQfeLvp!nkh`5vIH`$6<ZWeX=(L(!SNXX%Gp` zCz5Dmk<kBdMNZ&a@Bn%uAze<E5q8QLmc0pqH%J^EZz@>V6~1Yj9dl82fn$w<NNo1o zn)TQ|&!1>MV-em(;p!GtMn~oG-<l+jOe?(?vYpc-Fd=dT7x<ef`YwuDB3WGOtS+0* z4o$pVUW)=zmx?RJO@54m2r0JyQ5)#&JQ4Ns_(!uB;xdVwq~KV|gH4iwx77o0QW>3U zVoO>Vxbz8w$WaeNwwQW*?)ly<;Eq6quT}CD!b`eM(VIZ9+hW`wp8~Usj^0q3>NEL3 zA9l-|V8FxUO`yeSt<yvwo+au$7+Bolt`!UpzNFbEB#J$;s_5q%sXn%p^Fay9JUZrw zlTPeFa663J$=CNnr$#=wTQZzY%%lauv5+zrMP6qM>@!ZXKC~keQs{s}xT2au^ua3I z$wKHP!QjXf2`z`A=+s?fh~zMqi|s@bio`J2f7zHqCM~UyITML}Q2ICtEFSlt%w35D z8xvqVrQLaM$=C5vi~WJa8L5TT`|c@8a_C$5X;bGD-J=ZJpOn#c_m)A!sD&w3@Q#9R z5W!}oj$&yuPaez3%K%nGjnDf}FISh~TsJIN&PHlvks3L0-7+vd#AA8D#Ue$G$Ngd+ zNK;haB*dSrRoONK+ph-PHi9I6IXV>>p=tQ~<B$!{b8uCW_njBwfE=bm!oa(0lTNgB z;^Ds6uqWnG$8o&pzf4Ehz-OA&dPa)Un|zBs{{mb1)QOz6US|KdqB8N4VAP)t^cYi+ zS0Y#izMZ=$yD3d0af=4Q$q$ThZu!KJcp1FpM1b7+;i|^Z{%`@C#hqzC=6~5f)u(K? zPSa|P1sA~>VaUgdx>P)TaGKV;cEVc8&7=Bk?gkWxy<yiY!HQTp0(Uc(X$nG7%j!Ja z>oi*I`Fmw(&E)HGha9?W?tUg0=0FIdv|<LfSY!t41Xg8ke{gy9p?Y)2yb?A~;zqIu z2tf57^g(i9X%rhLPJ4}**MBN62n4I}>J868=~h4W>SUll(-I<KQb=?$3=Kpy=zksr z-XMt^c*sTk=$m_0+|qlo=O<RlDUP463gq!7e~*%iJ^7+lv>3w(3y<1J#diVi+m3*| zaYI(AraNzrUd8#k+YU_#@TH{plwA~H&(BWc5FTRm`t5(srG5G^qiN*hnz=LL4g0+X zpbmj0W}G*U3ao)W|H?^>2g^?cJ`m0t==@@_zjf-ggK<!TCJzEczgUzES^`+k@0+x* zx=q*2!QBdo=lh)pKvQU#)}^Ch@1qt~gk>WfxXHF5xN=YvC_D^3#wx{S93)mDu8hD5 z&K-*c%mSq^zEP!V6v_B+5xbV)j{T_8Zc|Yrp-TvCsMUxScmol_OB{Wt34Hv*vIOLW zGI3PQCe%hfN`D%7s|w=jnE+{g9wDo65f0=Od2;<Tv7-iygY=J?Vy|7`F6H9Ob?f^l zG4wyLT95W(&tD6j3P=S8+ZI8#(PQI<qtiF`s?2g;Jbx-TU0(_$)<@d}Kk;{<x(&)t zUrqwu5A-vam*OQB1t7%A&51}nc{dL$rFf@&qH$H8(_1Ib{<j`1J614Q&=}SY56|C7 z9UVxN!>M_JC?kT;`!CNuE-w-c9>`X-Sz~7P019<lQ98+wqOr$OxiS{+w-3{%?&tA> zjFbrM-{XIRe@Pi#*-5wu?tYs83HU{y!gFa&5{i)5ejIE~{`;`eR)CAJ@MDagcw*zP zXqy`D;=KupD4Q*?g=Q}%m}e!#bz?pl)f!J1eE~KqezZ7##3%o*=C<gfg{#1SspL}T zGr?dN9ymQBri|{L?;u!o_e<~<5qd0sv|B(R5?sv+1cMWa<i<IrB9OTqNB$E`+k^`6 z=Q)JWib8K09U}}i@kbV*C~+J=h$hV&ARI>;2a!&6th`B<IdMxu<%Tr(j~-mpZN$=v z<LW$cei}}qxDK8UjF~J%unl4DI(e}>`?1r%X*Ngq=%&i8G!<+-A22Je7!>Nl(Z{W3 z@wFdl{ACf4l%M9(0^@NyiG5dMuBkf)rf#tS6Rb`JE;g-PjG<4}H|=FO3pNwvMX4wc zU=&GnZf$UC^Se{V6B^qP^Z%k4NWNJoi5YC%@qge0FGI;m+IZ@`oq5%(9Wu6{d7N<t z15lvPi6}OS1V2F`4A?8M4`8^*M(evLCZo%M!9cLNI8ASpe&yS#V|hH9|0~enWqPKF zu<Qa3{JHv%niu7hSKWEfP9lHgYD%Fr4M5LmSiIEH?FxJl%l%I$R#$lD4er0hHgVz+ zC8+>RO5&$~Gqd)b$mewQHEFiMThgTm915GHI(?kf|Be>xCo#xV<esT6)&I%okqPo# zf^bpO14>1$?obwz9MGxr|Ep7wJ!CLin<pE{J;}z5uy~21hW<Z2pYNtbGC6w<>NdbF zbRTGioh-Qfd(1q{<phj@eXB2k=#tnz^(YS!PO742rSZn`=~7AlXH}8<0PxQ=E`;l{ zy^huZkze-&Ux96k9$5o4VUiTrqbPc^YD5=>BW)8qX8AC*jLxSi8z?$c|0EmyyuvEt zO?W9+^GYrc<QxP<9(0m%d&1$R;r?7V&g^r7V#(}@6@j#wh-_^KcSmNP{x8V{$0H@4 zV`9(2ymmSIvc#^G2B@1o4^umF5mh1~Odt13Fc?650F-R50DPN<5<pv*){ADGWONzU zz_iVSY?H^P;Uu&IT?i^(4%b)(eB2w4yP8~R!~oX!RSlq!?8V1#^-U2ccx~F@KwkO{ z03SYCB*eq`amw+j5P&^|?ZLHG*%>eXzX%TCNVL}p6nB{u>3h<~_vGb&cJK?jPZtZh zuvZ8MyQ8$Vh=lJaRsdv-CKBwHF6j_)QV7E5KT$O^q9-238lsPz)TKh6$h0*SCDQ=J zHt;<P<TqWbWMgkrPHOTcljHF)=z!ze-g+!kyfX`REQlh}*DzIHl;$~#B{%fLR?&D6 z##hb(_t*rLSsC4v5F#fQpWE;6*{JuBw3RaD>oR<8;&|{_KdAr8;oz3r@2SB+YL@+w z)l)J`YupQ0T@MNm?@-HEe!97v%T$+H8e`<GX@7XDs6alqcQ@{K4f)a45;?Xt;n>Kn z<_~kaSA{&xoQy0x?%4GiHW|38piM3t@s)1Jr#<m<R&=S?6S^S!W)A=MCAHDAnDD*D z$G&sAOOMGfT^myEWR=D#2JEDE&t#r@%G&bl*M;2g)dk`SX`}hUbfYyhgYn4S)$yRD z4*Gjn3zN;n_e~BCGd;D-rGatttSpVzTbywU{H?O%qRrVUT_M6_QbBo!zsh<^P7^E7 zO8&OFi)wJOU<-A1Fy&X?Bu#Ja`rA8N(U@!>-1#{?*kSHA*Gwf<a}Ib29xA#%U!wQo z<-PLNw5*Je-wym7e5|Y@VNCZTNUh2p_1)857RZg<qc|rT|E!}fWB{8Q$KCo+hu$Gn zZosVe!2!bu>Fw&jy9|f)!rzR>0ysf+Qq0G<?zVQkl<<<lI$*AUBcjQ-$7LgxpQ1(o zfmX5H`py1pp}GG)>=DINrjGKbexspi|Kw(Y1j2>pK|3j}-X*J=u6bg;kvLsT$?`hN zd4wB)#1Kw`zsWN`h7f5*S9)nDr*z;(qe|blo2D0nmfH*Wl!q#&n~Ur%X$&+Ld2Gi@ zEhcl24j}pV@bfX?JT^&ZZpFe?ldt@K`5bpeJ4_!t9iITO!6<o}s%*g(pQPEx;(A$v zBc?3Td0AqchKI`|i_p6mJ)riSkstc<-X&c1YmOx$<<Y5yx<AoOUUTiPyyaKC)xVjx ziEBdaa|lx<#Qg8=p#+MA=($4K7ov5Y|M(m21p7iwBcQkqRg5p(^!F#lf>=Lc+0-uH zyY;ulWu)!K8{lU#uxJ_#`j<%l(wCcvyabd$%~4$<tba%MkK>Zlg_}c(#e3Hx+qf=e zumrB1%Y1kaj>f}5US<ovBrh4kbnEJwE*ay7di<p3)y{jm@&%LEhbM_7p%3dW=inPS zC@~{^P)h4!GE=&a-JAHHg0YwSwM;NdZ^EuaO2!cVCb<d&)Ac4ZV8WB-&`NmR4`!J_ zd3FZKf?R45_Vg8U{*u)}55*0kFj_<16eNPKkM`DD$LDz>@0{1n*T{Ra3aLoMQQ0rC z=nfhTHv@F(kVh_@Ge+^$UwcR4B$fPo=ii#;Ram5Rrbv7g(1=iF&mWk3sL4Y_*oJI~ zZ<+h^sUq|eFWXy2CcN%{X?O=fRJ5#vxbao?nEj^P52xFQikcoc5N8qLkXHhXt&;E} z#<f%;LDQ-4G>!M`3=RM5!7eGtSsQ1>`OSfD3YXZv*Iz=J8{k-J8E$P(umvPf1wWaB z7ydg*M=6W2_oDz0rLM_^3@$!?m`8^h;9)3{OEv)v0Z9>0zN}QBry!h}-fuNj^5umF zy+kb|OnB!CQiP%P(UOV_oaZ{?S0_Oyh$JGng(%|Z=WHO#xqFkHvPh9~fVs$fU-5xc z8=7u2d@+=HHdzMtMSu8K7O8bI3`H0qLeO~m8P&fZb$s01%5*N|eR161q-nhxBdSQm ztqTU{<VHEMn>{5G5-R9lRxVX4F`;DSF9$8<PKt=~<5Q64S&DypkCduqu5onzxnEbW zeiGXM@WO{INd<c4_*BjQCD*&3AJ$SK$L~cO84aVtKAxZtZMrA1GC}(f*`9ALC}+&3 z(aZc?cp}+FA)@s3*yQ1B=hdTkTXhIU#FI-g&e15+V_kh-c)21)+l_!LNvfJpRc}r@ zzV&;6CIU){lhx20w<yfsv`KJxfx=EN24C|gv>h{#NPH|okqte$pM8;P=(u_Hyz2Bv z)*=Av2ddiipCaqb^7Klp)cGV+`yUM2d}fE}9Ei9OU<@(gxeDP2=pZu{o@l!P9s0Ak zlaYNlc`35wJhWUl_HGTC=PC-!Fo&1HP2Uo0PkUqSym3bybp~k2m!m=%VaY|El|N>K z%k9x9zLObYSK4~2pxnq*AQC+Kllo{ehUU>t5TaVRGo3Yg{N~zKc`tse6%8xiThlf; z*ztP!<Sy20JAq54ZY@E%eRZ~+xf#n5H;jsa5Z4h;uYDw+ighjQ6)&B)znZI1Gx+i^ zTcf~ykWDzGkB6HZ2MvNnTN>$vlk%44`hN0l7TWP%lzVg#AJ=wG6_0jcH`7@N%q*9x z_;z3aN{WFlHl7DQSO{c-9`6m~XMpHF`Eb=6`A8*czOpMccW%)V7CmjlZq^&E=?n<A zA6Rbu^gzTAZ6<`7mYel~0(OloG8Daj8c6&;7TWu&<@APAir5TLmlyzm1hg@5V2Dm} zf>5fX{QOQ=y7}2Ky_y+AZ2Z^)ecYw498}1820BA_vuS#Wp`hRf;@>qE-7C{w1xU&F zAqCqs0vD+tufEnCDuF{&qCbxNas~lXc&AU!?b_vo4_YuPz^x`6)IVHGzWQn>-={qG zUb&R)WwFpPF1OXO^m-`^`|*Chm{XiwtNt{*qPBz3N+Tk=bh7zJYG0VW@9wh}rTXsg z>i_CLZLDpqQ&lyaZ1#zy&zq+C&KVJx;BvKr3?3qVXANI^dAwV%-+a?i=hnlHtN9bv z@4dnzbb%V4>e8!u>!t@ZK$+=<nQWq>xuqE9f?4LTuP1A;h;Q`&%b=ZGhQ*I&zxPEv zPDQe^j<23k4gE+IOwJN!-ds;oU6$6w*}cct6!UxIa*ScuT;S5F(%LUS<86oD$Qt%C z7qsw*_S%Lx`R-Dy^L{khG<2YF`tC3A)$YfgUB&Y;&PLQE27I0d7LeM}ZaNQjEr&|$ z?WKb6m4AgVUA#!dE$;As$x)7zn+`*Tq${%aRAX>(@!f9GI%^+&EgA1$@s0K^^^0v& zlgo(re^zes$gyc39<MNb)qePT{+>J)AP*q#m5OO*)S~P~B1E@p#ng7gQ9OA(>q2Uj z4Tr<IO45{Iu$dvNq>s3wZHUV`Taav?CBlq<Si)rzC1Co!GKCn$7sow~LVX<12Jvuh zo+B}cF~k3<3;ez~M6c8RK&Lyo{>Km7-cS9K#YNV9tZ5Qs>;s(!bZ=7MFxc!Dw4Q?c zWPRMTW)Ymivp+qfT0}4V3Z4cp5kzf&yAx;OW5*a{)#Go3czo#zzozL*rsW)hG5Tf- z{7-w#gUVu-6~`|9UUj&^F@C|7o67~hVMP6;jRN=KQ|f4M7zaNYl3;%{?^a)`E}mZU zR8^EtLFK}uROIa2FQ3mc*o>{VOKRd`v9LHz_lfZP@0(&>%P~H_MST40vzPWMC(g6* zi`v<S^kct8h1RDJbaaZ!2u}qpYuT$#@`(Pl4Y5##UWXqudeZA-MeBlG3q#y}+@x~* zpAD8s>-dGaygqbvistq<l^8<JQTKbOc2hiQcIoo#eHgwhg5s4Dw!krLOI|J8Y?4lq z(iTfnm@vO{bs>lpK{_yE#o|T3S;Im!Ks*@w%WZA*d8Kpd)$o{lqHgztK5xT!WUcM) zngb3dk1SG}KJMi(YED}2MygNM`K?@_A2|jp#vPhyLCo?2{@uUho}9RHJK->XP230T zx^@{V^4mXaKBYUZd`)g!O#BeY2L-yquT%>qF3HOW|NZ;7eg5;d#1rUyMDJ-vr#UwM z=>y9Epb|EY$tWevs{PD6YN_nb=4Z03%gfhABaU{XnVf$hfbbV32~R=C$J@7%%lYz+ z%cc!y6VDFqu!_GgwstM2zpP2{a#(JosWM0)v2s&AcgW;^sZZ9=f+&_acYIEb*;`#n z(gX>`*;zsq5$`&4xsyV5(II>YRlvcKge{-O#3v&s-|eGo6)$aj{Qf2uWljHUb?=?v z8#jqz)ZVHwnJMl!oxeR@Unm3gGuN<ef6*)nfGmUx;)#H!=?k(JQ=55E;cbrLHgj0H zRZZ+!((8hUB||9xPKs(aZg2ebSoDW$Z^qm8s`L@d-B8)eN=Xle_QLVhU6p);(w-)I z(06IQ4S0s>U{thT7NJQ$Pp=%8snKtF>HKFq-C&_JtTer|w7!(BQ>>5h=(%4(2AJBb z_`J)SxK}cyIb^N<YsF+#c)QASJBR<jrlEav-!q|rAn_uRZ}CLK%<m(~hF09GGBEmB zy%(Y8XLAMeI~NxhMP;w)=cc7)Mff?(5k-eppx-R_MBeOc{|qwc;74D=4{%`mLbxYi zWG_|RRDj;lz+LuTW{Rw>t}Z^d%pxs~j2VF-M7Et&Is<uGj5!*7c3p7je}>}MB+E&O zTQkrpXpp?nP@DkPX?SJgo!YpwN>2ru>mNTyShL_4altR$y`MjyUR+$7;Cjf?$PyNX zhW(XRT%~-)2rBkzZI+H&e3z&meC47&4KeR{Q+iE~Sn#ENd!AV0AoJRZW%ueUic-HZ zmv#fYH=^8b*JtO8WlpnX<fgZ8w9Ifrt(UKyd-gpd>Gee^r}p$#zLwvz3V687ByXz{ z9POSN_g)TimdHGHdb2)ap?0TrNKtBgT1bf{Rma-a;D65oM6LAzs58ya>4es0H~SpR zb{9Xbk1dfl^tv=F168tJa@-_GDdiCGm=9z1Z&Pkm=y2I*DFptAM_R6(UXcl^=7B)D zab`vMy4c4G@zJqc9Go2K_{oNvCo2q63Fmdl3UtESXW?Y8HfmxsbdaTJb9WT<6aR8( zcSE;}-e1!&1ORr-He_(&xKcplc43~Wh6~&*7Zllq$ss`_so60K`=0OmWnZ1GB}3KT za+{w^S7>B2?#<)JOg|%<x(}lYc;TwW$>)nOIgMv@anommT59eO$tp?2hzi2j+hdr6 zJl@^9z3>Z0rw?FSxC%PY6b<cth}wE^uQf12O+h9k{H||obvaz&VJZCUZOUKw(po-z zr}eTl6F$A#r5nK%&NTY3CM$1|UlTG-4AnCl{{fnB@_;0WDz%LlcY(7wl>-1JdKvS3 za<-nIyW`ik&MkTini`#Rnq+S~r9hN69y0?YNU=eEtM0katHYV%y`V2LL1KH5vi+X_ zlx@g7tewnS<M(`pxih(}t~RT6VS-^pG+C+U3%yUj$ZzKLgKzOY6fPm4A@|^+{zD0u zg~@x%8kuRz(}mUyGRq%9Zw4?lCQeVcLN&2L7Gb+)0a6FE&p@^J{30wpQAmm80&j^| zlqo_GKANgB25AFDy?<`8^WKuIj>srKqnG4u^sX^d_Jzu6LCHXc)<WZ@^?BGe+M8%1 z?$yPnx3z=U5n1y=%R?}RE5ZleMCj)x$)Y&SoqeXOWb@eRg2K#3VFV#<lYl#+gx76h z=cGmoSV8&_ZTB(0WHrYudPoDspVx7jYv!A5*g|up!|ypL1ZQJ>vi%=0DAzO0da#>4 zCz5C}Fb888w1l7|psOx=S-husx>i#)hj90z)Z~g1g|udGhVyFTG>b8c;RY=5R~c7G zvxr~UK3<_C1sh5TO`d~g8O|c0ystK9wmf0UpX7FbWpw~ueq0L8T#{$HkYce!KnZCQ zewAi9<uUT3YsXRrb)R3>oc_4;fR&0t{_xlQV6d_%Rj}L0Uz`++k)1r9N)|x}31v4` z+h+$qK82FhB>SnU*+ludoCRoP9;UU4T24axO({oFTo=>K>lbi%Kq;#B>6FzjYP6Gr zle5&1ZREGpba$hq{i3Q3$CYPR=QVMlKjqW({5n?P%g?%9Q~7Nvk>394<$Qk{SwdS* zv<v&pk-Y52pWkf*9n)rlaWU%60Vd^bJkwWI!Y-b4Uv=)x?sQVLWGmJ^au`XwWTk*W zEWp}Hs^t;LhipdgY9Aw4*mQns{0-HZ)#5V4i{foV^6v(GA`%MIwF@b7<O0yIkc(Yi z6!gP_R<<F<c(r50H>)CD=dSxLu;xpAtloo43R}aH<<TvI!S`F7-g%HvX`N8b7R@L+ z=uLBV`o)><?~+C!-MfFVU(-vrYH4n#rt1MOaX6L_j%$lZdZ~{q3l7rczQ)^RuZB@* zbb;S6hJ}9LES(!fKsnsu$Lry<gUtMSmwa)v!>AUbeLp;2zoR9RDc<iL#BlZ}yW8Z> zzbyymsA>m_FXt$}%LL^-p?;V}-nAaww=W$hlxDQgD^mG-UNoJmxLLY~LWyXS|1F8m zAwDylrTN4&ot}8%tI0DL_)?`v%QR<1ysV`VdcfW}?N8eHVw{?X@V{9EFW=KX8NkuZ z>cIwhB9+v#NWOtT!kN&<hQB^sdQuCS2c99lQ!-Vbhq;}Cq?Vb{DM+Is)LR-lmzTv+ zUR!;F;$xibpL`4@659;1TBb)lDT=Ha`UK0R(zBX*2BkA!UB$Ppu%r7ZY>mxSwu|;Q z4V?x1%)z(Uo)?JFXz!WojNUHqfoTy<Q}9@&T*!tW{y3LLHbyH!TISG0mN|aM_RwyV z5T_&4NdYM|>fOAWncZoXSfbNCohAL8<qZbpyiLlbM4@7CZ}KO;?DxC4#NFJh0iCs0 zHJ~3$XB#5IeVO&$66G@SSPf%(>;fmFPkd90AAXwObm!a{24<y(NDD=6`%(h**lQdl zd~a1sC^b@<U%DtNR4zlKngVsuN{#ZSlw%pLdWAHvonhz`nl?@9Q#_3vc!4B;Uu0nr z)r7*uHF0GJfo?FI!$~(5C#iDC`XIL$(+(56LQ6IqbXWPLAIIeU_bJGxTZPRX)Oi-$ z^|l>jlHVG(&Nx0iwBm}qJBxTH^75P}G%+r3&Bv9z6*NA_NhsI5S+19zm6kQVRU<pv z`^`S7y7g&EIw!COo3q;uur}(fCalKwykUNNS`T6>eXLd%;W@%o>p1mAz8N=vRpV~> zPI9aatkm<Hbr$3e5#P3&byKuxJs7w?vbKi;>BxQUoFIci#Sh<6j~AaJ3*keh^On^H zg!kX=BR?n<<SMd$pET)IDFp!JPRVqio!~ZBCg6`)@8vIK&&xxDPFV!bArwC!tFfQd z0R?I3uQ>LlbyjXFkGr=i>oBS#3qswyk%+v&OYU+u{GeMPC;F!(m`HN#v-?6L{$pE5 zI8(7eZ(+LOTy0g1J-ZpoFhE59p6h~63{&_sECJuVzL`Mr`_`h%o2@F4*}OKzdOxX$ zPA)mgC?3lu!KT1aPu`P@G0wfzq`Y&M;e5X2x2s=O5Dll^E~pNN1`|z1eaWi<ctBoc zeB#>-l~XH};#V!iM|-G!62fh$(kmr5S7kxn`(9JVK_&E5;yus}BEdR~5TZ*}a0OaE zIQ7>>j|VPCz(Y8zVhmNx*~_%h`sr@2qnBC^CI|23966P<2vZ9$^%btGk4#lqINmOO zCkgdt@Od`n?iYv;7q~|0=iNJBaIaKdL*tg2qesrI{$BQIvm2IodQKCs_shV-;uzYg z>-^$0vIzF!q=o9_Wd8-3pqi0_E`(QG5jxgdmJ&?o?3b<?f0#pDSbIr$&m#wmH!Mq4 z))`(l>F4EpGbICCQVWh?63xAN9YJQnIE!YPF~TA^kgh1q8(P>7ha<_5=AUR1-+&2S zi5gW}DJwc{>u}yD{uCNUDj2iL8?zB@XN>sEwUw5g{g985>CVTV=c^1Al{H(;@Gvwr z*J;LJ>CE?I{&BjuZOm%wJCEE9n=}?wy{dAW@9gh|j57cyBM~1ri`E^?uH8U9Z+UM| z(K`PrarrD!8v!k<>V8{|+F7P#RQqT4<uMi8=@i6ubDL9D+xLwGtY#nu57zkXbDV`T zFv1m@f#M3Mzj|@|Vs1M)O1$Y?R%gd5*U}JoK}p?C>p>eSI$<8|j>~{^vLqj+UOlPz zUhNy5c7e8PhGjP9=j{CF$K^LPc;xEVFu%UnqJ2zE>Z)f2?v`K!WzX1#5TWN9Iae^O zgMz{D9{IoBZ$9vr<XZrJj98z>SU;(x&gatF<xiXI2Tups@&F6md$Fd0Knq}GSd!_S zf5op4lvpaaUeuh{G1?Af!Q<4Z+yR(BlDM%6E%U+cjA5&{IGow@B`FAUtNkzJs{RJN z0lgRZygTe?Ay$XrWYwF`6T3=poQ<=3F?dF5G2uCez5`1@Vzg9v{N$ez$ojF|-zpN$ zsvvY;A)jgT$T8<1i43O)gp)zvEcPPI^j!ogPoLnhg%!h?1{XaQ6T*;kHpw2wu<u0j zu#naZd}^1v<(>1!FLb~(mqLOfD-)i4Kd@9J###P8IZ`Xet8v*1zD*aKl5t>eFL=T; zZ6BK##%AKJuf~H(0fNU?#qxs`ez=$h&*=>sQ6zravM$@*|GYO2ryqL>1Km@6OCDG} z2@Ws5*wZ$>P5|jQsA@h)AQl;5zlW#)<!?DKt?c+E>}-s)O8}J;{gXgwpv_Q7w2mmt z!w*+TQIwHFkXuLyRRp2|9^{uwZ)i98uQ7r|?@i$6cjbZaUJo{{wWAzU_rYhXZ26Sa zRKgXsvlUs>uP;UB(#E5*8rhTSOjGGQlN;byW)Y9C#H`O(2Pbge{BH95Ze8}9wj!_P zO~TXvB7D^c?GEZz4eT<Ts?|A)2_g>iCVVPe*`s-#@lvak2e1<YsgX8s4b6$<4dme_ zLC4qU?@etR1tB70_L2CsS={cX)*Rw_ag=Em!5v2GIchX>d5XMo<)mZzY==wJn;?QQ z<>EQ@)mq>pkvt)U%T!!`cp8p_XSwN>K21<5=Gz*hs~q{s`OSv*;`G^W3T;sH+|+It z!eRNV8q!-7i_o+TBs3=ch1~Rdb|ol#QXifIaDvZJ)U7U@^jM#q-L+wW37V0mH7!|y z9omLy67yD=;}em%6vbsf39;dE=2sxDv45fxI{oTGvgSF#1;%kj*(=^SJt7IIjA&?t z6C`$^SnOn2=wG&oH?C@5dd-x1va*zkuFycCp-}b>HS_mITtw67Lx453S*JnVKs@1% ziFbJacRzyECNwR;P*R9_cg<L4lVq3$LC!6v3$E0Fg%{85d3Lwbjh^*}NO^_C$I<I? za(Su<{AJc~u`D?st^8u31(IDB*$oiwz3zW*-tV6>cyo=j+ah%ZjK_TuLie8xR*0R0 zldIaO>A)aHCk5Rz+YqZt!g0&!TUjuTLIy-@LXY)bzS^#`Wbtta>q>&DZHO2zd{dS; z)r00aCMV`4mTYE{Gg4QK$+^Owa5O~?xj*-VXKS9YQH?}Xz?|+gEMH=R5!A7STz&Gt zyBywxcW-CUGO)Jm1?8*rUA`+YKVTzuDqr%Rm?lnexWc@<B_8>^yfC3V`Nmq(@OK#~ zm(kv64xyQg%7s3&YZ%qP<s0bJ=7C@T58XSRYv+xrT1r`ax22H_Z1;?Xt?E8gGV-$_ zn!y|5EE%!uv>uMIzY=k;md244&~^{BMPD5@9uz<3gIn{IAlEksDbmuEJI8r%;nAtU z7sVk!3x(@V#M=}bWszl`1DJy95kjLd;c;>Uw4W`4WqtYB`5{yfg>twwuPPol%WP9S z@zS8zlZI|#&`y#9lxQFSy^z<f0<8IIL`HVb$E{oP^fxnk!LaBm54F^TqphU4wf3Cs zt^B=G!+*KHvTX%39p_@4e^EojKE)e}$d|$ack*(&gdmPe(w!_)i5zYs-m8P!zOlI0 zj(JS|N<!Cj@A7*T(!Xfw{%Y_<e>?@$KF@M<Z%xiuvdjkxljC-0T?o3<Q809z>eo*h z$%KRFjp1J0odV-sqi?)x&@eDC@^X_j)f}aeMdDzyd7A;&e>VHX7iobn=15Zh@(&Ut zN#XO9uyu`z#0s5Lxloo2-Qa-3MIzx<jqXB_KHm9Q`kq6BxAmtDl&J~G*6jI;fX9D( zi7wL2kDkK(%BfcwJ6ww1q@Cm~pnr!=GJ!omhs)>N0*t;-Z~>r>&qU#*#TXyvZ~0^` zPKTz6XC+`N;3ig7###8WJ@oK8?lPX7{7yCtC`Ar(n)D9$sd?aUd=rnh0k5hg;7$@r zuh5^ob9Bilx_r3-r@Hj>CY7GOaf;q~`$~&7f6c#RxV-`7DCg^0+EOk~i~uR@&7d7^ zg*4`_Z*^@KU>XkSZD}i&w9a^~RZw#J*rzr&W2&TF)Oq|YJ2-Q^X9oxNU3(7Kw6;}d zC|Mt#w0GWefbP8~<MgjSmQ*D1xAj%|f#OFDUxm<G>@#0``tKIrzQLEA)A^vLLAw$* zt@ur9|8}zKQx<+n?`b3A4)i7tsV6riVC4cYj^&D6gz}6b+#VnN%0f^A4sI0kERF}Z z&Iix;rG%e_`@Eow{P~Y!6FO+4wt4-#83S906NQPB2kpP!1<eG(^c#h@uTR*#o!dN9 zFOUF3!;~>WfaTCC`3xLK{~tY7WCrSw29Mu4_+H=(hv}hmUG3pjHLUZmZHy`pFC1ql zs`LZ}-J3)3KJo{IAMCCt_4sKKZ_<{>Gb2G<lB&k(&AXE}pD!<Mc(oLA#?!mN-wmTq z^=-88EDY?=Zf_{i(>6t6R|ieBi!h4$$0qe}pWG`r?-0-u%fw0#2FIYkUoy`kyvY+Z zZRa!zx+9)ZOzVkA0|b$fsgDCt&iV7oqm=#!W8?p*Qlx7dO-r>depoVRFOoBD5>Uh- zo#&^o{`w}iQoSzZMTrLyGbf82)qfS^!=2Og;ergyHU@SUyd_AR52AnJX=)ra6V9Xz zeR$;mUIs?Kk45|b9E@dJ$5S{Id;&ZQs6-<<)G|BI2+dqXeZ(G%&cpU)f&}^~O?#Ui zDxy%~6TD9N>5WJK(~`Tf*5WpjN~OuOt$`3Y$u%Mr^6f70;L8V-?>?A-ndj|Tt1MEy ze%@BGUumRakBU)4W8@c0`WQXsd^nc&B}k<UK{80tw^1nkit=Arj-x;YqYwZLgdRDu za<Vv8(D_`=3-FRUY32-A=XHq2#Eac|oLeySm7n3y#8#Ys7U5dDos=QyLAz`$(m0me z<4wMrpgUa5fHw=C#C5`iDBzRU=OANw7lVf7*diG~y95cK$hAlgfr$jE^X4VenuJcF zyx$jwH4(Fm%&ZAD(6{dpPqt!sMa<g_8!p>GP1}%X#Vm0(asw+$9O9JF*bU|pZu{Ax zRo$0`w6Vw+Au0%xGhmCuDZDm1nbLmN^%XvAlk}zZ!@!7cP`veDlUT1F3Naoq_<Q4j zo9)Z~`B5g=C@WW>Z6F^WH<$++t8Y45)78IlT)g09=`yoO^ZR9yR@vv4bMTx^g0l;} zQps7E-20i=*vqHsV3wN)zy6uYx60Q=c>9B_uRryxbjJ@7km9wI9#tOEv~>ZNRMCHd zNYKH?-{R2`i=X3XsJi<2L2NE-bnSE&PqxTh_u-=k@4d59H8)?M@;8Rj2X2y{?h~}I zpj1}SS@|@e|3p7mcHYtXIm?mrFzQxrIN^AyfqzU{zVdb!`A^ZwfQ+enu~^C$4c&V= z)9=p>BLG26HpXgc@aRnR#wE)QL^W0MSo7frr1`$wW7_*FUgzvax%YJ_vDvk3#sGCe zll+6J{7sPBTYUu+C(S)LtUlM@&(b!eA}AULs&U3P)l-MXn6l3w@=sE5@Qbn-7)=r? z<TvvG0b$UgY*-uMgonc0sAYO6)JuQ3rk<*o8_2!#Lxzu(BxlOX*=0}dG<m-z+4rIH z0_cMTeGvriw498577x=*r-lE$^xX$wRE<bHRF!&UJ&Zkv2Q6G8)DRBQZu%+$dwvx6 zW7R2EV+K1S1G^4px8AQ!crX;pP2cPbnGfn~>i$CYTTXrMWBG#%<<>@J)y*@@VilSQ z_)}z`A{zB)xsS{1UxYk;+-km(5&_Yx|9kRs9B7DAH}>~=u1Lvns@e0wo4YCK=fr1i zL#~^N=fp--e3|(kNI81n-uHRhqiKWVBGr+-(Zlg=eyg|nZi{M$BQD#qzgIPdzuve1 z^uSM6((V(L^-9fzNuO`->Osn*qaF`VM2=n+PvaV|7(OxBI<WpYvm}O^?A>8Vev?Ym z9^{c}aq&*;y&_V!tQDZEZvHaPTJyH)T{$&($kpTEGyb7JeV99aWa(Q|!LjiPNjhk6 z;UoC%nN($#OtkOA^yZ2&?CFllb^H8JN~>#&<8vu$@7891pq?FHM)rL-U`%5$vN|(5 z*|YD41;=H?lN&mcT3-KA3HaI{YOxA)9=&(-0^r}XNZu@CYByIVf}S}cX$&h#Z{_kD z4pWvpwZoa#ukkJ3qHlLR-Sg<%J(Zb{<;*Yb7pc1G-G-kDyy{8br11*Sv`;m3dhPsI z6LiLfIqq@od#xG=-N7s$dvX`WU(`GIrse7!qW!{2K&k>`WI@+koG#vI`B%0x#>REd zo4jclxM*0!69#xe&MT$jd>%xy3f88U?q$(to!3LkbbD;MRno+jCFGf#r-<O(gBd8< zDs#{>Y@$zyIPpVnJH~KfZ$df>*M4FypMlk1<pMKwPi#XLdmDr?%l+5h{vv4n>auso zr7M=SP2?w|Y^r}VUPQ0ZeNDBUQA9x1GO$JMSM^4vpqEl(&u8&@MUs_j{0(iUc@_Z; z01=vGO)nSuJ!<O}$33xNp1Ph#$KR%%tc&<I-dOJ{DMBF=KbnhxfyzPuq8C|vC>nQL zZrAmL1070O(+}e>l(4Kt5;s=Tz$hNG>(@2rsu$uYs9f)ocIQ&OiUV(VA%1){rLmqt z1?#NF)8OoO)At+^<F#7U*a)8~!hHDi%Y(T^i<;EatO59iVmT5<6C}dvej(9V+mMM; zQtzM;n7;XUD$brg-^aH@8M}P#N_`wEJn_<bZ&TBanU}ZE^CW3j8%bG6uuD4k#RRpT zM|qRC+zgL(%ca*Bv%~T$*$>4@S1@4eaTy1%Bx*s+%|2A6es>26k&o~vu^ttIiuTJQ ze9S>X=9?rg3@Ll?2cT>-#^e8|ZSl`SAgeR|!Ewb+?D~zGG39x;%g^tqJncF6Iwoc2 zUG>iB0u2)k=8cPVClB+_!+*M?Vb=g}%7cO=xQ~TwbCV;;b^n3Zw3B$^TzQofg)#NF z@3?`Gn}?a{yC2i*=#^@T76{Vu=z&84sqF#k+np5Z>)w~88Iw=y3c-Ya>lmv7m}$?6 z)WK08^i59kM9!FNsoPD@Dub+(n&@}Ig$#&XGm>HtBJkA3sOr+``5>=s&?doIRuTk= zIIT+3qp-0{jP$bYM_dBXf(*=R2|l2R__$4j@T4bQPJg8@qvEALzW^KcqD&)Bu<!Wb zQ+sg9>d)>8w}{eNgVRwAJZcEwcsC|cp0!yy8Dur3oY8TALF^!Viro6IphhsdCdJM` zSkqRgw0CC;61&C2=>#W#EQuA3+$6n~<wi#_#e+ek7|Vu*py^oz<N77OukmW>qo=kL zZp^eraYWp%4|f+#7nrYU7_;|SVG2!DG^mhr-Z{Frtaj_T9s*-em5S3xCK`)XIl`lI zBHY_Ff6l?N*)qbQS*!y6+gT9}Czm|OM6&-53fSdgsFU~C*(9yW{@{lXS(vLK5W}eS zVKxm{A~anxvT`9+1DFmwD65~CB_pT*fT0&04V$SbJy{j;I2qZxznsi8!$hhP9z3Qn z4vGhya5lrniFKmIFsz{xH?Fso-@&5agaFo1?4`Is*-BKxrMUfOAJZfzO#E4jCxbZx zXK0m+r5W391ij6;NV<g8VV@a$p_X5Hxj2s7!@yCUieI#n<dsGKf!aRa8cF3HXE)6v zcb*K`0L002o&j|z;HQLXx%i4AS%c?kRmj|V2IZgs9Ou<_u;?9ju`cr;wf90F)SS1h zQ7O=S@wlbRhf<=GVyQx&gxTz~8JXqGk+0IX;buvet6Bo{Fb98ruggOtsi();30Wj1 ze)_;H015ZbdCkwm_S|9V|BkP?`^&CHO&sR=U<tTQFxo^I6oMYzH?dd$wh%-Jhe&!a zB(*QhCus8BEj5^5)k~uAnGf=-f0C(|IpYfp`M%;a54($Bw?q6sj#0<-a9n;6ydbS< z3V6^6sKkfz<1?%Rj$v7SpQ$nT423-4oo1gH0-r~RLrYn@FCL_HJ-;iJ=_vivkn+hv z5hmd5GdI}$8B2f_?Ad32C=VTD4Pu_h5j<3RqD7tvpAt2~L#?tg@#%D7A6{R3yI=Zn z&u)`cd6lkL2<LT%6f(1WiO*^&IalBgnAn1BBr}=*`qBUR%%{45A1_bw-zAZUun%x~ z2jg6^a_CHmaQ~!`0%acv<$@U26^W0I@wxs}f6g<!%yo~smqprVR!^!B;dq}Pq*Cfb z$@s;UEnPiw!F9}|U<~SbqfY>xCmQ(r=OcM9_a%CP(IS{dUM31mxXgqWw_F31>CS_Z zurJsD7kItucDcwlBskPM>(txaVTy};TN)(uG)2~MIh-t?YcWza;nGc(SQ-pOvMRWm z&~Ft#sh)pNxZt~^TY^lGef8rBp{{|Egq%LdIeNVfnq^fUzrUR@b<L3X>cy_-z8R`r ze_q!(^%+PCm}|5??!r$@zMSZ?<{NgdA}ws)l#uCC<ZgZa>82KR4@K`@nm{|X%}*MB zJZ_blAge9N0$3V@{CMe%7)24<aTRR1AU*k0IOx|OfpG!n<6Mr>!>DXmrU{uKj52rw zD0UT%uvHhj{1uA>kv~@>Q&N%Jpo^%+qr=U#V%;`}cr57hYf6Z$U8&1dZ$$OOeW*ka zkY8p(3=IK00m~2De=O0{md}}WP!khi&b$98b}~X;qM6p$X^71HXr#J%h*?E)-+LW7 zXMB}p1KmUtud+CK^y^!(5Ax-Ib}ifkh9zYhMkrran!NLGdruYS)D(X|xaPaRKQD<P z1N+<eb6pRK{wQ4~u#!AXGx_<4cum55v|0@HrB7d0H!K_1%%Tn3Lz-g|&Qte)-$V=; z-e@y>J;79H4lBHUR!mmbskiSFUlCuici7alJrPOqN%IzHA<9<H6&=lPy7$ausuJxx zzOz}#Ji2f|M{*lUq00DVFB@FX1QTLN;e$6`ot>4Qp?9j=FYqjcQJrW1^mgjjT7T&$ z)=da8!;D&*0DS;;HtUybMqWuw#4tH>)-2ZEBa!DE1JH|TRLzr}=+|HF@UrkvUu5{R zd@9!kJ_I22=dxr_u3zWNwi|h<`?}uD-cqfuDTUgTUm^iSW(Jxy*GH|??$lYsALc>t z&>$<9x|Z9u@TVT#li;ObS%)zB3{~3@Mt>;}1nGyojPz9^)XW%E5hTSyV<n89H^El< z^%K~pMLUP6&;0LMfC#d47ez{rlzenLn6z;0?4;P`DX{#a@Dxe%crOWfqXZSlSLW5^ zYmbhsmKTQJ??53M1o9^NMgPsbV-v$ySHm<46jia|5+^?PDUwSVW2)UsjUZ6<67zt0 zknIaTovos%jbhTO{@^1p=?qTG;H-;&d^fo}7?b547m<vT@eKPY5TcHdA%ix_eyerg zEST?m$+u<mW_$)sTFP-BqxAtB2i(_HYykzyTp6LrA0v9D6;EYKc>Jrvo-^OwqzQ{v zeaJ?>a;Y`WxG(L|%nx?XK5r9!#~tfiwUTYr_J=(@nvmZ8@c@KFdyk@t-qWnJen`Fp zfyYxk>-Xs$LRQk!wlxgq5FzcBI1hy)Sujt<i`10Voc?6kV<TZ`Fxd-c5L$BDyyZSv zV`M#hsdlYCxc(Z@Q$NLRFIe-p%VkDd#AGtJsu8wCS9~j^^0+C$K?sWXuI>LUu<t?h zdeRzTR^w1+{(-x-ZMph_nx<LukjH*fz_G2eagbR8(&zG=)FbM5@B0J1p+j)uLg-$d zQ|sFq?H-Ep1_t`nZR^mwxQGlnNY<NBMmf_-@yZ3BIfj=K52bHjP-f|_^9kfib*wa( zzfXAKU=zsU`8%zxIyjEnels`~iJht;1@C)=zB@W2G+`}<lCKo5gic_R^L-0^BJv47 zrmE5_nk(Pg<7Q7Ab!YX6Xat1r0AM2W<7sZD%ie@S^w+9Rid3hId;h8?khMNcdn1>; z<`%{Ot1!RTeu${N>S-`KCvpxPL=76oJU<4#b2(>rixMKl`r@Sa5`3sWN`y8l#BC%w z^(sl3gFzQDrc$~;Ow|y6h7k!7Or}^~!Xx#69-p37b5IvGKj{cY8NK^UR&~~}jO5_# zGNN|+e!nHt6Kj6SkT|iv#w^+a^Sb!;>$M*-Ofp<5hsVgABEzrBKXGs#Uv@J(QHe*; zw>bpb>ura)CRyho`w`;Eag@0Bw#e7rx69tyOJB*V=wQ1~<H9R;Y1^URe$;sM7p)Fz znLxW98<$eC>L@V&VZXE{>;ixG{o*jZbaI`IA2P6@6rM7Evwikb<H6$93nT1x`=T+( zmAjx5a3bRHzhkzN@PRIbsmH^HVA|fY^D7ZdUXqaz`Gwl3V?)jD-(xpExxgC(#lW!3 z;|lc=kDt*@I0jOj|43R7#mmaW;CHXegvK?n1HVUH4tBJPG2+8lM_kk`&85L!EGJmg zln6=srWex{#0^=0DIhB&%~(e}&$#^UQ!uK3AFER#H$AlbF~7rOruutSpX_B@Z-QUP zw?mfz5BC00KS-;7oczW2A-#jnWXByayebb@xR0^{JfT%j&;<;PeF1i7{H`<4vW<V( zE$nh`Y*D~3ez;Z~Q&lSRfMcPqmAb*(x2?6dtxKo+Ud!qi-pRTTj|+D$*u|vOv5=nz zuBjm87GQrRKBmTDTZ#B@jdP*EbJ&bid|rnWz_48eM2Eyc_?P0#W_1_&+Aa24!I_=E z^RUKxHrKD7b!Bw)j6nek?N2+NJB{=ncmk#gbbH<YE+)23wDET7^w`XqU5Sf&s|RMF zsl-E7Z&|tULQ?-^S<X`A1TtQ7)c$-Nc=$81^NC)kJ1v`v1~^l7B=M0XcH0_8ryS42 z#ZQ_{<bSr}^rQ3Jy^e-qm2Zm&@V)&<>=T|;(8!fYvvz8kZ*6nh4Id`dM%GHFq93v) zU5rWU+KFCMV^+LA%aiJO(Wy2w^IwUlROk;IyEp(oI#XYOpESUiS-fZ282x=y{gwuu z-_pdVAQJtGEE>?-FA^vr8i|fgHEtI;J<IuQdGwwPtcP-A6V@66iLPe1P=%ApKRIMD z%l>yvE%R2WtEgx)PQ}&!;KQ5#jLjMR(Mb5cXW@}7>(xnw!gtORds`Fax=v3Crxsk{ z+kK%`MI`&we-uFZEp7U+kKJH<@A-RqG;8(#)17!h7x6DPwbhBeW|HYGzd_h~V~u%# zX3=Nr?*SMQb+lsq;=`oc@jiS^hzT?L!3&Q$f)RjU1O8WFMDw@hD4rM2_v%+BN;&5b zFDENoO$j*-fbs9U;EyYm{QT!}r8Y}w{Q7fb7ex^)erV^xJnXI5?v8OAz#)DQyG{oW zts<>1yQ|#9PDA2tG!@rI$!(cJUTNJ0UmPvW@j-W#7}E6|J&VhaWr9|7W3T;{@#xhE zd-v10t`@Ij(A842I?nM_QQ&BKP6_%|?v67N1E-81{rERIM&Wqfs*gxGR;Jenr(55B zu$kW{?2;b7uQk}427e7eN%;G(PUtXQ)SpOJr?TwQDIfbdq<ChjvU2*XDx;IHM^lvx z)4c=Aa0t2n^Z%*ty}z1Xx;M}?NGJ*ck){EuN^c5E6%kMoumCE(BfUs3NrZzS2qFiO zjtvx~N$;UI1w?x9pp?)F5XhaJcirz=_fNR2{E)>8`OM6oy=Twf&-36llSuLYMv?rj z3t}D3b{=T@gBE5a1oilj#X;-qY;-4wYxWsg;wp4y{g%UqW;hC5+LyJD;_vc5TR!3a zR*h)cNK|$|XzjZq_?I8{Ef!S><>S@LQcwWEfV1}5aX;;z>}tZtmsLB}$h}67S9}kf z<I&7GWPTe9a*gfv@$<M`8IB9H{v5po$=xqC=~LXZ7c>@4qcaqstsE74rc<LkYkS4` zBk1fdono*;nFq|7cSpluXo~Cfk^;Uv<4Df-mk*Lvcsi((e0M!BTmRd`BCj?R`}|^E zo@em#Yrb-EUtD`LlL|d0Fv1&TS!A!Pyzq7<BgY*MMISK%JA3=bd~s5jn~aBdqgj`a ztcRhvS9aWqu6d0?C^T=qJZGB%KJS1Zi$b5L6)66Nx`%NeH+=DjO`i{HIyYl9#14|d z^%0MktlI6dbV_Z_HNM`%zvxjAsLQq>Q7i=BeN|%81T#FcFLL2xJ6zWTHX%JCt@_HI zX>}#2UizL0+anQ>?j$;0Hoi-kWn%`Ak!|{O06&xN_ssr_)B5MJTmVUgGyUF0wXff~ z_{zOP30CwCK7E^7A`8z0yhn7dAs?Zn9S+QPytm5HOeYm5jTW$%*}}CKRX1@6yMy@g zIFrlorp7!}k#AZvYtm=Fm%u&b&@WV+B=_dePoL8J_+K(59q{bfHvZ!R%B4_HC1|Eo zFp+cqudn*pY%T9u1h^@Vu3blP{Va>pvKZTlSU&u)fQN>M6^Ph&yW;dC)d&W(N!FjL zp7ee;+Eeq@8gniU<CfK-q68&&4H|ZYV1@iJvk`b!o8RUaFExyObcfYf+{0@f^#26q zjyON}YOVFDbhYa+!Ak|eq#Qn7(p7toYIeyb;%1Z?+xHToL#z<>SFDinD24&<yTl&f z^u)mBLlZt-3!i}7*q&=IPB|Q6QmSblnK<N+X_<z~>bJKl`@nJi@1D&e{@UHYI2?y> zrqecCXA^d}w}mg<KF_c%8~oy7QOuy*?Jr(YtnTMoAEZJQ%#=i|USD-A{cDqF*wWnm z(8<!Wt$$}n%)a(R(j;>7SpmwJ;#PXfq@t4VX=nKyg7*))A1w@NUl<jgdS%?yV<V5u z`41pB;t>6m%knM`0#rl-On%A!j&FFi3>u%svcI3_JJbrMaO--hM;Y;6^CwX8;bxN( zc$ca$X(w{1b}BAHX=8Xj&Cj{KLTJiWK6~rn+?$S5h8NjJ*9@y;OBCJc*ca{G$sKJs zOz%tqTwy}M1Iv$p^)L~DvPqZ#cNUJ(V#vFc38n{_2r1o65f8#G3T&y3O<DHxd2&Q+ zG^#yh|Hsb1&qYVEtKm!U<!^{FnN$_oBvFEAn3ef5#h5IlUiIFkb>F3bD8l;Z8OtA? zs>cNbKf7s-Mcx0B-uE&=0*?Q}D^wFIE(!YsJ1u*-#K=P<;*B6>X87r`aeZEht{F62 z0a~rSTRGB!GhRL~%-mVjtWpEpmVI#cBR~7sd`xxGWno0XEl_BcWRMJ;Zp;%5jO8d! zHyk0dEyq&Db!dk~Lak(QQAU{q$(>8Z+Jf?al@H}c#hb2hsU#m#?v#yLm);dYLk0Pm zrLBC<;#3{ac&Dln^DmrN7vP8bq48@9__`aRBp*Iwqxg`Zecdrx)bkW}lleA_#SE)d z!lY?baOvN?DmhtVjnXVa!&)97D4k!{u=OSSnP+|0#;tsoCl-7hbg*)@t6I9hR*>DG zV^6cQRdaPEt;r6<x}9`(QChl<t|n-Qx$GmX-=1qp>7GO)cu8NrJYh0iWbNqa7|vg` zyXMAp6;kNpo?2gI<96{VQSwq_9sp8rrNQg_nT0K?0KNtQ#9ku_#29tEkJ8T#Xv<HF z{vxeD&tDeaTbp#ve5G=JJe4C|uJJfl<$Lh6?`}pVk5VD;yzC<SeWr%ExlB@VmK@;J zX(?kms)gzPS67fl?gR9Z-4WL**}M^F9b2!*0>8O6EAL+s!U6kL`Cv~iINtDUJNF+I zz~WgSsx1Xl2xv5OrkbG5ecuToFCdY>3=ibtbk18!f<kwkqkp4#u+QwXRfi#HeUF=p zak9lq`fepkJynTs02K6=D!Ss?99}f(uQ04o5H`C-(BQ+DD+gv0@9i=}T{j{<i{3qY z2L(xl75@W`F)8)Op7rj#P#ecTN5cQnlJ%cJp11e;l=j`YfymjVeVOp2u*vFy?Z$MS z>3Ux2uWWdRlyt641-7TVPTM>8*M|8o*TT+eyRyuoF`-{^mMwH96-5Fz703vjRw{1n zUCn%<qJ0+Spdm`@^!xixv+GTA-R9=4wJ-jtbto6IK^%O!-s8>#_81NjeqDRm)}Mv} zU6gZ@Fy0afLI<H<Ak!WckAKl&qR?a|bFD`?SnXTO`%bvJD(wo}vISopAu@YUvEoA- zs9j%RRot*U%6awddK{TCR>^&B@`hZp_)LjvSGh<hT=M)?v5hZ(HKtv(PVc5SNhu7< z-ZZH?W(Mi}4H={74ZF$Ap<b!gb@LY8%|4aK8oXO_>J~P?QCjJc_OT;KRK@8er9v(i zs1)}%;eBE&$YeGL!}*vhvKc_rEau#3c>*m;-l)WT|H}=`ur_;8o#5dDbV~kjb;*G1 zT<4nYQ`4!#9DsZ6Q4NH!Muts)>}18W$DSJxk=N<Dm(%YNDEJSk(rs8Me-vNdU+fd2 zUr0`T`j(H1Z+Zim5E?pEttjZ4pf?)-;sPsfGGF_eYCzCDzWluM#Xm0x`I)}idw#h6 z54J!p>}eQ#)h<Mdv0TF60_5CU=|MW*_nYVO$AP|<#Qc^9-=>{&YggKu9zxk&^QZqF zd)v^n;U6*C?`%;_od<c*C?gC9k`Ex06ww^(3eW_R(0gdygSyiak?AM|;CcF!Z{0L1 zQT4YFPhj`ZUlxP`HtH;KgIgX$8r-dIZT?$h<@aaVa)EA66Je(0*?SbG{o8B)&gJn( zqs`p%Z;NV@ZhpLE&R`=7(f?t0tA!3SI*%_>px)X6CL>FU`L|r-Km>|lR2QJG=cFa| zYQxkG+np^sYKC#IGT$#=`BT%I%S=>&5=HYTO>Y(t48Gm7mlrzTSM*;kB+^-HQ6JiV z;9zgJWw+z6m@Ez#P4Nd_AI*J-yPYl9iuR2g64L2xcHB(&#h<42zjiN^yw&`c8c@ps zGnMq;d@R=8^Vdl{3dqr@B{VFhPsWA@`WiEqs~VMnifTX=?=g&qOPKjJ@Vqkjwe^?0 zNpBRDd;f$;ju;>wrb^lIZS)m2!L!i;h9RrlJ~s3QCV_=94DyNpgVp<x*8$kwCW_6s zSRj=XXvZ|^A~ffuc)fk`ntY(3M!18i2*HZK@pzY<N>D8IgO1n2-v1Q1Ylim?{>9K& zRW~p)H~-S7-n@9E_4vgl;(<#47U9ZdMbY@BBIk8v@B;qlzIC)E5j4fH&k~6~$wdnC zQP~;8WAf>Y$6BmWo$yjkZl*z51*|n^x#62Kd<c9Ui{{I`0hBx%AF<%yt1@cGR}-dA zgw_2mWQ|4#!F4E*GV{km%MWM_wQ|(Wm}Vz{zWezv52#F<>BYYApWS+CsAlC?8;!e1 ziy|mx8D7n-d4R0lFKLHxMGzRYPG5-A9>%EK_;bav^4(pVJ*U0US>fq+3gmcJ;-+fV zwFVZ;ySe)}T}ldnevnfqN=7(osOg|^hb($q5cfZOw*@}#T{b`DOXv7P&%uc12p0)8 z-|X~I^0LS{3rfgZ)xq_-`-TIP1z+Z&8NO9PPBh{lC**~{X%JF$I?^yCV2>w>C5bT@ zmM>(78;Eh;h}C#ykzJwng3li7tt_B^uu)mQPM^dVyoDnrMwct8VIWhqUVsoQIbjlG zQz9hHLK^hNCXGMk2{GoLlWTN4%Ba^Fb!VvlFeAZK;~h9qZ$SS5v+>xraL{3PbYgcB zdS_6=OBkr85zaziubxWu@sVX{7Ew(;W(6W&;YA6`9>;^h^IMggxg*Vc7j{)5Kp{kg z73fGTCJI0baAclvS>4P)wcBS%WxiO>vrBejQBD_Gh3pJy&6NUB<_CYh-sC$}DnQH6 zuO(D7?V{H%#33cdgL<W(f73#IOaHL;@tt=&yazK(#i8x)5AVcvL?Y6$i#YuSEk!<F zE@6v3`WkO1HV9xZr*zx&X=hzA9&r4}%hm76#riE=A=|koYQY4$*7t&6mr#FD<>z$u zyX9E56O>3<Eck9}(gespUu66it0zM>3Vwdicff9`eH>}bTR1f#X$G`9RQP&d!H2Ir z|KZtOaN3`cs;MB|u+bOS6de0y10y><{NPAhQTC5Q>!e`j!UDdlJP(Q+chF;Fpm{q! zu2J;Jq2x(kcU;>cAnEs^{DY_$_pstSvA(G|3i0;B?MF{~G_Kf8?e7ws@wL^oDI7xR z2z?AGo9M@BPHz02Z1QVs3zQj{e*K+qL2k^_`O}p6^9Y#jM#(1zW-kE*x}ZM<95#}^ zr)j@ql{P2+4wfw=Z1^h@aO?Z@ejRYPYp!P$auPb938krnDkx}d#v1|bA*2z=09i=_ z{SK5{BH;fK%mMFbME_^E&Wt^FgIf{#n^&C=*Bc4)8U|AN)VB9|>u%>AqvBt5ni$ef z<;wM=0svM#sf8sto|jL&5)eG5hiIOMR?0QTw`H91QzH6!Z&Pj-qsg6c?yu(nqM--< zwEW5M1C#tYwu@KBG#PM;oIr19nJPixP&^8~$~Bv!N$Th^k9-z!@{3(HmUwjNTU8#| zJd5D4CjG+`z=Ij9b&ye7tnhSjzZsZ~4*9!k&}JP857@L~6?UIFgm?KB)|u9nEAggl zwnJ(*R<G;m>Y&QTD&@_t1?X2gzK>9{c#meR5KFt%3{bk+eH{Wae{^ci3Yxn9lc@o~ z$H{DHc;OwM1i8lg>Sx?7x5fKB$VEgy`N<RVZ>wWvm<No9^tPbYC{@LEGw2<_IIfa> zZjQClDLuL~v$vHs_l&L=yKq2b`3YU;v35eJNREW?3Nfj<>)2%rdyu~#)7O?BkKKq} zYfaZW>(crt|502!U7TqFVIk#C=f^3>%l2E9V)r}lel(FNjrIY8cNeGGB0hJ-79rJ= zfoMtZjpBh;^R#;OAJW~sy3@Yct?G?NS!DB=@+S}2)IqxM^oz;;fh?ND%8Cy+=b@ZN zJ6F)8uAu@t<0-XB9L|V0f>`D5_0(ymY;&&y4TXdP$rznOTL@@H^%V(=gA3nTQI=c$ zHK3li&)s}g@83J0J06Ne>Rfr?cIEGeObQU-bK_%P`3>3iqXDLuPC%X<Els`*TJ;hC zF;joizdyVDz761~HMR&xb&EXHp;N~_=XxYT33UHFa;}MOLJ)>MI5c>=!tI@k)Ai5P z&!64v4EM4;r{^go$&{)TqP=it4r8{SF6JOhIX>q&e@6Iq_t~QKeq-^H0f!$p#he22 z^3k4^{a2!|01-5Es^kg~qJl&aKqWOJ;5fN&GqbA5cL;VerZoxNODSh?3Jj7ZdZw-Z zc!D&-L((incoqCwuY&Kg3-=yhO%k7dwZimo9`Q>%+?110DitGql{FD*rn2|x{*9`{ zx}ep<M!Go97hFk^gcjpFhOsX+-MfW5KhJ82R7R>xm^)obNqYq4F@x$gUAs-ijlP$^ z2(;BM2l9k)S>``%q3jQ_TS<QaH6#L05Gio8o>DAn<mMYaj|Vsc(pm;dB8Vbi=M>0! z_Uo_p>j>vL1j6)J{ZWS`!QCWj{u@!M3vMi+{Xy#VnR%#lY{$n~vFYBqz<=K+rZIT= z9TGmO=tb<ruu28eNbDQXmolG!1w<Q)M|9}FKFoQX`|nuz`wSF>|6eKv@Z=QBl{srJ z;f)Lm$<12!Lp&=Txf;lmkV3Kh%6^`d^b5SyBzuZv;MO)pR#kn8CH<v~%2!oGj60Sz zjj-kMF@X$}+?^5JJ@xH8+JBn7i#*%&&V3?CyB!`}#C=v0*SxjW7k9%#?AL*7y|Bj1 z4tSyo{XaCbY*M2S{;{&`64h@XF#ah7a+E&E?wU{u01EQL&>+dKt9>bHQpukCi`;3X zH|-X3thE83A{)HRNZY$f?YgHbod}$)=wVeu{+QP@0k+b$zlU#aA2qN|5ZRdHkS9CE z>~RwR?*16Pkcj;L5B++c&|RBO$I)k<@CnuQ`%0V}3v(|%|2~1lDL@1Lc^_P~_E#3) z_;MHtA>7L~w3kUbbN{OiXbW=zer5%=fFE%l&GAaEQNbTt^)4l;H5S`e?J-kNo+8aq z7I>_O8dK|i064mCb%CE0%7kT7Ik>|^NX)n<;#?tq<UN(|urJp*MUJl@kn+;h!YE+Z z>hAI+*9gP5aQhr?vF%@3_0*q`?FnD!^m6_jzT5(?&m^EFg5ra4tnEF!ka0&Kp8Mk2 z?OmVTg&xsqmt<*14_I8_Q)}y`nZcuU_DA_!HGRA4MZ`A&w|i8-1ZVtSqpT9AnwxA+ z1GSu&6JcYuUdWJn<9b?fwE51&XVkxpr40B7{ay7=DPE-+`#Ee_9b6Zzw~jqS3?6zK zbZk`jJz?o*dHp}KxTMp%a}zf?AjBXyU-Y6eW$0KyNA>yU+L3p@#(tSyXwy~siGpG= zx63T4(2VLJ<Pfod=4fk#ocuK9>uFy!_KY!X<F5H}%W3PrWA{Xz%}L_BJ`Q-#x$zhE zhowAgCQhY%H3hF0zg|^UEVivste+QZI^BJ3%Bc$eqGh{Rnb4EE*M?s^vP_xB73X=W zpP}v6fmL)Liy*<-rBiypVSe5w*wWG?z|k)JYTRj8Sufhr#&MM;kM}=oD~<--tLc`; zo~CF(VEnLI8=NTC9;czUy}vv4e&WhT+|<#Tki}!-tF`77VAG-6?K5@jY1sgnw2>t5 zI!lz8Xq+;udZj3O%bSl^oA&IY-G-o~auf(5;l8QYUdEqKl#qW+s~TSID=06no));b zK4ko@vc>(~DW+mE9b=7Yex757yRt$eeA6E6v06n({gvGfYLhmOT~bdXaGe}*&{n)0 z#~{y#o0LF54-X8Kcyvoc9@7x?MzXllJkjJ4J>=49lOYAKpD`-{I}qPx+dw!VH(Gi5 z__zjGS>12eWcVI-qDuG9M@1Vk-;PT_HK#G^v~GP36Us?7BB-KYW4-!UYtt8YeNV{S z)HLhT<lZW@`Fu6|QlJe40#4uYiuxGtJ1Z5N7I0r4p`xTqd`Y5w#$R@PY+{Zl9y8i! z3vZIr)BJ*ZbkB{KGYF@T#sXoT7*;)1ygk!;i-wgxbj472PUTd2tr5X7`dw&Z!&(S- zt2}YzFd^{m(+_R20&c;fo92<VYR4J3ZSVZY?a^CB3p@aYcfOzr>2)ssO=;S9Pk$}_ zxXo83;V+AJmmUAnOkV**LzXW7n_ICjwP1aZ@de6V%1|O9tLrn1P<ED66hl;T{Da>y z;lF>25^7Lk=g`cbPRC4f*cT9NzKMtS(z7z7QDdT+j{*3)E%vyRXC^je@krX)570?K zx)33WT^J@zCFfo7Y@z@A^Q_}5A+Dci!5bk~)_3XY%|H4FRYBbjSjQkE06;z+E1)<1 z)q2@Xzh2&WKSkD9iW&DgS>C4Ceq^3^BAUON3H%w84m6*hHcjj{t-L{6c#fq+s`&~@ z+f80N9Z>iQw0>kdvyM!wD(AJ|9*ariJK&HfKU<xzq|m};7ukJFmh60W1X<`@Gzf?G zbX3F|V*t%8V2s>_d~z-rc7B_@eM5pN=p?V26yIak7+5zeph@!}o^`l9P`c)+J%Cnw zAEztv`qfi*iuA0-6UsBB@M!4umE1IxpC64gW`SIK<VUQYl(4B-YeN8-Ntd51E8fL= zvO20ols9K(d$JC|!glHcS7szS`zf($MmXWlmir$}#4G~>vZ@NL+s2!BN?dRsC<;)z z!Cuuml?b(SQYJ5;bmmG*01;`=6tp3Ka;8+16+zL!6|FxfO0MY%y(;AXT2~X-P!K|v zon-xYgu=0$!WA#q=#}*n7kWVPe2TsP8J%-Z{nHZ+Y4(-i!9D$RC7Iumkj!6SdThUQ zetMIV=lHqLbITEsJ1?MdaeS~%P?)JoYN|herT3a<NSAiL?_@O^VUeh*@W{4Tijmyg zL&2*h*&{{2{p4l%v5)$V8hYRl`rD^%Zi`a~q^|{JJ6ZYCa$#>pyvHApJmjHip<{iR za2+xoF8x?+Q8+$@yM4)Xz_6>5(Cbb`o%L!V-cd%Batvs(+j=LbvE-2`n@YGK%y9vq zrpqKZMa&La>DfGxCw}P>*yjn|rIKAzYXLWQVp~~AH#{)2llS>onTy`)pYn_(F9hvE zAnY%x|04iW5fn%_J`MU4Oa(@`k7fnkwtbfb9&~7y8oGEH@G++Vj$<;UA|q2de+#EO zyLm&EQncnZM+arbtN5!$i6&En_;d4<Ve>!I?|@cEYIT5~rOrHKc@he7&$f4pF3xzr z+C8}AV?CSZh43wiTX}ZW!MKK}HM}LLZqW0hl$;VEf0ZI}{%`Ozg0NqPoMJ{Rq;96; zvpL=`k$@mFJ;YX9^0txbWLzs$x|d&s`h<F4#(dJdFP!U{IgEc_BPAyNG7AU#{&=5C zL_y9CJh26`J$wnegWS8x4VOFNGZ~r+ZxL$S4-?)X<$fLj@S{BD+Z>$dAb7u@_qh*W z=Il!e1MtiYGWOoZq36K`nmQP2_g~g@c_$ap!k#5Kugkh!o2Sj#Qp=kp{6wx?FUVI> zX@m*FHFK3gFl6m`b;?ZStdnszizg6>iI@fKY5|DV1A`1BHF8Xo7!&!Iy~ON`kP~YS zn7Sa$Gk^L1=Ww@!BJ;L^YNiGlwqQ5{4V_*s4a}O@xPrFeo7efMlo_N-ibsM%`SlcT zl|Ai`7nmTa1|pwF9(uw@9_9=>^v|yb6Q~V~-uWk=<kTyPN6Y3lx&pjb1-N+8D*gPq z6zuAdqSpB6=V%(8?^?XN)8nN_!L96BB!)pP1Q2UW?L&EY!a?wW5dHy4Caqqs60;~D zL~bl^#N<lX8*XmR&nDlvU2b$wA}=y&L|(YcsJ#lmU(Oll*`!`xdeEdrnH7UftCDlw zO2n>(xkunk6B<muzH~d0uMcOCe@lz}l~rXrEon8q5bm;`^}eEa#c2K1nO4iiG^0d> z`-38$e>!7<V(KtI<YiY>_`v12pbWhJRN(gKKAo=*8~gj8d4t2$$I&qW7q|?1X2jCV zW*ErbkYFHydQ=yC((;&0=sB)a3%Pp1A(o(-72$SRA5z*w8e{zQD*YTOO2KA}07^EW zwr{Sie_y!^?O%YBe(#pH!!aJPT}@UaqH_QD8?k`Ze5OFHSUT}%)?=B<$$Z1kQ?4Ad zDc)&Rm@ZkD>o)(x1$LgJe*c=K7g)~Rl&jy{(KAHJsn+T`ianqYd?%sem8K6TCUS6t z7L_i1nF34>eY>IGWJrS(1|_2|c`GXpZFG>-?MSO4sWcr|-i$j&Px2OVN?cE<k;I~G z8;B?#FoCAg98WEUpR^+H`sVU!bgCD*kr+%*JpN^VUB>t!k12O3niR#cE!S9Vv~C>T z3PBfc(r5Mn_}AA>k&$yCZWJ9s+4GfqEhm8IHy3tVu<r&~tHkSGNEme<bW9Lhq6e3N z7tjRQU`^gBhn$#uT$W|}4M!nl)j3u2y7_%~3siez4$0j7=oES0Ed=J$)Vuv0R6^DF z=_|;8R|f*qBrId7;GSs#reQR`Fqcv0y8m>|P0EnfL?}PZV~?Jr_2Gq#jN7iRA71wu zj9#G$-?5=y-8%rmD?`7^8kBcVxs#8kP6Q^8@sx<Ja>Mr9$dVOGEyd%k`C%GQtFS6o z@Lgi)EW$m|pS9Ae<>7^%s=#Ob)Hd4nPB>6}zw*Szq_UXhU+=_6yC8FgD1fF_(6uz6 zBK2*^X_u-#9q7bk1k0>>^jZnWo5NV=;YDY@T@Zq%9I{iGN7VoMRwhJMP4LA|CvKc% z9Dn)HWe$Y5{)glhLt7YrC`~xs-n-;c?ne^_ZaOuvdq$i!0lsWNS?OcFmN5p!qFJpR z-(xQn-{F1c&cW^KiSV?>g8L>8Ka?TClCO20&h|e%rH0wqPYbAp(JqlBDaYHS@5Ga* z<iU(!v-p$%rMQm7&8GSdX>$BN)<#s})F4a#`x<kA4+DgR)N0S3GFKIdo<9Nf0(CIG z{#+M$pV+$Jp|GzJr+t<`n%EXP{m5PD47yet=`3R4BKH^m0)2`B{Vsawer1}Ih$)xF z#@SBxJK2Q+A=$&{Ki3(l9GHLQ98srH-QuAz*MkFjF0gK0bVHm%iYl~r4gXdJS<e^R z%;ljlhETAnH%cc9iEd?S($NHK$#<XAAu!{pL%Z)@{?I%pO-g||@f>6S)X<Oqo|?dy zW(BH#u?Y7%mxoom2(h2i1FXv`_|kN>>;mzt<g_W72l)!+ixgjFj<;k=chi%<beYB< zEmlI73Z{%6rI(zcLwR}|q)XKX&_SP!+f`pq?6M<(d@`nGbev2!;fq^VF0oez^||%< zH%YTXp~A54-`;*v3?4kS^~Zk}UWtW}hfX+Dw-vE?%34OqrMhip3M)Y4#DA+fRktyy zOy1%-xvX+fS#E*i@Gg!@dZCR7&`|s~tG-?X3hkiad#dI3`6xxZZ}UwWRaG{)6rU60 z;|B55T-`?zkTM2@M?81Eu}MUd579Vd!c|J1dwtSfft_6@P`n}uNMzis9%vPemAn6+ z5)iVosx|q)oG@{*bAcr*D@%kSD)xu2uC5>lchI~-0&TL!Y6IZZ1dxF)sO0Dfb_~#( z%*mm8b4DsBoIz`fX8%j~w{|>q^iDNAq-S3F0}2FFrmbx!TjwU-#TWT|rvTj@2|sfY z?Y=}adWDI0Nx^pwGr7CBbhmY=DvG#I@60{#!Uu`JzLa%42*_6Zt)1NHPrf@tbK{5T zbXOI!w5k<I{r8CWI(OU4UXp4ZRXlq(rMP&zI1&*xwupU%B1{Y1<9nV=K1@Ex(8nZ1 zCgrpLjYopCROMudePgq}4%c$<IOu0$%_;Mv1<6=8&PR6^HnXu_blAiHGVG%#zlF8T zG1GjihbQ^PM#P!ix@CVY-w>?1Vh7v@P=7;y1pQ3`)U6UFDcttZx@hg+O&~mY*my>` z0I~!SnwB3PidldRucoj<O7*IA3-iammCdURY5^}WWlGG?Qq|6wL6tpVfZfA$wBsMN z`g;lJEJpd(2Efb@`-(|ONtMv0^ifqA`&0ksc&F9|@R<9pU{nG(&vu&!Lb_iO%uj`_ zv7v5a+<W1NAv;GC)cfJS;RE;Cd*fO7<KuA(V+|$9sJeb6?xKo=Yn2&vyVT@0&V^Ms zrpL5y&Z%glPE5z&qJ%0s^Xm(-{nLtep@x^G<*#>XDWc6!jn7{?9kNFGx;#}LqV12W zOlNXmo9ftAQ5hPgo6MLe<hS?-Z8GT1-7yQw(n5t_h<NQ4^P=M%5Mym!nyQMDtnp?t zT2}!*LfWye&@oBHJ>M@a$<N;+&*gp1;uMi~s_d4(v2ogDiMyjzoWo@4L&vdMC;Sh6 zMO?MTDdG$IjN<_wVOXyoM2>UOy&bpLws)+5(xE1$L5LQ{1S7PVRKxjS?9B|%1S@zh zOP{-1!5&K-;mipFa+-AyTlzF<eGT7Kl-5L!iKbK(ziCcO_~bHQ=k(i8D(fY{;WI;H zs~H8+y;c*T-}77m&PcMDDXtF)SAv)!EF5ZJO3Py!KpGE+LIq8ApD!K;W$Qqm$Ar3x zDC*lIA91S?S1#EH@$b@;n|J1$2kR9n%9k(GHA#VvPOn4RFNd<Slcz4nzIngY%k(v6 zjMYWVHAIZmMT|7AnQMZUlgtaCfEdOuY#|7nDS6!%gF>vcO((zojJ^OHZC7KAP)m(g zl@hy-Q~7Xm@s<9r;(&GWz$|n5iT=eQ@NyseH0Ee*<}Vd^ZOm?$XBI;n#q(QEU0He6 zM31n3hun6tV!YwA<<^vF@15u8Ikmao&oA7wV*-2x580EZ8<3z=nSd9QVW?EG3jL{} z*6o-p=>`2PUNw0_aU;ffjw{4KaJnmtHEPU=>!+<b!sF)zp7SlkQh00yM@>Als&lfd zmue-OUJuW{Nfj}?JD?KNcPWx^^zp<$<<5!Lyp?rWQNeuCa!N94wf)W{U(dA-f~9p> zf`1byK$BaC@zYZ9EV%Cm<8_Y{P|@FQH^f(e_?I)<31RejPCWiS&D6c{3$2_BD`Q+V zq?zoS`dUi!62O16md!l8f8J7Y%!PfVrC74yvaEu=H7;u^biQr)u^nSTV-?le!@x8O zf3G^yZA_~gAS*mr;7EVQ<(AeXK4z8)CY4a>GRBy5WMmFR={92P&b8oj#wxu`<;nfq z2+tgty$}qWLq9CTaU>qRyN5eM_z1#Oh2bBOlo=M>YvS^$eY#;8h1RzXtIgK`YE0K{ z6#fl{sph~|#)aL*4jq|3-Q2Iy$gC96cbz)fjeQ?VDWoH`P5mlGE`Fu|7LcK4Wib8e z2r;Sm*FS@>f5U!K#!v3Bdj!+2i%|b?gg^7KEg0s7pj=|Xd9mOZSxb?+T>Sl*cke|q zm8J9o2^=#;vP*O)4+J5xO`f*5vOkEp?@BjL_}?Vv;Pwd3kp!L`*eJXxQp<s_w^&5V zDbON+T2&X;yRkilaZvW6@H;Xoz3NMmZmiJYC35Cp(<IH_%c{}i6{zB=_*+_nTx2+z zGl1l{RV^o><TAb}7dnGyT0Z1+9}o{U;^7Z6WsA6rP|tyV9<Mw0s+(3dgY|OolpsHJ zm)I7HquamIE9oJw8PPa%M%NZ{@{b>AhfWCVcdm^Qy=W;OthiR+IsY}NF>NXGgrpic zA>3OD=Jnc`O-fVYBp4Qtq+Dgewd&!e8^6f9a60GGJ1}Vof(<Y#!*OncNhx%{vwx=n zn~C5psNYsVe-XPhEK@NeGn|Z?H>8P13z?@xqYYE5hu=2bd``i!;cD2W<`t{NLtjuV zTTwl?5bF#~tteSmJjv*Ophf>4A^ZD8odgT{#VtsumhIbo1LzvwKL<Px6VeSf-KR&R z@Wc_BM`syMnhYSLZPIqyh-AHfOrdSzn#me|2Q0Xn+U^WNOSxLP&}xH60*cZ@oDQLn zMr)=$?V4_nBm^6%1@g+GBd~%loU0R<i(|<R*kOc)c|~U~y-9GiRKAEs*Yr$Ru6XF5 zNVQ2>u!PE{m|W#T&kY_GsNb>XlRRbj!C=^R>cE<Fa9~w52psRlLlx_p#m|%5Zb1T0 zWRTWjk5xy2U(Dy=#6$fJp!;-TA$MgoEB52oMT)wRluZ$cy#OqsXq>}xB`FH5k^!&| znWCy5$Xg>~5xwz;M|3QEY-oy77qr162}MQCwW7v)<TQsd#8PB()5|?IGrkR8=&f9O zo$t1V&I>XP*l`4}T#OS_vjBBy#<Z-g_;Kp!=H0H1!r7KIT{&wEH+U{WFB%iX(>5d3 zY{jU1@Aun=I9B{oW2kiF4-MXvgnkTZI^=y94W&T@Vp)7%a#DK~?m?aDp`Tlqg*IPr zuE?|sz9xt8$C$Q&lZ?Cr5n;toQlIBri)uw}v&P2dz=nY1dKpX~?9Gg8@aBm~wZCn+ z?`n>%w%g#5gMO)C*85F0*YS@}8kxRSV-$ex#vE8{>fJTn5=xn-Q@df1c@^EB3;cc9 zw`=;nmkVb!rNohG{?nr}M#E2CszwF~YK%E{`(OqZ)`k^X|8Y#_5jIP@vF!gf$P8ki z4s~K}2#Ilv!EOq_LffS}bWK0C4x>vnvJSgyByAmLJt?ezr2*TIuqdJa)w1j>bXnWc zr>>Q!#<X2}lpBG(*QmQh7{h;tymSkqc^j~kDx@3t{`a}&uG~Gf+kCI5Fn%f$po@*0 zR&|FlmydWDS1VgYyQgdLeg%e<`rq6(F`tz6JAIA{rd4mz@UF9~x~!BUJN2+XIV>lV z+F0-)RNOZJE*-QxL)MtqG9bKd_~iCV)iZC5y#f0HF-=g^2+Y(nuo&1QY#QsnLaRjo zU$iiD>&l!~y$jPXdpk-=id1s|D{5gBR%|P!x~X8u=ANPUkZ<GU0PK=KN)6a5dbPkc zY?5?iXa>xf_T&Er2nVKTRf`hTt(4(v9&(g2t!e~gK1#s;m2T|R!;6QO{qF=Y3*=Qs zw+Du=ICF{_qsdFU5RtmAYQ5<e-yNrMVP=xl0d*@__gvQGpv0#+N9%8xi$E3Ji>mGi zf+?9wK9_D(Sz6PhM)X#cqNx{>2dr(PF2t&S3mEV?(S_5*wrkqh;_X#^K6i7!LR+c- z9Cc+B{+u#Tr*=#XNCzM&%G`gO(wKIop0r=5XOTvAvhytXYJ|pyc@|7R1Eq9ee94%0 zDw*>5k^$5@tlA7=9d;1ercK?+AqM#TH9XjmA#CKtTaZx+nl<x-CL${;@;@J=hRjKB z{#0Q!=^opo0I<0A`ml`#OlDPA%%0j>HnB!pof;}Jnty=xO!!{!Gb+ZS-`?FY&xh&n zi)N11*^kInY%5mnsU0Vc!d<Ao55ncgX!MoiFdE8DR$SUp(Z73O#EMOx-nXt(7p7H% zH(SI#Z;!ySPbU|o#Y`U3f$YU%OH6&D(Ssp}`E}G|SjU)_Y3cGP{HX!{DRn*AL?CUf z_^K{o9q}P2>#%$FqcX#WY`vI>+lcT<nTsTILFjN2s^$xQ>Huaq1GV}?EPxtily>;Q zQTc@L^#c&#hyNU&P|Z|t1uL9;e%T^$dbqNTaWDgf%6x3y5yCTHy%qHv6imm;^lYnx z&yovLff5USSUEBpU1mfBj;61`OZ`Y!GoED-j&3OvSxF%d1xJWZA<`X)BMY9Lx*u+I z(uWGdehND>0f+X<-%}fYY%5ycQ-5NxkqCKc=HpX>bmnBdBzlgq%K%%M1LAMy9th)} z2D}&0%w$2xCe?<L>E+^~AQS<s&(%sdzShVzGT`;24&4F9yze2W={Fzgz+@xz{|U^Q z-rxg9P!w6A`>JLI<$j%PvBOKMnWr+#7|U9Yz;ed2;=2v-cp@t^xgZ^)L|SbLK?1)4 z0csN}VtpWI9d_M(37i!1eoDcl(`)!x<e3sA0!v5OJ6VDJX2GAQ?kV;j;JiM3y(Fn% z>QN<RNRvN+p$<J(m5WIw(8vwU9E6{9k!t_BxtYOq*dBqpL_WcCv@T51ikk0?sg_d# z@%Wua=GsdTL0057Nl&YTPi}%mVvIwrexa`bj<!9BiJ+dq{cV9@VOj7$Y%)<NEV#F^ z^DNXOeCgKzordEE>tIfT5U+>8=q0vNWDR55;#`o2_#5B{HPpbj{z#;Ls{_+2qY?Ps zHpsuEH93sH)HmGCtii^YgeoYaNhcRT9`KNl`93w4?C1@0SQ6M8IA#Dq9(={K0(uU9 zXOeEYY%%I9cpLpi{aXS`fV$6q<kHvF(t)u-S@B>E${5p)z=q=p22py?k7o$u7Z|Yk zPZ=XU_(Z>?iIytYoznkps%Uig1GabB${RD4iH=PFjxCv=@PVa@sSWHj-qD(E&}!na zyunu}TfA%vzOZ8DW-n$r5mobzUQAK*kt+oa=8TS1Go!}S;|1^1J+*^B1)Tif6n}Hf zP>=ta3q%$C_k^)}8Z4dKwsENvxrdIGYQ}xK8o$Z^B8zp{?&jp%>ka0xUTMw>$)TkZ z<ldApvk@DIL$uVqi81Y1cRwZqU;`;T&Ya`wz#CP;zs3Fk&5u+Z1$sdQrgnDC=mvGr Ow{Gfc<f~ge|9=2ce@%A) literal 0 HcmV?d00001 diff --git a/tests/unit/tst_qtuiviewer.cpp b/tests/unit/tst_qtuiviewer.cpp new file mode 100644 index 0000000..bf2aff2 --- /dev/null +++ b/tests/unit/tst_qtuiviewer.cpp @@ -0,0 +1,17 @@ +#include "tst_qtuiviewer.h" + +void TestQString::toUpper() +{ + qDebug("TestQString::toUpper"); + QString str = "Hello"; + QVERIFY(str.toUpper() == "HELLO"); +} + +void TestQString::toLower() +{ + qDebug("TestQString::toLower"); + QString str = "Hello"; + QCOMPARE(str.toLower(), "hell"); +} + +QTEST_MAIN(TestQString) diff --git a/tests/unit/tst_qtuiviewer.h b/tests/unit/tst_qtuiviewer.h new file mode 100644 index 0000000..cffffcf --- /dev/null +++ b/tests/unit/tst_qtuiviewer.h @@ -0,0 +1,11 @@ +#pragma once + +#include <QtTest/QTest> + +class TestQString : public QObject +{ + Q_OBJECT +private slots: + void toUpper(); + void toLower(); +}; -- GitLab