From 6f7c106cf66149e5132dad42332cd2d9a302aca7 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 08:33:05 +0200 Subject: [PATCH 01/59] ci: clang-12 is now officially supported by Conan 1.36 --- .github/workflows/ci-conan.yml | 6 ------ .github/workflows/ci-test-package-cmake.yml | 6 ------ 2 files changed, 12 deletions(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index d93a3c5d..668e6559 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -121,12 +121,6 @@ jobs: conan profile update settings.compiler.libcxx=${{ matrix.config.lib }} default fi conan profile show default - - name: Add support for clang-12 to Conan's settings.yml - # TODO Remove when Conan will support clang-12 (after clang-12 release) - if: matrix.config.compiler.type == 'CLANG' - shell: bash - run: | - sed -i -e 's/"8", "9", "10", "11"]/"8", "9", "10", "11", "12"]/' ~/.conan/settings.yml - name: Run Conan Package Tools shell: bash env: diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index c2fcebcf..ea9f6696 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -143,12 +143,6 @@ jobs: conan profile update settings.compiler.libcxx=${{ matrix.config.lib }} default fi conan profile show default - - name: Add support for clang-12 to Conan's settings.yml - # TODO Remove when Conan will support clang-12 (after clang-12 release) - if: matrix.config.compiler.type == 'CLANG' - shell: bash - run: | - sed -i -e 's/"8", "9", "10", "11"]/"8", "9", "10", "11", "12"]/' ~/.conan/settings.yml - name: Install Conan dependencies shell: bash run: | From c3b9d5ececb948459371fd0728ede2e72eaba9d6 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 08:35:58 +0200 Subject: [PATCH 02/59] build: conanfile.py modernized --- conanfile.py | 45 +++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/conanfile.py b/conanfile.py index 87d147ba..832ed641 100644 --- a/conanfile.py +++ b/conanfile.py @@ -22,7 +22,7 @@ from conans import ConanFile, tools from conans.tools import Version, check_min_cppstd -from conan.tools.cmake import CMakeToolchain, CMake, CMakeDeps +from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMake from conans.errors import ConanInvalidConfiguration import os, re @@ -58,28 +58,27 @@ class UnitsConan(ConanFile): # } generators = "cmake_paths" - _cmake = None - @property def _run_tests(self): return tools.get_env("CONAN_RUN_TESTS", False) - def _configure_cmake(self): - if not self._cmake: - self._cmake = CMake(self) - if self._run_tests: - # developer's mode (unit tests, examples, documentation, restrictive compilation warnings, ...) - self._cmake.configure() - else: - # consumer's mode (library sources only) - self._cmake.configure(source_folder="src") - return self._cmake - def set_version(self): content = tools.load(os.path.join(self.recipe_folder, "src/CMakeLists.txt")) version = re.search(r"project\([^\)]+VERSION (\d+\.\d+\.\d+)[^\)]*\)", content).group(1) self.version = version.strip() + def requirements(self): + compiler = self.settings.compiler + if compiler == "clang" and compiler.libcxx == "libc++": + self.requires("range-v3/0.11.0") + + def build_requirements(self): + if self._run_tests: + self.build_requires("catch2/2.13.4") + self.build_requires("linear_algebra/0.7.0@public-conan/stable") + if self.options.build_docs: + self.build_requires("doxygen/1.8.20") + def validate(self): compiler = self.settings.compiler version = Version(self.settings.compiler.version) @@ -102,18 +101,6 @@ class UnitsConan(ConanFile): # # build_docs has sense only in a development or CI build # del self.options.build_docs - def requirements(self): - compiler = self.settings.compiler - if compiler == "clang" and compiler.libcxx == "libc++": - self.requires("range-v3/0.11.0") - - def build_requirements(self): - if self._run_tests: - self.build_requires("catch2/2.13.4") - self.build_requires("linear_algebra/0.7.0@public-conan/stable") - if self.options.build_docs: - self.build_requires("doxygen/1.8.20") - def generate(self): tc = CMakeToolchain(self) tc.variables["UNITS_DOWNCAST_MODE"] = str(self.options.downcast_mode).upper() @@ -124,14 +111,16 @@ class UnitsConan(ConanFile): deps.generate() def build(self): - cmake = self._configure_cmake() + cmake = CMake(self) + cmake.configure(source_folder=None if self._run_tests else "src") cmake.build() if self._run_tests: cmake.test(output_on_failure=True) def package(self): self.copy(pattern="LICENSE.md", dst="licenses") - cmake = self._configure_cmake() + cmake = CMake(self) + cmake.configure(source_folder=None if self._run_tests else "src") cmake.install() def package_id(self): From a79086332490881b040f12a3fe55a2151b069584 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 08:37:10 +0200 Subject: [PATCH 03/59] build: CMake 3.15 does not set default MSVC warning level anymore --- cmake/warnings.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index afe0da47..ce46d8bb 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -22,7 +22,7 @@ # Based on https://github.com/lefticus/cpp_starter_project/blob/master/cmake/CompilerWarnings.cmake -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.15) option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" ON) @@ -90,8 +90,6 @@ macro(_set_flags) endif() if(MSVC) - string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE) set(flags ${MSVC_WARNINGS}) elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") set(flags ${CLANG_WARNINGS}) From d1473bfde7f4206ef76647d1c20f1676c6d1b64c Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 11:24:52 +0200 Subject: [PATCH 04/59] ci: fixed setting Ninja as a default generator for Conan --- .github/workflows/ci-test-package-cmake.yml | 1 + .github/workflows/codeql-analysis.yml | 2 ++ .github/workflows/documentation.yml | 1 + conanfile.py | 2 +- docs/usage.rst | 1 - 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index ea9f6696..69b7f06f 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -84,6 +84,7 @@ jobs: CC: ${{ matrix.config.compiler.cc }} CXX: ${{ matrix.config.compiler.cxx }} CMAKE_GENERATOR: Ninja + CONAN_CMAKE_GENERATOR: Ninja steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 478d0435..0e3c43f6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -80,6 +80,8 @@ jobs: python-version: '3.8' - name: Conan build if: matrix.language == 'cpp' + env: + CONAN_CMAKE_GENERATOR: Ninja run: | pip install -U conan conan config init diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 1229e983..fdefe755 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -40,6 +40,7 @@ env: CC: gcc-10 CXX: g++-10 CMAKE_GENERATOR: Ninja + CONAN_CMAKE_GENERATOR: Ninja jobs: docs: diff --git a/conanfile.py b/conanfile.py index 832ed641..d3d37125 100644 --- a/conanfile.py +++ b/conanfile.py @@ -102,7 +102,7 @@ class UnitsConan(ConanFile): # del self.options.build_docs def generate(self): - tc = CMakeToolchain(self) + tc = CMakeToolchain(self, generator=os.getenv("CONAN_CMAKE_GENERATOR")) tc.variables["UNITS_DOWNCAST_MODE"] = str(self.options.downcast_mode).upper() # if self._run_tests: # TODO Enable this when environment is supported in the Conan toolchain tc.variables["UNITS_BUILD_DOCS"] = self.options.build_docs diff --git a/docs/usage.rst b/docs/usage.rst index e074f941..24fe91ca 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -92,7 +92,6 @@ in *~/.conan/profiles* directory. An example profile can look as follows: [env] CC=/usr/bin/gcc-10 CXX=/usr/bin/g++-10 - CONAN_CMAKE_GENERATOR=Ninja .. tip:: From 5793cb8d0c8abdfe9a300528d3bd21b6e3ffb3a2 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 12:54:43 +0200 Subject: [PATCH 05/59] ci: got rid of Ninja in CodeQL action --- .github/workflows/codeql-analysis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0e3c43f6..478d0435 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -80,8 +80,6 @@ jobs: python-version: '3.8' - name: Conan build if: matrix.language == 'cpp' - env: - CONAN_CMAKE_GENERATOR: Ninja run: | pip install -U conan conan config init From d7582ff344f851f90c7b83d3dffe6b7caa4aba65 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 12:56:13 +0200 Subject: [PATCH 06/59] ci: generator setting for a `CMakeToolchain` added in test_package --- test_package/conanfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test_package/conanfile.py b/test_package/conanfile.py index d6ed6b6c..f72ce180 100644 --- a/test_package/conanfile.py +++ b/test_package/conanfile.py @@ -22,12 +22,13 @@ from conans import ConanFile, tools, RunEnvironment from conan.tools.cmake import CMakeToolchain, CMake, CMakeDeps +import os class TestPackageConan(ConanFile): settings = "os", "compiler", "build_type", "arch" def generate(self): - tc = CMakeToolchain(self) + tc = CMakeToolchain(self, generator=os.getenv("CONAN_CMAKE_GENERATOR")) tc.generate() deps = CMakeDeps(self) deps.generate() From cc5a84823708bd8eefc91e11240a54ff29b1f618 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 13:44:08 +0200 Subject: [PATCH 07/59] ci: calling `conanvcvars.bat` for MSVC added --- .github/workflows/ci-test-package-cmake.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 69b7f06f..9008d6f6 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -153,6 +153,9 @@ jobs: shell: bash working-directory: build/${{ matrix.build_type }} run: | + if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then + conanvcvars.bat + fi cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - name: Install mp-units shell: bash @@ -164,6 +167,9 @@ jobs: run: | mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. + if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then + conanvcvars.bat + fi cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Build test_package shell: bash From f4ccb9c7fc04a156c78b66c5976630afc9f2e844 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 13:46:09 +0200 Subject: [PATCH 08/59] ci: `VISUAL` renamed to `MSVC` --- .github/workflows/ci-conan.yml | 2 +- .github/workflows/ci-test-package-cmake.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 668e6559..62f0ddc0 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -41,7 +41,7 @@ jobs: - { name: "Windows MSVC 2019", os: windows-latest, - compiler: { type: VISUAL, version: 16, cc: "cl", cxx: "cl" } + compiler: { type: MSVC, version: 16, cc: "cl", cxx: "cl" } } - { name: "Ubuntu GCC 10.1.0", diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 9008d6f6..87ccceda 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -45,7 +45,7 @@ jobs: - { name: "Windows MSVC 2019", os: windows-latest, - compiler: { type: VISUAL, version: 16, cc: "", cxx: "" } + compiler: { type: MSVC, version: 16, cc: "", cxx: "" } } - { name: "Ubuntu GCC 10.1.0", @@ -153,7 +153,7 @@ jobs: shell: bash working-directory: build/${{ matrix.build_type }} run: | - if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then + if [[ "${{ matrix.config.compiler.type }}" == "MSVC" ]]; then conanvcvars.bat fi cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake @@ -167,7 +167,7 @@ jobs: run: | mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. - if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then + if [[ "${{ matrix.config.compiler.type }}" == "MSVC" ]]; then conanvcvars.bat fi cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package From 228bd709b1c996ede9f0b16b7c2c1f08dadc3f67 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 14:15:27 +0200 Subject: [PATCH 09/59] Revert "ci: `VISUAL` renamed to `MSVC`" This reverts commit f4ccb9c7fc04a156c78b66c5976630afc9f2e844. --- .github/workflows/ci-conan.yml | 2 +- .github/workflows/ci-test-package-cmake.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 62f0ddc0..668e6559 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -41,7 +41,7 @@ jobs: - { name: "Windows MSVC 2019", os: windows-latest, - compiler: { type: MSVC, version: 16, cc: "cl", cxx: "cl" } + compiler: { type: VISUAL, version: 16, cc: "cl", cxx: "cl" } } - { name: "Ubuntu GCC 10.1.0", diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 87ccceda..9008d6f6 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -45,7 +45,7 @@ jobs: - { name: "Windows MSVC 2019", os: windows-latest, - compiler: { type: MSVC, version: 16, cc: "", cxx: "" } + compiler: { type: VISUAL, version: 16, cc: "", cxx: "" } } - { name: "Ubuntu GCC 10.1.0", @@ -153,7 +153,7 @@ jobs: shell: bash working-directory: build/${{ matrix.build_type }} run: | - if [[ "${{ matrix.config.compiler.type }}" == "MSVC" ]]; then + if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then conanvcvars.bat fi cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake @@ -167,7 +167,7 @@ jobs: run: | mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. - if [[ "${{ matrix.config.compiler.type }}" == "MSVC" ]]; then + if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then conanvcvars.bat fi cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package From d4b49b5edbf0aef159bd3bb41143db5e0010c844 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 14:16:20 +0200 Subject: [PATCH 10/59] ci: calling `conanvcvars.bat` fixed --- .github/workflows/ci-test-package-cmake.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 9008d6f6..4c0ebac6 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -154,7 +154,7 @@ jobs: working-directory: build/${{ matrix.build_type }} run: | if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then - conanvcvars.bat + ./conanvcvars.bat fi cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - name: Install mp-units @@ -168,7 +168,7 @@ jobs: mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then - conanvcvars.bat + ./conanvcvars.bat fi cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Build test_package From 25483cc29f0b1bf116a7774aba11b77cfed81765 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 14:39:47 +0200 Subject: [PATCH 11/59] ci: set default shell for MSVC to be able to run conanvcvars.bat --- .github/workflows/ci-test-package-cmake.yml | 24 +++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 4c0ebac6..50bd94a9 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -150,26 +150,36 @@ jobs: mkdir -p build/${{ matrix.build_type }} && cd build/${{ matrix.build_type }} conan install ../.. -b outdated -u - name: Configure mp-units CMake + if: matrix.config.compiler.type == 'VISUAL' + working-directory: build/${{ matrix.build_type }} + run: | + conanvcvars.bat + cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + - name: Configure mp-units CMake + if: matrix.config.compiler.type != 'VISUAL' shell: bash working-directory: build/${{ matrix.build_type }} run: | - if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then - ./conanvcvars.bat - fi cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - name: Install mp-units shell: bash working-directory: build/${{ matrix.build_type }} run: | cmake --install . --prefix test_package - - name: Configure test_package CMake + - name: Install dependencies for test_package shell: bash run: | mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. - if [[ "${{ matrix.config.compiler.type }}" == "VISUAL" ]]; then - ./conanvcvars.bat - fi + - name: Configure test_package CMake + if: matrix.config.compiler.type == 'VISUAL' + run: | + conanvcvars.bat + cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package + - name: Configure test_package CMake + if: matrix.config.compiler.type != 'VISUAL' + shell: bash + run: | cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Build test_package shell: bash From c45b68232a1dd114f8f91b045470ff3915b626db Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 17:07:24 +0200 Subject: [PATCH 12/59] ci: working directory set for "Configure test_package CMake" step --- .github/workflows/ci-test-package-cmake.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 50bd94a9..66300a20 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -173,12 +173,14 @@ jobs: conan install ../../.. - name: Configure test_package CMake if: matrix.config.compiler.type == 'VISUAL' + working-directory: test_package/build/${{ matrix.build_type }} run: | conanvcvars.bat cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Configure test_package CMake if: matrix.config.compiler.type != 'VISUAL' shell: bash + working-directory: test_package/build/${{ matrix.build_type }} run: | cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Build test_package From f6db4435e6dba20edd52bd438df7ea42a7cbf072 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 17:17:33 +0200 Subject: [PATCH 13/59] ci: `cmd` shell set for MSVC --- .github/workflows/ci-test-package-cmake.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 66300a20..4cfcb11f 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -151,6 +151,7 @@ jobs: conan install ../.. -b outdated -u - name: Configure mp-units CMake if: matrix.config.compiler.type == 'VISUAL' + shell: cmd working-directory: build/${{ matrix.build_type }} run: | conanvcvars.bat @@ -173,6 +174,7 @@ jobs: conan install ../../.. - name: Configure test_package CMake if: matrix.config.compiler.type == 'VISUAL' + shell: cmd working-directory: test_package/build/${{ matrix.build_type }} run: | conanvcvars.bat From 4be96e76a02402792deda02adfcf9d939b7b0506 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 20:14:01 +0200 Subject: [PATCH 14/59] ci: calling conanvcvars.bat fixed --- .github/workflows/ci-test-package-cmake.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index 4cfcb11f..eb8871fe 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -154,7 +154,7 @@ jobs: shell: cmd working-directory: build/${{ matrix.build_type }} run: | - conanvcvars.bat + call conanvcvars.bat cmake ../../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake - name: Configure mp-units CMake if: matrix.config.compiler.type != 'VISUAL' @@ -177,7 +177,7 @@ jobs: shell: cmd working-directory: test_package/build/${{ matrix.build_type }} run: | - conanvcvars.bat + call conanvcvars.bat cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - name: Configure test_package CMake if: matrix.config.compiler.type != 'VISUAL' From 9d4ea8a8bf7073c0611a2ec1697c6cc51875e5bd Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 29 Apr 2021 20:57:36 +0200 Subject: [PATCH 15/59] ci: test_package configure and build moved to one step --- .github/workflows/ci-test-package-cmake.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-test-package-cmake.yml b/.github/workflows/ci-test-package-cmake.yml index eb8871fe..be5e46f7 100644 --- a/.github/workflows/ci-test-package-cmake.yml +++ b/.github/workflows/ci-test-package-cmake.yml @@ -172,23 +172,20 @@ jobs: run: | mkdir -p test_package/build/${{ matrix.build_type }} && cd test_package/build/${{ matrix.build_type }} conan install ../../.. - - name: Configure test_package CMake + - name: Build test_package CMake if: matrix.config.compiler.type == 'VISUAL' shell: cmd working-directory: test_package/build/${{ matrix.build_type }} run: | call conanvcvars.bat cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - - name: Configure test_package CMake + cmake --build . + - name: Build test_package CMake if: matrix.config.compiler.type != 'VISUAL' shell: bash working-directory: test_package/build/${{ matrix.build_type }} run: | cmake ../.. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_INSTALL_PREFIX=../../../build/${{ matrix.build_type }}/test_package - - name: Build test_package - shell: bash - working-directory: test_package/build/${{ matrix.build_type }} - run: | cmake --build . - name: Run test_package shell: bash From ab66455fb12175e22b229629e0a3c9432264398b Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 2 May 2021 13:03:14 +0200 Subject: [PATCH 16/59] fix: haversine formula fixed Resolves #276 --- example/glide_computer/geographic.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/glide_computer/geographic.cpp b/example/glide_computer/geographic.cpp index 8f39cd8d..5d6073b3 100644 --- a/example/glide_computer/geographic.cpp +++ b/example/glide_computer/geographic.cpp @@ -53,8 +53,8 @@ distance spherical_distance(position from, position to) return distance(earth_radius * central_angle); } else { // the haversine formula - const auto sin_lat = sin(lat2 - lat1) / 2; - const auto sin_lon = sin(lon2 - lon1) / 2; + const auto sin_lat = sin((lat2 - lat1) / 2); + const auto sin_lon = sin((lon2 - lon1) / 2); const auto central_angle = 2 * asin(sqrt(sin_lat * sin_lat + cos(lat1) * cos(lat2) * sin_lon * sin_lon)); return distance(earth_radius * central_angle); } From 6d39459cbcfe238ea679af8baec11563783e0804 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 3 May 2021 19:44:50 +0200 Subject: [PATCH 17/59] perf: rvalue references support added for constructors and getters Resolves #275 --- docs/CHANGELOG.md | 1 + src/core/include/units/quantity.h | 12 ++++--- src/core/include/units/quantity_kind.h | 22 +++++++----- src/core/include/units/quantity_point.h | 38 +++++++++++--------- src/core/include/units/quantity_point_kind.h | 30 +++++++--------- test/unit_test/static/quantity_kind_test.cpp | 6 ++-- test/unit_test/static/quantity_test.cpp | 14 ++++---- 7 files changed, 68 insertions(+), 55 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index da20f0cd..2fc975f2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -23,6 +23,7 @@ - perf: value initialization for quantity value removed (left with a default initialization) - perf: limited the `equivalent` trait usage - perf: limited the C++ Standard Library headers usage + - perf: rvalue references support added for constructors and getters - (!) fix: `exp()` has sense only for dimensionless quantities - (!) fix: `dim_torque` now properly divides by an angle (instead of multiply) + default unit name change - fix: quantity's operators fixed to behave like the underlying types do diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 4ed10cf9..13c519ab 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -147,9 +147,10 @@ public: quantity(const quantity&) = default; quantity(quantity&&) = default; - template Value> - constexpr explicit(!(is_same_v && is_same_v)) - quantity(const Value& v) : number_(v) {} + template + requires safe_convertible_to_, rep> + constexpr explicit(!(std::same_as && std::same_as)) + quantity(Value&& v) : number_(std::forward(v)) {} template Q> constexpr explicit(false) quantity(const Q& q) : number_(quantity_cast(q).number()) {} @@ -162,7 +163,10 @@ public: quantity& operator=(quantity&&) = default; // data access - [[nodiscard]] constexpr rep number() const noexcept { return number_; } + [[nodiscard]] constexpr rep& number() & noexcept { return number_; } + [[nodiscard]] constexpr const rep& number() const & noexcept { return number_; } + [[nodiscard]] constexpr rep&& number() && noexcept { return std::move(number_); } + [[nodiscard]] constexpr const rep&& number() const && noexcept { return std::move(number_); } // member unary operators [[nodiscard]] constexpr Quantity auto operator+() const diff --git a/src/core/include/units/quantity_kind.h b/src/core/include/units/quantity_kind.h index c6891bd2..80a0c90a 100644 --- a/src/core/include/units/quantity_kind.h +++ b/src/core/include/units/quantity_kind.h @@ -93,22 +93,28 @@ public: quantity_kind(const quantity_kind&) = default; quantity_kind(quantity_kind&&) = default; - template Value> - requires is_same_v && std::is_constructible_v - constexpr explicit quantity_kind(const Value& v) : q_(v) {} + template + requires std::same_as && + safe_convertible_to_, rep> && + std::constructible_from + constexpr explicit quantity_kind(Value&& v) : q_(std::forward(v)) {} template - requires (Quantity || QuantityLike) && std::is_constructible_v - constexpr explicit quantity_kind(const Q& q) : q_{q} {} + requires (Quantity> || QuantityLike>) && + std::constructible_from + constexpr explicit quantity_kind(Q&& q) : q_(std::forward(q)) {} template QK2> - requires std::is_convertible_v - constexpr explicit(false) quantity_kind(const QK2& qk) : q_{qk.common()} {} + requires std::convertible_to + constexpr explicit(false) quantity_kind(const QK2& qk) : q_(qk.common()) {} quantity_kind& operator=(const quantity_kind&) = default; quantity_kind& operator=(quantity_kind&&) = default; - [[nodiscard]] constexpr quantity_type common() const noexcept { return q_; } + [[nodiscard]] constexpr quantity_type& common() & noexcept { return q_; } + [[nodiscard]] constexpr const quantity_type& common() const & noexcept { return q_; } + [[nodiscard]] constexpr quantity_type&& common() && noexcept { return std::move(q_); } + [[nodiscard]] constexpr const quantity_type&& common() const && noexcept { return std::move(q_); } [[nodiscard]] static constexpr quantity_kind zero() noexcept requires requires { quantity_type::zero(); } diff --git a/src/core/include/units/quantity_point.h b/src/core/include/units/quantity_point.h index dd1a276f..93c38615 100644 --- a/src/core/include/units/quantity_point.h +++ b/src/core/include/units/quantity_point.h @@ -59,29 +59,33 @@ public: quantity_point(const quantity_point&) = default; quantity_point(quantity_point&&) = default; - template Value> - requires is_same_v && std::is_constructible_v - constexpr explicit quantity_point(const Value& v) : q_(v) {} + template + requires std::same_as && + safe_convertible_to_, rep> && + std::constructible_from + constexpr explicit quantity_point(Value&& v) : q_(std::forward(v)) {} - constexpr explicit quantity_point(const quantity_type& q) : q_{q} {} + template + requires (Quantity> || QuantityLike>) && + std::constructible_from + constexpr explicit quantity_point(Q&& q) : q_(std::forward(q)) {} - template - requires std::is_constructible_v - constexpr explicit quantity_point(const Q& q) : q_{q} {} + template + requires std::convertible_to + constexpr explicit(false) quantity_point(const QP2& qp) : q_(qp.relative()) {} template constexpr explicit quantity_point(const QP& qp) requires std::is_constructible_v::relative(qp))> - : q_{quantity_point_like_traits::relative(qp)} {} - - template - requires std::is_convertible_v - constexpr explicit(false) quantity_point(const QP2& qp) : q_{qp.relative()} {} + : q_(quantity_point_like_traits::relative(qp)) {} quantity_point& operator=(const quantity_point&) = default; quantity_point& operator=(quantity_point&&) = default; - [[nodiscard]] constexpr quantity_type relative() const noexcept { return q_; } + [[nodiscard]] constexpr quantity_type& relative() & noexcept { return q_; } + [[nodiscard]] constexpr const quantity_type& relative() const & noexcept { return q_; } + [[nodiscard]] constexpr quantity_type&& relative() && noexcept { return std::move(q_); } + [[nodiscard]] constexpr const quantity_type&& relative() const && noexcept { return std::move(q_); } [[nodiscard]] static constexpr quantity_point min() noexcept requires requires { quantity_type::min(); } @@ -183,14 +187,16 @@ public: { return lhs.relative() == rhs.relative(); } - }; template -explicit(false) quantity_point(Rep) -> quantity_point; +explicit quantity_point(Rep) -> quantity_point; + +template +explicit quantity_point(Q) -> quantity_point; template -quantity_point(Q) -> quantity_point::dimension, +explicit quantity_point(Q) -> quantity_point::dimension, typename quantity_like_traits::unit, typename quantity_like_traits::rep>; template diff --git a/src/core/include/units/quantity_point_kind.h b/src/core/include/units/quantity_point_kind.h index e315ff40..213de447 100644 --- a/src/core/include/units/quantity_point_kind.h +++ b/src/core/include/units/quantity_point_kind.h @@ -60,32 +60,28 @@ public: quantity_point_kind(const quantity_point_kind&) = default; quantity_point_kind(quantity_point_kind&&) = default; - template Value> - requires std::is_constructible_v - constexpr explicit quantity_point_kind(const Value& v) : qk_(v) {} + template + requires std::constructible_from + constexpr explicit quantity_point_kind(T&& t) : qk_(std::forward(t)) {} - constexpr explicit quantity_point_kind(const quantity_type& q) : qk_{q} {} - - template - requires std::is_constructible_v - constexpr explicit quantity_point_kind(const Q& q) : qk_{q} {} + constexpr explicit quantity_point_kind(const quantity_point& qp) : qk_(qp.relative()) {} + constexpr explicit quantity_point_kind(quantity_point&& qp) : qk_(std::move(qp).relative()) {} template - requires std::is_constructible_v, QP> - constexpr explicit quantity_point_kind(const QP& qp) : qk_{quantity_point_like_traits::relative(qp)} {} - - constexpr explicit quantity_point_kind(const quantity_point& qp) : qk_{qp.relative()} {} - - constexpr explicit quantity_point_kind(const quantity_kind_type& qk) : qk_{qk} {} + requires std::constructible_from, QP> + constexpr explicit quantity_point_kind(const QP& qp) : qk_(quantity_point_like_traits::relative(qp)) {} template QPK2> - requires std::is_convertible_v - constexpr explicit(false) quantity_point_kind(const QPK2& qpk) : qk_{qpk.relative()} {} + requires std::convertible_to + constexpr explicit(false) quantity_point_kind(const QPK2& qpk) : qk_(qpk.relative()) {} quantity_point_kind& operator=(const quantity_point_kind&) = default; quantity_point_kind& operator=(quantity_point_kind&&) = default; - [[nodiscard]] constexpr quantity_kind_type relative() const noexcept { return qk_; } + [[nodiscard]] constexpr quantity_kind_type& relative() & noexcept { return qk_; } + [[nodiscard]] constexpr const quantity_kind_type& relative() const & noexcept { return qk_; } + [[nodiscard]] constexpr quantity_kind_type&& relative() && noexcept { return std::move(qk_); } + [[nodiscard]] constexpr const quantity_kind_type&& relative() const && noexcept { return std::move(qk_); } [[nodiscard]] static constexpr quantity_point_kind min() noexcept requires requires { quantity_kind_type::min(); } diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index 42c4485d..1dc9a5f2 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -475,9 +475,9 @@ static_assert(same(width(2. * m) - width(3 * m), widt static_assert(same(width(2e3 * m) - width(3 * km), width(-1e3 * m))); static_assert(is_same_v< - decltype((width(0 * m) + width(0 * m)).common().number()), int>); + decltype((width(0 * m) + width(0 * m)).common().number()), int&&>); static_assert(is_same_v< - decltype((width(0 * m) - width(0 * m)).common().number()), int>); + decltype((width(0 * m) - width(0 * m)).common().number()), int&&>); static_assert((width(128 * m) + width(128 * m)).common().number() == std::uint8_t(128) + std::uint8_t(128)); static_assert((width(0 * m) - width(1 * m)).common().number() == @@ -646,7 +646,7 @@ static_assert(same(width(3 * m) % width(2 * m), width(0 * m) % width(0 * m)).common().number()), - decltype(std::uint8_t(0) % std::uint8_t(0))>); + decltype(std::uint8_t(0) % std::uint8_t(0))&&>); static_assert(!std::is_invocable_v, reference, width>); static_assert(!std::is_invocable_v, width, height>); diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 507c6382..6c16f0f0 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -269,7 +269,7 @@ static_assert([](auto v) { auto vv = ++v; return std::pair(v, vv); }(123_q_m) == static_assert([](auto v) { auto vv = v--; return std::pair(v, vv); }(123_q_m) == std::pair(122_q_m, 123_q_m)); static_assert([](auto v) { auto vv = --v; return std::pair(v, vv); }(123_q_m) == std::pair(122_q_m, 122_q_m)); -static_assert(is_same_v); +static_assert(is_same_v); //////////////////////// @@ -406,13 +406,13 @@ static_assert(compare>); static_assert(compare>); static_assert(compare(1) / 1_q_s), frequency, std::int64_t>>); -static_assert(is_same_v); -static_assert(is_same_v); +static_assert(is_same_v); +static_assert(is_same_v); static_assert((std::uint8_t(128) * m + std::uint8_t(128) * m).number() == std::uint8_t(128) + std::uint8_t(128)); static_assert((std::uint8_t(0) * m - std::uint8_t(1) * m).number() == std::uint8_t(0) - std::uint8_t(1)); static_assert(is_same_v); + decltype(std::uint8_t(0) % std::uint8_t(0))&&>); // different representation types static_assert(is_same_v>); @@ -595,14 +595,14 @@ static_assert(quantity(1) - 2.3 == quantity(1 - 2.3)); static_assert(1.2 + quantity(3) == quantity(1.2 + 3)); static_assert(1.2 - quantity(3) == quantity(1.2 - 3)); -static_assert(is_same_v); -static_assert(is_same_v); +static_assert(is_same_v); +static_assert(is_same_v); static_assert((quantity{std::uint8_t(128)} + quantity{std::uint8_t(128)}).number() == std::uint8_t(128) + std::uint8_t(128)); static_assert((quantity{std::uint8_t(0)} - quantity{std::uint8_t(1)}).number() == std::uint8_t(0) - std::uint8_t(1)); static_assert(is_same_v); + decltype(std::uint8_t(0) % std::uint8_t(0))&&>); static_assert(quantity{2} * (1 * m) == 2_q_m); static_assert(quantity{2} / (1 * m) == 2 / 1_q_m); From 70a9e475d01f280412603b242118483b35dcb034 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 3 May 2021 19:55:00 +0200 Subject: [PATCH 18/59] build: LA bintray address disabled due to it being EOL --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index 052244e3..c6962f2f 100644 --- a/build.py +++ b/build.py @@ -36,7 +36,7 @@ if __name__ == "__main__": # dependencies remotes = [ - ("https://api.bintray.com/conan/twonington/public-conan", True, "linear-algebra") + # ("https://api.bintray.com/conan/twonington/public-conan", True, "linear-algebra") ], build_policy = ["mp-units", "outdated"], upload_dependencies = "all", From c2cae80914fda6de8e585ac5f52cb02611869574 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 4 May 2021 10:56:31 +0200 Subject: [PATCH 19/59] build: :boom: Linear Algebra is now hosted on its [Artifactory](https://api.bintray.com/conan/twonington/public-conan) --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/documentation.yml | 2 +- build.py | 2 +- docs/CHANGELOG.md | 1 + docs/usage.rst | 2 +- docs/use_cases/linear_algebra.rst | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 478d0435..2991ab65 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -84,7 +84,7 @@ jobs: pip install -U conan conan config init conan remote add upload https://mpusz.jfrog.io/artifactory/api/conan/conan-oss - conan remote add linear-algebra https://api.bintray.com/conan/twonington/public-conan + conan remote add linear-algebra https://twonington.jfrog.io/artifactory/api/conan/conan-oss mkdir _lgtm_build_dir && cd _lgtm_build_dir conan install .. -s compiler.cppstd=20 -s compiler.libcxx=libstdc++11 -o mp-units:build_docs=False -e mp-units:CONAN_RUN_TESTS=True -b outdated -u conan build .. diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index fdefe755..3e003f7b 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -76,7 +76,7 @@ jobs: run: | conan config init conan remote add -i 0 upload https://mpusz.jfrog.io/artifactory/api/conan/conan-oss - conan remote add linear-algebra https://api.bintray.com/conan/twonington/public-conan + conan remote add linear-algebra https://twonington.jfrog.io/artifactory/api/conan/conan-oss - name: Install Conan dependencies run: | mkdir build && cd build diff --git a/build.py b/build.py index c6962f2f..5660af4e 100644 --- a/build.py +++ b/build.py @@ -36,7 +36,7 @@ if __name__ == "__main__": # dependencies remotes = [ - # ("https://api.bintray.com/conan/twonington/public-conan", True, "linear-algebra") + ("https://twonington.jfrog.io/artifactory/api/conan/conan-oss", True, "linear-algebra") ], build_policy = ["mp-units", "outdated"], upload_dependencies = "all", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2fc975f2..a5a05b65 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -32,6 +32,7 @@ - fix: downcasting facility for non-default-constructible types - fix: restore user-warnings within the library implementation - (!) build: Conan testing version is now hosted on [Artifactory](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units) + - (!) build: Linear Algebra is now hosted on its [Artifactory](https://api.bintray.com/conan/twonington/public-conan) - (!) build: `BUILD_DOCS` CMake option renamed to `UNITS_BUILD_DOCS` - build: doxygen updated to 1.8.20 - build: catch2 updated to 2.13.4 diff --git a/docs/usage.rst b/docs/usage.rst index 24fe91ca..14755348 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -348,7 +348,7 @@ in **mp-units** repository, you should: .. code-block:: shell - conan remote add linear-algebra https://api.bintray.com/conan/twonington/public-conan + conan remote add linear-algebra https://twonington.jfrog.io/artifactory/api/conan/conan-oss git clone https://github.com/mpusz/units.git && cd units pip3 install -r docs/requirements.txt mkdir build && cd build diff --git a/docs/use_cases/linear_algebra.rst b/docs/use_cases/linear_algebra.rst index 4d2d9ae3..f1f66f37 100644 --- a/docs/use_cases/linear_algebra.rst +++ b/docs/use_cases/linear_algebra.rst @@ -11,7 +11,7 @@ enough to be used with other Linear Algebra libraries existing on the market. All of the examples provided in this chapter refer to the official proposal of the Linear Algebra Library for the C++23 defined in `P1385 `_ and its latest implementation from `GitHub `_ - or `Conan `_. + or `Conan `_. Also, to simplify the examples all of them assume:: using namespace std::math; From 9f2a62accf577b4148ca3f12c977ed7f0f262a55 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 4 May 2021 13:06:52 +0200 Subject: [PATCH 20/59] build: `linear_algebra` Conan recipe reference fixed --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index d3d37125..a80b2283 100644 --- a/conanfile.py +++ b/conanfile.py @@ -75,7 +75,7 @@ class UnitsConan(ConanFile): def build_requirements(self): if self._run_tests: self.build_requires("catch2/2.13.4") - self.build_requires("linear_algebra/0.7.0@public-conan/stable") + self.build_requires("linear_algebra/0.7.0@conan-oss/stable") if self.options.build_docs: self.build_requires("doxygen/1.8.20") From 03c33a86a6727351b86e53082158698ce624f5a7 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 4 May 2021 13:07:34 +0200 Subject: [PATCH 21/59] docs: --- docs/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a5a05b65..04f81942 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -32,7 +32,7 @@ - fix: downcasting facility for non-default-constructible types - fix: restore user-warnings within the library implementation - (!) build: Conan testing version is now hosted on [Artifactory](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units) - - (!) build: Linear Algebra is now hosted on its [Artifactory](https://api.bintray.com/conan/twonington/public-conan) + - (!) build: Linear Algebra is now hosted on its [Artifactory](https://twonington.jfrog.io/artifactory/api/conan/conan-oss) - (!) build: `BUILD_DOCS` CMake option renamed to `UNITS_BUILD_DOCS` - build: doxygen updated to 1.8.20 - build: catch2 updated to 2.13.4 From a60e951cd023ffecfc5036d84e0ca03217e1dabd Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 4 May 2021 14:36:49 +0200 Subject: [PATCH 22/59] docs: Broken links to examples source code fixed --- docs/examples/basics/avg_speed.rst | 2 +- docs/examples/basics/box_example.rst | 2 +- docs/examples/basics/capacitor_time_curve.rst | 2 +- docs/examples/basics/clcpp_response.rst | 2 +- docs/examples/basics/experimental_angle.rst | 2 +- docs/examples/basics/foot_pound_second.rst | 2 +- docs/examples/basics/glide_computer.rst | 12 ++++++------ docs/examples/basics/hello_units.rst | 2 +- docs/examples/basics/total_energy.rst | 2 +- docs/examples/basics/unknown_dimension.rst | 2 +- .../custom_representation/linear_algebra.rst | 2 +- docs/examples/custom_representation/measurement.rst | 2 +- docs/examples/custom_systems/custom_systems.rst | 2 +- docs/examples/custom_utilities/conversion_factor.rst | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/examples/basics/avg_speed.rst b/docs/examples/basics/avg_speed.rst index 9eceb60a..46906984 100644 --- a/docs/examples/basics/avg_speed.rst +++ b/docs/examples/basics/avg_speed.rst @@ -1,7 +1,7 @@ avg_speed ========= -.. literalinclude:: ../../example/references/avg_speed.cpp +.. literalinclude:: ../../../example/references/avg_speed.cpp :caption: avg_speed.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/box_example.rst b/docs/examples/basics/box_example.rst index 86fb9b7c..c75116d3 100644 --- a/docs/examples/basics/box_example.rst +++ b/docs/examples/basics/box_example.rst @@ -1,7 +1,7 @@ box_example =========== -.. literalinclude:: ../../example/references/box_example.cpp +.. literalinclude:: ../../../example/references/box_example.cpp :caption: box_example.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/capacitor_time_curve.rst b/docs/examples/basics/capacitor_time_curve.rst index 26fdf7cd..ea9e4f58 100644 --- a/docs/examples/basics/capacitor_time_curve.rst +++ b/docs/examples/basics/capacitor_time_curve.rst @@ -1,7 +1,7 @@ capacitor_time_curve ==================== -.. literalinclude:: ../../example/references/capacitor_time_curve.cpp +.. literalinclude:: ../../../example/references/capacitor_time_curve.cpp :caption: capacitor_time_curve.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/clcpp_response.rst b/docs/examples/basics/clcpp_response.rst index e77b4189..417b8ac0 100644 --- a/docs/examples/basics/clcpp_response.rst +++ b/docs/examples/basics/clcpp_response.rst @@ -1,7 +1,7 @@ clcpp_response ============== -.. literalinclude:: ../../example/references/clcpp_response.cpp +.. literalinclude:: ../../../example/references/clcpp_response.cpp :caption: clcpp_response.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/experimental_angle.rst b/docs/examples/basics/experimental_angle.rst index 46a970e9..71c060b3 100644 --- a/docs/examples/basics/experimental_angle.rst +++ b/docs/examples/basics/experimental_angle.rst @@ -1,7 +1,7 @@ experimental_angle ================== -.. literalinclude:: ../../example/references/experimental_angle.cpp +.. literalinclude:: ../../../example/references/experimental_angle.cpp :caption: experimental_angle.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/foot_pound_second.rst b/docs/examples/basics/foot_pound_second.rst index ba10e747..9d15c786 100644 --- a/docs/examples/basics/foot_pound_second.rst +++ b/docs/examples/basics/foot_pound_second.rst @@ -1,7 +1,7 @@ foot_pound_second ================= -.. literalinclude:: ../../example/references/foot_pound_second.cpp +.. literalinclude:: ../../../example/references/foot_pound_second.cpp :caption: foot_pound_second.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/glide_computer.rst b/docs/examples/basics/glide_computer.rst index 5595bb37..b4139cc2 100644 --- a/docs/examples/basics/glide_computer.rst +++ b/docs/examples/basics/glide_computer.rst @@ -13,7 +13,7 @@ This example presents the usage of: - quantities text output formatting, - cooperation with `std::chrono`. -.. literalinclude:: ../../example/glide_computer/include/glide_computer.h +.. literalinclude:: ../../../example/glide_computer/include/glide_computer.h :caption: glide_computer.h :start-at: #include :end-before: using namespace units; @@ -35,7 +35,7 @@ For example we have 3 for a quantity of length: - ``height`` - a relative altitude difference between 2 points in the air - ``altitude`` - an absolute altitude value measured form the mean sea level (AMSL). -.. literalinclude:: ../../example/glide_computer/include/glide_computer.h +.. literalinclude:: ../../../example/glide_computer/include/glide_computer.h :caption: glide_computer.h :start-at: using namespace units; :end-before: // text output @@ -44,7 +44,7 @@ For example we have 3 for a quantity of length: Next a custom text output is provided both for C++ output streams and the text formatting facility. -.. literalinclude:: ../../example/glide_computer/include/glide_computer.h +.. literalinclude:: ../../../example/glide_computer/include/glide_computer.h :caption: glide_computer.h :start-at: // text output :end-before: // definition of glide computer databases and utilities @@ -58,13 +58,13 @@ convert it to the one required by the engine interface. The glide calculator takes task created as a list of waypoints, glider performance data, weather conditions, safety constraints, and a towing height. -.. literalinclude:: ../../example/glide_computer/include/glide_computer.h +.. literalinclude:: ../../../example/glide_computer/include/glide_computer.h :caption: glide_computer.h :start-at: // definition of glide computer databases and utilities :linenos: :lineno-match: -.. literalinclude:: ../../example/references/glide_computer_example.cpp +.. literalinclude:: ../../../example/references/glide_computer_example.cpp :caption: glide_computer_example.cpp :start-at: #include :linenos: @@ -74,7 +74,7 @@ Having all of that it estimates the number of flight phases (towing, circling, g needed to finish a task. As an output it provides the duration needed to finish the task while flying a selected glider in the specific weather conditions. -.. literalinclude:: ../../example/glide_computer/glide_computer.cpp +.. literalinclude:: ../../../example/glide_computer/glide_computer.cpp :caption: glide_computer.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/hello_units.rst b/docs/examples/basics/hello_units.rst index a6b50b90..ab33ce32 100644 --- a/docs/examples/basics/hello_units.rst +++ b/docs/examples/basics/hello_units.rst @@ -1,7 +1,7 @@ hello_units =========== -.. literalinclude:: ../../example/hello_units.cpp +.. literalinclude:: ../../../example/hello_units.cpp :caption: hello_units.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/total_energy.rst b/docs/examples/basics/total_energy.rst index 1ea5627e..f65cc23d 100644 --- a/docs/examples/basics/total_energy.rst +++ b/docs/examples/basics/total_energy.rst @@ -1,7 +1,7 @@ total_energy ============ -.. literalinclude:: ../../example/references/total_energy.cpp +.. literalinclude:: ../../../example/references/total_energy.cpp :caption: total_energy.cpp :start-at: #include :linenos: diff --git a/docs/examples/basics/unknown_dimension.rst b/docs/examples/basics/unknown_dimension.rst index 9d39427b..27876666 100644 --- a/docs/examples/basics/unknown_dimension.rst +++ b/docs/examples/basics/unknown_dimension.rst @@ -1,7 +1,7 @@ unknown_dimension ================= -.. literalinclude:: ../../example/references/unknown_dimension.cpp +.. literalinclude:: ../../../example/references/unknown_dimension.cpp :caption: unknown_dimension.cpp :start-at: #include :linenos: diff --git a/docs/examples/custom_representation/linear_algebra.rst b/docs/examples/custom_representation/linear_algebra.rst index 07f4c0fc..9bb9ac1e 100644 --- a/docs/examples/custom_representation/linear_algebra.rst +++ b/docs/examples/custom_representation/linear_algebra.rst @@ -1,7 +1,7 @@ linear_algebra ============== -.. literalinclude:: ../../example/references/linear_algebra.cpp +.. literalinclude:: ../../../example/references/linear_algebra.cpp :caption: linear_algebra.cpp :start-at: #include :linenos: diff --git a/docs/examples/custom_representation/measurement.rst b/docs/examples/custom_representation/measurement.rst index c0496e1e..da278975 100644 --- a/docs/examples/custom_representation/measurement.rst +++ b/docs/examples/custom_representation/measurement.rst @@ -1,7 +1,7 @@ measurement =========== -.. literalinclude:: ../../example/measurement.cpp +.. literalinclude:: ../../../example/measurement.cpp :caption: measurement.cpp :start-at: #include :linenos: diff --git a/docs/examples/custom_systems/custom_systems.rst b/docs/examples/custom_systems/custom_systems.rst index a4e93583..673bb0b2 100644 --- a/docs/examples/custom_systems/custom_systems.rst +++ b/docs/examples/custom_systems/custom_systems.rst @@ -1,7 +1,7 @@ custom_systems ============== -.. literalinclude:: ../../example/custom_systems.cpp +.. literalinclude:: ../../../example/custom_systems.cpp :caption: custom_systems.cpp :start-at: #include :linenos: diff --git a/docs/examples/custom_utilities/conversion_factor.rst b/docs/examples/custom_utilities/conversion_factor.rst index 21bbefc5..79de28d2 100644 --- a/docs/examples/custom_utilities/conversion_factor.rst +++ b/docs/examples/custom_utilities/conversion_factor.rst @@ -1,7 +1,7 @@ conversion_factor ================= -.. literalinclude:: ../../example/conversion_factor.cpp +.. literalinclude:: ../../../example/conversion_factor.cpp :caption: conversion_factor.cpp :start-at: #include :linenos: From 2e4b9483fae1833d01ef37138cb41d35f45392a0 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 7 May 2021 20:45:24 +0200 Subject: [PATCH 23/59] build: modern_project_structure.cmake added --- CMakeLists.txt | 4 ++++ cmake/modern_project_structure.cmake | 31 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 cmake/modern_project_structure.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 93a07dcc..98d294a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,10 @@ project(mp-units-dev list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") +# make sure that the file is being used as an entry point +include(modern_project_structure) +ensure_entry_point() + # set restrictive compilation warnings include(warnings) set_warnings() diff --git a/cmake/modern_project_structure.cmake b/cmake/modern_project_structure.cmake new file mode 100644 index 00000000..09debeb3 --- /dev/null +++ b/cmake/modern_project_structure.cmake @@ -0,0 +1,31 @@ +# The MIT License (MIT) +# +# Copyright (c) 2018 Mateusz Pusz +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +cmake_minimum_required(VERSION 3.4) + +function(ensure_entry_point) + if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + message(FATAL_ERROR "'${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt' is meant to be used only " + "as a CMake entry point and should not be included from other CMake files. " + "Include '${CMAKE_CURRENT_SOURCE_DIR}/src/CMaskeLists.txt' directly instead.") + endif() +endfunction() From f4a8a1358ebc342363208e3e812a9e46ea127afd Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 7 May 2021 20:46:40 +0200 Subject: [PATCH 24/59] build: iwyu CMake script refactored --- CMakeLists.txt | 2 +- cmake/include-what-you-use.cmake | 88 +++++++++++++++++--------------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 98d294a5..8d36f11f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ add_compile_definitions($<$:gsl_CONFIG_CONTRACT_CHECKING_AUDIT>) option(UNITS_IWYU "Enables include-what-you-use" OFF) if(UNITS_IWYU) include(include-what-you-use) - set_iwyu( + enable_iwyu( MAPPING_FILE "${PROJECT_SOURCE_DIR}/.mp-units.imp" NO_FORWARD_DECLARATIONS QUOTED_INCLUDES_FIRST diff --git a/cmake/include-what-you-use.cmake b/cmake/include-what-you-use.cmake index 8c0f81c5..a2360e47 100644 --- a/cmake/include-what-you-use.cmake +++ b/cmake/include-what-you-use.cmake @@ -33,7 +33,7 @@ set(IWYU_VERBOSITY_LEVEL 3 CACHE STRING "IWYU verbosity level (the higher the le macro(_find_iwyu) find_program(_iwyu_path NAMES "include-what-you-use") if(NOT _iwyu_path) - message(WARNING "'include-what-you-use' executable not found!") + message(FATAL_ERROR "'include-what-you-use' executable not found!") return() endif() endmacro() @@ -43,7 +43,7 @@ macro(_iwyu_args_append arg) endmacro() macro(_iwyu_args_append_if_present option arg) - if(_set_iwyu_${option}) + if(_enable_iwyu_${option}) _iwyu_args_append("${arg}") endif() endmacro() @@ -52,31 +52,35 @@ macro(_process_iwyu_arguments offset) set(_options NO_DEFAULT_MAPPINGS PCH_IN_CODE TRANSITIVE_INCLUDES_ONLY NO_COMMENTS NO_FORWARD_DECLARATIONS CXX17_NAMESPACES QUOTED_INCLUDES_FIRST) set(_one_value_args MAPPING_FILE MAX_LINE_LENGTH) set(_multi_value_args KEEP) - cmake_parse_arguments(PARSE_ARGV ${offset} _set_iwyu "${_options}" "${_one_value_args}" "${_multi_value_args}") + cmake_parse_arguments(PARSE_ARGV ${offset} _enable_iwyu "${_options}" "${_one_value_args}" "${_multi_value_args}") # validate and process arguments - if(${prefix}_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "Invalid arguments '${${prefix}_UNPARSED_ARGUMENTS}'") + if(_enable_iwyu_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Invalid arguments '${_enable_iwyu_UNPARSED_ARGUMENTS}'") endif() - if(_set_iwyu_KEEP) - foreach(_pattern ${_set_iwyu_KEEP}) + if(_enable_iwyu_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "No value provided for '${_enable_iwyu_KEYWORDS_MISSING_VALUES}'") + endif() + + if(_enable_iwyu_KEEP) + foreach(_pattern ${_enable_iwyu_KEEP}) _iwyu_args_append("--keep=${_pattern}") endforeach() endif() - if(_set_iwyu_MAPPING_FILE) - if(NOT EXISTS ${_set_iwyu_MAPPING_FILE}) - message(FATAL_ERROR "IWYU: Mapping file '${_set_iwyu_MAPPING_FILE}' does not exist") + if(_enable_iwyu_MAPPING_FILE) + if(NOT EXISTS ${_enable_iwyu_MAPPING_FILE}) + message(FATAL_ERROR "IWYU: Mapping file '${_enable_iwyu_MAPPING_FILE}' does not exist") endif() - _iwyu_args_append("--mapping_file=${_set_iwyu_MAPPING_FILE}") + _iwyu_args_append("--mapping_file=${_enable_iwyu_MAPPING_FILE}") endif() - if(_set_iwyu_MAX_LINE_LENGTH) - if(NOT _set_iwyu_MAX_LINE_LENGTH GREATER 0) - message(FATAL_ERROR "IWYU: Invalid MAX_LINE_LENGTH value = '${_set_iwyu_MAX_LINE_LENGTH}") + if(_enable_iwyu_MAX_LINE_LENGTH) + if(NOT _enable_iwyu_MAX_LINE_LENGTH GREATER 0) + message(FATAL_ERROR "IWYU: Invalid MAX_LINE_LENGTH value = '${_enable_iwyu_MAX_LINE_LENGTH}") endif() - _iwyu_args_append("--max_line_length=${_set_iwyu_MAX_LINE_LENGTH}") + _iwyu_args_append("--max_line_length=${_enable_iwyu_MAX_LINE_LENGTH}") endif() _iwyu_args_append_if_present(NO_DEFAULT_MAPPINGS "--no_default_mappings") @@ -91,26 +95,26 @@ macro(_process_iwyu_arguments offset) endmacro() # -# set_target_iwyu(TargetName -# [KEEP pattern...] -# [MAPPING_FILE file] -# [NO_DEFAULT_MAPPINGS] -# [PCH_IN_CODE] -# [TRANSITIVE_INCLUDES_ONLY] -# [MAX_LINE_LENGTH length] -# [NO_COMMENTS] -# [NO_FORWARD_DECLARATIONS] -# [CXX17_NAMESPACES] -# [QUOTED_INCLUDES_FIRST]) +# enable_target_iwyu(TargetName +# [KEEP pattern...] +# [MAPPING_FILE file] +# [NO_DEFAULT_MAPPINGS] +# [PCH_IN_CODE] +# [TRANSITIVE_INCLUDES_ONLY] +# [MAX_LINE_LENGTH length] +# [NO_COMMENTS] +# [NO_FORWARD_DECLARATIONS] +# [CXX17_NAMESPACES] +# [QUOTED_INCLUDES_FIRST]) # -function(set_target_iwyu target) +function(enable_target_iwyu target) _find_iwyu() _process_iwyu_arguments(1) - message(STATUS "Setting include-what-you-use for '${target}'") + message(STATUS "Enabling include-what-you-use for '${target}'") message(STATUS " Path: ${_iwyu_path}") message(STATUS " Arguments: ${_iwyu_args}") - message(STATUS "Setting include-what-you-use for '${target}' - done") + message(STATUS "Enabling include-what-you-use for '${target}' - done") set_target_properties(${target} PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path};${_iwyu_args}" @@ -118,25 +122,25 @@ function(set_target_iwyu target) endfunction() # -# set_target_iwyu([KEEP patterns...] -# [MAPPING_FILE file] -# [NO_DEFAULT_MAPPINGS] -# [PCH_IN_CODE] -# [TRANSITIVE_INCLUDES_ONLY] -# [MAX_LINE_LENGTH length] -# [NO_COMMENTS] -# [NO_FORWARD_DECLARATIONS] -# [CXX17_NAMESPACES] -# [QUOTED_INCLUDES_FIRST]) +# enable_target_iwyu([KEEP patterns...] +# [MAPPING_FILE file] +# [NO_DEFAULT_MAPPINGS] +# [PCH_IN_CODE] +# [TRANSITIVE_INCLUDES_ONLY] +# [MAX_LINE_LENGTH length] +# [NO_COMMENTS] +# [NO_FORWARD_DECLARATIONS] +# [CXX17_NAMESPACES] +# [QUOTED_INCLUDES_FIRST]) # -function(set_iwyu) +function(enable_iwyu) _find_iwyu() _process_iwyu_arguments(0) - message(STATUS "Setting include-what-you-use") + message(STATUS "Enabling include-what-you-use") message(STATUS " Path: ${_iwyu_path}") message(STATUS " Arguments: ${_iwyu_args}") - message(STATUS "Setting include-what-you-use - done") + message(STATUS "Enabling include-what-you-use - done") set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path};${_iwyu_args}" PARENT_SCOPE) endfunction() From 7b0730cf172176117c15737977bf535c8b2fdaa5 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 8 May 2021 18:28:49 +0200 Subject: [PATCH 25/59] build: ccache support added --- CMakeLists.txt | 4 + cmake/ccache.cmake | 193 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 cmake/ccache.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d36f11f..4dabb596 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,10 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(modern_project_structure) ensure_entry_point() +# use ccache if available +include(ccache) +enable_ccache_if_possible() + # set restrictive compilation warnings include(warnings) set_warnings() diff --git a/cmake/ccache.cmake b/cmake/ccache.cmake new file mode 100644 index 00000000..247ec0af --- /dev/null +++ b/cmake/ccache.cmake @@ -0,0 +1,193 @@ +# The MIT License (MIT) +# +# Copyright (c) 2017 Mateusz Pusz +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +cmake_minimum_required(VERSION 3.4) + +include(modern_project_structure) + +macro(_enable_ccache) + set(_options ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES ACCOUNT_FOR_PCH ACCOUNT_FOR_MODULES) + set(_one_value_args MODE BASE_DIR) + set(_multi_value_args PREFIXES) + cmake_parse_arguments(PARSE_ARGV 0 _enable_ccache "${_options}" "${_one_value_args}" "${_multi_value_args}") + + if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + message(FATAL_ERROR "'enable_ccache' function should be called from the top-level CMakeLists.txt file!") + # otherwise, it will not work for XCode + return() + endif() + + set(_ccacheEnv + CCACHE_CPP2=1 # avoids spurious warnings with some compilers for ccache older than 3.3 + # CCACHE_ABSSTDERR=1 # reverts absolute paths after applying CCACHE_BASEDIR + ) + + # validate and process arguments + if(_enable_ccache_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Invalid arguments '${_enable_ccache_UNPARSED_ARGUMENTS}'") + endif() + + if(_enable_ccache_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "No value provided for '${_enable_ccache_KEYWORDS_MISSING_VALUES}'") + endif() + + if(_enable_ccache_MODE) + set(_valid_mode_values DIRECT_PREPROCESSOR DIRECT_DEPEND PREPROCESSOR DEPEND) + if(NOT _enable_ccache_MODE IN_LIST _valid_mode_values) + message(FATAL_ERROR "'MODE' should be one of ${_valid_mode_values}") + endif() + endif() + + if(_enable_ccache_MODE STREQUAL DIRECT_DEPEND) + list(APPEND _ccacheEnv CCACHE_DIRECT=1 CCACHE_DEPEND=1) + elseif(_enable_ccache_MODE STREQUAL PREPROCESSOR) + list(APPEND _ccacheEnv CCACHE_NO_DIRECT=1 CCACHE_NO_DEPEND=1) + elseif(_enable_ccache_MODE STREQUAL DEPEND) + list(APPEND _ccacheEnv CCACHE_NO_DIRECT=1 CCACHE_DEPEND=1) + else() + set(_enable_ccache_MODE DIRECT_PREPROCESSOR) + list(APPEND _ccacheEnv CCACHE_DIRECT=1 CCACHE_NO_DEPEND=1) + endif() + + if(_enable_ccache_BASE_DIR) + if(NOT EXISTS ${_enable_ccache_BASE_DIR}) + message(FATAL_ERROR "Base directory '${_enable_ccache_BASE_DIR}' does not exist") + endif() + list(APPEND _ccacheEnv "CCACHE_BASEDIR=${_enable_ccache_BASE_DIR}") + else() + list(APPEND _ccacheEnv "CCACHE_BASEDIR=${CMAKE_SOURCE_DIR}") + endif() + + if(_enable_ccache_PREFIXES) + string(REPLACE ";" " " _prefixes_txt "${_enable_ccache_PREFIXES}") + list(APPEND _ccacheEnv "CCACHE_PREFIX=${_prefixes_txt}") + endif() + + if(_enable_ccache_ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES) + list(APPEND _sloppiness include_file_mtime include_file_ctime) + endif() + + if(_enable_ccache_ACCOUNT_FOR_PCH) + list(APPEND _sloppiness pch_defines time_macros include_file_mtime include_file_ctime) + endif() + + if(_enable_ccache_ACCOUNT_FOR_MODULES) + if(NOT _enable_ccache_MODE STREQUAL DIRECT_DEPEND) + message(FATAL_ERROR "DIRECT_DEPEND mode required with ACCOUNT_FOR_MODULES option") + endif() + list(APPEND _sloppiness modules) + endif() + + if(_sloppiness) + list(REMOVE_DUPLICATES _sloppiness) + string(REPLACE ";" "," _sloppiness_txt "${_sloppiness}") + list(APPEND _ccacheEnv "CCACHE_SLOPPINESS=${_sloppiness_txt}") + endif() + + message(STATUS "Enabling ccache with '${_ccacheEnv}'") + + if(CMAKE_GENERATOR MATCHES "Ninja|Makefiles") + foreach(_lang IN ITEMS C CXX OBJC OBJCXX CUDA) + set(CMAKE_${_lang}_COMPILER_LAUNCHER + ${CMAKE_COMMAND} -E env + ${_ccacheEnv} ${_ccache_path} + PARENT_SCOPE + ) + endforeach() + elseif(CMAKE_GENERATOR STREQUAL Xcode) + # Each of the Xcode project variables allow specifying only a single value, but the ccache command line needs to have multiple options. + # A separate launch script needs to be written out and the project variables pointed at them. + foreach(_lang IN ITEMS C CXX) + set(launch${_lang} ${CMAKE_BINARY_DIR}/launch-${_lang}) + file(WRITE ${launch${_lang}} "#!/bin/bash\n\n") + foreach(keyVal IN LISTS _ccacheEnv) + file(APPEND ${launch${_lang}} "export ${keyVal}\n") + endforeach() + file(APPEND ${launch${_lang}} + "exec \"${CCACHE_PROGRAM}\" " + "\"${CMAKE_${_lang}_COMPILER}\" \"$@\"\n" + ) + execute_process(COMMAND chmod a+rx ${launch${_lang}}) + endforeach() + set(CMAKE_XCODE_ATTRIBUTE_CC ${launchC} PARENT_SCOPE) + set(CMAKE_XCODE_ATTRIBUTE_CXX ${launchCXX} PARENT_SCOPE) + set(CMAKE_XCODE_ATTRIBUTE_LD ${launchC} PARENT_SCOPE) + set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS ${launchCXX} PARENT_SCOPE) + else() + message(WARNING "'${CMAKE_GENERATOR}' generator is not supported by ccache!") + return() + endif() +endmacro() + + +# +# enable_ccache([MODE DIRECT_PREPROCESSOR|DIRECT_DEPEND|PREPROCESSOR|DEPEND] # DIRECT_PREPROCESSOR by default +# [BASE_DIR dir] # ${CMAKE_SOURCE_DIR} by default +# [ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES] +# [ACCOUNT_FOR_PCH] +# [ACCOUNT_FOR_MODULES] +# [PREFIXES prefixes...]) +# +# BASE_DIR +# Set this option to ${CMAKE_BINARY_DIR} if you use FetchContent a lot for many projects with the same build options. +# Otherwise, if most of the sources come from the project itself then the default ${CMAKE_SOURCE_DIR} may be +# a better choice. +# +# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES +# Use it if some header files are being generated by the compilation process. +# +# ACCOUNT_FOR_PCH +# Use it if precompiled headers are enabled in your project. Automatically includes uses +# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES as well. +# See here for details: https://ccache.dev/manual/4.2.1.html#_precompiled_headers +# +# ACCOUNT_FOR_MODULES +# Use it for projects with C++20 modules. Requires DIRECT_DEPEND mode. +# +# PREFIXES +# A list of other tools that should be used together with ccache as a compiler launcher +# (i.e. distcc, icecc, sccache-dist, ...). +# +function(enable_ccache) + find_program(_ccache_path NAMES "ccache") + if(NOT _ccache_path) + message(FATAL_ERROR "'ccache' executable not found!") + return() + endif() + + _enable_ccache() +endfunction() + +function(enable_ccache_if_possible) + find_program(_ccache_path NAMES "ccache") + if(NOT _ccache_path) + message(STATUS "ccache support not enabled: the executable was not found") + return() + endif() + + if(NOT CMAKE_GENERATOR MATCHES "Ninja|Makefiles|Xcode") + message(STATUS "ccache support not enabled: unsupported generator '${CMAKE_GENERATOR}'") + return() + endif() + + _enable_ccache() +endfunction() From 0513d4f74bbfca38cef0fdb4f1c94caf6c44e923 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 8 May 2021 18:45:41 +0200 Subject: [PATCH 26/59] ci: ccache-action added to ci-conan --- .github/workflows/ci-conan.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 668e6559..24c63b15 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -78,6 +78,11 @@ jobs: downcast_mode: [ "on", "auto" ] steps: - uses: actions/checkout@v2 + - uses: hendrikmuhs/ccache-action@v1 + if: runner.os == 'Linux' + with: + key: ${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.build_type }} + max-size: 100M - name: Install Clang if: matrix.config.compiler.type == 'CLANG' shell: bash From c8d7138ad7628feaf5aa9ef5eb5ade810a1f1a31 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 8 May 2021 19:10:59 +0200 Subject: [PATCH 27/59] ci: `os` and `lib` added as cache keys for ccache action --- .github/workflows/ci-conan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 24c63b15..9333d97e 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -81,7 +81,7 @@ jobs: - uses: hendrikmuhs/ccache-action@v1 if: runner.os == 'Linux' with: - key: ${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.build_type }} + key: ${{ matrix.config.os }}-${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.config.lib }}-${{ matrix.build_type }} max-size: 100M - name: Install Clang if: matrix.config.compiler.type == 'CLANG' From 2bb305eef6c11b06a0371c7100c4803fcadab9ba Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 8 May 2021 19:53:01 +0200 Subject: [PATCH 28/59] ci: `downcast_mode` added to the cache key for ccache --- .github/workflows/ci-conan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 9333d97e..5de61acc 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -81,7 +81,7 @@ jobs: - uses: hendrikmuhs/ccache-action@v1 if: runner.os == 'Linux' with: - key: ${{ matrix.config.os }}-${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.config.lib }}-${{ matrix.build_type }} + key: ${{ matrix.config.os }}-${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.config.lib }}-${{ matrix.build_type }}-${{ matrix.downcast_mode }} max-size: 100M - name: Install Clang if: matrix.config.compiler.type == 'CLANG' From a739c104275c4aa9e1524ff55778ec7b5b946c91 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 8 May 2021 19:54:19 +0200 Subject: [PATCH 29/59] ci: ccache max cache size limited to 50MB --- .github/workflows/ci-conan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-conan.yml b/.github/workflows/ci-conan.yml index 5de61acc..84052ef7 100644 --- a/.github/workflows/ci-conan.yml +++ b/.github/workflows/ci-conan.yml @@ -82,7 +82,7 @@ jobs: if: runner.os == 'Linux' with: key: ${{ matrix.config.os }}-${{ matrix.config.compiler.type }}-${{ matrix.config.compiler.version }}-${{ matrix.config.lib }}-${{ matrix.build_type }}-${{ matrix.downcast_mode }} - max-size: 100M + max-size: 50M - name: Install Clang if: matrix.config.compiler.type == 'CLANG' shell: bash From cb5371dec90493e785780b3339339522f2fbd8b8 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 9 May 2021 13:49:16 +0200 Subject: [PATCH 30/59] build: `enable_ccache()` refactored --- CMakeLists.txt | 2 +- cmake/ccache.cmake | 170 ++++++++++++++++++++++++++------------------- 2 files changed, 101 insertions(+), 71 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4dabb596..63792cf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ ensure_entry_point() # use ccache if available include(ccache) -enable_ccache_if_possible() +enable_ccache() # set restrictive compilation warnings include(warnings) diff --git a/cmake/ccache.cmake b/cmake/ccache.cmake index 247ec0af..513b36a3 100644 --- a/cmake/ccache.cmake +++ b/cmake/ccache.cmake @@ -22,24 +22,54 @@ cmake_minimum_required(VERSION 3.4) -include(modern_project_structure) - -macro(_enable_ccache) - set(_options ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES ACCOUNT_FOR_PCH ACCOUNT_FOR_MODULES) - set(_one_value_args MODE BASE_DIR) - set(_multi_value_args PREFIXES) - cmake_parse_arguments(PARSE_ARGV 0 _enable_ccache "${_options}" "${_one_value_args}" "${_multi_value_args}") +macro(_enable_ccache_failed) + if(NOT _enable_ccache_QUIET) + message(STATUS "Enabling ccache - failed") + endif() + return() +endmacro() +# +# enable_ccache([PROGRAM] # ccache by default +# [QUIET] [REQUIRED] +# [MODE DIRECT_PREPROCESSOR|DIRECT_DEPEND|PREPROCESSOR|DEPEND] # DIRECT_PREPROCESSOR by default +# [BASE_DIR dir] # ${CMAKE_SOURCE_DIR} by default +# [ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES] +# [ACCOUNT_FOR_PCH] +# [ACCOUNT_FOR_MODULES] +# [PREFIXES prefixes...] +# ) +# +# BASE_DIR +# Set this option to ${CMAKE_BINARY_DIR} if you use FetchContent a lot for many projects with the same build options. +# Otherwise, if most of the sources come from the project itself then the default ${CMAKE_SOURCE_DIR} may be +# a better choice. +# +# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES +# Use it if some header files are being generated by the compilation process. +# +# ACCOUNT_FOR_PCH +# Use it if precompiled headers are enabled in your project. Automatically includes uses +# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES as well. +# See here for details: https://ccache.dev/manual/4.2.1.html#_precompiled_headers +# +# ACCOUNT_FOR_MODULES +# Use it for projects with C++20 modules. Requires DIRECT_DEPEND mode. +# +# PREFIXES +# A list of other tools that should be used together with ccache as a compiler launcher +# (i.e. distcc, icecc, sccache-dist, ...). +# +function(enable_ccache) if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) message(FATAL_ERROR "'enable_ccache' function should be called from the top-level CMakeLists.txt file!") # otherwise, it will not work for XCode - return() endif() - set(_ccacheEnv - CCACHE_CPP2=1 # avoids spurious warnings with some compilers for ccache older than 3.3 - # CCACHE_ABSSTDERR=1 # reverts absolute paths after applying CCACHE_BASEDIR - ) + set(_options QUIET REQUIRED ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES ACCOUNT_FOR_PCH ACCOUNT_FOR_MODULES) + set(_one_value_args PROGRAM MODE BASE_DIR) + set(_multi_value_args PREFIXES) + cmake_parse_arguments(PARSE_ARGV 0 _enable_ccache "${_options}" "${_one_value_args}" "${_multi_value_args}") # validate and process arguments if(_enable_ccache_UNPARSED_ARGUMENTS) @@ -57,6 +87,56 @@ macro(_enable_ccache) endif() endif() + if(NOT _enable_ccache_QUIET) + message(STATUS "Enabling ccache") + endif() + + if(${_enable_ccache_REQUIRED}) + set(_error_log_level FATAL_ERROR) + elseif(NOT _enable_ccache_QUIET) + set(_error_log_level STATUS) + endif() + + if(NOT CMAKE_GENERATOR MATCHES "Ninja|Makefiles|Xcode") + if(DEFINED _error_log_level) + message(${_error_log_level} "ccache support not enabled: unsupported generator '${CMAKE_GENERATOR}'") + endif() + _enable_ccache_failed() + endif() + + if(NOT DEFINED _enable_ccache_PROGRAM) + set(_enable_ccache_PROGRAM ccache) + endif() + + find_program(CCACHE_PATH ${_enable_ccache_PROGRAM}) + if(CCACHE_PATH) + if(NOT _enable_ccache_QUIET) + message(STATUS " Executable: ${CCACHE_PATH}") + endif() + + # get version number + execute_process(COMMAND "${CCACHE_PATH}" --version OUTPUT_VARIABLE _output) + string(REPLACE "\n" ";" _output "${_output}") + foreach(_line ${_output}) + string(REGEX REPLACE "ccache version ([\\.0-9]+)$" "\\1" _ccache_version "${_line}") + if(_ccache_version) + if(NOT _enable_ccache_QUIET) + message(STATUS " Version: ${_ccache_version}") + endif() + break() + endif() + endforeach() + else() + if(DEFINED _error_log_level) + message(${_error_log_level} " '${_enable_ccache_PROGRAM}' executable was not found") + endif() + _enable_ccache_failed() + endif() + + if("${_ccache_version}" VERSION_LESS 3.3.0) + list(APPEND _ccacheEnv CCACHE_CPP2=1) # avoids spurious warnings with some compilers for ccache older than 3.3 + endif() + if(_enable_ccache_MODE STREQUAL DIRECT_DEPEND) list(APPEND _ccacheEnv CCACHE_DIRECT=1 CCACHE_DEPEND=1) elseif(_enable_ccache_MODE STREQUAL PREPROCESSOR) @@ -69,6 +149,7 @@ macro(_enable_ccache) endif() if(_enable_ccache_BASE_DIR) + # CCACHE_ABSSTDERR=1 # reverts absolute paths after applying CCACHE_BASEDIR if(NOT EXISTS ${_enable_ccache_BASE_DIR}) message(FATAL_ERROR "Base directory '${_enable_ccache_BASE_DIR}' does not exist") endif() @@ -103,13 +184,15 @@ macro(_enable_ccache) list(APPEND _ccacheEnv "CCACHE_SLOPPINESS=${_sloppiness_txt}") endif() - message(STATUS "Enabling ccache with '${_ccacheEnv}'") + if(NOT _enable_ccache_QUIET) + message(STATUS " Environment: ${_ccacheEnv}") + endif() if(CMAKE_GENERATOR MATCHES "Ninja|Makefiles") foreach(_lang IN ITEMS C CXX OBJC OBJCXX CUDA) set(CMAKE_${_lang}_COMPILER_LAUNCHER ${CMAKE_COMMAND} -E env - ${_ccacheEnv} ${_ccache_path} + ${_ccacheEnv} ${CCACHE_PATH} PARENT_SCOPE ) endforeach() @@ -132,62 +215,9 @@ macro(_enable_ccache) set(CMAKE_XCODE_ATTRIBUTE_CXX ${launchCXX} PARENT_SCOPE) set(CMAKE_XCODE_ATTRIBUTE_LD ${launchC} PARENT_SCOPE) set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS ${launchCXX} PARENT_SCOPE) - else() - message(WARNING "'${CMAKE_GENERATOR}' generator is not supported by ccache!") - return() - endif() -endmacro() - - -# -# enable_ccache([MODE DIRECT_PREPROCESSOR|DIRECT_DEPEND|PREPROCESSOR|DEPEND] # DIRECT_PREPROCESSOR by default -# [BASE_DIR dir] # ${CMAKE_SOURCE_DIR} by default -# [ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES] -# [ACCOUNT_FOR_PCH] -# [ACCOUNT_FOR_MODULES] -# [PREFIXES prefixes...]) -# -# BASE_DIR -# Set this option to ${CMAKE_BINARY_DIR} if you use FetchContent a lot for many projects with the same build options. -# Otherwise, if most of the sources come from the project itself then the default ${CMAKE_SOURCE_DIR} may be -# a better choice. -# -# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES -# Use it if some header files are being generated by the compilation process. -# -# ACCOUNT_FOR_PCH -# Use it if precompiled headers are enabled in your project. Automatically includes uses -# ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES as well. -# See here for details: https://ccache.dev/manual/4.2.1.html#_precompiled_headers -# -# ACCOUNT_FOR_MODULES -# Use it for projects with C++20 modules. Requires DIRECT_DEPEND mode. -# -# PREFIXES -# A list of other tools that should be used together with ccache as a compiler launcher -# (i.e. distcc, icecc, sccache-dist, ...). -# -function(enable_ccache) - find_program(_ccache_path NAMES "ccache") - if(NOT _ccache_path) - message(FATAL_ERROR "'ccache' executable not found!") - return() endif() - _enable_ccache() -endfunction() - -function(enable_ccache_if_possible) - find_program(_ccache_path NAMES "ccache") - if(NOT _ccache_path) - message(STATUS "ccache support not enabled: the executable was not found") - return() - endif() - - if(NOT CMAKE_GENERATOR MATCHES "Ninja|Makefiles|Xcode") - message(STATUS "ccache support not enabled: unsupported generator '${CMAKE_GENERATOR}'") - return() - endif() - - _enable_ccache() + if(NOT _enable_ccache_QUIET) + message(STATUS "Enabling ccache - done") + endif() endfunction() From c1cf800bd1937d2f97dffc0b6751b9aef4e8564a Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 9 May 2021 14:43:32 +0200 Subject: [PATCH 31/59] build: PROGRAM, QUIET, and REQUIRED options added for `enable_iwyu()` --- cmake/include-what-you-use.cmake | 106 ++++++++++++++++++------------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/cmake/include-what-you-use.cmake b/cmake/include-what-you-use.cmake index a2360e47..41853ae6 100644 --- a/cmake/include-what-you-use.cmake +++ b/cmake/include-what-you-use.cmake @@ -30,14 +30,6 @@ endif() set(IWYU_VERBOSITY_LEVEL 3 CACHE STRING "IWYU verbosity level (the higher the level, the more output)") -macro(_find_iwyu) - find_program(_iwyu_path NAMES "include-what-you-use") - if(NOT _iwyu_path) - message(FATAL_ERROR "'include-what-you-use' executable not found!") - return() - endif() -endmacro() - macro(_iwyu_args_append arg) list(APPEND _iwyu_args "-Xiwyu" "${arg}") endmacro() @@ -48,9 +40,16 @@ macro(_iwyu_args_append_if_present option arg) endif() endmacro() -macro(_process_iwyu_arguments offset) - set(_options NO_DEFAULT_MAPPINGS PCH_IN_CODE TRANSITIVE_INCLUDES_ONLY NO_COMMENTS NO_FORWARD_DECLARATIONS CXX17_NAMESPACES QUOTED_INCLUDES_FIRST) - set(_one_value_args MAPPING_FILE MAX_LINE_LENGTH) +macro(_enable_iwyu_failed log_postfix) + if(NOT _enable_iwyu_QUIET) + message(STATUS "Enabling include-what-you-use${log_postfix} - failed") + endif() + return() +endmacro() + +macro(_process_iwyu_arguments offset log_postfix) + set(_options QUIET REQUIRED NO_DEFAULT_MAPPINGS PCH_IN_CODE TRANSITIVE_INCLUDES_ONLY NO_COMMENTS NO_FORWARD_DECLARATIONS CXX17_NAMESPACES QUOTED_INCLUDES_FIRST) + set(_one_value_args PROGRAM MAPPING_FILE MAX_LINE_LENGTH) set(_multi_value_args KEEP) cmake_parse_arguments(PARSE_ARGV ${offset} _enable_iwyu "${_options}" "${_one_value_args}" "${_multi_value_args}") @@ -63,6 +62,32 @@ macro(_process_iwyu_arguments offset) message(FATAL_ERROR "No value provided for '${_enable_iwyu_KEYWORDS_MISSING_VALUES}'") endif() + if(NOT _enable_iwyu_QUIET) + message(STATUS "Enabling include-what-you-use${log_postfix}") + endif() + + if(${_enable_iwyu_REQUIRED}) + set(_error_log_level FATAL_ERROR) + elseif(NOT _enable_iwyu_QUIET) + set(_error_log_level STATUS) + endif() + + if(NOT DEFINED _enable_iwyu_PROGRAM) + set(_enable_iwyu_PROGRAM include-what-you-use) + endif() + + find_program(IWYU_PATH ${_enable_iwyu_PROGRAM}) + if(IWYU_PATH) + if(NOT _enable_iwyu_QUIET) + message(STATUS " Executable: ${IWYU_PATH}") + endif() + else() + if(DEFINED _error_log_level) + message(${_error_log_level} " '${_enable_iwyu_PROGRAM}' executable was not found") + endif() + _enable_iwyu_failed("${log_postfix}") + endif() + if(_enable_iwyu_KEEP) foreach(_pattern ${_enable_iwyu_KEEP}) _iwyu_args_append("--keep=${_pattern}") @@ -92,10 +117,36 @@ macro(_process_iwyu_arguments offset) _iwyu_args_append_if_present(QUOTED_INCLUDES_FIRST "--quoted_includes_first") _iwyu_args_append("--verbose=${IWYU_VERBOSITY_LEVEL}") + + if(NOT _enable_iwyu_QUIET) + message(STATUS " Arguments: ${_iwyu_args}") + message(STATUS "Enabling include-what-you-use${log_postfix} - done") + endif() endmacro() +# +# enable_iwyu([PROGRAM] # include-what-you-use by default +# [QUIET] [REQUIRED] +# [KEEP patterns...] +# [MAPPING_FILE file] +# [NO_DEFAULT_MAPPINGS] +# [PCH_IN_CODE] +# [TRANSITIVE_INCLUDES_ONLY] +# [MAX_LINE_LENGTH length] +# [NO_COMMENTS] +# [NO_FORWARD_DECLARATIONS] +# [CXX17_NAMESPACES] +# [QUOTED_INCLUDES_FIRST]) +# +function(enable_iwyu) + _process_iwyu_arguments(0 "") + set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path};${_iwyu_args}" PARENT_SCOPE) +endfunction() + # # enable_target_iwyu(TargetName +# [PROGRAM] # include-what-you-use by default +# [QUIET] [REQUIRED] # [KEEP pattern...] # [MAPPING_FILE file] # [NO_DEFAULT_MAPPINGS] @@ -108,39 +159,8 @@ endmacro() # [QUOTED_INCLUDES_FIRST]) # function(enable_target_iwyu target) - _find_iwyu() - _process_iwyu_arguments(1) - - message(STATUS "Enabling include-what-you-use for '${target}'") - message(STATUS " Path: ${_iwyu_path}") - message(STATUS " Arguments: ${_iwyu_args}") - message(STATUS "Enabling include-what-you-use for '${target}' - done") - + _process_iwyu_arguments(1 " for '${target}'") set_target_properties(${target} PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path};${_iwyu_args}" ) endfunction() - -# -# enable_target_iwyu([KEEP patterns...] -# [MAPPING_FILE file] -# [NO_DEFAULT_MAPPINGS] -# [PCH_IN_CODE] -# [TRANSITIVE_INCLUDES_ONLY] -# [MAX_LINE_LENGTH length] -# [NO_COMMENTS] -# [NO_FORWARD_DECLARATIONS] -# [CXX17_NAMESPACES] -# [QUOTED_INCLUDES_FIRST]) -# -function(enable_iwyu) - _find_iwyu() - _process_iwyu_arguments(0) - - message(STATUS "Enabling include-what-you-use") - message(STATUS " Path: ${_iwyu_path}") - message(STATUS " Arguments: ${_iwyu_args}") - message(STATUS "Enabling include-what-you-use - done") - - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path};${_iwyu_args}" PARENT_SCOPE) -endfunction() From 2c8c6c2e98485a07b2fb2f6df4de2a2511c994c6 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 9 May 2021 15:52:20 +0200 Subject: [PATCH 32/59] refactor: quantity cration helpers are not opt-out rather than opt-in Resolves #277 --- README.md | 10 ++---- docs/CHANGELOG.md | 2 +- docs/Doxyfile.in | 12 ------- docs/framework/quantities.rst | 32 +++++++++++-------- docs/quick_start.rst | 10 ++---- example/aliases/CMakeLists.txt | 10 ++++-- example/hello_units.cpp | 4 --- example/kalman_filter/CMakeLists.txt | 5 ++- example/literals/CMakeLists.txt | 10 ++++-- example/references/CMakeLists.txt | 10 ++++-- src/core/include/units/generic/angle.h | 8 ++--- .../units/isq/iec80000/modulation_rate.h | 12 +++---- .../units/isq/iec80000/storage_capacity.h | 12 +++---- .../units/isq/iec80000/traffic_intensity.h | 12 +++---- .../units/isq/iec80000/transfer_rate.h | 8 ++--- .../include/units/isq/natural/acceleration.h | 8 ++--- .../include/units/isq/natural/energy.h | 8 ++--- .../include/units/isq/natural/force.h | 8 ++--- .../include/units/isq/natural/length.h | 8 ++--- .../include/units/isq/natural/mass.h | 8 ++--- .../include/units/isq/natural/momentum.h | 8 ++--- .../include/units/isq/natural/time.h | 8 ++--- .../include/units/isq/si/cgs/acceleration.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/area.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/energy.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/force.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/length.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/mass.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/power.h | 8 ++--- .../include/units/isq/si/cgs/pressure.h | 12 +++---- .../si-cgs/include/units/isq/si/cgs/speed.h | 8 ++--- .../si-cgs/include/units/isq/si/cgs/time.h | 12 +++---- .../include/units/isq/si/fps/acceleration.h | 8 ++--- .../si-fps/include/units/isq/si/fps/area.h | 12 +++---- .../si-fps/include/units/isq/si/fps/density.h | 8 ++--- .../si-fps/include/units/isq/si/fps/energy.h | 8 ++--- .../si-fps/include/units/isq/si/fps/force.h | 12 +++---- .../si-fps/include/units/isq/si/fps/length.h | 12 +++---- .../si-fps/include/units/isq/si/fps/mass.h | 12 +++---- .../si-fps/include/units/isq/si/fps/power.h | 12 +++---- .../include/units/isq/si/fps/pressure.h | 12 +++---- .../si-fps/include/units/isq/si/fps/speed.h | 12 +++---- .../si-fps/include/units/isq/si/fps/time.h | 12 +++---- .../si-fps/include/units/isq/si/fps/volume.h | 12 +++---- .../si-iau/include/units/isq/si/iau/length.h | 12 +++---- .../include/units/isq/si/imperial/length.h | 12 +++---- .../include/units/isq/si/international/area.h | 12 +++---- .../units/isq/si/international/length.h | 12 +++---- .../units/isq/si/international/speed.h | 8 ++--- .../units/isq/si/international/volume.h | 12 +++---- .../include/units/isq/si/typographic/length.h | 12 +++---- .../include/units/isq/si/uscs/length.h | 12 +++---- .../si/include/units/isq/si/absorbed_dose.h | 12 +++---- .../si/include/units/isq/si/acceleration.h | 8 ++--- .../units/isq/si/amount_of_substance.h | 12 +++---- .../include/units/isq/si/angular_velocity.h | 8 ++--- src/systems/si/include/units/isq/si/area.h | 12 +++---- .../si/include/units/isq/si/capacitance.h | 12 +++---- .../include/units/isq/si/catalytic_activity.h | 12 +++---- .../si/include/units/isq/si/charge_density.h | 8 ++--- .../si/include/units/isq/si/concentration.h | 8 ++--- .../si/include/units/isq/si/conductance.h | 12 +++---- .../si/include/units/isq/si/current_density.h | 8 ++--- src/systems/si/include/units/isq/si/density.h | 8 ++--- .../include/units/isq/si/dynamic_viscosity.h | 8 ++--- .../si/include/units/isq/si/electric_charge.h | 12 +++---- .../include/units/isq/si/electric_current.h | 12 +++---- .../units/isq/si/electric_field_strength.h | 8 ++--- src/systems/si/include/units/isq/si/energy.h | 12 +++---- .../si/include/units/isq/si/energy_density.h | 8 ++--- src/systems/si/include/units/isq/si/force.h | 12 +++---- .../si/include/units/isq/si/frequency.h | 12 +++---- .../si/include/units/isq/si/heat_capacity.h | 8 ++--- .../si/include/units/isq/si/inductance.h | 12 +++---- src/systems/si/include/units/isq/si/length.h | 12 +++---- .../si/include/units/isq/si/luminance.h | 8 ++--- .../include/units/isq/si/luminous_intensity.h | 12 +++---- .../si/include/units/isq/si/magnetic_flux.h | 12 +++---- .../include/units/isq/si/magnetic_induction.h | 12 +++---- src/systems/si/include/units/isq/si/mass.h | 12 +++---- .../si/include/units/isq/si/molar_energy.h | 8 ++--- .../si/include/units/isq/si/momentum.h | 8 ++--- .../si/include/units/isq/si/permeability.h | 8 ++--- .../si/include/units/isq/si/permittivity.h | 8 ++--- src/systems/si/include/units/isq/si/power.h | 12 +++---- .../si/include/units/isq/si/pressure.h | 12 +++---- .../si/include/units/isq/si/radioactivity.h | 12 +++---- .../si/include/units/isq/si/resistance.h | 12 +++---- src/systems/si/include/units/isq/si/speed.h | 8 ++--- .../si/include/units/isq/si/surface_tension.h | 8 ++--- .../units/isq/si/thermal_conductivity.h | 8 ++--- .../units/isq/si/thermodynamic_temperature.h | 12 +++---- src/systems/si/include/units/isq/si/time.h | 12 +++---- src/systems/si/include/units/isq/si/torque.h | 8 ++--- src/systems/si/include/units/isq/si/voltage.h | 12 +++---- src/systems/si/include/units/isq/si/volume.h | 12 +++---- test/unit_test/runtime/CMakeLists.txt | 5 --- test/unit_test/static/CMakeLists.txt | 10 ------ test_package/CMakeLists.txt | 1 - 99 files changed, 500 insertions(+), 517 deletions(-) diff --git a/README.md b/README.md index ccaf92f5..d9443a3f 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,6 @@ analysis and unit/quantity manipulation. The basic idea and design heavily bases Here is a small example of possible operations: ```cpp -#define UNITS_REFERENCES - #include #include #include @@ -58,7 +56,7 @@ static_assert(10 * km / (5 * km) == 2); static_assert(1000 / (1 * s) == 1 * kHz); ``` -_Try it on the [Compiler Explorer](https://godbolt.org/z/53bTahKd8)._ +_Try it on the [Compiler Explorer](https://godbolt.org/z/5dvY8Woh1)._ This library requires some C++20 features (concepts, classes as NTTPs, ...). Thanks to them the user gets a powerful but still easy to use interface and all unit conversions @@ -66,10 +64,6 @@ and dimensional analysis can be performed without sacrificing on accuracy. Pleas the below example for a quick preview of basic library features: ```cpp -#define UNITS_ALIASES -#define UNITS_LITERALS -#define UNITS_REFERENCES - #include #include #include @@ -115,4 +109,4 @@ int main() } ``` -_Try it on the [Compiler Explorer](https://godbolt.org/z/jKnPPPEx6)._ +_Try it on the [Compiler Explorer](https://godbolt.org/z/9fnzfbhb6)._ diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 04f81942..97b01415 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,7 +6,6 @@ - (!) refactor: Refactored the library file tree - (!) refactor: `quantity::count()` renamed to `quantity::number()` - (!) refactor: `data` system renamed to `isq::iec80000` (quantity names renamed too) - - (!) refactor: quantity UDLs support has to be enabled with `UNITS_LITERALS` preprocessor define - refactor: quantity (kind) point updated to reflect latest changes to `quantity` - refactor: basic concepts, `quantity` and `quantity_cast` refactored - refactor: `abs()` definition refactored to be more explicit about the return type @@ -17,6 +16,7 @@ - feat: CTAD for dimensionless quantity added - feat: `modulation_rate` support added (thanks [@go2sh](https://github.com/go2sh)) - feat: SI prefixes for `isq::iec80000` support added (thanks [@go2sh](https://github.com/go2sh)) + - feat: a possibility to disable quantity UDLs support with `UNITS_NO_LITERALS` preprocessor define - perf: preconditions check do not influence the runtime performance of a Release build - perf: `quantity_cast()` generates less assembly instructions - perf: temporary string creation removed from `quantity::op<<()` diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index ce627992..9dec7d17 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -91,15 +91,3 @@ WARN_AS_ERROR = NO # The default value is: NO. QUIET = YES - -# The PREDEFINED tag can be used to specify one or more macro names that are -# defined before the preprocessor is started (similar to the -D option of e.g. -# gcc). The argument of the tag is a list of macros of the form: name or -# name=definition (no spaces). If the definition and the "=" are omitted, "=1" -# is assumed. To prevent a macro definition from being undefined via #undef or -# recursively expanded use the := operator instead of the = operator. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -PREDEFINED = UNITS_REFERENCES \ - UNITS_LITERALS \ - UNITS_ALIASES diff --git a/docs/framework/quantities.rst b/docs/framework/quantities.rst index 23786c50..ea880ac2 100644 --- a/docs/framework/quantities.rst +++ b/docs/framework/quantities.rst @@ -70,7 +70,7 @@ Unit-Specific Aliases (Experimental) Additionally to the dimension-specific aliases there are also ones provided for each and every :term:`unit` in the library:: - #ifdef UNITS_ALIASES + #ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline length { @@ -86,7 +86,7 @@ each and every :term:`unit` in the library:: } - #endif // UNITS_ALIASES + #endif // UNITS_NO_ALIASES Using the above our code can look as follows:: @@ -116,7 +116,7 @@ Quantity References (Experimental) Quantity References provide an alternative and simplified way to create quantities. They are defined using the `reference` class template:: - #ifdef UNITS_REFERENCES + #ifndef UNITS_NO_REFERENCES namespace length_references { @@ -131,7 +131,7 @@ They are defined using the `reference` class template:: } // namespace references - #endif // UNITS_REFERENCES + #endif // UNITS_NO_REFERENCES With the above our code can look as follows:: @@ -157,7 +157,7 @@ User Defined Literals (Experimental) Alternatively, to construct quantities with compile-time known values the library provides :abbr:`UDL (User Defined Literal)` s for each :term:`unit` of every :term:`dimension`:: - #ifdef UNITS_LITERALS + #ifndef UNITS_NO_LITERALS inline namespace literals { @@ -169,7 +169,7 @@ Alternatively, to construct quantities with compile-time known values the librar } - #endif // UNITS_LITERALS + #endif // UNITS_NO_LITERALS Thanks to them the same code can be as simple as:: @@ -185,13 +185,6 @@ Thanks to them the same code can be as simple as:: language (i.e. ``F`` (farad), ``J`` (joule), ``W`` (watt), ``K`` (kelvin), ``d`` (day), ``l`` or ``L`` (litre), ``erg``, ``ergps``). This is why the ``_q_`` prefix was consistently applied to all the UDLs. - -.. important:: - - As one can read in the next section UDLs, are considered to be inferior to `Quantity References`_ - and their definition affects compile-time performance a lot. This is why they are an opt-in feature - of the library and in order to use them one has to provide a `UNITS_LITERALS` preprocessor definition. - UDLs vs Quantity References +++++++++++++++++++++++++++ @@ -473,6 +466,19 @@ Summary +-----------------------------------------------+-------------+------------+---------------+ +Don't pay for what you don't use (compile-time performance) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +As noted in the previous chapter, each quantity creation helper has a different impact on the compile-time +performance. Aliases tend to be the fastest to compile but even their definition can be expensive for some +if it is not used in the source code. This is why it is possible to opt-out from each or every quantity +creation helper with the following preprocessor defines:: + + #define UNITS_NO_ALIASES + #define UNITS_NO_REFERENCES + #define UNITS_NO_LITERALS + + Dimension-specific Concepts --------------------------- diff --git a/docs/quick_start.rst b/docs/quick_start.rst index cced0d9b..54168803 100644 --- a/docs/quick_start.rst +++ b/docs/quick_start.rst @@ -3,8 +3,6 @@ Quick Start Here is a small example of possible operations:: - #define UNITS_REFERENCES - #include #include #include @@ -34,7 +32,7 @@ Here is a small example of possible operations:: .. admonition:: Try it on Compiler Explorer - `Example #1 `_ + `Example #1 `_ This library requires some C++20 features (concepts, classes as :abbr:`NTTP (Non-Type Template Parameter)`, ...). Thanks to them the user gets a powerful @@ -42,10 +40,6 @@ but still easy to use interface where all unit conversions and dimensional analy performed without sacrificing on accuracy. Please see the below example for a quick preview of basic library features:: - #define UNITS_ALIASES - #define UNITS_LITERALS - #define UNITS_REFERENCES - #include #include #include @@ -92,7 +86,7 @@ of basic library features:: .. admonition:: Try it on Compiler Explorer - `Example #2 `_ + `Example #2 `_ .. seealso:: diff --git a/example/aliases/CMakeLists.txt b/example/aliases/CMakeLists.txt index a65f3e4d..331b6a84 100644 --- a/example/aliases/CMakeLists.txt +++ b/example/aliases/CMakeLists.txt @@ -28,7 +28,10 @@ cmake_minimum_required(VERSION 3.2) function(add_example target) add_executable(${target}-aliases ${target}.cpp) target_link_libraries(${target}-aliases PRIVATE ${ARGN}) - target_compile_definitions(${target}-aliases PRIVATE UNITS_ALIASES) + target_compile_definitions(${target}-aliases PRIVATE + UNITS_NO_LITERALS + UNITS_NO_REFERENCES + ) endfunction() add_example(avg_speed mp-units::core-io mp-units::si mp-units::si-cgs mp-units::si-international) @@ -43,7 +46,10 @@ add_example(unknown_dimension mp-units::core-io mp-units::si) if(NOT UNITS_LIBCXX) add_example(glide_computer_example mp-units::core-fmt mp-units::si-international glide_computer) - target_compile_definitions(glide_computer_example-aliases PRIVATE UNITS_REFERENCES) + target_compile_definitions(glide_computer_example-aliases PRIVATE + UNITS_NO_LITERALS + UNITS_NO_REFERENCES + ) find_package(linear_algebra CONFIG REQUIRED) add_example(linear_algebra mp-units::core-fmt mp-units::core-io mp-units::si) diff --git a/example/hello_units.cpp b/example/hello_units.cpp index f7b22988..ec1713fa 100644 --- a/example/hello_units.cpp +++ b/example/hello_units.cpp @@ -20,10 +20,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#define UNITS_ALIASES -#define UNITS_LITERALS -#define UNITS_REFERENCES - #include #include #include // IWYU pragma: keep diff --git a/example/kalman_filter/CMakeLists.txt b/example/kalman_filter/CMakeLists.txt index 2ee45504..d170256a 100644 --- a/example/kalman_filter/CMakeLists.txt +++ b/example/kalman_filter/CMakeLists.txt @@ -28,7 +28,10 @@ cmake_minimum_required(VERSION 3.2) function(add_example target) add_executable(${target} ${target}.cpp) target_link_libraries(${target} PRIVATE ${ARGN}) - target_compile_definitions(${target} PRIVATE UNITS_REFERENCES) + target_compile_definitions(${target} PRIVATE + UNITS_NO_LITERALS + UNITS_NO_ALIASES + ) endfunction() add_example(kalman_filter-example_1 mp-units::core-fmt mp-units::si) diff --git a/example/literals/CMakeLists.txt b/example/literals/CMakeLists.txt index 8ac70781..676c8296 100644 --- a/example/literals/CMakeLists.txt +++ b/example/literals/CMakeLists.txt @@ -28,7 +28,10 @@ cmake_minimum_required(VERSION 3.2) function(add_example target) add_executable(${target}-literals ${target}.cpp) target_link_libraries(${target}-literals PRIVATE ${ARGN}) - target_compile_definitions(${target}-literals PRIVATE UNITS_LITERALS) + target_compile_definitions(${target}-literals PRIVATE + UNITS_NO_REFERENCES + UNITS_NO_ALIASES + ) endfunction() add_example(avg_speed mp-units::core-io mp-units::si mp-units::si-cgs mp-units::si-international) @@ -42,7 +45,10 @@ add_example(unknown_dimension mp-units::core-io mp-units::si) if(NOT UNITS_LIBCXX) add_example(glide_computer_example mp-units::core-fmt mp-units::si-international glide_computer) - target_compile_definitions(glide_computer_example-literals PRIVATE UNITS_LITERALS) + target_compile_definitions(glide_computer_example-literals PRIVATE + UNITS_NO_REFERENCES + UNITS_NO_ALIASES + ) find_package(linear_algebra CONFIG REQUIRED) add_example(linear_algebra mp-units::core-fmt mp-units::core-io mp-units::si) diff --git a/example/references/CMakeLists.txt b/example/references/CMakeLists.txt index b7cb5c65..56054880 100644 --- a/example/references/CMakeLists.txt +++ b/example/references/CMakeLists.txt @@ -28,7 +28,10 @@ cmake_minimum_required(VERSION 3.2) function(add_example target) add_executable(${target}-references ${target}.cpp) target_link_libraries(${target}-references PRIVATE ${ARGN}) - target_compile_definitions(${target}-references PRIVATE UNITS_REFERENCES) + target_compile_definitions(${target}-references PRIVATE + UNITS_NO_LITERALS + UNITS_NO_ALIASES + ) endfunction() add_example(avg_speed mp-units::core-io mp-units::si mp-units::si-cgs mp-units::si-international) @@ -42,7 +45,10 @@ add_example(unknown_dimension mp-units::core-io mp-units::si) if(NOT UNITS_LIBCXX) add_example(glide_computer_example mp-units::core-fmt mp-units::si-international glide_computer) - target_compile_definitions(glide_computer_example-references PRIVATE UNITS_REFERENCES) + target_compile_definitions(glide_computer_example-references PRIVATE + UNITS_NO_LITERALS + UNITS_NO_ALIASES + ) find_package(linear_algebra CONFIG REQUIRED) add_example(linear_algebra mp-units::core-fmt mp-units::core-io mp-units::si) diff --git a/src/core/include/units/generic/angle.h b/src/core/include/units/generic/angle.h index 76bd1f51..00c723dc 100644 --- a/src/core/include/units/generic/angle.h +++ b/src/core/include/units/generic/angle.h @@ -43,7 +43,7 @@ concept Angle = QuantityOfT; template> U, Representation Rep = double> using angle = quantity, U, Rep>; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -53,9 +53,9 @@ constexpr auto operator"" _q_rad(long double l) { return angle U, Representation Rep = double> using modulation_rate = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -66,9 +66,9 @@ constexpr auto operator"" _q_YBd(unsigned long long l) { gsl_ExpectsAudit(std::i } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace modulation_rate_references { @@ -90,11 +90,11 @@ using namespace modulation_rate_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::iec80000 -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::iec80000::inline modulation_rate { @@ -110,4 +110,4 @@ template using YBd = units::isq::iec80000::modulati } // namespace units::aliases::isq::iec80000::inline modulation_rate -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-iec80000/include/units/isq/iec80000/storage_capacity.h b/src/systems/isq-iec80000/include/units/isq/iec80000/storage_capacity.h index 7a6e6cd5..7b1c0a2f 100644 --- a/src/systems/isq-iec80000/include/units/isq/iec80000/storage_capacity.h +++ b/src/systems/isq-iec80000/include/units/isq/iec80000/storage_capacity.h @@ -79,7 +79,7 @@ concept StorageCapacity = QuantityOf; template U, Representation Rep = double> using storage_capacity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -123,9 +123,9 @@ constexpr auto operator"" _q_PiB(unsigned long long l) { gsl_ExpectsAudit(std::i } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace storage_capacity_references { @@ -175,11 +175,11 @@ using namespace storage_capacity_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::iec80000 -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::iec80000::inline storage_capacity { @@ -223,4 +223,4 @@ template using PiB = units::isq::iec80000::storage_ } // namespace units::aliases::isq::iec80000::inline storage_capacity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-iec80000/include/units/isq/iec80000/traffic_intensity.h b/src/systems/isq-iec80000/include/units/isq/iec80000/traffic_intensity.h index 541aa505..15b4fa18 100644 --- a/src/systems/isq-iec80000/include/units/isq/iec80000/traffic_intensity.h +++ b/src/systems/isq-iec80000/include/units/isq/iec80000/traffic_intensity.h @@ -43,7 +43,7 @@ concept TrafficIntensity = QuantityOf; template U, Representation Rep = double> using traffic_intensity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,9 +51,9 @@ constexpr auto operator"" _q_E(unsigned long long l) { gsl_ExpectsAudit(std::in_ } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace traffic_intensity_references { @@ -67,11 +67,11 @@ using namespace traffic_intensity_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::iec80000 -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::iec80000::inline traffic_intensity { @@ -79,4 +79,4 @@ template using E = units::isq::iec80000::traffic_in } // namespace units::aliases::isq::iec80000::inline traffic_intensity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h b/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h index 29f4248a..06c8ab63 100644 --- a/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h +++ b/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h @@ -52,7 +52,7 @@ concept TransferRate = QuantityOf; template U, Representation Rep = double> using transfer_rate = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -68,11 +68,11 @@ constexpr auto operator"" _q_YB_per_s(unsigned long long l) { gsl_ExpectsAudit(s } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::iec80000 -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::iec80000::inline transfer_rate { @@ -88,4 +88,4 @@ template using YB_per_s = units::isq::iec80000::tra } // namespace units::aliases::isq::iec80000::inline transfer_rate -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-natural/include/units/isq/natural/acceleration.h b/src/systems/isq-natural/include/units/isq/natural/acceleration.h index 735cad68..35f765eb 100644 --- a/src/systems/isq-natural/include/units/isq/natural/acceleration.h +++ b/src/systems/isq-natural/include/units/isq/natural/acceleration.h @@ -40,7 +40,7 @@ struct dim_acceleration : isq::dim_acceleration U, Representation Rep = double> using acceleration = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace acceleration_references { @@ -54,11 +54,11 @@ using namespace acceleration_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline acceleration { @@ -66,4 +66,4 @@ template using GeV = units::isq::natural::accelerat } // namespace units::aliases::isq::natural::inline acceleration -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-natural/include/units/isq/natural/energy.h b/src/systems/isq-natural/include/units/isq/natural/energy.h index f5f9db3d..9924af00 100644 --- a/src/systems/isq-natural/include/units/isq/natural/energy.h +++ b/src/systems/isq-natural/include/units/isq/natural/energy.h @@ -40,7 +40,7 @@ struct dim_energy : isq::dim_energy U, Representation Rep = double> using energy = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace energy_references { @@ -54,11 +54,11 @@ using namespace energy_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline energy { @@ -66,4 +66,4 @@ template using GeV = units::isq::natural::energy U, Representation Rep = double> using force = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace force_references { @@ -54,11 +54,11 @@ using namespace force_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline force { @@ -66,4 +66,4 @@ template using GeV2 = units::isq::natural::force {}; template U, Representation Rep = double> using length = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace length_references { @@ -51,11 +51,11 @@ using namespace length_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline length { @@ -63,4 +63,4 @@ template using inv_GeV = units::isq::natural::lengt } // namespace units::aliases::isq::natural::inline length -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-natural/include/units/isq/natural/mass.h b/src/systems/isq-natural/include/units/isq/natural/mass.h index 7efca445..55d8a24f 100644 --- a/src/systems/isq-natural/include/units/isq/natural/mass.h +++ b/src/systems/isq-natural/include/units/isq/natural/mass.h @@ -37,7 +37,7 @@ struct dim_mass : isq::dim_mass {}; template U, Representation Rep = double> using mass = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace mass_references { @@ -51,11 +51,11 @@ using namespace mass_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline mass { @@ -63,4 +63,4 @@ template using GeV = units::isq::natural::mass U, Representation Rep = double> using momentum = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace momentum_references { @@ -54,11 +54,11 @@ using namespace momentum_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline momentum { @@ -66,4 +66,4 @@ template using GeV = units::isq::natural::momentum< } // namespace units::aliases::isq::natural::inline momentum -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/isq-natural/include/units/isq/natural/time.h b/src/systems/isq-natural/include/units/isq/natural/time.h index 8c98870d..ea903166 100644 --- a/src/systems/isq-natural/include/units/isq/natural/time.h +++ b/src/systems/isq-natural/include/units/isq/natural/time.h @@ -37,7 +37,7 @@ struct dim_time : isq::dim_time {}; template U, Representation Rep = double> using time = quantity; -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace time_references { @@ -51,11 +51,11 @@ using namespace time_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::natural -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::natural::inline time { @@ -63,4 +63,4 @@ template using inv_GeV = units::isq::natural::time< } // namespace units::aliases::isq::natural::inline time -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-cgs/include/units/isq/si/cgs/acceleration.h b/src/systems/si-cgs/include/units/isq/si/cgs/acceleration.h index fd349032..26c5aea2 100644 --- a/src/systems/si-cgs/include/units/isq/si/cgs/acceleration.h +++ b/src/systems/si-cgs/include/units/isq/si/cgs/acceleration.h @@ -40,7 +40,7 @@ struct dim_acceleration : isq::dim_acceleration U, Representation Rep = double> using acceleration = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,9 +50,9 @@ constexpr auto operator"" _q_Gal(long double l) { return acceleration using Gal = units::isq::si::cgs::accelerat } // namespace units::aliases::isq::si::cgs::inline acceleration -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-cgs/include/units/isq/si/cgs/area.h b/src/systems/si-cgs/include/units/isq/si/cgs/area.h index 5f0f1495..ceb567ae 100644 --- a/src/systems/si-cgs/include/units/isq/si/cgs/area.h +++ b/src/systems/si-cgs/include/units/isq/si/cgs/area.h @@ -42,7 +42,7 @@ struct dim_area : isq::dim_area {}; template U, Representation Rep = double> using area = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,9 +52,9 @@ constexpr auto operator"" _q_cm2(long double l) { return area using cm2 = units::isq::si::cgs::area {}; template U, Representation Rep = double> using energy = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,9 +52,9 @@ constexpr auto operator"" _q_erg(long double l) { return energy using erg = units::isq::si::cgs::energy { template U, Representation Rep = double> using force = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -53,9 +53,9 @@ constexpr auto operator"" _q_dyn(long double l) { return force using dyn = units::isq::si::cgs::force {}; template U, Representation Rep = double> using length = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,9 +51,9 @@ constexpr auto operator"" _q_cm(long double l) { return length using cm = units::isq::si::cgs::length {}; template U, Representation Rep = double> using mass = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,9 +51,9 @@ constexpr auto operator"" _q_g(long double l) { return mass(l } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace mass_references { @@ -67,11 +67,11 @@ using namespace mass_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::si::cgs -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::cgs::inline mass { @@ -79,4 +79,4 @@ template using g = units::isq::si::cgs::mass U, Representation Rep = double> using power = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_erg_per_s(long double l) { return power using erg_per_s = units::isq::si::cgs::pow } // namespace units::aliases::isq::si::cgs::inline power -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-cgs/include/units/isq/si/cgs/pressure.h b/src/systems/si-cgs/include/units/isq/si/cgs/pressure.h index d10ec70c..cae347e9 100644 --- a/src/systems/si-cgs/include/units/isq/si/cgs/pressure.h +++ b/src/systems/si-cgs/include/units/isq/si/cgs/pressure.h @@ -43,7 +43,7 @@ struct dim_pressure : isq::dim_pressure U, Representation Rep = double> using pressure = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -53,9 +53,9 @@ constexpr auto operator"" _q_Ba(long double l) { return pressure using Ba = units::isq::si::cgs::pressure U, Representation Rep = double> using speed = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_cm_per_s(long double l) { return speed using cm_per_s = units::isq::si::cgs::spee } // namespace units::aliases::isq::si::cgs::inline speed -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-cgs/include/units/isq/si/cgs/time.h b/src/systems/si-cgs/include/units/isq/si/cgs/time.h index b3b0c1c4..f721c5b7 100644 --- a/src/systems/si-cgs/include/units/isq/si/cgs/time.h +++ b/src/systems/si-cgs/include/units/isq/si/cgs/time.h @@ -37,7 +37,7 @@ using si::second; using si::dim_time; using si::time; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -45,9 +45,9 @@ using si::literals::operator"" _q_s; } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace time_references { @@ -61,11 +61,11 @@ using namespace time_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::si::cgs -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::cgs::inline time { @@ -73,4 +73,4 @@ using namespace units::aliases::isq::si::time; } // namespace units::aliases::isq::si::cgs::inline time -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/acceleration.h b/src/systems/si-fps/include/units/isq/si/fps/acceleration.h index e6587f58..507495e7 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/acceleration.h +++ b/src/systems/si-fps/include/units/isq/si/fps/acceleration.h @@ -39,7 +39,7 @@ struct dim_acceleration : isq::dim_acceleration U, Representation Rep = double> using acceleration = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -49,11 +49,11 @@ constexpr auto operator"" _q_ft_per_s2(long double l) { return acceleration using ft_per_s2 = units::isq::si::fps::acc } // namespace units::aliases::isq::si::fps::inline acceleration -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/area.h b/src/systems/si-fps/include/units/isq/si/fps/area.h index 2f967eb2..d02e5732 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/area.h +++ b/src/systems/si-fps/include/units/isq/si/fps/area.h @@ -41,7 +41,7 @@ struct dim_area : isq::dim_area {}; template U, Representation Rep = double> using area = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,9 +51,9 @@ constexpr auto operator"" _q_ft2(long double l) { return area using ft2 = units::isq::si::fps::area U, Representation Rep = double> using density = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_lb_per_ft3(long double l) { return density using lb_per_ft3 = units::isq::si::fps::de } // namespace units::aliases::isq::si::fps::inline density -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/energy.h b/src/systems/si-fps/include/units/isq/si/fps/energy.h index 1f559b75..250f0e88 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/energy.h +++ b/src/systems/si-fps/include/units/isq/si/fps/energy.h @@ -45,7 +45,7 @@ struct foot_pound_force : noble_deduced_unit U, Representation Rep = double> using energy = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -59,11 +59,11 @@ constexpr auto operator"" _q_ft_lbf(long double l) { return energy using ft_lbf = units::isq::si::fps::energy } // namespace units::aliases::isq::si::fps::inline energy -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/force.h b/src/systems/si-fps/include/units/isq/si/fps/force.h index 43efd300..43e91a01 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/force.h +++ b/src/systems/si-fps/include/units/isq/si/fps/force.h @@ -52,7 +52,7 @@ struct dim_force : isq::dim_force U, Representation Rep = double> using force = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -70,9 +70,9 @@ constexpr auto operator"" _q_klbf(long double l) { return force using klbf = units::isq::si::fps::force {}; template U, Representation Rep = double> using length = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -100,9 +100,9 @@ constexpr auto operator"" _q_naut_mi(long double l) { return length using naut_mi = units::isq::si::fps::lengt } // namespace units::aliases::isq::si::fps::inline length -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/mass.h b/src/systems/si-fps/include/units/isq/si/fps/mass.h index 8471c127..cbf50513 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/mass.h +++ b/src/systems/si-fps/include/units/isq/si/fps/mass.h @@ -58,7 +58,7 @@ struct short_ton : named_scaled_unit{}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -100,9 +100,9 @@ constexpr auto operator"" _q_lton(long double l) { return mass using lton = units::isq::si::fps::mass U, Representation Rep = double> using power = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -64,9 +64,9 @@ constexpr auto operator"" _q_hp(long double l) { return power using hp = units::isq::si::fps::power {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -67,9 +67,9 @@ constexpr auto operator"" _q_kpsi(long double l) { return pressure using kpsi = units::isq::si::fps::pressure } // namespace units::aliases::isq::si::fps::inline pressure -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si-fps/include/units/isq/si/fps/speed.h b/src/systems/si-fps/include/units/isq/si/fps/speed.h index 16ac98e5..2a2616a8 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/speed.h +++ b/src/systems/si-fps/include/units/isq/si/fps/speed.h @@ -47,7 +47,7 @@ struct nautical_mile_per_hour : named_deduced_unit {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -65,9 +65,9 @@ constexpr auto operator"" _q_knot(long double l) { return speed using knot = units::isq::si::fps::speed {}; template U, Representation Rep = double> using volume = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -56,9 +56,9 @@ constexpr auto operator"" _q_yd3(long double l) { return volume using yd3 = units::isq::si::fps::volume {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -62,9 +62,9 @@ constexpr auto operator"" _q_angstrom(long double l) { return si::length using angstrom = units::isq::si::length {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -54,9 +54,9 @@ constexpr auto operator"" _q_rd(long double l) { return si::length using rd = units::isq::si::length {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -47,9 +47,9 @@ constexpr auto operator"" _q_ft2(long double l) { return si::area using ft2 = units::isq::si::area { // https://en.wikipedia.org/wiki/Thousandth_of_an_inch using mil = thou; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -104,9 +104,9 @@ constexpr auto operator"" _q_mil(long double l) { return si::length using mil = units::isq::si::length {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -46,11 +46,11 @@ constexpr auto operator"" _q_mi_per_h(long double l) { return si::speed using mi_per_h = units::isq::si::speed {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -47,9 +47,9 @@ constexpr auto operator"" _q_ft3(long double l) { return si::volume using ft3 = units::isq::si::volume {}; struct point_prn : named_scaled_unit {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -63,9 +63,9 @@ constexpr auto operator"" _q_point_prn(long double l) { return si::length using point_prn = units::isq::si::length {}; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -63,9 +63,9 @@ constexpr auto operator"" _q_mi_us(long double l) { return si::length using mi = units::isq::si::length U, Representation Rep = double> using absorbed_dose = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -152,9 +152,9 @@ constexpr auto operator"" _q_YGy(long double l) { return absorbed_dose using YGy = units::isq::si::absorbed_dose< } // namespace units::aliases::isq::si::inline absorbed_dose -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/acceleration.h b/src/systems/si/include/units/isq/si/acceleration.h index 8cfa0331..c6e8110e 100644 --- a/src/systems/si/include/units/isq/si/acceleration.h +++ b/src/systems/si/include/units/isq/si/acceleration.h @@ -39,7 +39,7 @@ struct dim_acceleration : isq::dim_acceleration U, Representation Rep = double> using acceleration = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -49,11 +49,11 @@ constexpr auto operator"" _q_m_per_s2(long double l) { return acceleration using m_per_s2 = units::isq::si::accelerat } // namespace units::aliases::isq::si::inline acceleration -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/amount_of_substance.h b/src/systems/si/include/units/isq/si/amount_of_substance.h index b1e074a1..79282af9 100644 --- a/src/systems/si/include/units/isq/si/amount_of_substance.h +++ b/src/systems/si/include/units/isq/si/amount_of_substance.h @@ -41,7 +41,7 @@ struct dim_amount_of_substance : isq::dim_amount_of_substance {}; template U, Representation Rep = double> using amount_of_substance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,9 +51,9 @@ constexpr auto operator"" _q_mol(long double l) { return amount_of_substance using mol = units::isq::si::amount_of_subs } // namespace units::aliases::isq::si::inline amount_of_substance -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/angular_velocity.h b/src/systems/si/include/units/isq/si/angular_velocity.h index 316708b9..52fd092b 100644 --- a/src/systems/si/include/units/isq/si/angular_velocity.h +++ b/src/systems/si/include/units/isq/si/angular_velocity.h @@ -41,7 +41,7 @@ struct dim_angular_velocity : isq::dim_angular_velocity U, Representation Rep = double> using angular_velocity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_rad_per_s(long double l) { return angular_velocity< } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline angular_velocity { @@ -63,4 +63,4 @@ template using rad_per_s = units::isq::si::angular_ } // namespace units::aliases::isq::si::inline angular_velocity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/area.h b/src/systems/si/include/units/isq/si/area.h index 3ffb5744..d6571961 100644 --- a/src/systems/si/include/units/isq/si/area.h +++ b/src/systems/si/include/units/isq/si/area.h @@ -63,7 +63,7 @@ struct hectare : alias_unit {}; template U, Representation Rep = double> using area = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -157,9 +157,9 @@ constexpr auto operator"" _q_ha(long double l) { return area using ha = units::isq::si::area U, Representation Rep = double> using capacitance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -153,9 +153,9 @@ constexpr auto operator"" _q_YF(long double l) { return capacitance using YF = units::isq::si::capacitance U, Representation Rep = double> using catalytic_activity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -159,9 +159,9 @@ constexpr auto operator"" _q_U(long double l) { return catalytic_activity using U = units::isq::si::catalytic_activi } // namespace units::aliases::isq::si::inline catalytic_activity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/charge_density.h b/src/systems/si/include/units/isq/si/charge_density.h index 441cb5fc..ec23d422 100644 --- a/src/systems/si/include/units/isq/si/charge_density.h +++ b/src/systems/si/include/units/isq/si/charge_density.h @@ -47,7 +47,7 @@ using charge_density = quantity; template U, Representation Rep = double> using surface_charge_density = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -61,11 +61,11 @@ constexpr auto operator"" _q_C_per_m2(long double l) { return surface_charge_den } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline charge_density { @@ -74,4 +74,4 @@ template using C_per_m2 = units::isq::si::surface_c } // namespace units::aliases::isq::si::inline charge_density -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/concentration.h b/src/systems/si/include/units/isq/si/concentration.h index 99a99ae8..903f943a 100644 --- a/src/systems/si/include/units/isq/si/concentration.h +++ b/src/systems/si/include/units/isq/si/concentration.h @@ -40,7 +40,7 @@ struct dim_concentration : isq::dim_concentration U, Representation Rep = double> using concentration = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_mol_per_m3(long double l) { return concentration using mol_per_m3 = units::isq::si::concent } // namespace units::aliases::isq::si::inline concentration -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/conductance.h b/src/systems/si/include/units/isq/si/conductance.h index 11877476..50fd7dee 100644 --- a/src/systems/si/include/units/isq/si/conductance.h +++ b/src/systems/si/include/units/isq/si/conductance.h @@ -58,7 +58,7 @@ struct dim_conductance : isq::dim_conductance U, Representation Rep = double> using conductance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -132,9 +132,9 @@ constexpr auto operator"" _q_YS(long double l) { return conductance using YS = units::isq::si::conductance U, Representation Rep = double> using current_density = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,11 +52,11 @@ constexpr auto operator"" _q_A_per_m2(long double l) { return current_density using A_per_m2 = units::isq::si::current_d } // namespace units::aliases::isq::si::inline current_density -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/density.h b/src/systems/si/include/units/isq/si/density.h index 192c16b6..5b0cf016 100644 --- a/src/systems/si/include/units/isq/si/density.h +++ b/src/systems/si/include/units/isq/si/density.h @@ -42,7 +42,7 @@ struct dim_density : isq::dim_density U, Representation Rep = double> using density = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,11 +52,11 @@ constexpr auto operator"" _q_kg_per_m3(long double l) { return density using kg_per_m3 = units::isq::si::density< } // namespace units::aliases::isq::si::inline density -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/dynamic_viscosity.h b/src/systems/si/include/units/isq/si/dynamic_viscosity.h index 5ee4571f..4b9b4339 100644 --- a/src/systems/si/include/units/isq/si/dynamic_viscosity.h +++ b/src/systems/si/include/units/isq/si/dynamic_viscosity.h @@ -40,7 +40,7 @@ struct dim_dynamic_viscosity : isq::dim_dynamic_viscosity U, Representation Rep = double> using dynamic_viscosity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_Pa_s(long double l) { return dynamic_viscosity using Pa_s = units::isq::si::dynamic_visco } // namespace units::aliases::isq::si::inline dynamic_viscosity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/electric_charge.h b/src/systems/si/include/units/isq/si/electric_charge.h index 7dd60373..6b522952 100644 --- a/src/systems/si/include/units/isq/si/electric_charge.h +++ b/src/systems/si/include/units/isq/si/electric_charge.h @@ -42,7 +42,7 @@ struct dim_electric_charge : isq::dim_electric_charge U, Representation Rep = double> using electric_charge = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,9 +52,9 @@ constexpr auto operator"" _q_C(long double l) { return electric_charge using C = units::isq::si::electric_charge< } // namespace units::aliases::isq::si::inline electric_charge -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/electric_current.h b/src/systems/si/include/units/isq/si/electric_current.h index f295862a..f71b86bf 100644 --- a/src/systems/si/include/units/isq/si/electric_current.h +++ b/src/systems/si/include/units/isq/si/electric_current.h @@ -61,7 +61,7 @@ struct dim_electric_current : isq::dim_electric_current {}; template U, Representation Rep = double> using electric_current = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -151,9 +151,9 @@ constexpr auto operator"" _q_YA(long double l) { return electric_current using YA = units::isq::si::electric_curren } // namespace units::aliases::isq::si::inline electric_current -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/electric_field_strength.h b/src/systems/si/include/units/isq/si/electric_field_strength.h index ec11149c..290b4dbb 100644 --- a/src/systems/si/include/units/isq/si/electric_field_strength.h +++ b/src/systems/si/include/units/isq/si/electric_field_strength.h @@ -39,7 +39,7 @@ struct dim_electric_field_strength : isq::dim_electric_field_strength U, Representation Rep = double> using electric_field_strength = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -49,11 +49,11 @@ constexpr auto operator"" _q_V_per_m(long double l) { return electric_field_stre } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline electric_field_strength { @@ -61,4 +61,4 @@ template using V_per_m = units::isq::si::electric_f } // namespace units::aliases::isq::si::inline electric_field_strength -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/energy.h b/src/systems/si/include/units/isq/si/energy.h index f4a36b16..ddcbb270 100644 --- a/src/systems/si/include/units/isq/si/energy.h +++ b/src/systems/si/include/units/isq/si/energy.h @@ -61,7 +61,7 @@ struct dim_energy : isq::dim_energy {} template U, Representation Rep = double> using energy = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -143,9 +143,9 @@ constexpr auto operator"" _q_GeV(long double l) { return energy using GeV = units::isq::si::energy U, Representation Rep = double> using energy_density = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_J_per_m3(long double l) { return energy_density using J_per_m3 = units::isq::si::energy_de } // namespace units::aliases::isq::si::inline energy_density -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/force.h b/src/systems/si/include/units/isq/si/force.h index 09bb70ae..484e7aeb 100644 --- a/src/systems/si/include/units/isq/si/force.h +++ b/src/systems/si/include/units/isq/si/force.h @@ -63,7 +63,7 @@ struct dim_force : isq::dim_force template U, Representation Rep = double> using force = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -153,9 +153,9 @@ constexpr auto operator"" _q_YN(long double l) { return force using YN = units::isq::si::force {}; template U, Representation Rep = double> using frequency = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -131,9 +131,9 @@ constexpr auto operator"" _q_YHz(long double l) { return frequency using YHz = units::isq::si::frequency; template U, Representation Rep = double> using molar_heat_capacity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -71,11 +71,11 @@ constexpr auto operator"" _q_J_per_mol_K(long double l) { return molar_heat_capa } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::heat_capacity { @@ -85,4 +85,4 @@ template using J_per_mol_K = units::isq::si::molar_ } // namespace units::aliases::isq::si::heat_capacity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/inductance.h b/src/systems/si/include/units/isq/si/inductance.h index 82fcb963..3ca6a0d9 100644 --- a/src/systems/si/include/units/isq/si/inductance.h +++ b/src/systems/si/include/units/isq/si/inductance.h @@ -59,7 +59,7 @@ struct dim_inductance : isq::dim_inductance U, Representation Rep = double> using inductance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -133,9 +133,9 @@ constexpr auto operator"" _q_YH(long double l) { return inductance using YH = units::isq::si::inductance {}; template U, Representation Rep = double> using length = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -157,9 +157,9 @@ constexpr auto operator"" _q_au(long double l) { return length using au = units::isq::si::length U, Representation Rep = double> using luminance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_cd_per_m2(long double l) { return luminance using cd_per_m2 = units::isq::si::luminanc } // namespace units::aliases::isq::si::inline luminance -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/luminous_intensity.h b/src/systems/si/include/units/isq/si/luminous_intensity.h index 85299c40..7d0a78ec 100644 --- a/src/systems/si/include/units/isq/si/luminous_intensity.h +++ b/src/systems/si/include/units/isq/si/luminous_intensity.h @@ -61,7 +61,7 @@ struct dim_luminous_intensity : isq::dim_luminous_intensity {}; template U, Representation Rep = double> using luminous_intensity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -151,9 +151,9 @@ constexpr auto operator"" _q_Ycd(long double l) { return luminous_intensity using Ycd = units::isq::si::luminous_inten } // namespace units::aliases::isq::si::luminous_intensity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/magnetic_flux.h b/src/systems/si/include/units/isq/si/magnetic_flux.h index e106f6fd..78f22854 100644 --- a/src/systems/si/include/units/isq/si/magnetic_flux.h +++ b/src/systems/si/include/units/isq/si/magnetic_flux.h @@ -59,7 +59,7 @@ struct dim_magnetic_flux : isq::dim_magnetic_flux U, Representation Rep = double> using magnetic_flux = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -133,9 +133,9 @@ constexpr auto operator"" _q_YWb(long double l) { return magnetic_flux using YWb = units::isq::si::magnetic_flux< } // namespace units::aliases::isq::si::inline magnetic_flux -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/magnetic_induction.h b/src/systems/si/include/units/isq/si/magnetic_induction.h index cfccd5da..71a3a3e7 100644 --- a/src/systems/si/include/units/isq/si/magnetic_induction.h +++ b/src/systems/si/include/units/isq/si/magnetic_induction.h @@ -63,7 +63,7 @@ struct dim_magnetic_induction : isq::dim_magnetic_induction U, Representation Rep = double> using magnetic_induction = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -141,9 +141,9 @@ constexpr auto operator"" _q_G(long double l) { return magnetic_induction using G = units::isq::si::magnetic_inducti } // namespace units::aliases::isq::si::inline magnetic_induction -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/mass.h b/src/systems/si/include/units/isq/si/mass.h index 38fc58f8..a13c4047 100644 --- a/src/systems/si/include/units/isq/si/mass.h +++ b/src/systems/si/include/units/isq/si/mass.h @@ -85,7 +85,7 @@ struct dim_mass : isq::dim_mass {}; template U, Representation Rep = double> using mass = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -264,9 +264,9 @@ constexpr auto operator"" _q_Da(long double l) { return mass using Da = units::isq::si::mass U, Representation Rep = double> using molar_energy = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,11 +52,11 @@ constexpr auto operator"" _q_J_per_mol(long double l) { return molar_energy using J_per_mol = units::isq::si::molar_en } // namespace units::aliases::isq::si::inline molar_energy -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/momentum.h b/src/systems/si/include/units/isq/si/momentum.h index 0123837f..28151b6f 100644 --- a/src/systems/si/include/units/isq/si/momentum.h +++ b/src/systems/si/include/units/isq/si/momentum.h @@ -40,7 +40,7 @@ struct dim_momentum : isq::dim_momentum U, Representation Rep = double> using momentum = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_kg_m_per_s(long double l) { return momentum using kg_m_per_s = units::isq::si::momentu } // namespace units::aliases::isq::si::inline momentum -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/permeability.h b/src/systems/si/include/units/isq/si/permeability.h index 3b16a50b..260e5658 100644 --- a/src/systems/si/include/units/isq/si/permeability.h +++ b/src/systems/si/include/units/isq/si/permeability.h @@ -41,7 +41,7 @@ struct dim_permeability : isq::dim_permeability U, Representation Rep = double> using permeability = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_H_per_m(long double l) { return permeability using H_per_m = units::isq::si::permeabili } // namespace units::aliases::isq::si::inline permeability -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/permittivity.h b/src/systems/si/include/units/isq/si/permittivity.h index d367b518..850430fe 100644 --- a/src/systems/si/include/units/isq/si/permittivity.h +++ b/src/systems/si/include/units/isq/si/permittivity.h @@ -41,7 +41,7 @@ struct dim_permittivity : isq::dim_permittivity U, Representation Rep = double> using permittivity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_F_per_m(long double l) { return permittivity using F_per_m = units::isq::si::permittivi } // namespace units::aliases::isq::si::inline permittivity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/power.h b/src/systems/si/include/units/isq/si/power.h index 371385fb..ebe1bb03 100644 --- a/src/systems/si/include/units/isq/si/power.h +++ b/src/systems/si/include/units/isq/si/power.h @@ -58,7 +58,7 @@ struct dim_power : isq::dim_power {}; template U, Representation Rep = double> using power = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -132,9 +132,9 @@ constexpr auto operator"" _q_YW(long double l) { return power using YW = units::isq::si::power U, Representation Rep = double> using pressure = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -153,9 +153,9 @@ constexpr auto operator"" _q_YPa(long double l) { return pressure using YPa = units::isq::si::pressure U, Representation Rep = double> using radioactivity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -151,9 +151,9 @@ constexpr auto operator"" _q_YBq(long double l) { return radioactivity using YBq = units::isq::radioactivity U, Representation Rep = double> using resistance = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -133,9 +133,9 @@ constexpr auto operator"" _q_YR(long double l) { return resistance using YR = units::isq::si::resistance U, Representation Rep = double> using speed = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -56,11 +56,11 @@ constexpr auto operator"" _q_km_per_h(long double l) { return speed using km_per_h = units::isq::si::speed U, Representation Rep = double> using surface_tension = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,11 +50,11 @@ constexpr auto operator"" _q_N_per_m(long double l) { return surface_tension using N_per_m = units::isq::si::surface_te } // namespace units::aliases::isq::si::inline surface_tension -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/thermal_conductivity.h b/src/systems/si/include/units/isq/si/thermal_conductivity.h index b85eff41..eab781db 100644 --- a/src/systems/si/include/units/isq/si/thermal_conductivity.h +++ b/src/systems/si/include/units/isq/si/thermal_conductivity.h @@ -41,7 +41,7 @@ struct dim_thermal_conductivity : isq::dim_thermal_conductivity U, Representation Rep = double> using thermal_conductivity = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -51,11 +51,11 @@ constexpr auto operator"" _q_W_per_m_K(long double l) { return thermal_conductiv } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline thermal_conductivity { @@ -63,4 +63,4 @@ template using W_per_m_K = units::isq::si::thermal_ } // namespace units::aliases::isq::si::inline thermal_conductivity -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/thermodynamic_temperature.h b/src/systems/si/include/units/isq/si/thermodynamic_temperature.h index e1cbf0f8..10ee923b 100644 --- a/src/systems/si/include/units/isq/si/thermodynamic_temperature.h +++ b/src/systems/si/include/units/isq/si/thermodynamic_temperature.h @@ -40,7 +40,7 @@ struct dim_thermodynamic_temperature : isq::dim_thermodynamic_temperature U, Representation Rep = double> using thermodynamic_temperature = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -50,9 +50,9 @@ constexpr auto operator"" _q_K(long double l) { return thermodynamic_temperature } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace thermodynamic_temperature_references { @@ -66,11 +66,11 @@ using namespace thermodynamic_temperature_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline thermodynamic_temperature { @@ -78,4 +78,4 @@ template using K = units::isq::si::thermodynamic_te } // namespace units::aliases::isq::si::inline thermodynamic_temperature -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/time.h b/src/systems/si/include/units/isq/si/time.h index d9201b67..ebcd163e 100644 --- a/src/systems/si/include/units/isq/si/time.h +++ b/src/systems/si/include/units/isq/si/time.h @@ -52,7 +52,7 @@ struct dim_time : isq::dim_time {}; template U, Representation Rep = double> using time = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -106,9 +106,9 @@ constexpr auto operator"" _q_d(long double l) { return time(l) } // namespace literals -#endif // UNITS_LITERALS +#endif // UNITS_NO_LITERALS -#ifdef UNITS_REFERENCES +#ifndef UNITS_NO_REFERENCES namespace time_references { @@ -133,11 +133,11 @@ using namespace time_references; } // namespace references -#endif // UNITS_REFERENCES +#endif // UNITS_NO_REFERENCES } // namespace units::isq::si -#ifdef UNITS_ALIASES +#ifndef UNITS_NO_ALIASES namespace units::aliases::isq::si::inline time { @@ -156,4 +156,4 @@ template using d = units::isq::si::time U, Representation Rep = double> using torque = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -52,11 +52,11 @@ constexpr auto operator"" _q_N_m_per_rad(long double l) { return torque using N_m_per_rad = units::isq::si::torque } // namespace units::aliases::isq::si::inline torque -#endif // UNITS_ALIASES +#endif // UNITS_NO_ALIASES diff --git a/src/systems/si/include/units/isq/si/voltage.h b/src/systems/si/include/units/isq/si/voltage.h index ce50f61e..8f10478f 100644 --- a/src/systems/si/include/units/isq/si/voltage.h +++ b/src/systems/si/include/units/isq/si/voltage.h @@ -63,7 +63,7 @@ struct dim_voltage : isq::dim_voltage U, Representation Rep = double> using voltage = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -153,9 +153,9 @@ constexpr auto operator"" _q_YV(long double l) { return voltage using YV = units::isq::si::voltage {}; template U, Representation Rep = double> using volume = quantity; -#ifdef UNITS_LITERALS +#ifndef UNITS_NO_LITERALS inline namespace literals { @@ -257,9 +257,9 @@ constexpr auto operator"" _q_Yl(long double l) { return volume using Yl = units::isq::si::volume,/wd4242 /wd4244,-Wno-conversion> ) -target_compile_definitions(unit_tests_static_truncating PRIVATE - UNITS_REFERENCES - UNITS_LITERALS - UNITS_ALIASES -) add_library(unit_tests_static cgs_test.cpp @@ -78,8 +73,3 @@ target_link_libraries(unit_tests_static PRIVATE unit_tests_static_truncating mp-units::mp-units ) -target_compile_definitions(unit_tests_static PRIVATE - UNITS_REFERENCES - UNITS_LITERALS - UNITS_ALIASES -) diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt index f04c2b0b..8a5eec85 100644 --- a/test_package/CMakeLists.txt +++ b/test_package/CMakeLists.txt @@ -29,4 +29,3 @@ find_package(mp-units CONFIG REQUIRED) add_executable(test_package test_package.cpp) target_link_libraries(test_package PRIVATE mp-units::mp-units) -target_compile_definitions(test_package PRIVATE UNITS_REFERENCES) From c028f606c8525323a648645c7413002629c9875e Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 9 May 2021 19:30:27 +0200 Subject: [PATCH 33/59] docs: "Install" chapter added to Usage --- docs/usage.rst | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index 14755348..a3f2a2fe 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -278,7 +278,7 @@ library release the following steps may be performed: .. code-block:: shell - mkdir build && cd build + mkdir my_project/build && cd my_project/build conan install .. -pr -s compiler.cppstd=20 -b=missing cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake cmake --build . @@ -329,12 +329,27 @@ differences: .. code-block:: shell - mkdir build && cd build + mkdir my_project/build && cd my_project/build conan install .. -pr -s compiler.cppstd=20 -b=outdated -u cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake cmake --build . +Install +^^^^^^^ + +In case you don't want to use Conan in your project and just want to install the **mp-units** +library on your file system and use it via ``find_package(mp-units)`` from another repository +to find it, it is enough to perform the following steps: + +.. code-block:: shell + + mkdir units/build && cd units/build + conan install .. -pr -s compiler.cppstd=20 -b=missing + cmake ../src -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake + cmake --install . --prefix + + Contributing (or just building all the tests, examples, and documentation) -------------------------------------------------------------------------- @@ -351,7 +366,7 @@ in **mp-units** repository, you should: conan remote add linear-algebra https://twonington.jfrog.io/artifactory/api/conan/conan-oss git clone https://github.com/mpusz/units.git && cd units pip3 install -r docs/requirements.txt - mkdir build && cd build + mkdir units/build && cd units/build conan install .. -pr -s compiler.cppstd=20 -e mp-units:CONAN_RUN_TESTS=True -b outdated -u conan build .. From 6c6e7955b69ecf1b48f85a2ec1b3bd067004e006 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 10 May 2021 15:51:17 +0200 Subject: [PATCH 34/59] chore: .gitignore updated to ignore auto-generated docs --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2d2ba83d..319166d5 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ /cmake-build-*/ /build/ /out/ +_build/ # Conan *.pyc From 8e88f06380a129442fc0fe01335975ad5e898763 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 10 May 2021 15:56:48 +0200 Subject: [PATCH 35/59] refactor: `*deduced_unit` renamed to `*derived_unit` --- docs/CHANGELOG.md | 1 + docs/framework/units.rst | 212 +++++++++--------- docs/reference/core/types/units.rst | 6 +- docs/use_cases/extensions.rst | 4 +- ...ed_symbol_text.h => derived_symbol_text.h} | 6 +- .../bits/{deduced_unit.h => derived_unit.h} | 4 +- src/core/include/units/bits/unit_text.h | 2 +- src/core/include/units/unit.h | 16 +- .../units/isq/iec80000/transfer_rate.h | 16 +- .../si-fps/include/units/isq/si/fps/energy.h | 2 +- .../si-fps/include/units/isq/si/fps/power.h | 2 +- .../si-fps/include/units/isq/si/fps/speed.h | 6 +- .../si-fps/include/units/isq/si/fps/volume.h | 2 +- .../include/units/isq/si/international/area.h | 2 +- .../units/isq/si/international/speed.h | 2 +- .../units/isq/si/international/volume.h | 2 +- src/systems/si/include/units/isq/si/area.h | 40 ++-- src/systems/si/include/units/isq/si/speed.h | 2 +- src/systems/si/include/units/isq/si/volume.h | 40 ++-- test/unit_test/runtime/fmt_test.cpp | 4 +- test/unit_test/static/custom_unit_test.cpp | 2 +- test/unit_test/static/unit_test.cpp | 2 +- 22 files changed, 188 insertions(+), 187 deletions(-) rename src/core/include/units/bits/{deduced_symbol_text.h => derived_symbol_text.h} (94%) rename src/core/include/units/bits/{deduced_unit.h => derived_unit.h} (96%) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 97b01415..7a2ed012 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,7 @@ - (!) refactor: Refactored the library file tree - (!) refactor: `quantity::count()` renamed to `quantity::number()` - (!) refactor: `data` system renamed to `isq::iec80000` (quantity names renamed too) + - (!) refactor: `*deduced_unit` renamed to `*derived_unit` - refactor: quantity (kind) point updated to reflect latest changes to `quantity` - refactor: basic concepts, `quantity` and `quantity_cast` refactored - refactor: `abs()` definition refactored to be more explicit about the return type diff --git a/docs/framework/units.rst b/docs/framework/units.rst index c4f8380d..c5d9e66c 100644 --- a/docs/framework/units.rst +++ b/docs/framework/units.rst @@ -8,7 +8,7 @@ compare quantities of the same dimension a notion of a :term:`measurement unit` was introduced. Units are designated by conventionally assigned names and symbols. Thanks to them it is possible to compare two quantities of the same dimension and express the ratio of the second quantity to the first -one as a number. For example ``10s`` is ``10`` times more than ``1s``. +one as a number. For example ``10 s`` is ``10`` times more than ``1 s``. Base quantities are expressed in terms of :term:`base units ` (i.e. ``m`` (meter), ``s`` (second)), while derived quantities are expressed @@ -94,97 +94,14 @@ knows how to convert ``si::metre`` to ``si::centimetre`` and vice versa). :ref:`use_cases/extensions:Custom Systems` chapter. -Derived Units -------------- - -Derived units can be either named or unnamed. - -Derived Named Units -^^^^^^^^^^^^^^^^^^^ - -Derived named units have a unique symbol (i.e. ``N`` (newton) or ``Pa`` -(pascal)) and they are defined in the same way as base units (which -always have to be a named unit):: - - namespace si { - - struct newton : named_unit {}; - - } - - -Derived Unnamed Units -^^^^^^^^^^^^^^^^^^^^^ - -Derived unnamed units are the units where the symbol is derived from the -base quantities symbols and the expression of the dependence of the derived -quantity on the base quantities (i.e. ``m/s`` (metre per second), ``m²`` -(square metre)). To support such use cases a library introduced a notion of -:term:`derived dimension recipe` which stores the information about the -order, exponents, and types of dimensions used to defined this particular -derived dimension. For example each of the below ``momentum`` definitions -will result in a different unnamed unit symbol: - -.. code-block:: - :emphasize-lines: 2-4, 6-8, 10-12 - - struct dim_momentum : derived_dimension, - exponent, - exponent> {}; // kg ⋅ m/s - struct dim_momentum : derived_dimension, - exponent, - exponent> {}; // m ⋅ kg/s - struct dim_momentum : derived_dimension, - exponent, - exponent> {}; // 1/s ⋅ m ⋅ kg - -where ``kilogram_metre_per_second`` is defined as:: - - struct kilogram_metre_per_second : unit {}; - -However, the easiest way to define momentum is just to use the -``si::dim_speed`` derived dimension in the recipe: - -.. code-block:: - :emphasize-lines: 3 - - struct dim_momentum : derived_dimension, - exponent> {}; // kg ⋅ m/s - -In such a case the library will do its magic and will automatically -unpack a provided derived dimension to its base dimensions in order to -end up with a :term:`normalized derived dimension` for a parent entity. - - -The need to support a derived dimension in the recipe is not just a -syntactic sugar that allows us to do less typing. It is worth to notice -here that some of the derived unnamed units are defined in terms of other -derived named units (i.e. surface tension quantity is measured in terms -of ``N/m``): - -.. code-block:: - :emphasize-lines: 2 - - struct dim_surface_tension : derived_dimension, - exponent> {}; // N/m - -If we defined the above in terms of base units we would end up with -a ``kg/s²`` derived unit symbol. - - Scaled Units ------------ -Until now we talked mostly about -:term:`coherent units ` which are units used to -define dimensions and thus, in their system of units, have proportionality -factor/ratio equals one. However quantities of each dimension can also use -other units of measurement to describe their magnitude (numerical value). +Described above base units (in case of base quantities) and +:term:`coherent units ` (in case of derived quantities), +in their system of units, have proportionality factor/ratio equal to one. +However, quantities of such dimensions can also use units of measurement +with other ratios to describe their magnitude (numerical value). Named Scaled Units @@ -289,13 +206,99 @@ example we can define ``si::kilometre`` as:: as ``km²`` would be invalid). -Deduced Units -^^^^^^^^^^^^^ +Derived Units +------------- + +:term:`Derived units ` are the units used to measure +:term:`derived quantities `. They can either have their own unique +names (i.e. ``N`` (newton)) or can be composed from the names of units of quantities +used to define thier derived quantity (i.e. ``km/h``). + + +Derived Named Units +^^^^^^^^^^^^^^^^^^^ + +Derived named units have a unique symbol (i.e. ``N`` (newton) or ``Pa`` +(pascal)) and they are defined in the same way as base units (which +always have to be a named unit):: + + namespace si { + + struct newton : named_unit {}; + + } + + +Derived Unnamed Units +^^^^^^^^^^^^^^^^^^^^^ + +Derived unnamed units are the units where the symbol is derived from the +base quantities symbols and the expression of the dependence of the derived +quantity on the base quantities (i.e. ``m/s`` (metre per second), ``m²`` +(square metre)). To support such use cases a library introduced a notion of +:term:`derived dimension recipe` which stores the information about the +order, exponents, and types of dimensions used to define this particular +derived dimension. For example each of the below ``momentum`` definitions +will result in a different unnamed unit symbol: + +.. code-block:: + :emphasize-lines: 2-4, 6-8, 10-12 + + struct dim_momentum : derived_dimension, + exponent, + exponent> {}; // kg ⋅ m/s + struct dim_momentum : derived_dimension, + exponent, + exponent> {}; // m ⋅ kg/s + struct dim_momentum : derived_dimension, + exponent, + exponent> {}; // 1/s ⋅ m ⋅ kg + +where ``kilogram_metre_per_second`` is defined as:: + + struct kilogram_metre_per_second : unit {}; + +However, the easiest way to define momentum is just to use the +``si::dim_speed`` derived dimension in the recipe: + +.. code-block:: + :emphasize-lines: 3 + + struct dim_momentum : derived_dimension, + exponent> {}; // kg ⋅ m/s + +In such a case the library will do its magic and will automatically +unpack a provided derived dimension to its base dimensions in order to +end up with a :term:`normalized derived dimension` for a parent entity. + +The need to support a derived dimension in the recipe is not just a +syntactic sugar that allows us to do less typing. It is worth to notice +here that some of the derived unnamed units are defined in terms of other +derived named units (i.e. surface tension quantity is measured in terms +of ``N/m``): + +.. code-block:: + :emphasize-lines: 2 + + struct dim_surface_tension : derived_dimension, + exponent> {}; // N/m + +If we defined the above in terms of base units we would end up with +a ``kg/s²`` derived unit symbol. + + +Derived Scaled Units +^^^^^^^^^^^^^^^^^^^^ For some units determining of a correct scaling ratio may not be trivial, and even if done correctly, may be a pain to maintain. For a simple example let's take a "kilometre per hour" unit. What is the easiest to maintain -ratio in reference to "metre per second": +ratio in reference to the "metre per second": - ``1000/3600`` - ``10/36`` @@ -303,30 +306,29 @@ ratio in reference to "metre per second": Whichever, we choose there will always be someone not happy with our choice. -Thanks to a `deduced_unit` class template provided by the library this problem +Thanks to a `derived_unit` class template provided by the library this problem does not exist at all. With it ``si::kilometre_per_hour`` can be defined as:: namespace si { - struct kilometre_per_hour : deduced_unit {}; + struct kilometre_per_hour : derived_unit {}; } -In case the deduced unit should served as a named one we can use ether a -`named_deduced_unit` where the user is able to provide a symbol for the unit -by him/her-self or `noble_deduced_unit` where the symbol is the deduced name +In case the scaled derived unit should serve as a named one we can use either +a `named_derived_unit` where the user is able to provide a symbol for the unit +by him/her-self or `noble_derived_unit` where the symbol is the deduced name based on the ingredients:: namespace si::fps { - struct nautical_mile_per_hour : named_deduced_unit{}; - struct foot_pound_force : noble_deduced_unit {}; + struct knot : named_derived_unit {}; + struct foot_pound_force : noble_derived_unit {}; } -Please note that deduced units are the only unit-related class template that -take a dimension as its parameter. This derived dimension provides a :term:`recipe` +Please note that the dervided scaled units are the only unit-related class templates +that take a dimension as its parameter. This derived dimension provides a :term:`recipe` used for its definition. Based on the information stored in the recipe (order, type, and exponents of composite dimensions) and the ratios of units provided in the template parameter list after the derived dimension parameter, @@ -377,9 +379,9 @@ of a `scaled_unit` class template: [scaled_unit]<:-[named_unit] [scaled_unit]<:-[named_scaled_unit] [scaled_unit]<:-[prefixed_unit] - [scaled_unit]<:-[deduced_unit] - [scaled_unit]<:-[noble_deduced_unit] - [scaled_unit]<:-[named_deduced_unit] + [scaled_unit]<:-[derived_unit] + [scaled_unit]<:-[noble_derived_unit] + [scaled_unit]<:-[named_derived_unit] [scaled_unit]<:-[alias_unit] [scaled_unit]<:-[prefixed_alias_unit] diff --git a/docs/reference/core/types/units.rst b/docs/reference/core/types/units.rst index c7ad4b1d..f2caf2c4 100644 --- a/docs/reference/core/types/units.rst +++ b/docs/reference/core/types/units.rst @@ -16,13 +16,13 @@ Units .. doxygenstruct:: units::prefixed_unit :members: -.. doxygenstruct:: units::deduced_unit +.. doxygenstruct:: units::derived_unit :members: -.. doxygenstruct:: units::noble_deduced_unit +.. doxygenstruct:: units::noble_derived_unit :members: -.. doxygenstruct:: units::named_deduced_unit +.. doxygenstruct:: units::named_derived_unit :members: .. doxygenstruct:: units::alias_unit diff --git a/docs/use_cases/extensions.rst b/docs/use_cases/extensions.rst index 7c3f3305..9e07a92a 100644 --- a/docs/use_cases/extensions.rst +++ b/docs/use_cases/extensions.rst @@ -118,7 +118,7 @@ coherent unit:: exponent, exponent> {}; // our unit of interest for a new derived dimension - struct desk_per_hour : deduced_unit {}; + struct desk_per_hour : derived_unit {}; // a quantity of our dimension template U, Representation Rep = double> @@ -167,7 +167,7 @@ With the above we can now define a new derived dimension:: exponent, exponent> {}; - struct person_per_desk : deduced_unit {}; + struct person_per_desk : derived_unit {}; template U, Representation Rep = double> using occupancy_rate = quantity; diff --git a/src/core/include/units/bits/deduced_symbol_text.h b/src/core/include/units/bits/derived_symbol_text.h similarity index 94% rename from src/core/include/units/bits/deduced_symbol_text.h rename to src/core/include/units/bits/derived_symbol_text.h index d4e56d10..50ad7d3a 100644 --- a/src/core/include/units/bits/deduced_symbol_text.h +++ b/src/core/include/units/bits/derived_symbol_text.h @@ -80,16 +80,16 @@ template inline constexpr int negative_exp_count = ((Es::num < 0 ? 1 : 0) + ... + 0); template -constexpr auto deduced_symbol_text(exponent_list, std::index_sequence) +constexpr auto derived_symbol_text(exponent_list, std::index_sequence) { constexpr auto neg_exp = negative_exp_count; return (exp_text() + ...); } template -constexpr auto deduced_symbol_text() +constexpr auto derived_symbol_text() { - return deduced_symbol_text(typename Dim::recipe(), std::index_sequence_for()); + return derived_symbol_text(typename Dim::recipe(), std::index_sequence_for()); } } // namespace units::detail diff --git a/src/core/include/units/bits/deduced_unit.h b/src/core/include/units/bits/derived_unit.h similarity index 96% rename from src/core/include/units/bits/deduced_unit.h rename to src/core/include/units/bits/derived_unit.h index ff3bf5ce..f65b2fdd 100644 --- a/src/core/include/units/bits/deduced_unit.h +++ b/src/core/include/units/bits/derived_unit.h @@ -33,7 +33,7 @@ inline constexpr bool same_scaled_units = false; template inline constexpr bool same_scaled_units, Us...> = (UnitOf && ...); -// deduced_unit +// derived_unit template constexpr ratio inverse_if_negative(const ratio& r) @@ -51,6 +51,6 @@ constexpr ratio derived_ratio(exponent_list) } template -using deduced_unit = scaled_unit(typename D::recipe()), typename D::coherent_unit::reference>; +using derived_unit = scaled_unit(typename D::recipe()), typename D::coherent_unit::reference>; } // namespace units::detail diff --git a/src/core/include/units/bits/unit_text.h b/src/core/include/units/bits/unit_text.h index 208dadef..5fc86bed 100644 --- a/src/core/include/units/bits/unit_text.h +++ b/src/core/include/units/bits/unit_text.h @@ -22,7 +22,7 @@ #pragma once -#include +#include #include #include #include diff --git a/src/core/include/units/unit.h b/src/core/include/units/unit.h index ef972808..d6bca261 100644 --- a/src/core/include/units/unit.h +++ b/src/core/include/units/unit.h @@ -22,11 +22,11 @@ #pragma once -#include +#include #include // IWYU pragma: begin_exports -#include +#include #include #include #include @@ -155,9 +155,9 @@ struct prefixed_unit : downcast_dispatch requires detail::same_scaled_units && (U::is_named && (URest::is_named && ... && true)) -struct deduced_unit : downcast_dispatch> { +struct derived_unit : downcast_dispatch> { static constexpr bool is_named = false; - static constexpr auto symbol = detail::deduced_symbol_text(); + static constexpr auto symbol = detail::derived_symbol_text(); using prefix_family = no_prefix; }; @@ -167,7 +167,7 @@ struct deduced_unit : downcast_dispatch requires detail::same_scaled_units && (U::is_named && (URest::is_named && ... && true)) // TODO - 'noble' is placeholder to sort of mean can pass its name on to other deduced units -struct noble_deduced_unit : downcast_dispatch> { +struct noble_derived_unit : downcast_dispatch> { static constexpr bool is_named = true; - static constexpr auto symbol = detail::deduced_symbol_text(); + static constexpr auto symbol = detail::derived_symbol_text(); using prefix_family = no_prefix; }; @@ -203,7 +203,7 @@ struct noble_deduced_unit : downcast_dispatch requires detail::same_scaled_units -struct named_deduced_unit : downcast_dispatch> { +struct named_derived_unit : downcast_dispatch> { static constexpr bool is_named = true; static constexpr auto symbol = Symbol; using prefix_family = PF; diff --git a/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h b/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h index 06c8ab63..ac081b86 100644 --- a/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h +++ b/src/systems/isq-iec80000/include/units/isq/iec80000/transfer_rate.h @@ -37,14 +37,14 @@ namespace units::isq::iec80000 { struct byte_per_second : unit {}; struct dim_transfer_rate : derived_dimension, exponent> {}; -struct kilobyte_per_second : deduced_unit {}; -struct megabyte_per_second : deduced_unit {}; -struct gigabyte_per_second : deduced_unit {}; -struct terabyte_per_second : deduced_unit {}; -struct petabyte_per_second : deduced_unit {}; -struct exabyte_per_second : deduced_unit {}; -struct zettabyte_per_second : deduced_unit {}; -struct yottabyte_per_second : deduced_unit {}; +struct kilobyte_per_second : derived_unit {}; +struct megabyte_per_second : derived_unit {}; +struct gigabyte_per_second : derived_unit {}; +struct terabyte_per_second : derived_unit {}; +struct petabyte_per_second : derived_unit {}; +struct exabyte_per_second : derived_unit {}; +struct zettabyte_per_second : derived_unit {}; +struct yottabyte_per_second : derived_unit {}; template concept TransferRate = QuantityOf; diff --git a/src/systems/si-fps/include/units/isq/si/fps/energy.h b/src/systems/si-fps/include/units/isq/si/fps/energy.h index 250f0e88..b33bab74 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/energy.h +++ b/src/systems/si-fps/include/units/isq/si/fps/energy.h @@ -40,7 +40,7 @@ struct foot_poundal : unit {}; struct dim_energy : isq::dim_energy {}; // https://en.wikipedia.org/wiki/Foot-pound_(energy) -struct foot_pound_force : noble_deduced_unit {}; +struct foot_pound_force : noble_derived_unit {}; template U, Representation Rep = double> using energy = quantity; diff --git a/src/systems/si-fps/include/units/isq/si/fps/power.h b/src/systems/si-fps/include/units/isq/si/fps/power.h index 17365d6e..92bba117 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/power.h +++ b/src/systems/si-fps/include/units/isq/si/fps/power.h @@ -39,7 +39,7 @@ struct foot_poundal_per_second : unit {}; struct dim_power : isq::dim_power {}; -struct foot_pound_force_per_second : deduced_unit {}; +struct foot_pound_force_per_second : derived_unit {}; struct horse_power : named_scaled_unit {}; diff --git a/src/systems/si-fps/include/units/isq/si/fps/speed.h b/src/systems/si-fps/include/units/isq/si/fps/speed.h index 2a2616a8..098498d5 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/speed.h +++ b/src/systems/si-fps/include/units/isq/si/fps/speed.h @@ -41,10 +41,8 @@ struct dim_speed : isq::dim_speed U, Representation Rep = double> using speed = quantity; -struct mile_per_hour : deduced_unit{}; - -struct nautical_mile_per_hour : named_deduced_unit{}; - +struct mile_per_hour : derived_unit{}; +struct nautical_mile_per_hour : derived_unit{}; struct knot : alias_unit {}; #ifndef UNITS_NO_LITERALS diff --git a/src/systems/si-fps/include/units/isq/si/fps/volume.h b/src/systems/si-fps/include/units/isq/si/fps/volume.h index 822e970f..0f809bb6 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/volume.h +++ b/src/systems/si-fps/include/units/isq/si/fps/volume.h @@ -37,7 +37,7 @@ namespace units::isq::si::fps { struct cubic_foot : unit {}; struct dim_volume : isq::dim_volume {}; -struct cubic_yard : deduced_unit {}; +struct cubic_yard : derived_unit {}; template U, Representation Rep = double> using volume = quantity; diff --git a/src/systems/si-international/include/units/isq/si/international/area.h b/src/systems/si-international/include/units/isq/si/international/area.h index 9661e43b..5a5489d9 100644 --- a/src/systems/si-international/include/units/isq/si/international/area.h +++ b/src/systems/si-international/include/units/isq/si/international/area.h @@ -35,7 +35,7 @@ namespace units::isq::si::international { -struct square_foot : deduced_unit {}; +struct square_foot : derived_unit {}; #ifndef UNITS_NO_LITERALS diff --git a/src/systems/si-international/include/units/isq/si/international/speed.h b/src/systems/si-international/include/units/isq/si/international/speed.h index 7ee17198..406cc195 100644 --- a/src/systems/si-international/include/units/isq/si/international/speed.h +++ b/src/systems/si-international/include/units/isq/si/international/speed.h @@ -34,7 +34,7 @@ namespace units::isq::si::international { -struct mile_per_hour : deduced_unit {}; +struct mile_per_hour : derived_unit {}; #ifndef UNITS_NO_LITERALS diff --git a/src/systems/si-international/include/units/isq/si/international/volume.h b/src/systems/si-international/include/units/isq/si/international/volume.h index aea9186a..641340ae 100644 --- a/src/systems/si-international/include/units/isq/si/international/volume.h +++ b/src/systems/si-international/include/units/isq/si/international/volume.h @@ -35,7 +35,7 @@ namespace units::isq::si::international { -struct cubic_foot : deduced_unit {}; +struct cubic_foot : derived_unit {}; #ifndef UNITS_NO_LITERALS diff --git a/src/systems/si/include/units/isq/si/area.h b/src/systems/si/include/units/isq/si/area.h index d6571961..13d21a1a 100644 --- a/src/systems/si/include/units/isq/si/area.h +++ b/src/systems/si/include/units/isq/si/area.h @@ -37,26 +37,26 @@ namespace units::isq::si { struct square_metre : unit {}; struct dim_area : isq::dim_area {}; -struct square_yoctometre : deduced_unit {}; -struct square_zeptometre : deduced_unit {}; -struct square_attometre : deduced_unit {}; -struct square_femtometre : deduced_unit {}; -struct square_picometre : deduced_unit {}; -struct square_nanometre : deduced_unit {}; -struct square_micrometre : deduced_unit {}; -struct square_millimetre : deduced_unit {}; -struct square_centimetre : deduced_unit {}; -struct square_decimetre : deduced_unit {}; -struct square_decametre : deduced_unit {}; -struct square_hectometre : deduced_unit {}; -struct square_kilometre : deduced_unit {}; -struct square_megametre : deduced_unit {}; -struct square_gigametre : deduced_unit {}; -struct square_terametre : deduced_unit {}; -struct square_petametre : deduced_unit {}; -struct square_exametre : deduced_unit {}; -struct square_zettametre : deduced_unit {}; -struct square_yottametre : deduced_unit {}; +struct square_yoctometre : derived_unit {}; +struct square_zeptometre : derived_unit {}; +struct square_attometre : derived_unit {}; +struct square_femtometre : derived_unit {}; +struct square_picometre : derived_unit {}; +struct square_nanometre : derived_unit {}; +struct square_micrometre : derived_unit {}; +struct square_millimetre : derived_unit {}; +struct square_centimetre : derived_unit {}; +struct square_decimetre : derived_unit {}; +struct square_decametre : derived_unit {}; +struct square_hectometre : derived_unit {}; +struct square_kilometre : derived_unit {}; +struct square_megametre : derived_unit {}; +struct square_gigametre : derived_unit {}; +struct square_terametre : derived_unit {}; +struct square_petametre : derived_unit {}; +struct square_exametre : derived_unit {}; +struct square_zettametre : derived_unit {}; +struct square_yottametre : derived_unit {}; struct hectare : alias_unit {}; diff --git a/src/systems/si/include/units/isq/si/speed.h b/src/systems/si/include/units/isq/si/speed.h index 5103cc54..0405f67c 100644 --- a/src/systems/si/include/units/isq/si/speed.h +++ b/src/systems/si/include/units/isq/si/speed.h @@ -37,7 +37,7 @@ namespace units::isq::si { struct metre_per_second : unit {}; struct dim_speed : isq::dim_speed {}; -struct kilometre_per_hour : deduced_unit {}; +struct kilometre_per_hour : derived_unit {}; template U, Representation Rep = double> using speed = quantity; diff --git a/src/systems/si/include/units/isq/si/volume.h b/src/systems/si/include/units/isq/si/volume.h index 904c1d79..4d328bcf 100644 --- a/src/systems/si/include/units/isq/si/volume.h +++ b/src/systems/si/include/units/isq/si/volume.h @@ -37,26 +37,26 @@ namespace units::isq::si { struct cubic_metre : unit {}; struct dim_volume : isq::dim_volume {}; -struct cubic_yoctometre : deduced_unit {}; -struct cubic_zeptometre : deduced_unit {}; -struct cubic_attometre : deduced_unit {}; -struct cubic_femtometre : deduced_unit {}; -struct cubic_picometre : deduced_unit {}; -struct cubic_nanometre : deduced_unit {}; -struct cubic_micrometre : deduced_unit {}; -struct cubic_millimetre : deduced_unit {}; -struct cubic_centimetre : deduced_unit {}; -struct cubic_decimetre : deduced_unit {}; -struct cubic_decametre : deduced_unit {}; -struct cubic_hectometre : deduced_unit {}; -struct cubic_kilometre : deduced_unit {}; -struct cubic_megametre : deduced_unit {}; -struct cubic_gigametre : deduced_unit {}; -struct cubic_terametre : deduced_unit {}; -struct cubic_petametre : deduced_unit {}; -struct cubic_exametre : deduced_unit {}; -struct cubic_zettametre : deduced_unit {}; -struct cubic_yottametre : deduced_unit {}; +struct cubic_yoctometre : derived_unit {}; +struct cubic_zeptometre : derived_unit {}; +struct cubic_attometre : derived_unit {}; +struct cubic_femtometre : derived_unit {}; +struct cubic_picometre : derived_unit {}; +struct cubic_nanometre : derived_unit {}; +struct cubic_micrometre : derived_unit {}; +struct cubic_millimetre : derived_unit {}; +struct cubic_centimetre : derived_unit {}; +struct cubic_decimetre : derived_unit {}; +struct cubic_decametre : derived_unit {}; +struct cubic_hectometre : derived_unit {}; +struct cubic_kilometre : derived_unit {}; +struct cubic_megametre : derived_unit {}; +struct cubic_gigametre : derived_unit {}; +struct cubic_terametre : derived_unit {}; +struct cubic_petametre : derived_unit {}; +struct cubic_exametre : derived_unit {}; +struct cubic_zettametre : derived_unit {}; +struct cubic_yottametre : derived_unit {}; struct litre : alias_unit {}; struct yoctolitre : prefixed_alias_unit {}; diff --git a/test/unit_test/runtime/fmt_test.cpp b/test/unit_test/runtime/fmt_test.cpp index 0c6ecc2b..2ab232e4 100644 --- a/test/unit_test/runtime/fmt_test.cpp +++ b/test/unit_test/runtime/fmt_test.cpp @@ -194,7 +194,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } - SECTION("quantity with a deduced unit") + SECTION("quantity with a derived unit") { SECTION("coherent derived unit") { @@ -287,7 +287,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") SECTION("surface tension") { - struct newton_per_centimetre : deduced_unit {}; + struct newton_per_centimetre : derived_unit {}; const surface_tension q(123); os << q; diff --git a/test/unit_test/static/custom_unit_test.cpp b/test/unit_test/static/custom_unit_test.cpp index 12af712e..ecb68b09 100644 --- a/test/unit_test/static/custom_unit_test.cpp +++ b/test/unit_test/static/custom_unit_test.cpp @@ -65,7 +65,7 @@ namespace { struct kilogram_per_second : unit {}; struct dim_mass_rate : derived_dimension, units::exponent> {}; -struct kilogram_per_hour : deduced_unit {}; +struct kilogram_per_hour : derived_unit {}; [[maybe_unused]] constexpr auto a = 1_q_kg / 1_q_h; } diff --git a/test/unit_test/static/unit_test.cpp b/test/unit_test/static/unit_test.cpp index f8d0315d..ec657dad 100644 --- a/test/unit_test/static/unit_test.cpp +++ b/test/unit_test/static/unit_test.cpp @@ -52,7 +52,7 @@ static_assert([](P) { return !requires { typename prefixed_unit {}; struct dim_speed : derived_dimension, units::exponent> {}; -struct kilometre_per_hour : deduced_unit {}; +struct kilometre_per_hour : derived_unit {}; static_assert(equivalent); static_assert(equivalent); From 7ead50acfcdb3ad889493c759079e38f3b32dffc Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 10 May 2021 16:45:38 +0200 Subject: [PATCH 36/59] refactor: `derived_kind` template parameters reordered to be compatible with a `derived_unit` Resolves #229 --- docs/framework/dimensions.rst | 4 ++-- example/glide_computer/include/glide_computer.h | 4 ++-- src/core/include/units/kind.h | 2 +- test/unit_test/static/kind_test.cpp | 2 +- test/unit_test/static/quantity_kind_test.cpp | 4 ++-- test/unit_test/static/quantity_point_kind_test.cpp | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/framework/dimensions.rst b/docs/framework/dimensions.rst index 344912a6..55cec054 100644 --- a/docs/framework/dimensions.rst +++ b/docs/framework/dimensions.rst @@ -77,7 +77,7 @@ you can use a quantity argument instead of a quantity kind. :emphasize-lines: 8-9 struct height_kind : kind {}; - struct rate_of_climb_kind : derived_kind {}; + struct rate_of_climb_kind : derived_kind {}; template using height = quantity_kind; template using rate_of_climb = quantity_kind; @@ -90,7 +90,7 @@ you can use a quantity argument instead of a quantity kind. :emphasize-lines: 8-12 struct width_kind : kind {}; - struct horizontal_area_kind : derived_kind {}; + struct horizontal_area_kind : derived_kind {}; template using width = quantity_kind; template using horizontal_area = quantity_kind; diff --git a/example/glide_computer/include/glide_computer.h b/example/glide_computer/include/glide_computer.h index 40341237..8185f95f 100644 --- a/example/glide_computer/include/glide_computer.h +++ b/example/glide_computer/include/glide_computer.h @@ -77,8 +77,8 @@ constexpr units::Dimensionless auto operator/(const QK1& lhs, const QK2& rhs) using horizontal_kind = geographic::horizontal_kind; struct vertical_kind : units::kind {}; struct vertical_point_kind : units::point_kind {}; -struct velocity_kind : units::derived_kind {}; -struct rate_of_climb_kind : units::derived_kind {}; +struct velocity_kind : units::derived_kind {}; +struct rate_of_climb_kind : units::derived_kind {}; // https://en.wikipedia.org/wiki/Flight_planning#Units_of_measurement // length diff --git a/src/core/include/units/kind.h b/src/core/include/units/kind.h index 7b1eef7f..5494adc5 100644 --- a/src/core/include/units/kind.h +++ b/src/core/include/units/kind.h @@ -54,7 +54,7 @@ using downcast_point_kind = downcast>; template struct kind : downcast_dispatch> {}; -template +template requires std::same_as struct derived_kind : downcast_dispatch> {}; diff --git a/test/unit_test/static/kind_test.cpp b/test/unit_test/static/kind_test.cpp index 37d43849..fb6ba0bc 100644 --- a/test/unit_test/static/kind_test.cpp +++ b/test/unit_test/static/kind_test.cpp @@ -151,7 +151,7 @@ static_assert(!equivalent); struct height : kind {}; -struct rate_of_climb : derived_kind {}; // program-defined derived kind +struct rate_of_climb : derived_kind {}; // program-defined derived kind struct velocity_of_climb : point_kind {}; // program-defined derived point kind static_assert(Kind); diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index 1dc9a5f2..1cc20856 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -52,8 +52,8 @@ struct radius_kind : kind {}; struct width_kind : kind {}; struct height_kind : kind {}; -struct horizontal_area_kind : derived_kind {}; -struct rate_of_climb_kind : derived_kind {}; +struct horizontal_area_kind : derived_kind {}; +struct rate_of_climb_kind : derived_kind {}; struct apple : kind {}; struct orange : kind {}; diff --git a/test/unit_test/static/quantity_point_kind_test.cpp b/test/unit_test/static/quantity_point_kind_test.cpp index df8cb952..b92ba9b5 100644 --- a/test/unit_test/static/quantity_point_kind_test.cpp +++ b/test/unit_test/static/quantity_point_kind_test.cpp @@ -54,7 +54,7 @@ struct ordinate_kind : point_kind {}; struct distance_kind : kind {}; struct cgs_width_kind : kind {}; struct cgs_height_kind : kind {}; -struct rate_of_climb_kind : derived_kind {}; +struct rate_of_climb_kind : derived_kind {}; struct altitude_kind : point_kind {}; struct apple : kind {}; From b894ee6558dad30e015ba73ba866a86e164c9ec9 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 10 May 2021 18:03:47 +0200 Subject: [PATCH 37/59] refactor: :boom: got rid of a `noble_derived_unit` Resolves #280 --- docs/CHANGELOG.md | 2 ++ docs/_static/img/units.png | Bin 76331 -> 54808 bytes docs/framework/units.rst | 7 ++--- docs/reference/core/types/units.rst | 3 --- src/core/include/units/unit.h | 25 ------------------ .../isq/include/units/isq/dimensions/energy.h | 8 +++++- .../isq/include/units/isq/dimensions/power.h | 8 +++++- .../si-fps/include/units/isq/si/fps/energy.h | 4 +-- .../si-fps/include/units/isq/si/fps/power.h | 4 +-- test/unit_test/static/fps_test.cpp | 4 ++- 10 files changed, 25 insertions(+), 40 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7a2ed012..c4326c9d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,6 +7,7 @@ - (!) refactor: `quantity::count()` renamed to `quantity::number()` - (!) refactor: `data` system renamed to `isq::iec80000` (quantity names renamed too) - (!) refactor: `*deduced_unit` renamed to `*derived_unit` + - (!) refactor: got rid of a `noble_derived_unit` - refactor: quantity (kind) point updated to reflect latest changes to `quantity` - refactor: basic concepts, `quantity` and `quantity_cast` refactored - refactor: `abs()` definition refactored to be more explicit about the return type @@ -32,6 +33,7 @@ - fix: ambiguous case for empty type list resolved - fix: downcasting facility for non-default-constructible types - fix: restore user-warnings within the library implementation + - fix: the text symbol of `foot_pound_force` and `foot_pound_force_per_second` - (!) build: Conan testing version is now hosted on [Artifactory](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units) - (!) build: Linear Algebra is now hosted on its [Artifactory](https://twonington.jfrog.io/artifactory/api/conan/conan-oss) - (!) build: `BUILD_DOCS` CMake option renamed to `UNITS_BUILD_DOCS` diff --git a/docs/_static/img/units.png b/docs/_static/img/units.png index 40727db11e0f3953326ebdd2db65adc9d76602e6..41296df3308574009f83c294360686fc6586686c 100644 GIT binary patch literal 54808 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 literal 76331 zcmeAS@N?(olHy`uVBq!ia0y~yU>0LwU@GKbV_;yoZ=v#$fkA=6)5S5QBJR!H@;Sjr z#g5lcW@X|2_Up}gt|xjs%}WAYHYPZRxNKOY!L_Yj#Py}CptarZMT-;`B{_?T1ZXnt zG~dmc;Qpp7NqkApv)VMX^7}&DRAz7T{8s+I>8^G9xu54$toP3}HfE~vXkbA>3Z6_# zCqL=#WRjT3 zcG)D7laaHhXwC%>CM8Cp6|zhsVp|W--8zYZa{>eB6HCU^CMomUXH0!~)2}0W_L>|? zt59){4~N6Wqh=aH)TGQ|Xmvd{@imvGPFA~hwko4*!=a|XupqhQuwc)I8NZKhF}dO} zS+DV2Y}K@b3pOO|S7^MY?2s5({U*{FWYGi%IpGBxPQ*M8ib&}*%~on$#Ssv(p?(6` z6%!n!I07P;FlMQ$Y3djqpJh6cp_TPFM2dkkWd=j5>$8Snh(_c`GylR z+1Ff{M8w`OL!)^@B9n;NOlH5tiI&&abRq}0!eJH-9V7NRhm?xfL<(~TL~P)PIiig- zAR>j&qSf_T#AY?*fN$ghxm~7!tNYBxG+z~m#DjLQ)Fi1kA^*^$^Y;G_Z3ryS=t_3u zIpSyiHbVE}_UC*1Im>Mt6q$cNZ1I!bR#|^}+1VZGmy#oPzDn+qwq^PKKl^@GZrB&5 zR@dGQ8wEI*%wc%H(Ze!GN(GvR6oL;eTC#*?^88tSk@@Eiw-h=T9(mY)P2&Hvv$HoA zTr4_M@v^k$*G=&oxz}SaJbmK#;@Vdc505)WkIHhZ->f)zW9LV|+gCmxoweRD=gHfQ ztC!kWuiL?qe?Gdy`hBH@dCYxr_4zjnXMZ=(yVJ4zU2O<=_s8VCBaQ5TR=e#Bj<~`h z%{|fK6lXxh5*bZiNJ5z4@RqAveYs8lOXIksN21#oMqXCd&gr}V|A+AUy>{%g&GHW} z760BKq;cM7c4zvseLK$n_LA6=nY%PLVnx^ds%NZoF0bY8v-)JfA$Z@Q^-$A%3!xKy zOdo5LHXjbJa%55o;AK3$sf^7`mP15_!-a2(P_?iW=LCnh0s;p(wm;jM?{j*EaKG=o zWvxf&3b!5pAh$R4?*BiV1=sKYXqL9;hgIFrujX^^ZaSuMfYuSBr{mblhi|?&zc~CfCny&Og85{l5Q!>#JgF9Lr_C zy>DJEDj^~!`8IA%4~v$nL*l`6j!cyf2R6-`-{rAHoTciiqXkbR%cnkv)I&~drB-}d z)YR0psg_$itggq=yw|b+UHS{g{kN8Xcyjst<1Rb#gnNHlBX-$zFn_zxfBoD3H94k- zVi)cxJ>xs$^SA05zt2^t@`P4h+!5Hk@wA@x>-qM^UsZKA_MGi=S}%9^LH0e7EQkLu zgoC%<*zxHTcj2{}%X5rpl-Gu8OK0sr!fl-X@caG$4%aXHA8Oru&TX+9@5i&-?`J1o z*m82>j(@Z4W^7Nm7~C-V`1sT5bI0p`zl&XYV8MnHyZd>VPX#iGh*{n$D4ES7!gyKdjiSPOwhQxI zJQ`RwO?N0g&NC?huzg0 z`+oh3=8-L%EhfgiZnw~s*Zm4+wm%rfkk>49ry-$XjeY=<4pZhH$=gt;RZgJhq z+WPVJpJmoYE|Z8@>FT|bxpIOAzVAhu9zEo83aZ~2?wHgn z@Uul^O+qC0zg!kre+A3vX$rZ#`Pab@|9|M@pQ z@aOG+?WhwicjV*ot=AVV{ln#;bjWF~7tfx3`cd1B41cd>-SPe3@l!4Vp@$x|_`NlJ z*?4ls=Wn|uY!=8{$=znN|GUR8|K7i6v)^wM6s!NgH;#Mq%FF4GuE*Ce-f&{&J^%FA zT8v!XyKa5zv0l#k!}omxr{TgH0j4A)rAHs%n&oil{`&FQzSzpa%AcvyL1A9-LLou1 zcdHy+)ip!abwvEOZeLWRHRaaff_FEUFV38-tg!S-^FQ-@bK2`_^)D@VIBNItN7U2} z7VmDD-JZh`8mRO7+TX75^s`qrgX{l(-R{@A>&c?x!V8VRjYYNi?ZkN$_j3kBJSqQe zw97^%A@bh436FjjEzF&CK(kMH*7Wv=Mk+!lBAGflxJ{MU2Q9pEuk+`7y=&$6N0vEV zb&2Sas$-7Y`r)Om$U9E&sk!&UzV^*G;MCH6Ije5^p?t}z&)*)YGXD8+II6_*>5p8q z{Nu}VLsfOGN^_RKUo+$XJ0%{;8}i4?GJ3aW*B`q(Sx!58{*HS9Z%MchjQ3 z+^?Q%UG-SYmGdKgv0Yx+&qZOnr{140s14fh9~QBqT1V@){-a+jUOg_{T>9woL50s# z7+PKDnduxp<Oz^@_hcM>^rvT9;6#T!;STqR6&&H~{|WKiS+Tkv z)xNlAgXWdE7R~efI)wY)2b5`r{Jgzdd)Hd4Z}+&i-u$`mzum&zZTZ)QnAh#KSvPyr z)vRM{ZoYr!a&=2NBnt|y;ANV&zJQ@+&*m+8fqNd#Kl?U( zZPeHB+#iRmJR4Y6sXHVF+Aa>+>zFuEYtj~HrjvpTHhA>Odrx*a#u2eBarJ6#uTs`^ z+uvT;E4g}(=tKri6`zJfN{K0^dJc(!$t5}-Oq!|=i4%k7n7A>$R7{xF`kd>;%ca+z zeiz{7xxKC4&p&sI7n8~aE+!GNl?x>1^Ky0nu=uDeO{)lGtVJ($)A@G~JN|YU)IKEoePo?c~z2Gw}OA&CZIR zMT-{sZ@v<{%N5b4&a&5#2f0K!VP@-O#>&ob-VX|I^L;&OCjXKj+yDeO=ccGTBp&?d zz!d3rVACFV$1YI@t}W|6RP=GPbcvWa;6A2mc8w}^KyRuHtn_}il=lrD;poT%s;Cn{*nvffDn&{ zLrt>HESowSo@(zAas)y%P0RPMgBSR2}QbYM~m&;%7Pd_pIbn5Jd!;a{+~$kTz3 z)8gUn%_nSkIUzg^ZgEa{%i?p{B9>u&mc44-O(8+I!orW+Z@x4Cs|;<(2`MyQ@(i?7 zabSvcJdiJS-g7~FncE4^ZL<5!v}G0xBdir*XXNU(Q1~bcO8xuyUr<-RRQOs@?xL1} zM%=V_RhjbuCcXwIXVPh1eb+3C`7NNIXh_r7PUjQd~y?QhwkEp;d8 zHs{uJryV3kU}5MG2g*jTpQRS;bU0wt%fR6MQ%hkTr^V6l&ztUlnTT-WDd7bh66zHi zqoDOh<=dts=CikXD9iBukLuRjn1zVL6@s9`C^1=4$b*;hv{77}OL(sD3C?Y@`wUH| zWws*BH1cjZq_lZYq%`Lg!HkQ0B5!vb->mVAS<}XVsqq4rk`f}sV^kaxCw8xOoBz3~ zAyw)>>ji)PFb6x~fuUS|8Y~@ZT4jnyQyUXL3YYdWKURgg^@Ki?h}h4o^Lo_SIeye0a}9c+ z`F7P2_5J^M-uv-p^Levp4X;a(f)&;rl~hZZd2c&I;i7e69S^s~+Nd4Y+hB!os)r>b zSN9aVT z8^QR|Y9Gc^TB@>oz(>Q((ac4+gP#)y7#uA7;1Ksy=bvwZ~y%ZhMXC)}uv8 z{^@1W(Al&x^hNMJ!3{o-Z5d>}T3aPDZXYdw7CV8b10G3!!V5O6xP12f17pVnCfxqQ z6V|)F{&g~V!_kO+HCOp(u9#g4?HDp}PHu^txrniWMiJo!8$1jHW+^jHZ^)Fo&ix?oYdz=A8-<77dLWgnpQbXjy6)Si^LSM$ zsO_Z3xWCM0!Tj8IxizKBUpT}G8~7$KVQ_m=I)SH;#X}*T!y{qJ;}*APJ%>w7;KLp_ zrZwEppQEfiL-6m}>0e)&8%@)T{ly+R(ZPx{VwvLQ%=z0unL#0tX`Aq)2;;yE%RhF~ z*6q^$>(ccZPwUL#JYnoDu5DoVpe65IT>i_*eF6(MoR~f>MMh+Ap{-|vg_fnkSH|uY~@?*Otxy5vDOnQ`+(FgCHs!ZSoCHsYSi9&%IIQQrRtCvsH?Qkfk|ZoBd9WIn6orAAR;C6@P)N^loDp$JI;D!>C#ECcj>HF;s%LD@=u1t|RJ<(x`!|7?Q?o)CmzUqkl zTcI?s>~we69qvyjI$4a|6y~=aUFJKx@cfeF8;Y(TmoTs5`1b$$KFP;3-gW)^^I4xq zy0m>=+L?~V8=1>xSFimvJAeQ2vxn6eWKLEt{A*f!VS(e{wWm_7*T4F+UW}n(Rzdgi zJl}gi-)^`6aNw~2!@sWHg}+wLEj*g~d~w{~DpSL$AC2B8%K`?C@a z>(2CAd}yd&y7!@%mzTlMl`m&}eP-h$VJ_k>Qlv&F8Nt-1;(oV@YMe?aZr( z+CNv%YqkA$gLiw+j@bV>I0tL)*Zx;-+j*;vOdo!Id~5#4A5StP zwxsObR{Ba){Xx^b^o50wU$y!zO4#@7*KMu8{m1XUum2ONyZuwy6ah)gZ+b0<XJ6Jb!q{!(aO>eje#7yy@{p zm8;vO^Xd8DB4R%;PwQDC#v#$R(fMyxK>b#}3s<=-*X6dSUun`_Gl|6^abk@63Xh02 z5kC#t?wYXK?wTL?azXy*XJ;eCG>*;AKYRQDV|dm=0iCGEi;v$QjIaN@cWQ8!z^&!q zDm0jX(p=lG4aAQ z-Dm@72YiOXyEK#BA{M(}Pl|c=W#+^jT4c0;Q((l3vg%he#S8ql>sh=yarn_Q*Tji; z$^-SL`~4A~divs}av={x#>-#g6cyz9W^K(?f8t*#$~iN;{K-V?+#3rI3d(8rb#Tbc z3`pEJ=Q9h7!6DwHchZ-Otme%+b6~l0g6Zwr!xJu63EWya8W0CbjkNW1e5LOX}`uk+r{zwfbsbA~5FtpDqnwHrEmm+oq;T(l?V z;FWE@+;6%EiOg?GmN3 z|K8FKC)R&UF_BbzVBTAAiPuVz(lvPw@R}Ce?{{LCUth6hl5E+Hxbz?twXp0_Xjeg0xG-(g{Y-|O0nXSruTy7h1R zt9=i-x|{j!7~18E1mb3!hEES%8J<4pTI6!om3E6x`PRNmT@&$D&_>Qb^4E?1{I(pO zd?%9chrc!Wz4j+)`03)$AIV?hrmno4o>aL&VtJ`0WAL(l9Q!jLyjorL__%!ip(o3i zPhYxmYxZTP>0jSp10zCoVS~Q_4S%oLuIy?jXPciUtYGq z$xxa7;ezIG>rIwsA8xDv@aS~@gS9)~KWdl1mULXU+~Iigtrv`c^>&-I-PRXMl)pWF zN<&HT!jP;R6J{S@Tzgw=*V+*4HPPQ!iyg~)`u3Uh`lH8uXB&K<`~BmkGv*&ouiw8g zR@z=~|C^dO+uz@t3QChXe@{=S+pnQ>>HG}SCz_0>v&yuVJpY{P|;-Mc4tz;K1x*zW5 z%6p_g^FG)6z5f~W=2q;NJ29>P&Xg(N#r4*H_+I^ftGm-7r<-M$yTNH__sNUx$zMJ+ z-l%+jtRm-=i7m&T;zI>%{=R(9)!OQ%9Q5;RyG%`k+=rikTcc!l_DB1>u9kT|#2a({e~{0P&j-C)TW>$h)0x|s z-M?=6+>VQn-??$uEB^YrSK_t#pT&;V%V~8BMxZ ze%5A)XME(%xidGZaG6Ys?N%p+c_A9*8YpEFmcfB3Rle@gDR683Y)Wp9gxf8Fb`K8r`bv|X-ab)>&3_y1Gb#UCCh`)AM2 zYFOk~QPg#)N+7eM{~Ghzz~uLb_Wgd-EB&vSRc`*DIp-qfF-B#B^mJnOZ_l~cR4AT(h5t+Q5y@gLT?N*%kP8cRC%e}d^=)trar%L=7oa&Xa4=Gww91MX{e~ z74~;;tG8j=A6u*3j1vp$0#@5TonKM2)+^%6{!dANzAs!p=~3uCdC~K$`0Wp_-F|<) z|7ft8{?!hNqB?52Oava)ESddShD?%s={Vo&|I7F}M= zwb!@cXX;*qZ`Xcr$h@qk>k_hRPSvUHk+ZLb^|rKb3cjiKGh+YM-5Xa+=xI-#w#1Ly z`o)3zP;H$M$=jR{k45KQJvuexW&KmtUmmws1?`%$VE)%*))m?BnC8|!vwJsh!i}lg zSK~T2>F-Zk*wQNW^OZ(&Y1B-s#y8)rQ^SVoq+?KlSwaQ-Sw>Nk)hnDE8 zN!{m;I{LJ!aS>bLLwv`SlALcx6*>>;h%w-(2O)@Vn zxLEe}nd5@kEnWQzPb6;h`TGV>HJRqRI&t7%z)Q)jvOn)U`&IWO zEldl#su1+_>-qZfjq@tY!jmQmierzq{B)`}Ur{&*SS~H_o~xzOZk4sQZLf zk=a|l-`AYFv~87;SortdEc|vhuIJxfpECW_=J4Mf=Pcg3=(bIX z2+;P(YW4cLMP0o<9K}hUdJ+b`M_y?!Eq`_taq%#=4N6X!X53t~Q|`#W?+=%MIJc)YAk(SUZE_C>_xAZQRVOQ}0}++w@H+Hs@U={%`0424c|t;_WiSp_sS_b^Ze%*fXrw_ZO~JS$iH>?s$P=(`_y*YtZ-IvGgBP3qhg>HbaFqjf`oy2MJxrKgtm)n@HV zS{TOtY~N?Oce}n%%>DHIuCkf-?f(Mr<+!)L+-kIcvY^;Iwu16}57*-xS2ac+;CuMh z{NAdx(?5RW_PeW1 z2H%vnoT`Ygam8P=ef)a;{!39Q(-nIEcPy`4d73l%eZyeeO9??$Gn6`0X!hhh!P=^J)ySx%w$(_m*Xs4_*le#^1G@` z`*MyW$~s!R_F8=VqEec5S-IbSwf~Di=_yy2U7a3ZyE&&ps=9c6b};XTdc}u}nyKnS zb1$s4U1sxJ$Mu-d*%E7Y5LQ`HLN!*?xUlwdj$k#hd%>FM`)3{ccPW(69b}?Hg$3>+IRv zPg{3pE!NiGzu}bkzg52(3O<*WwtV{jT}15X?QK0ezAQSIH!#jPwWsCHYm0~OmqJ2k z-W1cF^+s58<#rB-m!SukoO7*1X6-rM&a#N*k)T*hXgP<*!w*j`8=nfAA=GzhX-#uxj*L9QQ!6;clp)6PhOqtN|EF0PI>XPERw7H zPM&?${6wa@`Gwm=DiovMzB(J7(Biak?fPrJ&HhinmoUu8w_fO%xuQ+2c#gw9uI^QR z>7l;QmaSM}B5Svlj-Xdb24^O{5BqC;cx2DAIGK-yCE+EsyOwpv$x-u6fAuiLv%+DUf*spZdD?syA^awWa*uD;^YF>U?a zLyMl}PJFGZ2^lCp#xY~r#VCe%ZZCUTzqV}5iQIVW$lPnkjkxEtrbLdg%|Dm1yZn9JhF_ce#hn+VuAFhu<2YxpSNhy7b8myj zx_AG5Vao{}eLi{Q@q!H=b0od5I5JIJ|G|yp<-9{*roC*QO)HwXa0|L z@7tlP!~RYM7Z0Er@x0p?i-k_8gNE*}%<4SqlsHjBe_yOQC&y_cyQU+8OSRcw?zca* zY1UuqON-5N-iPjTYVyvp{t|Nc$oUnIRUHxq^)>goGpS7QV-gX2xn%a;ZJIipcGtd$ z6%#Nxdx)Fm$&?k^+BxbeQ_|FyzTa4Lj9FmEs*vCZTN{L}lxw$MEZQfap|A5vRqdD~ zlgfnKEIH~&Hm2p7Cpz8Ryixej(dn<17*BuM$J!xW`X=a327CA2FH5#OFz{VGnc-ex zFL(d*9S#dJ9HX=rU)%!<&+xM+6Fe03K_j8A#>Zq?T3zp~_>mN=k`UQ?-0@W9#T)f& z!{v`%TDma*(#b=gBsVKuaD6S&@mqHJk69(x+;9JMJ^)&5=JETk)=%f2i4zz&mrRCE zHd?)2@b(SJirBY~`I~wgQYHHxo#eH(72lW7DTreKSr`9sY0!z|-i96Ty_FW_1_oZ7 zrE}P+95I!UAPt(_7EuY{YhOejUC>s?(*o^EW7;2Qj2c&KeIB;j9I>X z++_XYC|BpZ#)KEGExa4SQ=E`VgDXOeT-{Mj=d(7?Zpf_C7Z>Qy&{v&y^I*X0lB%4@ zW5E-4tk_~@^W0+Lyq9bG5f*zWTxHSF3G$ut?Nd`jW|cT6$JDMReKYo6;}i4u3Qwq; zU)Uy6p_)~{Sv}}dUggD8PhYO;F9VIWgPrZ6APbs!ahz&aJgZ^<&h6b_IwCJB?91H{ z+qp62mR^EZKIR?TGC!EbXLCVQ zgG|h;Efv?wy7WE58KynmD;&ggVHQ)x?Lw!ymqW$hLf4{!CS`VkmH^B)c>A2Eahh)b zt-UGU&H4;)L}cI0e`K-H{IZ}!_p`IN+-&B#uFF+So$g>@V=Y^HQ4Kbc$-tS?#L()h zrm?wijzU7@v8@w!gj;JrWwMsA(~Iq!z3gKX!?|nUSmn0A4VYhY)pa*~l1F6%Cup*N z!5OQfriN6hto+u6$A1acG9A3|_+`PJ_r_ITjVl9h@Aq`MWp%EL|8k&sE|QyJ6G2bNSqLA+r##9R&mS&&|F48qIPw&2+G!Y-$-Zl;5eG*_-`|Axqn3(PnI zBEVgQP!^rj)$&VrsJ*(fc$@GpC0V{%%f2fzUJSoIt>P$O+c_V1TjUtt>ez5-k=csP z=hi4*IA!qdeh`2B%Offbf|~ujY=_@3z2&%ne`LDk$1{a*y&gy$=iEF0RaHhmB4K8A zGqk$qPE6k$>3HB%WxGSi?M16O@^2ixu<~WW86)0O`D31ex4+-=d-1E}it}tlJOxCv zXy{~h+q^!@#WXE*#a@wit@IZ5y-bZ4wuD%x&ANA*^@wud?)y$Tnc25jU(w=}M+#(6 zxl?(03Xe)4)3TSg@eVe@QGQ~#{dQC?GFw%B|Mk~*w-)RRIDT4g=~3<{4GqHkcJC_s zV~a>yPox;Rx?{2pf6X>xs=Hhf&2&7wnW;I)y2Sldk2~+oWrkr4=F_vpbv89G{I+sk zGg2TcNQ35zoV72s_XvOZJ-d9$#1nrqj@mn4G0(aE&u(hpkH4*UlAStiE{B6+A#?aE z*EDZKM3O=@NWZuDh5jC)4K>FW3%n3sYoa@Q<=ADU!&O8rZZPRm?jt@Wjji?N5_V&SD)F{Jg`3jUyK zH1n|0nl8>QnU|McT-IB^o^iu;xi8gEW;Qzfm>TlQ$oFv-;|_KE+B*rmCvEedw&suO z)Y1!Lh)_X*hNi=#pqyqWw~TwHXMaiY+9B?fkl-9nqz zKW@2etrHX}nmZ9*Ogn@LF4%Bl)w2c0FVzxe9%E;SdRfKt>vq|T#*k|-&3kvN3hWJy zKDTl1hU(j8TB{f8A|($i&{W-Zl@g6umOpmyHG?|L7k%5`C1?1%dey7VYYu&z5cGDf zMs175$!*=wmz=VD3#k=Aq=Ok~{lv3t3-dKq6J{MVVVtwP*XvFeyR&m}WMit>IhH3g zqk{^6I<%GyM{Usc(ywhA#8U=aS!k4aMx~#Lu!NITdRJEt$-|D*j4{|!Ni7UT(it`r3&gE|tUObv2!6smv>6Lrq+tgXd z&-MvR&DZ+9#TijN?{sK5q$D2IX{YA8!1wa9-MP2cJ&yye)hDySX0BZ4kCn z)NFpr6+P{{hQ~&U1M7Yrcbb=f`{Bx!oBXX2IeCIMsNJ@7>5KGU&WL5@stU6-n1wcN zf7~*E&Bl#0nx>tv5MioawCL&524O4f&~2GW^W8bthkk9hmmAR#srSTewIb zr^Uj;l}ZVbt;Gtd>8buscivhYWe!T6U6$nrZU#vNZoZ@g%N{G06&eHkgr#O$b>GbI zJf!sdc8A=x2@Ut-Zv?qLxs>tI-djm-@ro50zPx91L(k-keVaOg-?je7)oDT(x9!;R z<95i6Wxcb6H~2VT+hgJltwkKNIB)o^@ax_BI%LDjw_01Kfz}^cdpg9d{VP&&Vw-dL z(nIOs;ej<~Ir4H_Yv<;+e|c75x78c8bnNHmGH@zxTnk$I?modmPC!FP=TG=vrj>m& zbY*`pFZkd5^z%I~#XOy>+7y69+B2~&(_>q9`hJl zT|e<;HiF9@1yBH={Ft06bi#^hT4oLB1Ba(GT3$S~IC_5hA?=;n&#zPBxFLM&c>mrVC=6koLM zntO`l?F55}Ib655Oa#rZuYBkMUFc=1?vNN*T&Cm66zP7zq?eWH!f!bia9M6G>i5ex zc_YiMjA*Bxjc*@4T)DwpdZn^M;zX-yTOg}50*skN#7rL_3sRX-$`bWs&vCbwhy}8f ze-svT_5^5bF^hE9jep3%QJH?_T)V2E|LsMK7Tuq;_4KEeptX=u^R~Ew^Vb9mMy~E7 zGdHqurl>NW)|ta|!h1`x)4kN&52YuSUU~jm_6fM*RJSzkqPhT&?YuRy)BJ5gVPL$} z6%qzVI07P6j&D;VkAG;X5-XHLI`1bC}Uq?TQ3ZF1f+?e$AxJ1cii7zke*z|UOxD%E64Q;c8(6>Y^ zn~?qIU1{Sag|b_j$FpMB_N8z8{Oj56_l2K7aAw?k;t^BtD{qn! zu>aPKV8@sDrI?H@doUhjJQ+CK~LYyYyZeqDO&`-XQ_4vB%~ zx93fK&dIp{{0<*38!_JWg>PGgM7^0JzUE7 zTU<5%DCS8RMR9lA?fqXrIa^Ko?O99ig6FpUkK11Ve)L4xS}o@5G4yo;syWIRnN(F( zXZ*QRa;B;>;X`n>#n_4@s!7aMMG*&tDH_vwwi-EW1q{r@drA9i}}ox4ymH zuRcGpYnLlhIA^z+yYKZ4v9GVy_4207<(2+-@NKzmM{D=A%+0I%|9`n`Wn=zW6tu#B zT4spkZ0!jl_x1kIxxYC&N{vbAt@lSWAJ@Vab@$f3K56l}XY$1jiH~yEy!!X?_<8=2P~>9fx1PhWQSh;eZI9kw-6 zE!#44L#-YBN(^SK*zn`m>-S$C_^wr%QvYs_flS-?7gNeRZV8C36ZrY!aqja{z1>f2 zboaCha3244m_NJlbI0wCkNa*XU)cbfE1dh`%$4bn#KflloSJ=Tk=DNFCDx*~dT%?M znwqqJhHaTNH7hajYWm}iCogZ=(6Rk~xQdR}ufB>`GsQ0~sI#3@c&n4Mlb@@*#lBC+ zf$1iwb3K{WV0Q?^gKl2w?GmfQ*8b9#W7(rm=JV`v+d)PDUt!r z;il5-gJy#lMaY{5u4m%e@s4XtZf>HtC+D-X@hxm$Umt$2za}i=h*j9!0Pm299WM>i z%U?I`tJOPjtarA-=czY8m|0t`n|V9y;L$w+vky7#Tol$O^?r+T+Sz&S)$i+h=2~rA z{qdCNrj07QK26ei{p#NOb^4*<_x{%A$aKBm^wd?tK2eCz^2vc6m;OvjmF!=?QbbJj zYWT(S79r{LezRAGYwez2E9LjP$SFqKLPYH27LEIgjXJ6ck;iyE<}AJ|oU|raoZtJ{ zRk7AqUuD)J!G^h8Jv-+$CcN00lCx~}n)~T<*c-c53yOBVIuW`%l#|<3qWaUz=Y_8G zxefCFIqAg89bx?azCHVQ{4(}rt*Os?&7XtDy^p=p-*>6<$=awN1(EOP{kUHD`+%>k z#h(q$rCH~V-z`P&;adr!L+eKSPn`r6;3=Y6U-Lh|}yeruQHf4^qG|8T#3-X%@lv$Nz_H&+_le7y2yNASYBnBT^7^KE#$r|Gyi zv+)+Z(mek7P+a=UlBu6cSMSn$Q);$rUY%0ikB{ne%~IG8|9HKA|5v$=&F5@fm;YW7 zdFsZ&?pasE?W_t8rNUN7ZX< zep;;y(I}s=I0v*);`^+S>vdXo<=;MDGc->;cl&+fJL~sTOH;3=J$B{+leGc24Ux zdsqHqH(t}lpQ?qP=|*e`)e70PXPO@OqiGYjzb*?{t>HUcCh*zwMXHR*Yb5^1e0{#~ zaQ@|L&Rz4$gxdP&t+<`>w~cqk&r`E!P5kut#bUn8wd+?@sLm2MJG%9+{?)%XWgX;d zJ}_E*nb7><)|#EW&am2^KP0)l^jfB;*0S$ndRO0s%(~WR{jMST)^?}$pLZp`-}}vB z5%Z@T->-UIdb9o6<9om5-Jd`1zgTU%%x`|@)5av*53`NFy8iHG4v)VYz5KCHUDd9C zJ*$_;&KCPsye4Sgm48chqrJBM>{=bZ-eLI_nW7Jj66LpRBlbSi?vXU)X#e{=!B*QY z_m{SWaghL@RmOj>)}>yXt3Ez8|8VV2`NA+ak>ctWr^nY{{u}mnKWMx^_f?$Ip+&picYOL?)5gD-uiv+B-J$m! zU*~Qpx~g9B@96afcG+GDU-s>2_dB>+>*|CqfPmB3fC2W#&Sn0U$_~VPxL01=?Rz703?J9%++scTq50_Uh zi2iqTU!by&guRHnY~_uxLywl6JN~M1>Z#}Y|5r5L@NHgq%uqJ!@!s$D2i6L|zn^yC z*|qSya@}2Qb2n<6U)_5DoV9tI_3stmB39J$igI#K{busAQT+=;5buvGTrJiS1?+}V z93hj!LPEJZcdM(Gsg?iR?Y&J%?Bu5)<{Rwtl~Md#t}ae`S)8fAWdqm3OSV@I1lg{N zf4}edx{9w~cUnD5bY9>7syb_bi_ns*wt4sezxyq(t@HR>Bj4NThf}XVd$6D1c4x2W z*7S$Z6t62Nt-e1yXkS6zip#BM=VGVC zg>hxKV|dlv`}PWBU&0am@Vi53j{e>q?P8Tvzdr1`<#;pr(3(~IN^;t-Rqa2~E??XA zadCc&kksk7NqZlaUHtj{g_U--*5lP|7tQ%z@yCBoOD#SAO;of$N_MqZ#E#WoUPpZQ zymr($DE<4$eB4rJM$Lu4_Wk--o&L{h zOU}c?4;aH=o^0-tR%jr&n{gW5fWk(zp$`zYS5{r4L_`Or>5_`SP{JNj=dFhaR*1VS^h=l_w(!H zmb2gf{cf|kUHo6se_QY0`?W-V>m-AkE3#GB0+%MOaOdPV4L1MqYhS?Ts^Iz6lK%F; zo9=z6JX{*CAk_JScX?Kt&&?3y(pUZKqb>%_u6TWYeY<%2zJ=*WkN3%}`MkTGN47uh zY~PWF?DZEm&-#2nc8z~ZmwUtxY3Zw8oxhUT|C_N}TIjCi|8Kd`)6S-?x*1|Bu`)cM zp?9{~%bCuqZXta;yAI1rOpo7~asAkOf5)i(b+&DHOKiX0ua95z>qW4w_PVs>t8Aay zQN6!XcY#r0>M!SA)KR<6f$H?LxARxim~e>A~pkBIu#t`zG;+tsVW z;;uAAbDnzKpWT04-M)Q#e6{dmcOED7l_x5=R-Wv7-!D;M1# z;GlorSlt1A)@Z>o#A*$`7ZFLZv;n~?aB=JOxA_zO>W zbpG1yR9MWq>~{OrtcAb&B7a{#|I2t)*nuey!HW#%?OPId^Ul8--~HZ&uQca=xFLMm z;Q!vEsZPp*i3|6=zVba{_cmRV(_dekhe-Ad$!yd~{{3(H{IwVFH?BH+rTk9b?zfA= zd9J#&+lhaF+f6+15wuy7hw-$@6PT6hN&;)xVJhjWK+tT7Roy-#Bal_l{NJbgKQ53F^f$t z3-}kv+?07a{upS<%&Z4?qMY1Y7X{zs+3wZ6^UI^p1^4Uc-+0Bc!sR=U%BG};zaj!< zKXP!Ja!1;UX6^s`&2hb4>_V0sWw%W)G}letw2|Zhts~Z*57{?5Kkl4|niYIj?)Af0cJla&k$l z>(AhYcfPE0$`}6fqRz^#cdzt+yDtj5VRt0&etH`i$`$B(U;5(`zfcp6p4g)WxvL#F zN1Y5>E*mPoUu$ugWd5F~VX-lt)Bc6WHC26m6*}|M(j&jtnBO}XT`d0Mi}Clu^!Lf( z>n6SR_KH{`Svs|B`*FG5FHd&geqY1z``zyHsmuva!*lLxwPv09QN1Oh)W2x8-n@#I zqrbbS<$ksm@xQ(6&7Jed*uCd&5)J)oJ+XDx!| zp^j&t@%}m=`fJIoN^Y^&R~jqAbWW8sm>N|4*qHv|-=d{eZ4tZzZ2Ypz!$qg;$k-6e zyvOu;tcmTf0-OJjUjIls8(zg$ef@6P#mbNVzB2P5Q-bUvgrr#ft;=xm({K zh&7!F*`yo4zGKDBkGs`vr+w%;x_{k)tTayg4e(+Z9?}?gQ_}wRD zTc!1bmM?5!Q;#i8Yy3NHp?SW3oX~~J&#``%b+aSSM;Jy--4M|1Q+nLpXwMXlJEhlS zOU`Y-74UAIf~n;z4j#!X{&OcS57)H&TVi@;Uq`_Y!}Zzcd8!maVp4w!NmlFa1O0#0>?% zPcEH4XZiONN1h!C-}2Dn+PVAn>#xs0c-}64vHj-k`l$B6!+9694MTrE#lC9i&ie%+ z9NeZHVXH;5T3^lhwszsAA8mX)*|M(fTeWf|&cUkHaCf2X5!)N)! zq4s&N)rSYW-)|RNCttrQs-Atu!l2CfmER1d z-z@ctSYba&%iOXoIo(KGthf9Y=VP@y%gql@tN(VpJioSZj@M?1>esbasY>5E-6Q^d z{a$sa_Wt4<$=_o){{414`Dj=Fm#l876DvzZO@r6|dvBMuVNFr@a=-eeZ)E;|`Wm(+ z>Eh2Hd{w2+vIix8?+||xI_7J1P0jmQ}t?$y4Sd$SJx3+0z@R}=YR#iHj%*wm{Y%g&vCt zP7J&mxaZx<`2GLBRd3Z6%loa7Sb5;z@1!R)c9)!*6V)52wArZf$uiZWb$*w2CM|pw z_4A>6RjXI-vGA9@tIogK`urW|=hE)W{f?rL>2tz8p>Im@TcS{`&fX+C$=++Oagveh3h zbl#YHpsU5z^}b+MYUlB@YTvHUJ)~q9S7YtX5i#w%kB4FKZsiS^wmHAr*XiMV*ZAxq zPNq#Jm2sz7%M5B_d~=uXnv*K2rt-#Ux0Bzdw;#5yT&FJo=BTz#QvRCWy%nBwSzrs5 zZfwaE?z3OVyzl=%_ndp1T%R+pR{wS^^?KSHt&Up^@Ax>ruJrZyyS)7Rj(Ul^!d+L? z97~(dDfin)mkITIrOx{Frh9`={#Nn4m7$!aLX)LLR!>ozs$YL^XYAKE3ues>Z`KLj ze(TQKv>ny+ZilX)w}P=Hdikv%tG{)u5Ha}9U#+7(Rp{dsk^Y_1wxYE*CeKWq&x@)h{lisT7QNz&>(;Emn`d8V z`A_qTR2!~(?X9)#)1jEH6Rj@# z$iA7N5nuk*d2WeW$p_P4)eBcuaBtC6XsFu8&NY6shj?iOoHYta-?l`%v z`}9%{)wVZ|pgJRp3=QB(aSZ?k2@pWgU=lR>6B3zpXPM^glx+re9b?ybhn~$Q+eoZ`oXwk06ns-B% ze3zb50ZM=NHQUv_kUU?6$jH<@Z~y{48eA3pp~w z_v4ji`u6L8r>_38#5Ma>MY zu6bL8_o^_K8XYxf__s7%LggGMi}Os$qWm=f2xn9GcHz?vs=3yfp(9FmQMbMEoS0YNbz7zWJyJucdLRJWe zPWhaI)3YvhM2c42Epu9a{Yu!XQ;}hxjTM!by1&SJs^WH|?Bk1&o9nsDG<04$X&bwN zP0C{u5xaTU?n@tw3FGN>ofe1PmmJO4ZGL;9*3>Z>vO?-9+lRS1yDRE^bC#~^$uu)& zu{pZVmeZ$j&IQ+%o8rUY1Vmh!IxTGuXg+fSXh3??_S_eeoEc1Z^S?{<3%qwLtO*au zpS&^Wru*xxrsGC?*E2u55>z|s&dMOumG;|u5+$s!tZ(0cXFhj==K;>GzO8R}r7hmG zVMX>v<2aBL6&l|tCs;4EDwQmq%VqX^m$Yry^oILi{3Z&BPw8Ux;jvhFDSDG|jnC!V z(GE6(y5F1~ZMVd3)A{1slos@BSE^*aL(=jU7w6}wZwdF(Ug3O9L+4dMvT+E==o5^f zaJ=AAvN2Eag7jMNBhT}$2u*Z49x3QG#c6d|yXn16nblhpcdyjaZamm0JZr{^xgq=V zXC7;3=qt*-wpD*Y$fl5OK9?ml8w6Kw^R5Pk0B9en1|w%r(WWO7zg=qAzx*AuafPPk zw9^udr=QF6Dz?4kQeAfI;Dw*2EAQk>DL?(sKG*y0rIN)SzBx-5`TU%sle&I^9N*fv zS0{%Yag~Oe=)hDu8MK`>=lh(_U!X~ayywSyuQ4s!SQO=PQ&oWHyq^if=}%RPt-E;g z-DAT}6z5voCi_4PE<^xI`GHtyh>R(;Z>_cH5;tS|1-E$&;mS-PgHW~qz5KmLP> zvvB)k5q^)>+*^>jR}k5FOT{5EaQ2tT@~JF7n?I;9{!Dx6{b@7X?Y9{^k(*MS7v0cV zU0}E5ingrKqq5_ga+6l{hU|I&`RA+(my=%Cr!mBFTP!pVN}O#5aTthPunlx-K^gak ze_ossX%BrI=0$387+flJS}b(*sX6!hX%i+ddTMun4{NUT!V9-t-m3hrJKoHn_v3k9 z@9FME{JH8^R3dll_=6`09YEwwr-nmH(NRrxIj##_6B93cG{y-2eaO~X)%Mt8zG~CS zO>1fu%~$i@W`AA8^f$-)OM;SF(ARaTQeJ1?NN)W;`)x~^@6=qBH4F+4i4%F(I>>JW zog-7udE)s?)PRet{qTdjAi--G{n@;2Z~wIw z?&}w|im#`y^{Y^tHx0CT{c3mC;=G5S=LrZVt^1wiaw@s`;D_p~Vm=qSmqqUIaoARH zwvtPUT`zv$qt_xcmrH_5RZtFQ6gp7_T10f;rS!1lX`{TR7CTcGzA6WwWP{d>r*A|9g^M$ zB|dnWcH8yc$$+bFZ@x=UKgl82z3)ftmx`PEt955Ii9`1I>|Caj5`Ua?^%OnO`81Ho zRS8%QTIaX&*|~EG$?xX=I8f%4`{=7lmG}1~2KU!SL3a|^yWe+huQ7W6^X#F0LZ1|` zw=t-(&AIR(C1;ZkxPbs(Vf6%bj9E1!aoWy3^I`qNf>(3fY!g1l>zxKWu(fdRC^CKlg(}mp08vV|U*BNO$&` z>S-_k$_n%@{#uvJ?)*-0^T`>h$mth!GKS^dnw@WJPER|gs2aV&O3L*}uu{*{qerzL zcb671~B-k<$<*z^6ur zR#&?%Nqxs2nD-V6Nvygv{eZ}E&RCIrjcJ)HzO3ZC7}^~DHo@bz=kv{>b5|)T^4{ia zzZ|KaI~g4O;I(G!KqqTVop#FD9=v}m@Nm_B293RQqdF$%?A~!F?ZqkPZ90#wJnjTX z@y!T-6s!w_;b3>EFGOJe*N$ zf2%BG{;XR`mWT*g!Oa40o~8%(OiR7P-I+brTj*2banAV2xz)1#b~_%<-)$Nuz3psJ zY-2Q&Uq(#n)2v_Br%k#TB~qWd{{5SC``%2XD+*V za9j83Z$2TitUvcm zdY7{nEQ}8GD2!By_~YW6vylf;kX!*3ZKZ3EW*f$xHo3-Nu_8pFeLe_a_^aboSNzZSsUNL;-MhT84!_@y!y#P|7lNc zg@exYw25t*JK>&w;ML?=t?Ha7%unAF{J7LFG~N8$_i3pyJe}(Qb^+Paso+xa?vxc?dpG#Jk8Zdi{($qryar*dy%PGZ{h3m- zECF@=M{90#mU<OBZn`R?^_oxpF3TTw|4R=j~cuCb#j59EF0Pacgx@MTj8nodI8ef)D@t$lCQkH zuP4o^yZpPQ<;B{V2?FKTejgiF-O0T9X~kV{GxGrHZT%PCbH?P~URWJ0>-5uBo}sRF z#s2NNw`T{(^1q$vuusSUat=^-O;0z=r(WoOj(tauR%~i#Xm$Oz#Wk+#(jwQ%wMwdA z|JAd%G^E~ET)rwncfO$f4}?u!(;Nzncx4ONh{lD{Qk@uzcR}? z^1>_5v+%@D{(95?TQBDoccx`eAMcB=U30_aW2gK&la(F6vf3V&^|nnAZu)n!a@o`O z!E09-n8*rwGnxdwY)-WBC*7}aZDo3q`CL=w-1myw?n#ks&yTW5F)@mX@h+Tp z^Y|~fhE~_w)fc~fYHxL|y6V1n^RWwCzcPFa-Nf`FGjiYc)uLi~Z&^83$j)SW@>%Y* zyj8f8WPw&*y!3ykPbpK*RvI+^a#M(j*t5ODueP}VZz9vzwgZy3zuIaN69e;Cnd-_W zCQh7oHORi_Qt9=lOrI>D_8t+s{Mve>)%lXUr3)KsmfD=%-`BACbJwCpi&8Ec@LZSh zu)KH9-{H^sWYPOG*8H)QSG#b5W5b4w4AXP}(zF=G#AZen&rCPx?mn}6bI(Q#|Lb8M z3i=v4N4_rG{$t~-*4Ea%XL}wE4}2x{;r*PFwZn?B%)J zy*Pg7bnBN-J8`aV|Nr+XKc1IaTU)j)D3v~_-FI_x%9PWfknjVA<@&^L>-PyHBnHN3 z8U6j6kT~&Q>6D3LQoFL{6sol!C!evCaC@z+uzBU<`V0eGwwcTF(~M-^-`MuHap}%J zea1JT^X_k7_B4BD&mK#DwF?(GH*Cmw;m`1Uz9vgVM2eSh>b|);I!62XE}v^IdwWZE z>Qj!I_`C?tmMcD&{pbE(G5z5+xuyeW9eo?O+fIA`CdD%Kh1AsBt8DhydwE?v^!)SR ziI5=I|Ua=Hm?7X};?ml~HWR}FO>`+mOP+9k>qV~L+a{jqyPJ>1TMlrEJDh7>b6b>9xGJdtvF5={&MRr$` zq<$vsh`sK3!hNb|(7yDlzjs#~>7ReQ%ZV$q{M+^EtTJ=EySnz>3@zt5{L^5`4$Ue3 zQ-poj*PmJU?DThIMzw&64BXsxN;4eN1QHS_N`4KIUz3s;D4%86TVqi2_CJG+yBa6^ zx=$60&I?JjT@=|=qNxyjsz%XmR@%oWv8Arpw+1rJ5Sey<^0KG9%fdfD{XLUGc!ke` zb*)E__0BeY{PE_G98bk_*3WrjtREPqq^Do^3VnMgvWb29`6H{Y#wT8C5wv)7p*ef$ zoL#5B%zXYV@!cQS9sloL%(#6lZd%w@Q~Up)q~FOHv*t!^KXhR>o07Tt@}NiG?f>uu z%gtyMJe+snep9S zt;>&Yu-RU=QiMbHzjniQ+iB~cuX}RxyAh*WfNA3{F|qD@75taeZPxPGY|R!gv41Sm zBUx`>_0@(uJpL+sWMri0>V2}-WeXlGRG+$GNBSdKi$@q+PCTo2fBX!WO;H}3VG{uS4;I9jH2=H_P_iH4=8Br?uD z)}H$L@2&X;Rd;G%+&I|#di`FZ{r|S{Eq3z{JEZh~nq$Tl57+%+JMPtePxh((PM);oTseV)T@=<{P*>~pz1f6JA;?Yp-+Pto1D zy+KsyuT5OMhrpGV!rx_YZ?VfX9$MfR_}VlqV%mOZ-%pRKXD|qN^gG0Ibziy^MDCr?7=iFQ8sR5kqi<;_m72XiWqY5sV6{k~z^A!biOv8$ZtB9e43ee+0k{O2}X zb@tysr%#+c>2|(&_ibv?>!_09?*0P zIM3$nWOQWQ@LD~g{6)c?eW^=(|1@k#7OpeWy&t%xY|p;%-peoVSgW(^wm5LJTyWyL zxMbh&Gyj(IGcxvUU0a#|QLmR*K_@;QW)_*ypsliqt%t z?Vocrk0kxx-7sbD-njppVjVLjW{C^EJ@r}Rq?T~*baC=@Mgx8+1#%*)_xFK z%_ns9(DRp4d3*k4t%?4wo@Q%pF0$+L(%@>I9lP{rnPv7|d@LW3=y`G7>0jTR-gBQn zy5uDPWzn>!x- z**wKpq;1QK-tv!^_PE}N3|e%ppyvBu{)pY*mhW&{XqJ1gY4@>v%MWc_QG9>R&37Gh zayQ%zxOe;CUvX|RHf7KCFUkea*{|Qd%iLzpv+t$#D@?f`UVjnjTo^Q+PvM~9@1H+E ztp6kQ`~7}>yupSK z!RHCt4s-vUFcnSlPSFtg>7E_8FaEc(RjEnA2}O3zXCGUfT!qC>hl@O%r+N9}o}YqU zime5b%YCrt)XHNLXkIPSQsQq2GV~d%@h5tb^l}8e@j{M)t zZ`b>4&YZ$qC$nl#WOv^?HraoFhvN0G;deX>dZmn6#pl(V>Af#kY+12u^^}ec8|HuB zH+@cjxcI)Mue9cToTeLnwb=K1$L)2;r>yJ`t2oBHUAVkgs!Od`I`QhO^@i`KUJu-H zXZ5^TuD`FZZQWc|wm4QtN6Ifc=K8!%8&N*5zl#Hg`oMu+nRHoKmILa;yVBG_VXH5o@@U;6u187i9M|Ayl&-{ zmt6iS{m+7zXWzLST$r_8xbWZ3yM~FEOtzdaUb$gbYW$2H-~YLX+^PNHDjT%x|K{`D zi|gtiF#c9m(b34S-eOy{ZK0Og&6|;0d%CY#we)ZM|MB^+6^EL{HeQaJ{LEdpZ?)e0 z-aR(qt$fS&UQ@iK)BbjMtY3=i&4ocB^$(qtKE2;>mUH9=Cx6H){ZsmaiGsQ!r`Am_ zzxUf^?adAPQTm0)-#UkQ%*p(zHKXpz#P)~lCT>r7_viX*5wUIgv(58Ejje8Pf6rh$ zS%3epWkM4lALlu&$Sxo8mfu=1QLy{tH(Bec5=*=P?Arfe<}UYp>bkc|K|xin`cb6m>4Nu1CW4l7YwIrSd$Z$m6tk4$ z@;=kneQdbS}vs2YqQ)TMT7rS z%?*C<{AnsCc6>|Dy0m$IZ!X2HUBBV)i_(8LcRX8Vm&Lx}|L;%IJo2UHyXMz*X_>35 zORv|7Sd*skPR=|=*Q`H9LbvDj<@5UjoF>hioO}DLd-;!U?A!F+ugn`O#PZ!=AF2KRw_n0E%_!#FwNO2oby+3l-|v(wCl?JLQp}*p-7k{H==wmekdrJKj0hdPTqre|!Cqx&O|oKS@0D z)_g(ckVv7ff#$BW6SQ_C8>Qo>hM{BS#c{-4e!xy)ZJ)@*8r$i?@m`yJPJ2*2-19^^)zkC&d-H7p)i0-Iiq7 z7akFC@7|)&io$nHqJFLm14K5tE{qL*JMXBmnBnS4!YZ8%+}$dTIV)~H*}1iQNrRBk zmfSVRKW*(lcE})Rvf@*YrJ4=?I;X?`-fOfqgn zD}4WZU%l0S;>O1e*^4JG)=e6ji7^WaQ_z`~oItHkp2Z~p4HDsH;wdf^w#t-k4Q&pJ=f&aYjN)|&CwyFyk) zOUEvHQ_Rn@b2pbi{BcS&gBkJ+z(xK1Q@2gpQrJg>T z$63C>^|P`T=Nyk?p`6^aA{XDBzBpQ@b&XDYl=tE8?Z%5bb0)ZL+K@5f>O7m}ys?Wz z3lC22XK9!Yrea$@ z%-&YGHcQ3ko~c-g#_d|x{zsoxPitSjvW|nhnsLWoGnHGvSYN%V@{zw6@n_$yyt4kZ z-K#g~asBU#2~N`ISoUFctf1JpS=|}gnK{zabz&QLtJ^PeTCBu>X7$S+*0uUGO`axh zy@hVRA+N`kWZjO{mLyl7jla9`hgDVUf4__$p=z1Ss z^w7K`=B&wCFKv_0C2v(Zzi_G@&bj>hb^K(f&!1xQBqz*g=8&7I6_7H^uH5&N*YRo( z6Gw%3rnyRQw3kG3oz|K+yRU4sFYj~*r9+QaEar3Xe&*g*_Ic;8Q{Gn=mQA#lZ=L_k zCsEVH%6qreMIENtGIxvZHU0JT>q|4vI{#SbonHQaS<6YeYLmlrm0xVwsJ8H{n21ub zle_Ge0E-;~-}lems984OZB_Z3JDsfS_l72luRhi*oqX`n_D6P=zjwc{JFwW_PW)El z%P+zHM~e0LG+p+$_UxRVu{_*;UYKmlX>aK!v)UY-n@-`E4i`Yoq62- z_`AO!9{0YQBer(?#_Q2HUc27=|KW2M|F3SFnh7-vCAn_R>@LgNbpC$F(HUA7?}=*F zsBdil|9whQ)ji9*hA(FAGqpP3?7T4PpNoa#B#sRmJcLfP&G0?)=q0<)>GEn7_QM6= z+C)B|vj6X{bm8Wvu&_J(l=&*!65nu6xv*{1w>*#i&);ceZ_c^8ins92ylb8>3icbh zE5tKQca!*~&9ZFfvh@oT=bW5)ZR(L@uBsD2dkR|8j@>rkn4nSp?B>rM&)->Jc=jXN z_}ELIt=2LI+}%BucZ}`@h>1zYx0XJ3IKC~HU*~M;pSix(eju9Hcg;IXW9&bH*^+t{Z~NqNfc!BriU zn6%LQ(L;t!Tzlf)^OxqRiJxa#rE+0Ht7~ZYX-=`$%DeUNGg{8?Gx>77BhBH(llRZu zWg8DN>v!)gQ;e-hU3GWjpNNPhr-eiRzfDLC{Qr7Kn9Z5XTMIAQm4+wvz5M#MTW7@~ zvn@=kH*KC>qNk&CXU+=8w&-eJrswVNgg+Tw{<42YhTY34ao6WMvs|(25)*wpiCaO2 zby=j3VtkEZ;}$i6{tX>s?O9SjA z4=pO2&wXxh7ASMQTp`HleElEW2JyQ(GM{Anmp@uqB5Sg?GSVz#+am=pWyN(H*F1{s z6kGQC+;Ns83BT<)dA94se>l^_v!^81+TX*od$abNE?4U;$3+Joe?5EBVf&3IY+ed- zi5DF%Zn*8Eu$JRPk84z@`(CrQR@c4j?%gUpXRu|p!p9yV(F4onPM3S7cvkMp-qo@v zuvTy5jW55>d0vq^{8olv@mR|{;Y|lj{%%*Dh~&&9!)c=VA9c%`lCF-h(SjusBPCjk(3v+SRLLTQ&C*MRp0eiJdO<;R!G0&-54S!#=G%a z`N8Mk@}6rlD%$Cte-zyzb1SJVx?)<}x{H#c&!^R!9o|yoETnnKV2-#$7i;48nvAG@ zm%&!P+EpCz)2i#S)(zzi7X&9<4y*V(e@XM)9A@Danv7y%rmDxk8#Z1MN=Td-b&q$a ziI^Dg&TrWdb}zJ!XLZrv70U3~c3OT+h1srmZ}b(KvNc(*S;}lGR#N`d_OL`r!LIFq z-NBltS(iU;U)i{_w5)sG?sFm>PnZ`~w+M#)tQ0waeP&^dfv|@XqnMay%gIQ?#we8o zhZc!FEV?Gjv0=jlcBMR~yzRd|+BKr1>kfb0)ZnbGrS;PdAw3}c zgrMB%`uIJp8MC%U`KbtCUO73!dZLq8L5_jRUOtJma z@Bfxg_2XQmv-Ps@#z5=TR=rO5r6=?@=w$oG-aP))sPUH4fkTV7ohaJpv)~&jCT+LP z+1!=(u$%LU+J&vz*Wc*QHqT+7u(YK0@Wr!_H8)+4QqcF$)@IJCzM1A2tN1G-Y-8=C zvNKF2v9pEiK5dyG@#5pJd0mysvg#W56}wql#S%|R3pAZu%%PjKJ~?=2h1!G?rd{iL zg}+srd7htZoWkUzaFa#F;9eI;qFhTj{Lac{p?B2po#BnG7C4|=R>gSd>BgGLkM{1@yCm7RI{K%d|2L(tMaC{0 z3r;ZgAOD^cd*di5L=UjcU=U7V@>#GBTJL9c@ivNfipz`qC!Ql-a<_C{ z!;-lRJVK^8p3qzNQoHB4>){J-PLJfQ*S6Fg+4RT!XmNh*lFa+}ZaPh~{G^(4bnZG9 zGX;g^2PZ}g?DP(cy>SxRCWWgk5fMvfRj^G=4qbQScu?2> zR9dco_O5rkq8#jGy|h1WdinKh-}8GR%NGW0SUdawsp(t#oE{zc@QL+^Fvq!|nyFd4 zci5=GywSk9gqu-J>}8N}W={LVvc24j=M{vN%d0MxJ{Ms8=&|$X{nY0yR^npoV#H6+ z-D8u^FDcOd##EZY&RqAt=f-!dyWfAlb89K1;%8Qu-yc4yeh8a3g;jgczwfUP>FG`8 zG+=~T^wOoF)z#{%o7AmGWxJ!TU2bZn&N|X|so_FbcX$0l``g>|YXcUTRBN)#TK%52 zZN{>EHy!gU+tw5Wr2mG!v{x61U2Ek3ap1iI|hR&{Ai z6=gsF`aw66eLfB4t&h?dR54ZVdR@p_nHykn;^nfJ`)}?$d|~TvMjq||*6S{BjNX=W zGvmDNtV{0#tA5r-D;9KR{#sMAvb#@q>tQc1mwgR;Ob;#d-Eukj@!H$Vb$`BEt@|=b z|Mo#>3TWUoXe?1UU@Z1BfIBnG`DbJK!bp~f0mF^jAFgP6-P zKht!=!DFcx`htWWIi1#u6L`HZq;~!5TLFw0zHMv|*9cBZV~D)GC+_{Lkei2|B0|nb zVKT>t4JVe|^4hqz?cpxwpnI!Jm_MvK{;AceiRZ2<|AefCTN~y)-T3GF5u^2wrfqq3 zOxox2_lz~agFfzEw_8tS65mee=^dZ$O%%ASv--!}kQ)b6kqr;#+_2%qm08}6ciYze zWqY8YrB##Wcs;h3<%zeW@RKz6nTtPnJ$m%Osz*!jaDiW&h_X|>x8=bvzm6|E(3{m= zu>1BiOBudfFIVOtZ7DKsnUOYY-^|in<>}{<0?9|=z#%2!td)E@Yc%8nGNSegpWwMw zR{Htb{%LJx9zscLGR6E?oICRA!=lVGsax}|CX4c~W8UuMnl-D;!LRR3yNJlQDZ;;; z61;Czip+j>$xUxIQbf-LB`me8VO+UqFK=Bc^uooJt7EoJ*v4By*9xrN9Xd`vUH0SO zUC4|;^lBsB^J~9OWzxTO-#cMq>d$lj3$>?q8S%Vj^Vr(==*0(p%_ZD?j?V+vtnvQ6 zBL|jteHu7ZKt=k@i0rL7#c}giH}jl$aPp>*{d=9Mv+lqDf7{@e9Pi5ovUB+Y?sI-I z_r3pS)tQT>Z$lU_M2ha7`h4r1FTbp=ZTcCS7GLLN!P%Afuv6v3KIc&(1k^H+1eT+n(m+*Rd|my=k;wEvwUw~stEMA))m zpI|~_;Qg!;@xOuD{F@Tz&(UpVmTG0&dG}T(U*iSN%Y2%<*M0b9-x(J3{@&ir`~H4= z?a!L>{L}k#mL+fAef?#B*Y&f|uDb?3wt_ci@+;Wa^IZZT-4*eOJXYlJ_#$#9Bm&%My2E4Q?tPGa(bnmWUwR{g-CMfAEG7j{AuP|0fC=FpKf(M zJ!vZPZHgZI$E8iI(~--MT?z*dEz(=DJacB-x}OXdCv6muGW2i%k$L#-90oh z%+2Gc17pq8QdL_a;q(#W!~A{wJ3PGpRZThpUL{HFDC4+J@n}|V<(eE z5tq;9nEk7te)tOyB~V0M6;4Pz=-;6fu+Q`j`z!v=_2#)Zmzic?dtuRjV$s{w*=$GI z^uATpu6I$oTpF&=_;c0YohBRTna-03UELKsr?4*6FU<&M6z}?--#E~bjeMI82&b$nXTR9#vl2@cEPHw8HRW96l_naS};)^w1e^2fI z?DS+##;j-CZaLk)_ts{qPsg7Ld!Mp;J`i?y@cS(CQ~X-k%{ltQ35Zy5C}Gmk`Ek;r zoiFP1rl6YezDM%z)2^hf%+O|i!&l|$z-CpwSKIdCj$7Nyw{fr>QS#WLd41)6&h|HP z(dyyl7q&cGdebQ0;f_RL?tRV^nR2Js`>{VqsWBA3g6i3MmA9s5ytviOkf(T<<%qD{ z>WYGS>uQx6Cr{lNT`?*~n(-!ZoR(^du-*nc( z1;Ly7xlV6)0SyRgYHR4kWX|6^aZQq?JW_FD(8vPn-7$nMQ-6D7w-PYGoBuQ z(*0}qnT^wV9(dn27ZP?lz}wk=%Ko>S!scBSd+*sF{=2@ws=OfkmbT97A3sx!FO`PN zE2_?&b$6lDJ*Hx&MhC|yI$oPjKmP-1p+NJq}V zIH0ip`tq_KqdVsW1(J$hRClgic3oUCAgk}_(<0efb7fDgPjEKaEwAA4JaEaI4SQ!* zA1p^I6Bj%bOh~-w@XF@=+OIs(J#$xFzpd~@L35(_^WZ<_n=1}(>C#`Xx0z4x`o=|t zHY8P7y;3u4Ez=Y4l#X|0 zNl#blZ!Avl+;sZpw~8O(|Ke@TrZJva)WY=RK=Mz&_3xJ1+_j8x@(FyY3R;M=MK^cp zX@fc9Q_cs>5&5^2;h7hsRsSLbxyKf~C<*s2sI)DA6CAZ^o%QeAn|bH@86-s2y}7e9 z_~wUuk1QiLe8|;__+nP~`|bX-Q~7Sx$G_S8J?_V=*ZJDFv^Ho7oOl&?m&a*m1jpLu z4mB4Z=gZAaPH|$28q+SWyeYT-{nIH4c$QB?t84GY)N8$Mw@YPPYNo7tcje-N zO-{j<8@|U?C*AArUs<1jX9wp`Wwi&(=QjzuUyr%U9_#i{yxWu<_4jqi((E(})V6 z5!Co@v|+B?^*QX8Z|9xd`Ogn=`EUI6XGfT>VeKuKukY7J|3A1ioabPlto4=qDi$6U z7w%7%pV4@Jy3YUpX-6L2IhGo(6TL0V+2YW>z18Wp|KEns_go-cyYGJ8?}Wd<0wzu6 zNKliJV0tj)!|$f&fhU>{Io&_cyTt2;FH#=6qRphE^D4A7>}}7w?8Phwok3fQw>k!X z)S5aYP37I5$7x^RUl-rs-!5P2^>_Er!1l+TlHWs5d}z$swnXR2G!$3Q>07`5pO|x-*4>5co~PONH1plD|MLA( zs@$GE4}5=wxADCUyYJcIuCw~bGMnvX8%4IsNB1*8&jpx~f4|_FWUS$vYX=wpKJHV& zaC#rdy4L~+jQXEi3o_)Yo)$+*?zW&hO)ezKM(@eXb?z!EYjY3SRljfLtS~XXkM*=00}WzDvq1GVd8I zI`(CkzPUJ~>b``@sk6K@!`{UACMq{&TfQjrs658C{{P>KoaZJemEBAKhE~^K*8_ue zu9Q9xW_l!bO2^uod+E{=71n~kTf-k+RG+st;Mjx4>Dq-KF70WJc&FK=^IxCSX4+KI zikhQcQ|-6r+}w0=UbRUre}h%?qQJ#5TP61V41Ab=hjsG|yJRu3y@ED>qM7m|r>%Dn zn)BEPCHuXa!@%8bwZ7?!M8b}(;tC6{IUU*M_vVh=eEnF#nK{BO6*{Y3?DpMx{`=lP zqnHgB(igYgZ^?_bUcKHt?^aLg>wh8t|NdkDTW@Rk_YL<~%UGwR1;<}=uM-0 zg#)>|_EJ6#oF*Ymf99RJGs{0BLSmPi@%7kkb2yi}N18Zf#x+@C!2zruzMC;nKa@Ef%-n9q<53d~GW}VTCGPGs z>z%(TICB&<&r}qhs+P8CgU95q1mhVD!XA$umlZG zr5^{?dlP1YmdT~Sig}Mjh>7toS#N$>DAjh+&>VbS%q9pLX+GuW0TC|qX35~>$XNo@?l>bw@Q~y3=OYUW@ zhr8}UiikqBzs%+p~?@uJ`0wytjadHy*0Z$By5@tL#H?6O`|BurdC(q zi|J2lO$Ei?*Z+`QW@Est+;+F&vcIin;{Nh?ItQCCrzc%~wca4}5Qj|Ji-VlcH)@+- zd2Y5#ZQs#V=Xb4JAG2XDN-|l6fpYhbiJ0L2m%YA-@*nIuSg|8mWn07XMivJJa(7iRQ zlfpt9Q&UrCm{#lEtNHEhGt-3YxZLHW>ABqJ6{4DFKEL+MOR?JhoZpS_vPB;ne|+6u z`pRES%yVtumh)@W4n2BXZh!0wyZrH7XZFWy-o*-kD?HvOt5Na7Q&s2P%nJ5Ci$51y zKHr!sZM3sjZNImdSIBL%|5wdFoSpT4+!-_y-?^9B#Lqr1*Fx4PLcS zZV!3YmdxQ$tYWs%n`Ns$zl6!}?Jd`-!EZp>%wetg zcQjnfwnycQ)!c+DJ2z}-y*)jC?aCBoUYTA=Q;~ONxseernSQH;_I7sd&N!qiFoE;D zNLYB@qUH^zZ zj%zi$#U8)ca|jCyi%AqR%`C|Nv_{1{;z)G(Hi5-omX}!zPXE5wz~oZ++`pnNu2Wjv z}4>Bb1V9OdF`MNDEJ1s3woGv~pA~rE5>1z6- zuc9Z*`_pzO|NX^VQTQ(V)!xhJuDW${^9ir})1np};qq)=hV7-lCq=|Q?)#mzRes|A zc6U3Oq7#lU>MQf-+*oQ`RJ5vZ%>&797tQ7IzoLZ2OnCoXG1gyrV>?&1Np@S^^f*ux zWS!Mg`@dhb(`>E9TebJxC_Zm%Q1Rd?=+epsfm3dt-_P^^)PH8%2_kC6k@vYnnSB=@ znkZW|t87`@_p8_MF}1P;+89iAR^A(OZvX$hm-e^XA~! zUlh>n`M5oK{oZdO^X>mXTJ05Jaa*n(vP`7+lWJVz$LGIzwM<^^DL!{#TmAo|O|AK> zm%r<(6My*U^RCr<4%IGruc2oBN6I!!!)jZ8xT1ArD^`{nNU z^&yE7vbT3%^|0H!A;Z@D$CT;{Ns~+Y#|!fB?FsEY6CC%%`l|BHdcXe5kE9-Ughw1% zrM>CA+{!)Wk39DL{d};LIR@Yyq@;QO4I6_o)Jf57Zs4;`CD|67#=MvxQyfA6&M3Ynd zkk-Q0mEW)Z&wOp&U(Z&jz~4R(7hlP{@%oZdy2a8dKWbibotgQ27T5oU=U$$5UKjW_ zVa=!Vt-afUGUFY4!Bpz2#wsfY??XV<2W)6M*3gOvi zxyOD!pS$u_dX>BDzIdhE+akV-YL~2CbcI z*|SG2)91Ho|BB`KZ7VLv>*@Jzdr|LPcbqbcyA^TN?zE)omKK+W(PRR2Z{*+N#C=y+(UQ z4(soJ?8{%WW5a?z^QEdEh3Zn%(-WV(HGi~3*xK#yyi2#99*s&C)IFoIY2o(&eQR!A zJ1)Q2>b`)IiI?fObwVp?Az5SNTP_v^hiQjjQTnlZXpYX|w+qF& zOJly>P0zm*|3PD#&gYO{r93a{S91OB63r4>zo8>E{7UDh`G!%+AOE$_cNZ0V*!$Z4 ze@?JXd}Z!NA&KukJD7E6$qRm+e(sRcU#SB=8#QKaSg_T6V(!Yf{G8p!=Pj1rGMjYh zEvT(~r~1FLhOX}FhC}~qZyjpdw}m}f>Gq)+X(VtHxTlPm5gU1+G=@%vtTc4)+rPqn}M<{JLiG+~Gm zPE7o~Ed9;v{C&a90wK%A=ah@F#a-S$X-7ihM9uuAtKO~=O-x*U|Lg1jhaNbFFL3@{ zws2y4wac>eN1s3JI<0?fTkii=lI`AlR^glzkM&A5y0w(QyVKd8e&*2b_q9S%Yh?9w zX33ZCkP^MIEmzvDU#9CYpS8s5{eRdVtNFQJpKSf`Q=Rz3dzzOwemg#Y>V*Y-U-|9- z^?WS%4_<88c_yM|ef)}558s!0rN`L+@R~AhO46k%FBR?|cK>rI{>(&UeUq&6_=Afh z_8sDu+PiFeQOcXTMTeS}N#&p4FQ?mY$8~=14=&J>I+HHRm(HaN10Eh~N~>b~^1gZA zbGCH543kf{-`5>k*eN-!~Sc5aE%p(eN0?Yy!*!d9;;UeE3SctP3NIs5r4VKI}{p0aOWy;{Akwe@e@ z!h@4v_OsnTpFZ!Rs5#HRpsoLt)%}kC`~7zHz4h8Qu2~nlSe`-GJ1*|Ep0o_d>5cT%MjCxp3t*$xHXYJyW09TsL1ga^0y-_1ss)>i?WHx)W}|eAn;gq9Z3Z z>+f09qIWjwLb10}Ys=4j)$c{a>lFeM17mI7Z~4D+!6xbm-X(77n@pX&iqL$oRsqC+Bcx!2k z)y^*ozWb_GGM*^?`SoqL{FGUyd+SW6X2yTx2>8*Q*T2H0@62Ue+w-=}(_?ROC##FC z(8&>;nDHl1$yn^0hs%?G+gly+TjX`tuI1owU3Aw%Z|4h}Et$1BtpOU)R(@WxZUgbff#UM}p4V&VF38G2_w>LpA#k_G=LGzM8e}NnL+9`E#T?^e1LhKlRoJ2xTB(DzKw)_JrFRxC7rCzz01rRt^SIf z^PHP=i&g8>s?N0!zutU1#m|sED@#k~O~8t+_J2YaUe4d|zG!c_((O|o{};I`2nfI8 zztB_g_*k!2u8q)7pWx^7%LJEfo72Kk+Ox7Ze*3%gT;GFs1g7j)`t+a+8-6Uh5cDwn%e|%D_fBtl{W!b(UZ<6Y zck`Nw`>rqBu%Kh=`RO|0Z!*nwxLS9W9Y}pK;d$4tYfb4om!7b0;ZD0UYlFh<6&qEr z+I>B!{^9$5=};fry;GLi{!w`&**({~?9tinb^*8N*%`bwe6!Krc-5=tGFZCdrK?5Ok+Taf-uo~?vijPS@1^w*&Iy{Y{>t|y;4(-2B4e@NZ@25a_3vTb zZGL<0p$-Mkr6<}9=812q#)jg?GLal{MsRH;H`rnYoTdiL>$l?;>8eJC>Zx z>)*9=SIt}Lw&qZJOHN{<=+DCMJ04o>IvS`IzpB34`gE_f`RcptGNyHYTC!`Q>xA$3 zzH>y$URFw*qiLJItzp4d$t_FYU)1e8B458Ie6z!o+rH*8i;twO*|jR~n9`ngVQc?I zo!xXH^zzZ$%bo`Bx4oBFCLXoEsxDh6G4cGrpgWdlr?H)4(o#7;Z{vn?#Z{|%w}^+; zeK{%ABVop}d`?Nzue(08?KWTPVcmLPMJD4e%T{I+2?yiVBHKJ~-`0x{6q&X0$HU|C zS2|R3odRy>Zn^8Y>XhB9BS(MT4LAQW*+V*ad%uXATQ1+x36~$eU3%K)$KUVv7aqU4 ztkugEF1k%r*W{Gk!S(C*35kkL?B4!X_J77Rtv|Lw!igK-a0lB;U;nZ{WUXcA9YKwG zjn==_|6Px-fBbRg`Nx}8TVKhnw*7WvZ&R&&?Ixe8so%9XZQk_ZT=o2fUp>n&{{0dh zl5x%W{Mq}eiHY1DOXDjpyuTEeWt(1MsXI%4<)QhTi#H`-D-J!R^e1-a)UWaT6{3R0 z;mbTjTfe9O;HlCPjF`KjaZ>FB%5i%!*Ve;;u9z?Ai}QerRp zOIIAfH?@CppUs*}9vrRuM}@?`CHYhzYpm%uvr7BCV8YhUT55_ic zzNq*udg^%p@(UhLZ?279R}Xfm=`6Z>b(wE;S>^7?=!hG39~djYu1@rAGvCINWr@?E^ea-Wo9df#_X2CAqiWi+;?`^8$19yma zN>sm9T)I9hHb^C2QD*ABsU`Y9Yra2e56MX0!mRH(Bj`tDMN9kHS%(hlzrXGM^B#e_yPuiJP)}?roOsZR1`$=+jW~^&A`=hy!&Ymv*Hi406O-aVQ1DwlVYMKSVq?UirnDB{)9Y{f z?52;nB9ciI^#ep=&bjoY4dx`tftj&toy$8rdzxG1oz{2UG{M+ zmEY*P8g_iu`oG_AFTWM>cNO1>*JVZOTOUu7Jtg^5Zew{X*ZtO$?<#IF*Iz7qu_*RX zn!UaJy+u>An8kO!k?l9jyA$%V;CjLTOt#)K?Zw|^*QPEml`XN*KAU&>OwE&n8y=nraIIyEV`-n8Xr zx!-PH)W~j_u&G^Ok;d}Cn@3Vlhvl9K`G51>5so85Vx3Qqt(0bBw2o>2cm8>xO4#F< zC;C|a8J|CQ+_wCFquFu!*)yCaXIWkRp3=4}a{bx74Tl!(GGJO&$aQexN?)m?4_3e9 zxR9Z7_T2>yfwx7e@414?#jfs2$ur14w@&fi%?qurrHR&GY;Gu;*37tFzrQc^|M#t3 z@AoI)5V*jmP;=B@;qHx_+^;mN5>j$ZjWn!+;6RB+p}t+=$(XX0x`^cds~lATk-tKjechC?k;;CuI_~q zRkxb{wjB%)t=?70{MR$|Wtr8c#S^r-G?#y!EFyL9 z#%qtgx^}NkPv_M%yXogxW;n!x#>-;^{PSk&=uA32xj30A6f~$V-$(JF`T`}!JcFN| z9xV*q-7Xo0QECTRUNJL*oTR&ns8RmiDmqzbwa(4pyi&|GQ9b{9arw=?QUV;}Vx~Lh z<|l$yC8U^u%uD;aal?r-RmrQ3=YVDn;u53h=X?o(nJcmtK*t3c~D^|Ri{o(iLlH4^cPO?unpL^2=nK#<^ z&Yy*;@m2Tah@7h0=T{D>?Q4ZBzky6pDVzn3_iyG}sawngUR`u_@_)}*s|TA^Pb*K( zYZB;BoqFQ<^xrl2Z^u7-dG5K&k*DA8!)B-K>knSbF&Gt2R+nqN1?Uls3aIpWZN z{d&%7qtW+p7etZ{guIq#9?%jsb=%Wq#>Yw%#!z8Ti_ zg8MYKC|&-m+IW1^CZ_)N5gR|L|GIR+l>cx4zq=~}^_Kb1?s(=d8>spJrEyx~Md|me z&Z~Zymin_w<*ehm4rE^~@B_`Z2LD;99dkYQGV7DxkVmD>>l`+x?SA~P$=#Xl$&)7w zmMl^EQhuDzs*QKA7--=8b6lOQ-0AR(5sjrzj|}^tN32UBaSLHltY&C|T>9QJPC@4OqkzRtgJzg@PBib-=gi~a=~jcQ_n9J|ZLCpe>e$Gk+{>^@6J@&d zst{;_gq#3m)zIYKpm_?mFZ)9({j%lM?)?tvIAjNzfaUqC+v4!=Y_kLR=9jbn{;9F~ z|7i99K;fjWOtJfp@=spgGU4Rex?iTkH~!1c9m~0vOWFSW=W(f3C}~!z==ofQ&;xnM z>oVem6A}a0ul{cToX1(3v$OieWbUeYor>4L^4Cgg>VXd2|Fbty+3WNvr_6Qxzj^)n z_Ss-?gjzZdrC${lA-H zr(PUj{&skm{k8UgVh3JZdp!vSoq2KM5>IS2_XCe#HT(a5JNWCX^cxjz!2>=P1}p~* zAAZ01#?`M+M?>e!-#ZSgTJ9pP0CU(2THYKNntt`%lb7ob3Vky4y7={p-;U3Hvzn*}xcOl z&D$Rz9;?3Ef9UBwt1+9PLDZMMUC}FwiZBb>(rbkaot@f7F93eY(24u=Wwa?k{XAl(=F~l{;Jy*HZRdapM#5M zj)$+U})`rpL?TzD!m+gg;7z8qe_AS*> zh%;FG=)%g|7e8fQUw1dqch;1gxNSM184F!QpGvktR`xtx{`%syEv$?)P1o*{oMch+ zKm{c~Z1repb=5uOyL`><-E)_-w^Xc;nyr#{Sn(m<^r#%f$^liIs$>ik2 z_f*;N>X%<_s;9%JpDxWPD^svP#CGZ*JBP@OW$z!ROg;J&Wtv>2pMksk$wr^ob3WbL z`c_M}um4ogFJi;pZS~KdW;otjj z%ihnQ9er)Z7M6ua#e^&(Id&)}&Y$(&*CDO+W7XdJHtVb%Tg4BxcDC#|w5e;pzZp+# z`B%Z9Ne5m8DCRd>HaaXg@H+OTXW7g-@+d1d9PcAWbvUCx`O}>){1gw%y?x-PF=B;o11AgTh7AwY6 z`8ApjOv&>%d@8%}@@~Nskr~T&?%VbjWz8n+U>=7V|10xy8$@PA{=4YD?5XutgC1MO zay?d;*9$~M5BqGc$TG>W*$Lf>b_-Cq%+aPIWwC`E-&s!z6xo}Qeoz%sX9 zP{?-WhW69Q3pSmV4;)&w@M;B5J#Xx7ri5}YHN|tA);uczbZ1@mk_rB-`BV2#W!+>Y zE-JdVciPm%3}c1D+85T1(Lt3fV&md&8w(UX@qVy|xxh!`iXEt;>4O| zl5-cY%P!}B;8)aiO{+rZzv!2I@Oqe>r*kG;_PtzR9NH(f>vO2XmreVp3)JeYu87k* z$dVqPQkSvpseST1-UVw8yp9c><5j&w2g&#=<)Fn>)x7F2<}b@+f0A<8PS}Zy-QRTh`UKSgn@)H00dD(PwMSt|s8Q;LyrjPJV{I|7E8f zE66rhXiD^Bs<@l{Q!D4Y)I5Lo>922W(%C6-;NsKy{}~{Qz74M)Dc!qPZAr7=`+ZuA z-mF(iX-xe&-(#z9j2u!XePv|Z|%MG+4tZ7&3d-EJ6mP^ zzR7$lHM9Qmm$U0uo%p1i^RlP=K~Ce5qRX#e&tMVGp3=H*_c_r8A2dq1&pR-^w_c+2 zq2h1;RgL6*oygS)cs)yppMwAOXO8P-XuB_KjKJ5B3^E6Uu zIphjIknFytHfQ0_*Sl8tH`J`W^T+A(r@0RQ-`(1p{q5P=dRGWtA{*a zwl3S5)!?k3vckL%5l5R}3-v~MPjYU5%_$^dsTj?&4ZQQl`+0oMDsSnXD69UV2TN&g zyLw^keFhnqqh1}{x~nS~|L$J&V!~|M)V_1tUESfK>GKjT)SbHo7n%h58SMSHQL}7i zP+?yAZJYMPj_t3%uKlqzruV_iyWe)omF8+qN8TE-1=LhtyLx$EuQAVc*$JQGHaRh@ zuhO~iy3Mui-7NMK_YS^)qSODhzw*?!g}c)jH`SleZj`?C^nq1ud922gC9L;il~(Lm zR$O+mQm!;wI>rhq#xKog;O_piZobvlb>6GP&Te~uEn{7Uod3t7U(wgM3bSlr zX>hL9XL>&C*(vj6$(V;WJsmSAM0{WN==Y}$x?KHMdz>nTjG0f&diJ#{eEA_h&@v%- z5j7KZ=-RTY5nXT3UXJbeK9Sx0XyK!S6>aP8@+U;>^pu}9?fsUBXRvj2OXn{A@@Wfn zhfT!yWv_lC?Xg*O#<%33>to0s8*QtFbM%q2qCsO3Xx(?ns@u_SdL1!0Bi8R zy!pA4)>*f6aBLOTZFs+_m}xFIcla&!^6<>cxOtn~c{r>dE3LM<_y>@6y-_vu zqIa7pq|{}oulW=rRH5yCs!24i{)Nk@k}dOdkycSVKvrTs<C?-AsLtuW>-}{({I_>+yLorl&-FE$EN>M` z6L!>YsnwI2bZ-9-t-Ej1sv-Tp22lQ-pap7nxmq1QZCLW$ydlFg&*Q{t-P8Y@-Uj{b zytbbGzgVikrtZvNP3q;xcR(8SZ&HLl37-CRU*z?^UBC9#R;P1EK07geg0t2Qg$;^t z{&eS-rpix8TKLCj7#B1^VEoYi&9sg`~3X8e)si>AGS&zG&(YKS>&HQ zu)V&Q%TAwMboi^t?7dny6hE#Ixyd>$b?r*+-#hNyQcid=Yt7y}mg$g0?_mbsv1xuY z;P9v99a}lJ?@N7Kw!6QiW7F2Bb-DW77F!lAT9lt-zq=&!YR>Qdy)Q17{umd-@#)=@dHZs1)*a>gU%v63Z~ObJX1gvqE-w!kh+(+qyddH7vRu~eYin*! zjzKrF`vg=5!bs@GKW*{AkGXjq}jt)xM|it4(%zwd=J{ql2BoF83R`o*kLfLjTmL z{XD!a%vT{MV$b#pzQvF<-)N#z;MTuSadkw*l|0ss8&<^b`>OXHvf=m5R?+)TPcoKe zhTUL2dBOCS;;FbRHix&=h?WO*IUa@X_&xc^>Z)w=*eZrTFpG;t|`x>z? zSZVI%((5IRm5YDHByD{8b?#&h2ArF;b*y6EpW^!Fu?D_Nds4}UskzW*bfFhGzG4Lv z5+_=H0^1cgHRZ*v```FH4k@1hSn;R(uIPG)!f6}6#OMn|=^6kEjD(tK|J51YAfQll4vwzAN<2WlB0c=1X%Dr5YXi@FV^_%5gy$aJ@-R!0MffC@;7Ah1k?)h`? zesTGft&yPSoXcmg?O)#B-kKf%jN?iBe4Dtu$Lj?^dm)(^8cR0Me#;mU@gW#X>X@1$ zF^iAW_{EGryh_uz&5MgDEp|t7`vdGb!tze>#oPQ_<<*-Ki{HK9`r5 zEnmeSJ}-K=1k+EU7a|Y+6My~`FMi!T|LaM1F|n^J&2EA+@+)mdF|n1aBf%+N-`l9< zZ7_rS)bcOwvzEPI=;5B}V)uX}z+(#6_lXYvr$1ec6z7b;@^c!~=eN?VAGRI;GyW4L+W+(GfAW_1 z&1^DT8=d&VmwDps*}*H%{5qqZc%a7l7^soIODhGO;x;X@*&F+~U*f)S?kbzV?dPDaU-zRP!q~Il>`!mtVs-7r ziS?%yOtP-5m?Ycz;nvR0Ec|}+JHOj4C|ven>-l@tE7Lzt>OSv$dU1b~029UvW8sbE zu6Inb)DvTGq;HPi`b*nqmH|_{Y*oRDoi41&DYoyoMYk@V{HQH#>WY}1ue9&j6)FAt z@~-n=c#M$o{#_3urv~ciB!z`v656oAL+Vu9?1_mP_KuGXloVuMy#4rN$_0-7@YANe zzwQ))oHn&|+3R(hOhpwh>J-&yFRM@S{p@}HH_zcxr4$8ufxSvOe?po3xh8(zkvVJs z($#;z-d*=U{r#TDb2M&Q{F^Nkd-R@knad{kGG>p!z#~np0TY#)6uK5I(&zGcuW=)A zV|Py`b+&3&}IuQHpuTAkydK{%Yq{p{IjaD~Zpk=VNMQ;O;hX zGP4#E6Fzot?XTPWgytG_sOSiZs)v+sDQ}&3+M2yL@X(_2^LmEy`#cUQ%_~<}mdK#L z?~7Gd$ojU^`g<8Za%hN&eGKqDYpbIZbaBFH($1_hpDZBi|*Y8@K+H_-{^l%SRxzrYJ9>!C}g3(K+*n2m|&b-qX z^V#=Cv>tPWjlHe=gd@fZekBZ(GVDKexh^`QbU*&ufgYBl;qm!Ly7kW4nJcV_$E|2yH5 zXtzgmGS~ds*7<^Q^FFHeS^P1$DwZW2UoGUZbVJ7xvzhtMt6E%D>V-trFU}Je^3gv( zV{OpED{M z@?xv~nbuz2%fvrp+52^$8VpNv6&tv7rIi%)KZ?AmjEJv%lOA-FjaTZ*irC#%^$zzW zHd%+M?TlDj+o__XvE)H(=K6=n?%myx^744Z&RgBd{gzyR^LFkt5l_0kZNFjlJEk-7 zJ6QJr{nyUby5r3xvmHxvv#+cPTwL;PLK|bNkxp z`s3cl_l|7h4_~oiX3blknEKfCIYpcHu8g`FyEXav{#7W98+vRc05jE{aT!xxbm4&;E_T*ZU^MmQPoTe>{84H{;rs1A*?c3)8N?ouK#W zXYbATQ=YZDoO;ZW%YJjuw%1cL%5SosIDOi=@^$~$4aYw99}#=184#a)el5}_j^TTL{i;{gY2uWb}1^qJG$@p zm4iPnHW$2D$o~H6uDk!u@85{Em1k|u4($lpA6>OFU3Jde_w|2vPT$aRH9qxYmzl-A zz18Mw_W$-&wXIy6zCEYwgJj9C_gCjRmF(OldvDHehJU87r@l9jtLODO-9B^u^d*m5 zzuDeYoxNq1^J;bRIZI$k*++;clPmfvAYe@-#LZW-Hxwc`F(Nx{dun>dB5vl z`oT3y|;{9@LL9~YSmj|jF;{rTg#w$7u> zYK`;r>u<_@lwI&#>0)=7^R;!qnbz<9xJ~Ghib2)47cIrnrs4O`e&}v>UDPsp|NK_h zPj7ala4g1y_NKG{W4@YC+OVO1!QtC?9()NlNIMd{B5bYH zyXp^|rVDuXdvHvcQBnSpUF*2gpH=053?*zI>6voNSTR^Gyth%p{$rr22KQd4_xh{( zGoH<1VL1A>J-+P4S^NJv$4?l3U+tLxBK3t-8{aP8`oDkukL$E)}bvzI>n_xI;>GgFKIsh{UbKMZ_v{>Vq?&^pH#48DJ>SrQ!& zJfKk>KJJ+<9u_FI>~ov57rJMVc!&fmBF zGyaB(t>2V(*K>}Y$q*G{^8fFE9-hYh1(u%3HI;$Q6qH!AamZ)o9S~Sf7!V_ z-dI%1c+9UtLVSxQd%J8E$G$&V%vQ0bmUDPtzyGK=x8%`B!~5so@B44~tayUX?hok( z*S@njP5JiuMB@L$pY_l9tlqF8eBY@mcBk7LeqPtr6c#fJ{uOuem29o|z4%{-vrNho z6aLS>+T!uz=pm(R;`*iapvLC3&|8z%ncKu3*r>`P1j9X#r4`nO@r=6m~$b>sK0D)`oX`K8TRyUj)7w?2 z`}R1j3DBrka8T4S|NgRX(OuW94SP~ghnYGoyBXlsb|u#D%lq=hT!jl8pV)r4U3SPl zgI!HXRz;^O=60a&PjPY4)s0eX-EM3?u+aV(|>>Rx0%xb|()=PCS$6hn5L>%N?RR97d%wdvNyO_jo?pX2scmF_W2 zw>xL~+GoxGKdXzb%dcMkSXAuE^@e}ut684DT)$_b(3;$jB6gppHF;9DMy_aKU8^%; zLe9-aC*_RSb#ic5+3kui7Ong7FCW1Dl`r-7_Wa`?4wgTdk=%D=*Vp)@D>v9L zyn2(i<7Hd6VQJJ!z08XhH_q#C-TwLN+kztx+gDAs-=(zIJ9Y2;Z?F6#&pU20K71p^!EH~Kr!R(l_PR21)6Ok?_t936fh~-AjUwX*e!-ZGMh|yiH za)uCRyG+f6xOK-rnNHgf@#|pMjK5RQJg_hkIVHCB;l8&2ZC7!vo@%pnCU^49!}IyQudaT)CH?ust=IXDWvNBdKX?3{7N_N+afzoo@_o9^c}JT! zcCnc&MJ1y|mvlSTX1E&)g?!7)-?&eGrI^^>suHK^e*c&H1f96JA#k$S zpJWd+Tyk5m=g^~m`)w;@!!njlWz#n?SSINsdPvNA@4DAL+PC8Og!^os8(nbn z=-R7Zz6&fCgh?x{jrg+vuiMt%ydSGhwDI0gdNASR(wwX-YZ}YNYZ=1-Nk;s>Dc=Sa&wI<()*kn%hc!!;YD!|IP3TkzezsbNz2`-pH~_`>=r#zAq37vK0e zpFK6%L*8hGe4qWh7niQK6+F!3Ke0I1&S9q*x0v41;PZa^cb!bH*#C~zdj0p0?xAaY zKj!R6_${TS5HZJFn ziGdsU6z?;0zHY}H5YNfRUR7bUFH^9!HStQL&M%e;KVQ9f;xRjWsQNUw$Mvm>OcL@* z&m}K^x*HL2rB<+>e_WA$FUiL0>CY9V0XHPBIol5R|`qMWosO#FsmGIl+uR+EO zmZ>)Kb#0E3x6fXBSS|9*y*X{yDQ%q$)%0U$EVFiB{BYXN#poIr-`-%A7|qD)*Vpcc z$T77}xcH_f<7USDpclU-&p)X8slM9q-97h^dUvZQlh|G>AGg~O{y*sVuF}0icXyQp zFqzC0<*sJ%+xF)B^ZWJXZg0JJ^{d$^)jGe(7m@N5=2OXgoLOBF?^4Ac(<`;=?G(+N z;wKmWDHxi*Y*hd7wXIjeI!i$#zvqyp=8;~fyL!2|XKkO|`;~F^k^P%DtZ@0UGh*w* zQ~Noc>=xcqdzy6l^?rpY>$~gzWG|ht?Zb^AnF14i4UHe0_QdcUwv-II6PD$EYU8r& z_KWtE?X(f*P#4HPs`O{UN{{x$iwoZE6i-_*w=m;@hqZZNj>X$4PR*Q~4F5hg53xIZ z`}2M6yC2)bl;6b8J5;`jbGv8V@!iTicfFbNCw^dno(r&3US#v1b4}kJHZQQ<9pAg& zyr%o>{QB6cPv54;*Dl`Xw$xF7Yq#Fvry;9#eqUM1d->Djm(SyvRJUJR7a+bZb7{+w z(!1-!nzggEIcHRU_I~x^&PLfit=S)bzptNm&9PGKNL$&wMKz4KEIY!II=m}i_kT4x z{^|TZQLQguUVZq-_dowuZuc#l?{CXPXS?(Lo$uw=S9)``q{#v`u@X6#7mSrx_!p|L zZ-39^`pwzjkN^8zwvvs%RRZDtF}`o>{8U!d{i`h2+?QeP-}*V?`_1W~?WCb6F= z%GLh7m*JYKvGK|K^u&oa)_RhS4T%z070ds#I^=4|PO!ND`s-eK-f4*$#R?bwUJ9I8 zu5-FRSnGh)u3|L>uYNXBAzPb!CswPkT+yE!;>)zL#r5ivLu=2uGL==Fnc%p6Fk3tSyD$SkAaBgF+B~zo=YVK<_leli@G;<0x=7@-; z=Dzn-l>2_yc+Z!f-k7(kX%iyO-}1a+^4Z@yL3P&l$q~6bOU(@z8*CGPCEISdcfID> zl`GeTgs4l^mOzm33uB;9eW|2eT8J%bh*Wn*4pen9(5Sma@PL_j>UI zPW?}{Z$@gdPG6WE@;=is`2QQdL!EZ>-|yf0S>(z=wN-kIVq!OMe%H|vdTnmCKIKeH zyTOBc^M_x4EmsNK(RDw!@^8hfo6`-7BL4SSRPI^zO_jU5t6DHJB1Go3R_Nq~&-b&P z=v#HssmJ*2p@)I3trs6yoXFZTsi5TK-yH`{YR@lYin!dy%dfxcp+e!pZQEEsY|Z@X z_3iWHZq6x_9n848i_B(rgD3en^)YaFcfB?O^@VqNT}_ersjK+Z{h(X^n$YUy+iHG3 zpHeOOvFP==|DGM}&Gj++v$yBG`~JJ$pVegg>6>R1kJKv$2%Yv_zdof~Xx|J6OO6d2 zG}vwQPJxD>S12&)=xA|lshtsVH1xP>s47!lY_u-p_N>jIA)7<$r?d92v!2e~F=@>K ziPbWlMOVK5$zv+o6{{zzUZ?(w`TqQBmWYTaar2A1XD|q#umu^m&cE{LqDK+oJ7;~9 zICFfX*MiqS!#PfvH!Uc$VCs9enwyI&i1nPoCwGTa7q{6me%x_fYmaH@x0`-fLG%Bw zzFKad!D-O=2E=*vs|TEpCYeg^+Qxd|VAe&Z9d|a>$v@Zo zs#-W-pT}0B&g@iX;QN10$f3)nx$7A8w&!wnmdUMuzc%FB!ELM98Uqpo zO{31N1uyqXF=xE|>EjLa-q;fbmpP{UGWSZGTPOv@yj>n7#?+SiYmL#-R`1yijRy}_ z+ZpNJzqv9kbH|pc0vSoSc~3kt-g9s3>!4Wv+oyAxbaaY#*Y7O#Y2bV!2RdKzZLpZw z%crNWG43dR{#nRLc9OcH+@>{${-ri%g1ardvul_dCnue`D?^TjPUhU4sS z|M3O>Ex2q_zI>P5w&}ZBN@Ar|8z%0&?UW}89x5;A@JQH_`qS;HU$@bERUI9p_5MZY zlw-@Km<|c&+<2CCmHF1Gso8a!s~7HiwTkfk7vG3o~nDP6C&aK4o;aqioM zq_PXL>ob3TiCFit>R&5UQR2&5r#Y#!TIG*xO@DEp*ZDPLr})3s?8cy>?qz5T;_R4o zbRIoEQogjoA;Yh^BT%P5^+&skK``DmY&q3 ztB16#s&SP^L#u1(o3CD3o1@GB`8(Z6cROROdp~t!OyTaWms1QiCjM5~74B5FS?B-h zji*#Um&aaT#<}3j9UjG_U*+;2em;5Qkr8Ni5F9)V!Yi^^A|gVz%B?^0O{#69{gZe0 zUa=ju%-5?ilcFFL<&cfoUh`Ae?vK3*EL}cv@sy(D7)iX{$ZyC=ob~VP##5@l%MV|uYdiAr;IBGE-}{0mZ#^nPa^wmw zkdIsA&TTN;Rr*$!bIOx&56e4WejPvhc+o=Z`z$W)5B8p)G41`aic_k^{fQF|p~1h&3+`p`deuw7wLzZM|slNxxyrd$zm3YL4%By|t_Kb=lFP%Ww0p zII%G;y?xfJqg!Y7g>AyCD-PA0_xveVd^+hr*D2R!Pxl)nI-__ORzA$U;o^M#4};XC ze4$0tQ$_uHkNd}-uMcpTCNo7H)MyH4f3fs+(e5p;mmb)x`0etpph@e>HpGHv)SxrY zOF)Y!N`%vX3vx=dU6U3%&+>oAku5cAA3I(Rx!k9@ip}eZUEe!#0rSc=hn7Fmoc+eO z4O}dgRWe$hNdBp=n%#dI>A*z=anNZ!N8`>mnVDu>Sm5?H>S`VHhW?`P4sPGg1%Wo} zq}$4@Rpj(E+x0(v$})}LnsxPB#VNJw{^;v*QytWI?`hd_X%p9dpKEf{laWGj9ccD1 z+jf@g+rrnkDmYhMUaM+wcT>&X$EEi#m|8_Y(kZQHojYl-`&_RppsG^j(ou0xsR2zO zt85s>#6tfGuCQV7ot2?3BA)1cp}ApkM8;}v?zd|*PM4f{TefX7qoI1mWj)TDcQ*Y= z+ZCNGaqIa63)2Yyz}{KEuf%RlI@(uq{q#4aiTVjIL8sSL@ju;B-?nfsQ>WglnL+om ztNt$C$+L0Ry4SZ%7-OP?#EgB`ug_j%wDQO9h1UOBT<#|9y+1qd{>GIXPMaYwSvU(a ztN8uXhWESH%~fUK%3kz(_oD`9Z4Hed%JY_)=3QA4ctG$6i^E%?+(5%h{$6Qoe;$$U z^||t_4?afhJNEI%neVXWhY3tR3gMtwxH|9bqB6-{+n5f_RDI-dFDvrj@yDh24L%)r zI+f^{_^~rpbX&*voXU5_=2HeSX%&o|aE zpH7~9+6Y>VfZP@ha@)0erw#Y>I{%gwYG0kk>CS#xXM^zOi!1I}D4=;VX@njQHraxf@ zDw)(*5V^6muKHt z)ts2&@9=2Zq(>E}H`Tn=nlyc3_H2e5(dYBbb>mO2d{l#!u@-QFZYgB7vW%YfqR6zw zy5(@((i>6}Dra4Pts8r^<7%HZzszg)mu(I24@d#?7X4zelK{q`bf>~zJ@ukHvZXr zDtr2AaN`jY$qJJ}3FgVYm5cUC?)oO$FiAj3alN7Mf9=i%9M*BBfyubx<>G$?0vA)h<}r|L<{_7b9%4!FkcFv`De1 zaYt$;+X_{lyz^(c65Pu2Yu2*&ojZ7!d~kEVZg%_j1EwE`x74sNyI?aLxpA~qI3Y3c zW$Xby7v+Q(KQ}YpocB+!F>u;b>A4!Z+vnA5n zX~11s#i?~^QTy0LU$KNALy8O&Q1H3!$k|oHQeykxiE-zKBVB)1xt*=uDykjU!gucR zssjd}raPSqQ)P1X*|g@6W1*H$!02wAKT>%U)KS-P`o7cGtRCwTA6Y|6^5T7PTG^-k}v}y>f^B8F3*i{>ZSz z{~;jKg%7AZFxl?9?Bs^qQ}26o{gk<@(a5iJdU=?f&|aSD-6 zxz1Z2SO2yxyvx_w?){eYPSUJ>nkzS*FM}jra19h732I8Pm98_+V^W`AQ*`$4>udLT zI(B)9c-*}9_^W=$ZHEtThYPF}SyhYPum0zGVzuvOd+k8$mAmd6%$clsGj-o8YA=V0Rv1(V7M7X{eq1s_L_#F!_0BW75a1 zu>ndG@*}frI;Eg9nXhV?8jZb7xY(kmz2E2ZcFCtY@Zj40ZJAN~ysFhpW2II93CFF> zQA28BZ<^4+;ubwEKV;9k@LLLMaqK_s)Erpu>?+>X^1|(ZJj3@&o%;t;PQ2K)d3i&H zUBtKNd$Ka(Zmwo&TbSE?q|R}EovH5q#FJar?n&i|o&0p`!Kd(wxbcqCgcD2Dxx4SY z`aLJN7ur=n$o6kWc<%IVSyz9pJ!xWL!s6**^KK(ozV9)=Ri`p$ZS(({_2c$7^#;*- zlML2!?Tv^C(a2lZ16n-@I;AfRbU%dX-6MW#UIz*?<((I_YN>BsjG~3-3t&d5V`eD1>7nLPPLb_UU(?!;~&Y7A`cNu6B}hzE-cHPekp9@ zh7$+*o~beBO~2;KwZ}&!cjGZm`9LtB*g1p7_Mb-5v5x1s+us_JV5D{QDc9 za|&E2&23;%n<_G~*yr?p#l}a~cXln;U9&Q@I{ow0)As+hBdb?xiEo?5_+SA`Ao}2lcufMpk zXIV%b!(v;`oR!m3<`#+?gD1n^&MtpDjs54}fA=42&3WRhqce%+_)%DvdLqFnCT4kU z;hi}zSa_zJu`-!Y?`Zt=_SKTtyz9jZ&V+2`{KI-eY}w22=}h&`<#n7LlbiR6%$~MB z%Ia@Y;zYk)Ik02Z9ln7g+P3!SylImi9=r8QvCA}uIvUqod}6xw>T32r?`vxoTBkET zdNt|OBi74WZ)UDp8#3LvB-flFI-n*qYF}`0Yj$yKcKlfvyZhsZ#pjdW?mBN+cSb>`_{&7j+Zz6jr`GMa*>_xPw$J}#ug=Fj6YWl4 z_y6y2`MN_F1ceLTnlBd|&)pli*zIe}>^WT0oZ(VS56s#+Kl#(+^AFqQ>yKU7{d?ih zneReo`t6<@@jmgE>;o<#&{f8YF*U_{0tK(nMXMfJteQKq+vjxruI?bCx5hkc^;KRx zun7{o&#*gs#FeD-WE;8g3AZwmIeG<^B(-Mzii^7`?;k@@EiPmix{ZsxOL$kn$3&9nHl zCm(xrKi{mb{o!J@g_*+QdHXh6-;4fKIP>pJ4gKgl0sn7Z7j&0lJN(pTdEfNMCzSbu z|Npt2U!U;h2m40pcPD-29*Yt4Cs!;FO{{)u$F0iY8*BT!9BDy#48y3OK2}VHUly@o~IQ)d$X+J$qD+PT1$a|KBdr_2*`F8!EqRT6pY8?=^ zSKp_e*EoG|>+g4xeQoJ0DlZtV_xY8!VME8&=s(}*C_gB%;$IUO`^V>gZq^)@sOV|= zo|RHrFK+#2ILCc!$Neoe%%_s|uckug1};0j^-9>Htgv@CQ&Q{s=eOtN%+=BPryPDy z{(uYns*~R$w-ikctXD}CJm0Uyd2su4-9zi{y1ux&Sop*_Z{xJbOT)j}{hq`YboQKy zR&2zLN2PzC$G^SG`up8(em9<-&b%tdnG*zFMtUAypmj0*`|kI3M>-6@H-|Agt!G#3 zYj|d38(3`k-akad#c0L~-ueHH?^tH|97#_;G{ezi?>|k$zkMZ#&)er8yD)L`hWGnQ z4XS>`-l+fo_roRa{A0R0i)^>wRMT1HE2sMTE_XdU6XVPeS;diG?W{}Ngv37D-JiHm z@?(vAvTeYV$CJTd0PW?Y`GRvJ^W}Zx0AM_QLSLxL6Jk)$A zFFjgP;5|#CC#Q-2aZAa}#5{>}eG?vS?KsAI%}X^x81tYb%(W$pRX`8J!S9Q*`0Fe!=;P-GgB_} zweQ^I9R20xU0&<*cZc5WE;lh*j4Q~#M zdaiGp6#q2WTWeo$=O_NX_SdQ<*1rwm>i%FQ{8udCX9!of2ak}b`ox?YtF^lC{}*tV zEoE8v`kJ6_w29l-R~Ma`BO{LdcKK9m>3ZPpHK|h!Z;I8+IN445kAIJ^aS~d4we)#0 z(;}Az9((etYGo%IOunY%Sa?zXz|5B`G$w7>@VG~R_Y&T1?{75TEPlyjzvAiNvgxr6 zd-mAWZ2RZE=f|bjAJ+f$X=R*K^oeuFveTkj1sHWbA1Af1c59e(=8E^f*`IU@8 z#Tu@;8xIR)n3ccUGBaZ5t<|S49C-a^nr~o8NQhc<#Mk3oM>o~4IQ^-gtwrCbn%Df> zyEavC`!GAX>N9~a%1?h?%Is8~_IBRJ=8Z4*@;llmeRH+zk+&6Km)WrYSNW_=RmX=p z5%RItr46euN)}kiR6P3`KIH~z*@R=y;lpk@@hi_x`TyzHoAM9O=ik2YZWH&_%^v3+ zDtv5g`4=wCUHQm0m%H|uhD-99miCWF#ib1j4++TBUJ>$ZOhs(Hy(tM_7mv`Kc)>*}(D58Gv#taYADnf!X?gx!+s&))4mu0MPG zgPkjlH`E*jO|URekGUgty=*Vj{=A>L>;EwC`aU&0{qf=c@JH|W{||g$a9mqI^t__2 z{6`!1)Y{2m>pmsjSmF7~cG>sWJ#5QY+39I%g}s09+uQC~OJVurp3B~4*Xke>x|Kar zb?Ts5@Rpx9n?F{4?K|43F4MpLe&m`rWv`1^_4aS+m5R9d+2QTd=Y5B^WL)jMb$e?u z`%#OFjC=PcC317WT70tKetiq;(_GWsH$mr*daBDUKl1#IC3oTP-0P3;6wh-1d#>i^ zQ}b8Vj&lyJ&${|4WX0Kq?J`TknqSy1y0C(oZ^h~vQTI%>u6Muc5>xZClomOaQT2D# z{gw4E{w@|cvgy~}_rA6v7T2z1u7CUWPV4iK7Ork#e+$0mHa~~c&w8(J_WQe`^!58w z^<43~+9d{piGpvc}m(PIhc*R=e*D;IF7-Qd!F<()Ch%W_Q(tlwUle1&2Dqm74O%h)^! zn{#zjCTQ8&SAT0uy~K}?{r4w4neiL6IQDzdQ86+3x-XjVcD~=Zx9-aN{p&UhvB}r& zF?w`AGeAg7X9ZKWf|T8ljwkF}6W^?0jQH{H(h8n)cCUS0KA&G_AD0+7t^V5r1(~4c z%l?7Q5<*U8|AYEipPIICcRzH_3qSPv^3-KQ1tvSJAGSR9I@;_jGV`21H9t{C`}&{)`;6rI3Tjd-;ESu2t+A4&~AJ=iT`8`dY_% z^`n>hWlN-)HmN*U35pQ=Xz_o~w2G2bA*w8%J(m|uW}7(WM9%Nz=khtXzipSgQTz4l zv5xoBw%OnW+?JvApmX{1#DlxNujZ;>u@>7~UFw>wEH8I@dD!Y(@nwQl-(M|KQ`cCY zaCw>h6b;pj^EB+M)+kvZ<|{gle(BwKAH4%~K;#b#2doHgnFLwPATVeU5$9(Uvc4X?Doo`;-fAO(g(B{66Ya%ZAsQ&$N z$)QiEw$*vX%+un_&j;CE;1_uNAw~3u_v-}*PrWGQe{@2b@A%yRy9Lkt){1uD`^~`o z`@8Gv;#m)`>qduu`u6?)e~IlIHl%;onE3TpUieD+s;H%z)em>h_;EluP%>b}(J9N9 zO^vMAYGpmU>fW8@)?H=diGPl`Z%jRX?Gnq^530XE{NFa&KYZ=CMPGO7UQKwuLYd#+ zE8>FBQt0V%2mFJOzp3jq6%G+$Ftt0rS&i0#e`QE)xGXbAv0F zk9WV@Cq22rUhqPZef9J5t;-$W2Dm9rJJjysVe|8giRorvZRd8mstr;dE{`4GOWN+& z4x6Rb-a0Scy3=OPW%twJD|fvqUzm1QD&pHgE}yCbu5-4_TZNP%%k$Rc^RIQ9HBBD0 z$~J225=Xn6%NqZjFyvqHNF^+j!7}B@UW@N_*dkXYux%IeRAZTrYXoFfmy^8j!dT8jI_x2zwY~j7At(a!Kn48UF}l8>yIv0-J6%&|J^HW{(j@G>Mbw9turOQ zyt)|K8rkyBVQR*l0+qCf|5}T?Lfmx{9qoeiTr)I8-rgzsI(7QW2@LeDvvpoAv%3?{A_|MFCr-=vnWWU@#pZ-Ik?aJ|3T6@oVRF!?Y(1TNeqwtQPE!S9vDA@8%K~?|qvY ztxEU!_`1v~dGs;sP>a*c7hGGt6sGehzi+?KIMnoNQGxz1 zwF{-r>({N?uX$(9ntbK6cP?+QKDvAvSKt=?YEgqffBT=?_NeM)G_^S~^IJYqFkNZ< zvQg9G(}}}|2213X{&w6dz5IlGZOY9=N0CL=ANOhgs5*RX#bnusb<2YyYIa=;(tf+; zkh3`NgUoQ9SsI(`nUibXFKg;}SX}B$`eM6qNhw$BB7-Mt@BVb`6x)+DG1S?j%F{(MaZmN8LJiZyS^^x zS6l0FWOq{HdXa!TmS>N!cQIEapZjx3l)G9X>P39JWBIqxkM9@S-S8~*wvXs@EWgVX z_2~YdN^ZHTFE{sw>14D`Vi7ocPXF%%VN>gz^Y1Pu%o4JBE7~1vUH)(`>-)v2-DzyPB3x#s{y> zN1t!YS~uzAThSA2U;SCnp8Egi^ZKj{^;agkCmipSePz2%_~B_~9i_DqTlW8PDtUWF zPWhM(L)ABTzSrx+l3xB@YA|>GzFRBUx=LSN@!P#&gQeT=a{= z|D14Ux2V6C-)<~k#KpZk@08)#ZSgXE{ObnN)nK^Xr7^-|v@ePl{j2 zwCHQ4ZlU*lxmP=vURYPHX3G}!bMxW7Nww~$g~TTATl|qv+@jJtE~rLcm_sPz>Z-W4 z`~R)^&CJ5LsD6^b^vJM>dp)2%aCK0U3ilM&WicR{1f_>WiF z(M7(mH($|_I{LIdehQ1Hy@N=f>*h5N!}nNF)~;@~iH9|D$|4*Hy*%jH^l}_J_Z<|BH)D6twc-s!z+2*R<(Q`(e9G{}E$* z>RG+u6P#!Df+OPA+`L#3rnBwu&+sE}BQ>ARGh^CNtdld*xpVzO<7Xmu&P`t@H1oU6 zwJP0^cDCwkpPQ6H{=FC@4c_}))7U&0x8GlROXRg>$5FkYGuEw67x@x$qvrE+OcuiZr1H+OM9XJ=5<&)1iKOa1wK{#(b%+o^m1zl_O)m4Xp*Cp>Y_AdUyQ?}!e(w8?EIit7z zTX(2Z4UJzms$Y3^_C_Fc;gyN)AImn+wEB^>-)Oo+MqCR+T9r=x^G{W` zZ#=b8S8zG0FVoO)a+@3yH!Gm-87VRt6-1mYxkC+H7 zoUrEW{Ce5zCvS`NCI0sP_;yN&&&PKr-qo?+S6}VtIO}mS=ho}|eau1(3z=i3zD(%f z{9H%l?$xfen#|oHx7;q(Y1#_O;uHz)oRi#H!VJuX{gtCtd`TO-x4srB+&sC$^Fn}!U?A;vm!(8o4<>EhGAF9g#{LY^lE$4pgqwbf#-DL-& z*Sz;x@;>#2wR>XTmdin()ACe1UdS%3={~>zM^x+Cz&iIIyOV#r{`E^t|FZ7V_V!P) z&-QHHP@*7v?|qr{iRT}9HQ#Vf|6nxH?;fA1=@s`a(lT$G#I?^i?wdY^+4=mpS*5Q- zjbD6lywy5EZReY*7eC|&*}Pv;yUVh6zuxXAOm{A<=Drud>-o8&hxda&wVT;)5MI=2 zyEi+0TmI^>=WlXjllR)27z*5TpSW-F6y=E>8y494et8tI!lm=$UrYA`22%4_UTW}$ z3h^zhwrRch$?S>&c-Ah(orzoL^!06f%#1hI=p;_;wA<|Oqae%jCV=}_yj{PN;h~iY z>Fe*!Ej#6@Wz$urerief>1+3=Y*?_i;_ccXy(Sl}xO`Wi&*tNYlrC4b{9P%+)Hcsvbi(zOr&?<+nEWlDc3p7#>C!#UBEd@A zZ-vBpeEC*Udw%Nmyk%3*yCw#P%@F>$`~vr_-nO(~MPIeFbJ}m^v|ssuqj2}<-z7h4T~!s9S_z=r>kU|Pwv{d;lz@A9&`0|bcB*U6?sLb`$o%r ze|vfHnaP>Lo9Fy4U*079^iDtryDwKjPKA-8%u5yD#H#Q1UzTv4U-W0i2WFYek>z@~ z;`SX{yp4bPhrm;!3wY&>-u_)YL0f3jlsoCGnsr-pa>Kgp(<}vicQq7# zSL^(DHsn59*c^S`ZlZ&6>1u&w-^~RsGDkN(n-(J?7RfwcHWj)8V1grPjw~R3gZ5PK z0|s+q6_1{F)YrNEY2|0#Q`I|TZ%qw4aBp5lwZk*h?^SzSpKhJ4`7|;j#mj$#JZ$ns zYdQmW_o=7nx28)lI$z(%>YyHQ`P$~WI;%fy4cU<)aZ7u`i=ZU&%etqp+lrPMA7tb1 z_Ibhjtr0dq`4luE|FiahT#5kW_IENGidQ^uf;XOcom-^weCcaHXNLf#a^6&Hh1=C! ze~M3Mnkjc}-f*HLFF_qPhZbT5nk~P_`o=*`@WlD^_Pe6y{kiwe(?Ukqc3#udl^-q^ zSiWx*C}(#)-7a@}`6tUwpsBOBwkQ6btbHeM_UVO0q*O=WsE5r7`Y4#P_?%XMv{mGL??e4)ED(g+qwCj>nf`^ydGB@5!@n^`d z(z!o%<)*X9s{Kj({>Js5f(9`^w>x@FjnQrRZaeM$pCvr58YvRzeoe^weUtg> z{MJ3kO#ZH4a?0*@A~Yo)V42~t4K#M6~m{o>lzg+dbIf6`x{&%Hgn{_E9n>)_P+Z^532Bnbs+&_O_LaY^#0eGeFXdfz&w zd5U6Z=CbS87vFJfW}9W29aeq)T>Xn4p772}o~=6fTS9K8Tf-7GXbCkNXzkR(={JrS z34;zy3Hs60*2Qe(|G8@K>r=TF84lM!@8&%5^5FkFS~3|AKmM@uM_bI`16n_Oxw_-8 zw#fPS{dDCvcjj za&WmY>F5}348O5_iy+6l2U`RWBznbIq*V7Gw>O_E`f68MJA)k8tv`F*&OUmk9k%AL z?$pu^DAr4XtiPuG#{U-Qi(O_x42wfth1SoGi$5L`p7lcNY1EdGN31g*Y^-q(j%B}{ zjFe#1K#M6o_a59A!oe7O-Cs=O*QIqj3e3HG@0rdE3Cok{z2(f7#-97G#i97}m&lcC znsbrXp+WCxzn2iN)zk3s(!558_X(~2Gp6a!D41&{4q4E#Ovh_aQdRBsCFiW7k=GHW zfh>;vd+=U}0OR)Ef!dNBI=o@qRd;-Sf1 zQ^|Y=?(Q@1mA@JEf>MdpfzGT8?;XPXkDDuBz4~(3XEw&f`Kce7T>^_Q$86WU`gMaX zQc4L?1C_O&^IxwkVQM>V$>DTowammB`Bk;kmmJn~zAnbJ!T+J3_ofP~KWWIzq&q;B zM1|+aT1(FbE0@UzhwyHxT5zwmVaoH0z5n=w??!CjohU6?ptI?%*Ml7J;U>rn1{Ksn z`MERiiQAO+2JoqEx0}r78S38eeY#P6?V5Gg^F;(|uiRICHY+avcgdB*X7Cj?jB1Dl zON&8CTSRC++uU1xf){*>d7s8D`I0qhetlNqycoU*0!BK}H3ONdIk4q3pq0f_L6_C5 zHa^cX?rwl=)~QrI;&E9=W-=c?ud_5yC#UMy1q>_h9Wpul_T`H1T%-k}3zRrFY*^uO zD<=Gy(1ovmv{{}=JF@S;v;Lh~?#)fT|Cil*2ss&HwN$Qsw#MxsKJ&f*3RkXce~Xk# z7c2sqk?|-d{+N(K$y$MiWn#iARn>d;J-_sD&F!V76Pebt4^YL%7y&rt>qGtuNp8Drq-T zmR`XDS~b>WbbX>I%Pf;8#WIL0+h--w@uiz z_W0}g37@)dC?KUYtqun6ZZ4*?S5w#-W6#gmP+(_k|E)heEOC2DWuC-2b_Lh}3py&# zZ>q_?6e@lj)+7Ptj$NSBgv=AS%@1WM*}G8f!Gf6X1=}Xf%KY{BWk$>Cr&gyFyEG^M zu1JmVn(dqaa57r3E8Jy?h*&b);P!bdrZ(?tNv7DV5%NisQbqZ^!j*Z#|K$o46?NAB z40Q<02A#d@8(y0;9VyUWf>vF`rrgZCCRAWvv~4QiN52h>_E%O!u2~zg@!R$iQ;+Lg zQ<*H>Z;BT!%KY`-FFY2z_AucKrO%5PFYZZEbo^qxx3z!SYRA0kWjjS?NN?GHTTml! zAoOvvD@+|mQ3+e%zPgBT>i4wC)}C$@D2H*>*@^| z3tkC4(z~ovqY(RbV=S_MP+3I!5ZKR~?!3t`v?NhG%;8jj}YM3#GYJG1-N9RT z&51tEa>?nymKvKrAMTrPOi%HKLT8@+;#VefqEE5RaM;PY zCG+=vLvJ0OQ@zH|c{Xe~u~Y9U+tTKSho|;SJKYoB@^@Y4PdzVp+l6L#cNH&a*>HH> zAM1a*S^M(t?%IDjR{!?-TF~aG{rx*zeH3CrnX5Y|??!6kMCrdL)_NE>9_y8slh!D! z;ayO5lB>z$yb1U8Wt(sH$yz_l{qgFvzrux*x9P8$(I;6h zf!5Snt$5bwD<-z{^7K2COoT6d{o~I1WUXp*&CfllKd+i?dAX;=cK_stnypLtHu_qm zaQ7eIt_Jeu9Z(zV`|laiCs;0lin(1Up0&k_iS4}Df2WH}VZrNLGnpa;*JP!~nJ!!# z75d{oV^!v-gBL!>GpD$#>MAU&T5~8ab5+;bFhM3AomC$0#l|xoq&PNg@L;|oV|4P6 zQoGgU*^}x((Jw3@8{!+(XSny@#Fy)?8f;lMVS!7Y`^iJCkAp7jRH)zmy6Nv7(6YAj z-_xRxv0U*Wu~K7r!iY>Ou5SB>~lH&ebCf*uWr`$fm$ZXvZu}_GKqRLw7Rk$ zI(KMQL_|vB@{OlKeY`EV6+aeS=4m8g%^-gbwM{9c}L zA-1;gUuC*#l+C-}kr79FS9#q#acGfOnYH<@JuFVeaw?!=@t<|qmOaN#YusPp*eta* zJ1m;1QS9LDYtAP&E_+$8+Iw}=OBv+}T8SH9?v^)5`LWjvblw2lpC6agc;rnveP{0| z_}qIpaBbAq9@X%en4XpT=Z;u&PfvLCL($^vlt~(gUG$|o_#|w^=32$|y*Om$+ z=698!?;oFh-skuO#_bDSKOgJd6;$;fv>xtxT!m=szO5@lSBqK2mP%S}*)L(5eZ}Ke z+Loq==N-<@G8JC;_|lTRxjwAwey6%jyY}tv zM|ZBBwYci*6P9;od=k>NQx@vwnd+hzUiu?DXKN-qZ{Lp;*-Bo;xSEyIi+&o5L1VWPTY)tQfcR^xWC^umf<~bp{wL9#j@WvU$E@0p3{1{xmO;1JLi}@ zWy6cRpZEW4O<}w9@Q{*Z;itRh_DM%({B}%rUJqSy_B7wk=q*pVQea}@{r&$wum6^H z{_FM9uv$fzM~7$6ufNx`P+2|ke(mdoFCTVq`2X+s!=>T(dZHs-K5GlNvVOhYt-rT# zwbd5aznA^|I>foVr|fsLOf~puuD^WN`QAjPlfniux3mQ`Bt1QB5~^y;Rr7T>PI~8d zuI!THF~$suup;3G--aJyPVfG%o*iLYQ{E>e;PBGyWcTy)9=oQlln7Cat(4+|tYDkS z_VE9|-NK)r?Qf6FKXW*L|9{5n4KutF1@A3M`El!^L3mk4x82^|iO>g`{BeD#9>sD0loOeelVA_TSk$-=3PhY|KwJqOlrHs~5mv^wW z0A0&^V|VOJ7Y8j%;*jt7yX)z8+akRcf250_J-&NXz9Fso``vQ+Empf{N*$3YaESf0 zsgir%Y%Au|;cMJ_rA!M>9$j0QdtEz;kLxXCOk7-CrcYgkhY;_E_!-}%^4{F#^`2JO zGj;V|i*GX)UwA+5wKw~XZ(K)hli8CmR?8=S{4GDN>|Nn;x!#Y9*&j79e+&QbXM9~n zV-D}@#o5dG3QVn-L+bY&O1i%8u2%npDU)9}=A5s{)%*9SSo&6Mnc}*)RjQy>W)~!W zD)ZUuWW$b{R`$im>>5C` z3uPH$^M93|=%^0WbKLE%f270k`@>D%w-SE$$kT9@!9>USSpk%vds1T!JE3X7iB-^v-q>Y zdBTeZn?L_*zprd&eXn;^x!<UA74yanbqLF`3zsXv+9{k z3k=MY!*F@&(cL8-A2O*E4<5BeE~~_>uN=7LyG;+#)V8eCu4kd}X6qtck?CyQ{UO zq<{W+yWRfEfk}Ev1s@KwKU!Pa{qe<==Y};WWLK2`Fss;Wr1&=@XG?Bp_PcEjQ#hYSxK!)CwK{M2`pl($TeX*_ukl`9<|UEy z=i6`F8b$kc8RdpPl!R%;PdUZK4~$ zG*9u;qb--e-QMWm8!Q_%M@m4)sOU|hcVzJ+-qu@ttIhY_+ra5AU%KPg%62wcWw-n5 z)8=Thw5HuTEhKjIC}U__+KWuLd;6am^GH|9pUYYG_}aef4?CAHOFrrq{8a10f&BTk zuZ~=W~ zxOrzM7x%2xeXslMx(+s#Pha^#*4kd#W{T>~3o@_FFMoQx)%;#t{n@Gu4YOIKw?5pt za(&Xd+uT#p2||7oTYwO=|{Mr`@P9CKrt=&x@t z*ZnGnuDf~vkw>QZOrRD^=fAsr-bx<}?{1Yfton2K$It0!y)pvkv2)IWuX{NzR~@pm zg>~!t#O7ZwYQ8?b5bLM<=gqz)jQ^MBMz5}q{`Qb-YqrqS#DEnNoU_#D&ui4R)m^UAf{pEW zqtoJhRq2NJW^LzCNzo8_wd-B@;~$Uv9tNz~Qr}vh==k4uxHgPE>?3lAy@d(E% zKc@W1Y3pNIL(g6{Xk5Z^L|Z50fpx}ZZB?ZHKqTJOROtOB=&A1lQ zzP&*A-QM>bFCE-AH^G~E&hmM+obtNykk%97tYil1F~Nnvi%-|2N9I%oCvnf;#M zu|dN2k>6Brr-zZ>-Z@>Iv^|&6ai>5t`@L089vKt9{Rq~7^jB5>@hZOQD;$5{|DSU| zJIpRFvCwJn<105=wv_6eJvY7d>EUQS#aUazuG6iuS;L$y8SGEd(xK= z)>plJBI|CJx>t)|Qq;*vY6#QJXnpl&T6$BFK^xC5-Yr^(PTuycwb~gV!x9m3gt0R} zkttO$|aEtdKq0V(<0-1sr|f z9xw9k%JT1~6@OM{T0D8c9Jt(1c1`5wxV2pu945b+UfMd}T%anyvV~Q(c)v~ZHY0b> zqu)-st*DiXxWx0mufBYhfS!=f@io{H^AXS1>q(JJ}izRmmGsTV84 zDs7hWKR(VA#yKua-^ zyrt$@975JpRtwd|UU(++<@N32^;hTAzPh5fx%VVjcSiKbOO`q%2KV3B|B);{dgz@p zm%i1v8OnxPZ<@6x&JRoO>grz1rDCn4d1<$R6j$o{u%n;%9EsYvVAr*}Z>>=a7p2rx zg}s=$u)ywKo>{W}`N;PY+}&&5JLNg33EX(>lGCZ~vwnTP+K;1l28|vpk3_{p_8C^6 zV>(mwH}}o0t=wzR+j86g{lZ-)F1oT&g164e|K75S4;TI~i~Kh|ZBJ*p*q-HOwTl{a z9Un@~sky|dRrBPm<>#w?!CRDhkA5!Sw`=Y#Q>}T%9A-H`#QbfH_m)gw^!a>tCv0&5 zpE9?7>x{D0svj5ALp7$@D)8HHZwgBR9b3BT<|bF+FYn8pW0pGvTi=iTurG_dlQHVz z!j^mU?pi+tZ4ZhScvAnYUPNto$6d z=j%D8sS^Iy{u3LPSiQ8IWeiz1@s_XbLL>VM1D#dd^X}GuPjXHyOxkvr=|Ve&1l*7@8LUmv!YjUEVtYB zvMt+tesjwHzBzm5>g-$<*w^ZM^+kGK>MYI|yUOM<+|ys_mdAY}Ys=R++cVcqJ8KLn zb0!&`YrW*vkTy^Kp1JE;huhk`onaaLX4lumuAekb(?)ahx{xh~lWzsj+;`()!20ub z>{DF)ES;Y2jfj{sJt1#;dg8>}e^0Mn?ZDKw?&7ld;#!%E;Q2AGHS<;{F%=4*NJ$L5 zw(`^!2kV?xr}9;gTo>w2=`Z*myIsZBW6Ni!H+#CRwq~b`oC?`uxL7Kr^IXo&U$^BR zMz+h;1nk_Km>8JXVwu~}>grdnZ@x~6b4TpY>t2e>SzrIj*}scD^Yk=b?NuJ~JM`29 z_!-5-J_elHQ=Ktg{nWx6`)YSvnKy20^?g?L_UrbmiiO+nTnT=gHN`W0)vXzxxvPBQ z-#80e$CgS~eR~n|&OjrJo4fnen~P`G&u(>n_Fb@ghAoRs+q$)k1-ptOA6Q-fvUi5< zyUoi(TOHK6yH{OezvHJiVJ&FpGW&dJ&wU*otv2K9L9U<${Src2EM83SBd4wR70t9V zH|_>aL@YX&6h70T4K&V@C_5?f-G&V(Ht;2uZ<^hZ2s%1ND%W>kG^U(b#TOpvTjz~eUObyY=?qJ;7Y9~R@U{rOSZQxo49C!xCqMr`zt0u! zv?=yUk@NLTU@F_K>&$#i-GFJAACroJDx>U)lHInFfn|rEi77iICT?uFB>P!l!|h!D ztOJjeCi2zJzWp{gQ|@&JC+7qPD4L?n$kn~+>B)N@3pyO4qN3iayuHE4uza;Mw`}Yj z%Xwd2T$ofGpeRhmAu;jjic9L31qyED1~b~!+)>C~dV22d!zRZr3J57MLXn0ulZaR< z$K=?F4fc&Aja$Q^Ls^1L?UyMhY`;A%(?P#9 zjnU>|Nwu8O+=(U~P*olcEQ?ee5(QNq%+wnbSl)cQ;wSZGI`{qGnwmdX=vr4F|9T@M8| zmP>C}mcPC*-%d|w!`-K!mK;rp;B$m}Tg8FNP}w0-(D;gs#zan&+*@1HzP_4jbK#;# zCb#U~xt8<9g=ccs!cE;E#>mB;eRT4@88aFVPqbp(W%q4I=P$PDw{M?3^6ZicG>jA& zg*dtyT3sV{{4nBl@l&w9d(B1vfZt+v*&UbOe%m8m*`MQyu>YB&Lt^5*hzpZg6ei^P zM=o%Ft-mho!ZWM8JImD@ZkJ4i1(X6KM?i#%!-SWMDmj)cy}8cw(ub;ruJx*_ueZI) zc`x@l!owRL_8tmGOd?_v3zM~lI%YH+p7%*>!Pa2ej9V7dwab%^%-yI6O(7E)IA^pl zw6=OOIT{PKJ5zMZ4;HbSmp)+Mj@Yxmxst2O;1_d^ZI!QBk4tveq% zW(##R9M1c#-{AOY6I<=d%WwCZHr`pj8lF^O*<|hy#S4pmx=t5YQO(ue5^;S}La~)? zQP;tCSim;0JnCa;b-mNt!xr7ya5yoVTQ+uz|EzgWiz?kCPTK!+g2mMY3lA@yrt zuC%bo^i6qpVXNpV6WRFZ@>g@?)_)Hdp5-+e5d#ZCm_)?pD5wM+WRWSGE!^NN8|AS3 z{L6E-tD1ZteSo`CMZk=at9!%5jf|XAbQ?>mPdQs{k!;;t_oAp;PxrRq4QYhOr`R)c zb$?1fBj~Xpgvo67+n!TXCvY!Vw`Ya(?t^d7#X9F884AlKS2wZ9WNyp6VBjKirQxdI z_UCS=t-O!JU8&>QaOlva#HGO>-4twXO?~w*+-X5rn!2ovhCp zIFB$hx<|dTz3|1dbz4s*O7D0Lq>z*=tggsKye5tj(`1fr!8RA%r=MD7xJ73Mzu~;`b{h|`g#7P`mP#O}xVSs88{NI5)6KWYGdeh8hKYem zH_NRpnZYj)$p5xw&=Zle`ofsEy(7GJ z^(p~sEVIn>?-^LWjL=(fHRzF&=ld5WRp!$?pTALA$N7V+TUUDe(XIL>^H@9-3^}&! zT~|JFv545U9?RBN)5l)xbzBZiOqwiWM-m=~u^rr$Qc!jyNhRf8iS!iBNl*Rz2|tA(M}wKbvt zMVZVU!NYY{rY}E=)~3O^?hs1w{2o#IWo zJtN_nf{K7GDCH+){QC0PHgjh?-~YQ=$NOaK-R>J#cepc&h<%hWz2(Ey>DzGV(65in zH*BcudAZP)Bc|x0YiVDYUy+mZU#IEMcHWuCC|1~?*W%f5NXaLmW-chKI0GU=DmYHv zW#H;AazDf9vEU8IlH0*@mlmEisPfU$$e6j;Hb44i?}2%bS{Yhh_qcSGO=94bVA0T7 zV=t}&@r)tU%d*>MvOCsXSUW#9&p)?&r$@PyLIPXjN6;w<-;BFIyt~F1GvOi|~znLww|H#v3Q(=BaAw?>JkLj3_W$#3K0ev}qvH7T88(R)ujZGgUHG^E#&6MMX*O-%dVYrwFxDyy z%`kcwTr8G!d3C;MZ}|3ik}q!j%PM($NABvXP~I$ePyLkLMOW|GRDF@q%P7)&xAV1_ z&wNYq=Vo~w?eF$;UtJyEy(9mA+p+g9XJ@G=o@#lx<3rQuuDU-@!|x|tx#2!_gT$W$ zu{S;)tFEZJC)6WTr5_b{PwCOevtq|D$t>K^VR5GL@`OW5c}}j*o)7+WF1a1t_VU7} znwc3F#1=Wsj{kZ=@%%M^ds~ONYia=(4?TKuadAb_H>W+{e*K?dT4^%N)K=cw{&sJo zvU*^|l+RbVRdhbt{S$F^_j5V_ZtlhR*W?&=fBb&G|Kmhs@!9dU-2D9e-1k1#Ugx*6 zbknbV_dc0}Ju^Q~*)YSXkVR@vZCF76pH^4LM!9VkhR13@zg?@|bN%J6Y=al?ZU^iv zO4FXzRvB zx2pHdPdM>`(<|c6&Hd$u#wD@s*2lY_Pg`^3oPYUB*<#QCS{J?=35)%!b2qa8b9+wg zez_-05IaO1~sdI7RqODJR%LCTO#eUhn)H-Twj^Lyhi#KRY zUzxtjPgBQ7luyc;>7n3;+riaY7ydIZ2(8flxos-P6g8cmJ@01cz3ABg&#L3;>bS6V z-}k(%DtUd&@vWKN_7v7lb9cTdxw}=1-}Y|a;d-`j$NBC5w6u0le|-3j%++O2Q*{g6 z|KD2?xOdhn{|T~h9nPQKyL;hp-nj-pFGk+j{N39}#$M$4ztsz)ZsR|WfW7};_PiIj7-M&D(Z9twHMU~q!yifSr|)Tgr4*^5bXbA5R^-zVUgt zeyH6aRozQd{-Tzy87B|<-b|W%?|(leveO( zVc%EgLm7{zsCS*^caP#a)>9>5>b)|XLq*5#)V)5+xN4$-r;NCHwP~D5-oXCz?=8Bn3+%h zB!8sBv``uC@O3QHZ!fN!?;3D&kG#nO{Y$djf`Sz^b(;Q`cKn|o9C4(c=OrWOfrlCQ z1X)>Y7cAs2RFP}E)Y3Y!PO)3)fBKaVzY9WNpH6)9Ov-+GRp&k1-5QA-%I{x4I?M8n znN7j_wo&Ww;^E~s?uqMqLkM~!<+kfEy-|zMzdi(0nXoY%(Wu|X> z{ON0TCXBd#@ZY$*M5R+r8BK(&gaprE6Q1b(l7a*r%@Z*xPU;>k9v!Qg?Zu zs+6!Jhm-=erWoqS-Th=Anx1SEq;Ht?Vy~92zu2yQ{)dZSC7(ILzMLbc z>b0&!|F7O3adtwX(sOIK-d9&Anx;+>diH2BhxSHGO-;|G#hn_T=I>s*)M;v|jB7yc zx1VyVtB!12cYS-fx|!(J!+b`eH@n7N+vyg_;g8~ab#!u1=CwUv1*mm_< z9ZB|OTDZ(fvU}#Qudi3K`oF#Gf4I#zKj~TU`BifRB2~P*dfwEXZi+9usj41RR+lOs zBUWNww%c#%SsUB(jaI1@DUUqn#Qr}c{OQBr%Y`b-p2U{ zCf>chSHkj(eb&N1Z_Di!iZAiZiQLZD#xJ`h$TQ`ko|%{7hG|O@pL(xPxHxI5B6s)R z-}{`lt_lrY?w9-I`SavyS6WUSGRc-XH_>&u|Hp0aiPfJ>{Z(FhMJN@JcG)zi=>3)8{|hT5 zl1^y&h_OAqmdUbef`=(*LZqQs&nf--J~-u^FSOqZ?{ zlJ<^^sCD{R>1jQC(}roYJI-YmgasrjK1mg?JTk*QM8IXsooavkKcycgL|yqkpY4S8 zBr~P$MxL`e{__SrycY51-e&)|OQcq+9`oUFjqo^i&iZ|A$JW>8t7Rh}r?{4#NL7qo zT9mq`;-%=Ch^=u;A1<*Dy6V}dqtI--kc&HcqF#4g{e5Rau}u!&d|M}#OtrJ!z2NFo zadGcftBMZ+7axV^O#iZa&C1OitIywC^yqCtZl7DklrR&y3_g}yFQx5REnfL@LhG${cdM^DeLFtC&hgm|#f+l5WL2-Cz19XbClscx&c8D! zx#iN2wALpR`SUWPO`0IRo`#b8b z!~L84`CBH>iAeFQ+VkSbB8|H$_VTmM_P3_biw%0!>$5NTO2iYsx`c*RW_RQ5;85*3Pe4E|x%gd|0wN<6AOP{28?3%bFz%;MK zFYsgGl0!~@OP^eM5Z^1UWNEqbO7PqOu6@j$+{yP&zMQC&$6PyKNhC3G$-CGqUznb} zy|FUr$C5m?h>2hI_y1Y-Y!=4_hyEiGS%E5h&wt+)c|T;u>Ztf-b?Qszd2sFX|NGqD z%Vy!^kMkvN&ntgw?d>^woAZbLdgYUFMdKh@c)Bh>p|?#HkEIT0QC)!*I(bFYrCySZL0 za*~pY^@)RW_utpEys{QbOpGzlp0kD}Nrl_V({OTA$gO!ZPddPDVQZjJI``+vt|rc`)wEwEAL?7kKr({()UOyF{c zfBhS>u6|0gvCEe8vws_MWkn$Kp}=P=uEcZPjyM*m$2MWIXq>t98*^L3dcVYpGYXeq zS8-q}^izmQytv`v%`Em?J3N=y-; zRi58|d^d24-s9i8t$c6SX;~Rc*v8mdgzsH(&*@UI-rgg8nwMg?RyFS`Jz1erA0zgB z)9H6b)rRH&f=Z(lwmbdZoh!X{^1b!>{R`sneaqEfDOIGU#O?d@UE7;aURu-NPv4$e zbH6@(WfW`nwY;G18J@MrOv7Uv-|zd)STAq8Do_2^$CJ+^HoS06-7WGauKKL#j-BD= zq25AoCQ8>YNplkWv3yPt_ugIQj(&M^b$`E>U)^4)J>|XltiSuM-c@T)IdbOv=}VWM z|G3D%@Z`^fmn(WM_lSqD3E%zY(+T$PPp+wYdK>#q`g2_SrJ8p9>{Pomzuwn~+V9ML zx$buLVP{kOf(SzyEzUH@-xpz$h0MS)ctIywzyT0o;*P6`f* zf=o*+>RS&fon!X+?AgE~G?}5*HR;&gxXBJS!V5NZJb%%eX5H$VG3SREXyj@}7ej07 z%0rIH9t|us(A}_pgNF~(msuu-7_}H>R^~SjcQ3fkYI$1mp`~r=A$R}5M zFomf(BqpAH5fl+&yzWaEi^qXSEN{x9+t_-x@0eZE&*E{QiKRs0^4o7I5f`?$ly@Fd zdbpf{5macwre`KNd|}bhS(JW44l#P#z~Z6skTW1c<&TI011PBB6E7X}7+PJw@Z4ku zg#z3d6&psb?w0vXEU;CVnBn5za7d}D?M)*n_Ta_{f!ub;pOFb<4PspX1?M06M6P?& {}; - struct foot_pound_force : noble_derived_unit {}; } @@ -380,7 +378,6 @@ of a `scaled_unit` class template: [scaled_unit]<:-[named_scaled_unit] [scaled_unit]<:-[prefixed_unit] [scaled_unit]<:-[derived_unit] - [scaled_unit]<:-[noble_derived_unit] [scaled_unit]<:-[named_derived_unit] [scaled_unit]<:-[alias_unit] [scaled_unit]<:-[prefixed_alias_unit] diff --git a/docs/reference/core/types/units.rst b/docs/reference/core/types/units.rst index f2caf2c4..897fcc85 100644 --- a/docs/reference/core/types/units.rst +++ b/docs/reference/core/types/units.rst @@ -19,9 +19,6 @@ Units .. doxygenstruct:: units::derived_unit :members: -.. doxygenstruct:: units::noble_derived_unit - :members: - .. doxygenstruct:: units::named_derived_unit :members: diff --git a/src/core/include/units/unit.h b/src/core/include/units/unit.h index d6bca261..a4a46463 100644 --- a/src/core/include/units/unit.h +++ b/src/core/include/units/unit.h @@ -161,31 +161,6 @@ struct derived_unit : downcast_dispatch - requires detail::same_scaled_units && - (U::is_named && (URest::is_named && ... && true)) -// TODO - 'noble' is placeholder to sort of mean can pass its name on to other deduced units -struct noble_derived_unit : downcast_dispatch> { - static constexpr bool is_named = true; - static constexpr auto symbol = detail::derived_symbol_text(); - using prefix_family = no_prefix; -}; - - /** * @brief A named unit with a deduced ratio * diff --git a/src/systems/isq/include/units/isq/dimensions/energy.h b/src/systems/isq/include/units/isq/dimensions/energy.h index 1f88bc16..db090615 100644 --- a/src/systems/isq/include/units/isq/dimensions/energy.h +++ b/src/systems/isq/include/units/isq/dimensions/energy.h @@ -28,8 +28,14 @@ namespace units::isq { +template +struct dim_energy; + template F, DimensionOfT L> -struct dim_energy : derived_dimension, exponent> {}; +struct dim_energy : derived_dimension, exponent> {}; + +template L, DimensionOfT F> +struct dim_energy : derived_dimension, exponent> {}; template concept Energy = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/power.h b/src/systems/isq/include/units/isq/dimensions/power.h index 9bef0f74..5a0b24ca 100644 --- a/src/systems/isq/include/units/isq/dimensions/power.h +++ b/src/systems/isq/include/units/isq/dimensions/power.h @@ -28,8 +28,14 @@ namespace units::isq { +template +struct dim_power; + template E, DimensionOfT T> -struct dim_power : derived_dimension, exponent> {}; +struct dim_power : derived_dimension, exponent> {}; + +template L, DimensionOfT F, DimensionOfT T> +struct dim_power : derived_dimension, exponent, exponent> {}; template concept Power = QuantityOfT; diff --git a/src/systems/si-fps/include/units/isq/si/fps/energy.h b/src/systems/si-fps/include/units/isq/si/fps/energy.h index b33bab74..7d430d4f 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/energy.h +++ b/src/systems/si-fps/include/units/isq/si/fps/energy.h @@ -37,10 +37,10 @@ namespace units::isq::si::fps { // https://en.wikipedia.org/wiki/Foot-poundal struct foot_poundal : unit {}; -struct dim_energy : isq::dim_energy {}; +struct dim_energy : isq::dim_energy {}; // https://en.wikipedia.org/wiki/Foot-pound_(energy) -struct foot_pound_force : noble_derived_unit {}; + struct foot_pound_force : derived_unit {}; template U, Representation Rep = double> using energy = quantity; diff --git a/src/systems/si-fps/include/units/isq/si/fps/power.h b/src/systems/si-fps/include/units/isq/si/fps/power.h index 92bba117..d8cb69fe 100644 --- a/src/systems/si-fps/include/units/isq/si/fps/power.h +++ b/src/systems/si-fps/include/units/isq/si/fps/power.h @@ -37,9 +37,9 @@ namespace units::isq::si::fps { struct foot_poundal_per_second : unit {}; -struct dim_power : isq::dim_power {}; +struct dim_power : isq::dim_power {}; -struct foot_pound_force_per_second : derived_unit {}; +struct foot_pound_force_per_second : derived_unit {}; struct horse_power : named_scaled_unit {}; diff --git a/test/unit_test/static/fps_test.cpp b/test/unit_test/static/fps_test.cpp index 054e2a5e..7bbf8ab8 100644 --- a/test/unit_test/static/fps_test.cpp +++ b/test/unit_test/static/fps_test.cpp @@ -84,6 +84,8 @@ static_assert(10_q_pdl * 10_q_ft == 100_q_ft_pdl); static_assert(100_q_ft_pdl / 10_q_ft == 10_q_pdl); static_assert(100_q_ft_pdl / 10_q_pdl == 10_q_ft); +static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ lbf", "ft lbf")); + /* ************** DERIVED DIMENSIONS IN TERMS OF OTHER UNITS **************** */ // power @@ -92,6 +94,6 @@ static_assert(10_q_ft_pdl / 10_q_s == 1_q_ft_pdl_per_s); static_assert(1_q_ft_pdl_per_s * 10_q_s == 10_q_ft_pdl); static_assert(10_q_ft_pdl / 1_q_ft_pdl_per_s == 10_q_s); -// static_assert(detail::unit_text() == "ft_lbf/s"); +static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ lbf/s", "ft lbf/s")); } From 68203b6a9f63c2a6bc050bf69337efd00003af7e Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 10 May 2021 18:11:53 +0200 Subject: [PATCH 38/59] test: additional tests for FPS unit text symbols added --- test/unit_test/static/fps_test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit_test/static/fps_test.cpp b/test/unit_test/static/fps_test.cpp index 7bbf8ab8..1eb7e541 100644 --- a/test/unit_test/static/fps_test.cpp +++ b/test/unit_test/static/fps_test.cpp @@ -84,6 +84,7 @@ static_assert(10_q_pdl * 10_q_ft == 100_q_ft_pdl); static_assert(100_q_ft_pdl / 10_q_ft == 10_q_pdl); static_assert(100_q_ft_pdl / 10_q_pdl == 10_q_ft); +static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ pdl", "ft pdl")); static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ lbf", "ft lbf")); /* ************** DERIVED DIMENSIONS IN TERMS OF OTHER UNITS **************** */ @@ -94,6 +95,7 @@ static_assert(10_q_ft_pdl / 10_q_s == 1_q_ft_pdl_per_s); static_assert(1_q_ft_pdl_per_s * 10_q_s == 10_q_ft_pdl); static_assert(10_q_ft_pdl / 1_q_ft_pdl_per_s == 10_q_s); +static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ pdl/s", "ft pdl/s")); static_assert(detail::unit_text() == basic_symbol_text("ft ⋅ lbf/s", "ft lbf/s")); } From 1783d243daa4351d2cdf25c13919f52a70ef5b17 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 15:03:04 +0200 Subject: [PATCH 39/59] fix: quantity modulo arithmetics fixed Resolves #231 --- docs/CHANGELOG.md | 1 + src/core/include/units/quantity.h | 18 ++--- test/unit_test/static/quantity_kind_test.cpp | 2 +- test/unit_test/static/quantity_test.cpp | 69 ++++++++++++++++++-- 4 files changed, 69 insertions(+), 21 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c4326c9d..23f48c5c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -34,6 +34,7 @@ - fix: downcasting facility for non-default-constructible types - fix: restore user-warnings within the library implementation - fix: the text symbol of `foot_pound_force` and `foot_pound_force_per_second` + - fix: quantity modulo arithmetics fixed - (!) build: Conan testing version is now hosted on [Artifactory](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units) - (!) build: Linear Algebra is now hosted on its [Artifactory](https://twonington.jfrog.io/artifactory/api/conan/conan-oss) - (!) build: `BUILD_DOCS` CMake option renamed to `UNITS_BUILD_DOCS` diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 13c519ab..c40b9992 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -426,25 +426,15 @@ template return detail::make_quantity(lhs.number() / rhs.number()); } -template - requires (!floating_point_) && (!floating_point_) && - quantity_value_for_, Rep1, Rep2> -[[nodiscard]] constexpr Quantity auto operator%(const quantity& lhs, const quantity& rhs) -{ - gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); - using unit = downcast_unit; - using ret = quantity, Rep1, Rep2>>; - return ret(lhs.number() % rhs.number()); -} - -template Q2> +template requires (!floating_point_) && (!floating_point_) && + (QuantityEquivalentTo || Dimensionless) && quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator%(const Q1& lhs, const Q2& rhs) { gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); - using ret = common_quantity_for, Q1, Q2>; - return ret(ret(lhs).number() % ret(rhs).number()); + using ret = quantity, typename Q1::rep, typename Q2::rep>>; + return ret(lhs.number() % rhs.number()); } template Q2> diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index 1cc20856..5ffea7fe 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -612,7 +612,7 @@ static_assert(same(height(2. * m) / (3 * s), rate_of_climb(2 * m) * dimensionless(3), width(6 * cm))); static_assert(same(dimensionless(2) * width(3 * m), width(6 * cm))); static_assert(same(width(2 * m) / dimensionless(3), width(2. / 3 * hm))); -static_assert(same(width(2 * m) % dimensionless(3), width(2 * cm))); +static_assert(same(width(2 * m) % dimensionless(3), width(2 * m))); static_assert(same(height(2 * m) / (3 * m), quantity_kind, one, int>(0))); diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 6c16f0f0..de56d789 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -399,7 +399,7 @@ static_assert(is_same_v>); static_assert(compare(1)), length>); static_assert(compare(1) * 1_q_m), length>); static_assert(compare(1)), length>); -static_assert(compare(1)), length>); +static_assert(compare(1)), length>); static_assert(compare>); static_assert(compare>); static_assert(compare>); @@ -433,7 +433,7 @@ static_assert(compare(1) / 1._q_s), frequency, long double>>); static_assert(compare>); static_assert(compare>); -static_assert(compare(1)), length>); +static_assert(compare(1)), length>); static_assert(compare(1)), length>); static_assert(is_same_v>); @@ -475,7 +475,7 @@ static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(is_same_v>); // different dimensions static_assert(compare>); @@ -545,7 +545,7 @@ static_assert((7_q_m % 2).number() == 1); static_assert((7_q_m % quantity{2}).number() == 1); static_assert((7_q_m % dimensionless(2)).number() == 1); static_assert((7_q_m % 2_q_m).number() == 1); -static_assert((7_q_km % 2000_q_m).number() == 1000); +static_assert((7_q_km % 2000_q_m).number() == 7); static_assert((10_q_km2 * 10_q_km2) / 50_q_km2 == 2_q_km2); @@ -560,8 +560,7 @@ static_assert(quantity_cast(10_q_km / 5_q_m).number() == 2000); static_assert((10_q_s * 2_q_kHz).number() == 20); -// unit constants - +// quantity references static_assert(2_q_m * (1 * m) == (2_q_m2)); static_assert(2_q_m2 / (1 * m) == (2_q_m)); @@ -787,4 +786,62 @@ static_assert(is_same_v, decltype(3'000 * m)>); + +constexpr auto qr2 = quotient_remainder_theorem(3 * km, 400 * m); +static_assert(qr2 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr3 = quotient_remainder_theorem(3 * km, 2 * m); +static_assert(qr3 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr4 = quotient_remainder_theorem(3 * km, 400'000 * mm); +static_assert(qr4 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr5 = quotient_remainder_theorem(3 * km, 2'000 * mm); +static_assert(qr5 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr6 = quotient_remainder_theorem(3 * km, 400 * mm); +static_assert(qr6 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr7 = quotient_remainder_theorem(3 * km, 2 * mm); +static_assert(qr7 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr8 = quotient_remainder_theorem(3'000 * m, 400); +static_assert(qr8 == 3'000 * m); +static_assert(is_same_v, decltype(3'000 * m)>); + +constexpr auto qr9 = quotient_remainder_theorem(3'000 * m, quantity(400)); +static_assert(qr9 == 3'000 * m); +static_assert(is_same_v, decltype(3'000 * m)>); + +constexpr auto qr10 = quotient_remainder_theorem(3 * km, quantity(400)); +static_assert(qr10 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr11 = quotient_remainder_theorem(3 * km, quantity(2)); +static_assert(qr11 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + +constexpr auto qr12 = quotient_remainder_theorem(3 * km, dimensionless, int>(400)); +static_assert(qr12 == 3 * km); +static_assert(is_same_v, decltype(3 * km)>); + } // namespace From 6e42cabc64a6c6c8d0120a506fddc5d16b3f61ee Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 15:31:46 +0200 Subject: [PATCH 40/59] feat: a support to define ISQ derived dimensions in terms of different number or order of components --- docs/CHANGELOG.md | 1 + .../include/units/isq/dimensions/absorbed_dose.h | 5 ++++- .../include/units/isq/dimensions/acceleration.h | 5 ++++- .../units/isq/dimensions/angular_velocity.h | 5 ++++- .../isq/include/units/isq/dimensions/area.h | 5 ++++- .../include/units/isq/dimensions/capacitance.h | 5 ++++- .../units/isq/dimensions/catalytic_activity.h | 5 ++++- .../include/units/isq/dimensions/charge_density.h | 12 +++++++++--- .../include/units/isq/dimensions/concentration.h | 5 ++++- .../include/units/isq/dimensions/conductance.h | 5 ++++- .../units/isq/dimensions/current_density.h | 5 ++++- .../isq/include/units/isq/dimensions/density.h | 5 ++++- .../units/isq/dimensions/dynamic_viscosity.h | 5 ++++- .../units/isq/dimensions/electric_charge.h | 5 ++++- .../isq/dimensions/electric_field_strength.h | 5 ++++- .../include/units/isq/dimensions/energy_density.h | 5 ++++- .../isq/include/units/isq/dimensions/force.h | 5 ++++- .../isq/include/units/isq/dimensions/frequency.h | 5 ++++- .../include/units/isq/dimensions/heat_capacity.h | 15 ++++++++++++--- .../isq/include/units/isq/dimensions/inductance.h | 5 ++++- .../isq/include/units/isq/dimensions/luminance.h | 5 ++++- .../include/units/isq/dimensions/magnetic_flux.h | 5 ++++- .../units/isq/dimensions/magnetic_induction.h | 5 ++++- .../include/units/isq/dimensions/molar_energy.h | 5 ++++- .../isq/include/units/isq/dimensions/momentum.h | 5 ++++- .../include/units/isq/dimensions/permeability.h | 5 ++++- .../include/units/isq/dimensions/permittivity.h | 5 ++++- .../isq/include/units/isq/dimensions/pressure.h | 5 ++++- .../include/units/isq/dimensions/radioactivity.h | 5 ++++- .../isq/include/units/isq/dimensions/resistance.h | 5 ++++- .../isq/include/units/isq/dimensions/speed.h | 5 ++++- .../units/isq/dimensions/surface_tension.h | 5 ++++- .../units/isq/dimensions/thermal_conductivity.h | 5 ++++- .../isq/include/units/isq/dimensions/torque.h | 5 ++++- .../isq/include/units/isq/dimensions/voltage.h | 5 ++++- .../isq/include/units/isq/dimensions/volume.h | 5 ++++- 36 files changed, 154 insertions(+), 39 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 23f48c5c..b27e605c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -19,6 +19,7 @@ - feat: `modulation_rate` support added (thanks [@go2sh](https://github.com/go2sh)) - feat: SI prefixes for `isq::iec80000` support added (thanks [@go2sh](https://github.com/go2sh)) - feat: a possibility to disable quantity UDLs support with `UNITS_NO_LITERALS` preprocessor define + - feat: a support to define ISQ derived dimensions in terms of different number or order of components - perf: preconditions check do not influence the runtime performance of a Release build - perf: `quantity_cast()` generates less assembly instructions - perf: temporary string creation removed from `quantity::op<<()` diff --git a/src/systems/isq/include/units/isq/dimensions/absorbed_dose.h b/src/systems/isq/include/units/isq/dimensions/absorbed_dose.h index 8dcb1e6c..633af9a7 100644 --- a/src/systems/isq/include/units/isq/dimensions/absorbed_dose.h +++ b/src/systems/isq/include/units/isq/dimensions/absorbed_dose.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_absorbed_dose; + template E, DimensionOfT M> -struct dim_absorbed_dose : derived_dimension, exponent> {}; +struct dim_absorbed_dose : derived_dimension, exponent> {}; template concept AbsorbedDose = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/acceleration.h b/src/systems/isq/include/units/isq/dimensions/acceleration.h index b639fcca..a122ec6d 100644 --- a/src/systems/isq/include/units/isq/dimensions/acceleration.h +++ b/src/systems/isq/include/units/isq/dimensions/acceleration.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_acceleration; + template L, DimensionOfT T> -struct dim_acceleration : derived_dimension, exponent> {}; +struct dim_acceleration : derived_dimension, exponent> {}; template concept Acceleration = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/angular_velocity.h b/src/systems/isq/include/units/isq/dimensions/angular_velocity.h index dfea55d1..1554dced 100644 --- a/src/systems/isq/include/units/isq/dimensions/angular_velocity.h +++ b/src/systems/isq/include/units/isq/dimensions/angular_velocity.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_angular_velocity; + template A, DimensionOfT T> -struct dim_angular_velocity : derived_dimension, exponent> {}; +struct dim_angular_velocity : derived_dimension, exponent> {}; template concept AngularVelocity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/area.h b/src/systems/isq/include/units/isq/dimensions/area.h index c122a00a..f03a4209 100644 --- a/src/systems/isq/include/units/isq/dimensions/area.h +++ b/src/systems/isq/include/units/isq/dimensions/area.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_area; + template L> -struct dim_area : derived_dimension> {}; +struct dim_area : derived_dimension> {}; template concept Area = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/capacitance.h b/src/systems/isq/include/units/isq/dimensions/capacitance.h index 8a7f1c72..8f474587 100644 --- a/src/systems/isq/include/units/isq/dimensions/capacitance.h +++ b/src/systems/isq/include/units/isq/dimensions/capacitance.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_capacitance; + template C, DimensionOfT V> -struct dim_capacitance : derived_dimension, exponent> {}; +struct dim_capacitance : derived_dimension, exponent> {}; template concept Capacitance = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/catalytic_activity.h b/src/systems/isq/include/units/isq/dimensions/catalytic_activity.h index 82b21dc1..8a07c879 100644 --- a/src/systems/isq/include/units/isq/dimensions/catalytic_activity.h +++ b/src/systems/isq/include/units/isq/dimensions/catalytic_activity.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_catalytic_activity; + template T, DimensionOfT M> -struct dim_catalytic_activity : derived_dimension, exponent> {}; +struct dim_catalytic_activity : derived_dimension, exponent> {}; template concept CatalyticActivity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/charge_density.h b/src/systems/isq/include/units/isq/dimensions/charge_density.h index 4e2d58b5..8625665a 100644 --- a/src/systems/isq/include/units/isq/dimensions/charge_density.h +++ b/src/systems/isq/include/units/isq/dimensions/charge_density.h @@ -28,11 +28,17 @@ namespace units::isq { -template Q, DimensionOfT L> -struct dim_charge_density : derived_dimension, exponent> {}; +template +struct dim_charge_density; template Q, DimensionOfT L> -struct dim_surface_charge_density : derived_dimension, exponent> {}; +struct dim_charge_density : derived_dimension, exponent> {}; + +template +struct dim_surface_charge_density; + +template Q, DimensionOfT L> +struct dim_surface_charge_density : derived_dimension, exponent> {}; template concept ChargeDensity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/concentration.h b/src/systems/isq/include/units/isq/dimensions/concentration.h index f1a82a08..f8592d98 100644 --- a/src/systems/isq/include/units/isq/dimensions/concentration.h +++ b/src/systems/isq/include/units/isq/dimensions/concentration.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_concentration; + template M, DimensionOfT L> -struct dim_concentration : derived_dimension, exponent> {}; +struct dim_concentration : derived_dimension, exponent> {}; template concept Concentration = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/conductance.h b/src/systems/isq/include/units/isq/dimensions/conductance.h index 0dea42ff..6d7a71fd 100644 --- a/src/systems/isq/include/units/isq/dimensions/conductance.h +++ b/src/systems/isq/include/units/isq/dimensions/conductance.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_conductance; + template R> -struct dim_conductance : derived_dimension> {}; +struct dim_conductance : derived_dimension> {}; template concept Conductance = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/current_density.h b/src/systems/isq/include/units/isq/dimensions/current_density.h index e6e1420a..f097de77 100644 --- a/src/systems/isq/include/units/isq/dimensions/current_density.h +++ b/src/systems/isq/include/units/isq/dimensions/current_density.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_current_density; + template I, DimensionOfT L> -struct dim_current_density : derived_dimension, exponent> {}; +struct dim_current_density : derived_dimension, exponent> {}; template concept CurrentDensity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/density.h b/src/systems/isq/include/units/isq/dimensions/density.h index 3b05b5ea..cb5196d9 100644 --- a/src/systems/isq/include/units/isq/dimensions/density.h +++ b/src/systems/isq/include/units/isq/dimensions/density.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_density; + template M, DimensionOfT L> -struct dim_density : derived_dimension, exponent> {}; +struct dim_density : derived_dimension, exponent> {}; template concept Density = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/dynamic_viscosity.h b/src/systems/isq/include/units/isq/dimensions/dynamic_viscosity.h index 43add26c..ceac79e5 100644 --- a/src/systems/isq/include/units/isq/dimensions/dynamic_viscosity.h +++ b/src/systems/isq/include/units/isq/dimensions/dynamic_viscosity.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_dynamic_viscosity; + template P, DimensionOfT T> -struct dim_dynamic_viscosity : derived_dimension, exponent> {}; +struct dim_dynamic_viscosity : derived_dimension, exponent> {}; template concept DynamicViscosity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/electric_charge.h b/src/systems/isq/include/units/isq/dimensions/electric_charge.h index 3f409c87..2c7db791 100644 --- a/src/systems/isq/include/units/isq/dimensions/electric_charge.h +++ b/src/systems/isq/include/units/isq/dimensions/electric_charge.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_electric_charge; + template T, DimensionOfT C> -struct dim_electric_charge : derived_dimension, exponent> {}; +struct dim_electric_charge : derived_dimension, exponent> {}; template concept ElectricCharge = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/electric_field_strength.h b/src/systems/isq/include/units/isq/dimensions/electric_field_strength.h index 358e8203..4bcd78f6 100644 --- a/src/systems/isq/include/units/isq/dimensions/electric_field_strength.h +++ b/src/systems/isq/include/units/isq/dimensions/electric_field_strength.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_electric_field_strength; + template V, DimensionOfT L> -struct dim_electric_field_strength : derived_dimension, exponent> {}; +struct dim_electric_field_strength : derived_dimension, exponent> {}; template concept ElectricFieldStrength = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/energy_density.h b/src/systems/isq/include/units/isq/dimensions/energy_density.h index 41fe8a12..aa63cbca 100644 --- a/src/systems/isq/include/units/isq/dimensions/energy_density.h +++ b/src/systems/isq/include/units/isq/dimensions/energy_density.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_energy_density; + template E, DimensionOfT V> -struct dim_energy_density : derived_dimension, exponent> {}; +struct dim_energy_density : derived_dimension, exponent> {}; template concept EnergyDensity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/force.h b/src/systems/isq/include/units/isq/dimensions/force.h index 92fdeb56..c8f11d75 100644 --- a/src/systems/isq/include/units/isq/dimensions/force.h +++ b/src/systems/isq/include/units/isq/dimensions/force.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_force; + template M, DimensionOfT A> -struct dim_force : derived_dimension, exponent> {}; +struct dim_force : derived_dimension, exponent> {}; template concept Force = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/frequency.h b/src/systems/isq/include/units/isq/dimensions/frequency.h index 827e72c1..4b3dc285 100644 --- a/src/systems/isq/include/units/isq/dimensions/frequency.h +++ b/src/systems/isq/include/units/isq/dimensions/frequency.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_frequency; + template T> -struct dim_frequency : derived_dimension> {}; +struct dim_frequency : derived_dimension> {}; template concept Frequency = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/heat_capacity.h b/src/systems/isq/include/units/isq/dimensions/heat_capacity.h index c838491e..6d96fb40 100644 --- a/src/systems/isq/include/units/isq/dimensions/heat_capacity.h +++ b/src/systems/isq/include/units/isq/dimensions/heat_capacity.h @@ -30,14 +30,23 @@ namespace units::isq { +template +struct dim_heat_capacity; + template E, DimensionOfT T> -struct dim_heat_capacity : derived_dimension, exponent> {}; +struct dim_heat_capacity : derived_dimension, exponent> {}; + +template +struct dim_specific_heat_capacity; template C, DimensionOfT M> -struct dim_specific_heat_capacity : derived_dimension, exponent> {}; +struct dim_specific_heat_capacity : derived_dimension, exponent> {}; + +template +struct dim_molar_heat_capacity; template C, DimensionOfT M> -struct dim_molar_heat_capacity : derived_dimension, exponent> {}; +struct dim_molar_heat_capacity : derived_dimension, exponent> {}; template concept HeatCapacity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/inductance.h b/src/systems/isq/include/units/isq/dimensions/inductance.h index 6e6ccbea..90ae21cd 100644 --- a/src/systems/isq/include/units/isq/dimensions/inductance.h +++ b/src/systems/isq/include/units/isq/dimensions/inductance.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_inductance; + template F, DimensionOfT I> -struct dim_inductance : derived_dimension, exponent> {}; +struct dim_inductance : derived_dimension, exponent> {}; template concept Inductance = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/luminance.h b/src/systems/isq/include/units/isq/dimensions/luminance.h index 6167591a..5e665d58 100644 --- a/src/systems/isq/include/units/isq/dimensions/luminance.h +++ b/src/systems/isq/include/units/isq/dimensions/luminance.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_luminance; + template I, DimensionOfT L> -struct dim_luminance : derived_dimension, exponent> {}; +struct dim_luminance : derived_dimension, exponent> {}; template concept Luminance = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/magnetic_flux.h b/src/systems/isq/include/units/isq/dimensions/magnetic_flux.h index 2708d0d4..67fe78e2 100644 --- a/src/systems/isq/include/units/isq/dimensions/magnetic_flux.h +++ b/src/systems/isq/include/units/isq/dimensions/magnetic_flux.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_magnetic_flux; + template B, DimensionOfT A> -struct dim_magnetic_flux : derived_dimension, exponent> {}; +struct dim_magnetic_flux : derived_dimension, exponent> {}; template concept MagneticFlux = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/magnetic_induction.h b/src/systems/isq/include/units/isq/dimensions/magnetic_induction.h index 7bd59e41..023fa2fa 100644 --- a/src/systems/isq/include/units/isq/dimensions/magnetic_induction.h +++ b/src/systems/isq/include/units/isq/dimensions/magnetic_induction.h @@ -29,8 +29,11 @@ namespace units::isq { +template +struct dim_magnetic_induction; + template V, DimensionOfT T, DimensionOfT L> -struct dim_magnetic_induction : derived_dimension, exponent, exponent> {}; +struct dim_magnetic_induction : derived_dimension, exponent, exponent> {}; template concept MagneticInduction = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/molar_energy.h b/src/systems/isq/include/units/isq/dimensions/molar_energy.h index b1c18e96..a60bb3df 100644 --- a/src/systems/isq/include/units/isq/dimensions/molar_energy.h +++ b/src/systems/isq/include/units/isq/dimensions/molar_energy.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_molar_energy; + template E, DimensionOfT M> -struct dim_molar_energy : derived_dimension, exponent> {}; +struct dim_molar_energy : derived_dimension, exponent> {}; template concept MolarEnergy = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/momentum.h b/src/systems/isq/include/units/isq/dimensions/momentum.h index 5f3fad25..f7240259 100644 --- a/src/systems/isq/include/units/isq/dimensions/momentum.h +++ b/src/systems/isq/include/units/isq/dimensions/momentum.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_momentum; + template M, DimensionOfT V> -struct dim_momentum : derived_dimension, exponent> {}; +struct dim_momentum : derived_dimension, exponent> {}; template concept Momentum = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/permeability.h b/src/systems/isq/include/units/isq/dimensions/permeability.h index 8bd2da53..01543a57 100644 --- a/src/systems/isq/include/units/isq/dimensions/permeability.h +++ b/src/systems/isq/include/units/isq/dimensions/permeability.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_permeability; + template H, DimensionOfT L> -struct dim_permeability : derived_dimension, exponent> {}; +struct dim_permeability : derived_dimension, exponent> {}; template concept Permeability = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/permittivity.h b/src/systems/isq/include/units/isq/dimensions/permittivity.h index 4d0cb155..78b0bb44 100644 --- a/src/systems/isq/include/units/isq/dimensions/permittivity.h +++ b/src/systems/isq/include/units/isq/dimensions/permittivity.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_permittivity; + template C, DimensionOfT L> -struct dim_permittivity : derived_dimension, exponent> {}; +struct dim_permittivity : derived_dimension, exponent> {}; template concept Permittivity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/pressure.h b/src/systems/isq/include/units/isq/dimensions/pressure.h index 6f5f8934..48858a28 100644 --- a/src/systems/isq/include/units/isq/dimensions/pressure.h +++ b/src/systems/isq/include/units/isq/dimensions/pressure.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_pressure; + template F, DimensionOfT A> -struct dim_pressure : derived_dimension, exponent> {}; +struct dim_pressure : derived_dimension, exponent> {}; template concept Pressure = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/radioactivity.h b/src/systems/isq/include/units/isq/dimensions/radioactivity.h index 3457153a..591a1da9 100644 --- a/src/systems/isq/include/units/isq/dimensions/radioactivity.h +++ b/src/systems/isq/include/units/isq/dimensions/radioactivity.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_radioactivity; + template T> -struct dim_radioactivity : derived_dimension> {}; +struct dim_radioactivity : derived_dimension> {}; template concept Radioactivity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/resistance.h b/src/systems/isq/include/units/isq/dimensions/resistance.h index 7ec09111..3af040cd 100644 --- a/src/systems/isq/include/units/isq/dimensions/resistance.h +++ b/src/systems/isq/include/units/isq/dimensions/resistance.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_resistance; + template V, DimensionOfT C> -struct dim_resistance : derived_dimension, exponent> {}; +struct dim_resistance : derived_dimension, exponent> {}; template concept Resistance = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/speed.h b/src/systems/isq/include/units/isq/dimensions/speed.h index e226fb04..d681420a 100644 --- a/src/systems/isq/include/units/isq/dimensions/speed.h +++ b/src/systems/isq/include/units/isq/dimensions/speed.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_speed; + template L, DimensionOfT T> -struct dim_speed : derived_dimension, exponent> {}; +struct dim_speed : derived_dimension, exponent> {}; template concept Speed = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/surface_tension.h b/src/systems/isq/include/units/isq/dimensions/surface_tension.h index db46257a..52cdd3f3 100644 --- a/src/systems/isq/include/units/isq/dimensions/surface_tension.h +++ b/src/systems/isq/include/units/isq/dimensions/surface_tension.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_surface_tension; + template F, DimensionOfT L> -struct dim_surface_tension : derived_dimension, exponent> {}; +struct dim_surface_tension : derived_dimension, exponent> {}; template concept SurfaceTension = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/thermal_conductivity.h b/src/systems/isq/include/units/isq/dimensions/thermal_conductivity.h index b71c37af..f7da8411 100644 --- a/src/systems/isq/include/units/isq/dimensions/thermal_conductivity.h +++ b/src/systems/isq/include/units/isq/dimensions/thermal_conductivity.h @@ -29,8 +29,11 @@ namespace units::isq { +template +struct dim_thermal_conductivity; + template P, DimensionOfT L, DimensionOfT T> -struct dim_thermal_conductivity : derived_dimension, exponent, exponent> {}; +struct dim_thermal_conductivity : derived_dimension, exponent, exponent> {}; template concept ThermalConductivity = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/torque.h b/src/systems/isq/include/units/isq/dimensions/torque.h index 0109b822..3a0c3697 100644 --- a/src/systems/isq/include/units/isq/dimensions/torque.h +++ b/src/systems/isq/include/units/isq/dimensions/torque.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_torque; + template F, DimensionOfT L, DimensionOfT A> -struct dim_torque : derived_dimension, exponent, exponent> {}; +struct dim_torque : derived_dimension, exponent, exponent> {}; template concept Torque = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/voltage.h b/src/systems/isq/include/units/isq/dimensions/voltage.h index fd0ba06b..187d5808 100644 --- a/src/systems/isq/include/units/isq/dimensions/voltage.h +++ b/src/systems/isq/include/units/isq/dimensions/voltage.h @@ -28,8 +28,11 @@ namespace units::isq { +template +struct dim_voltage; + template P, DimensionOfT C> -struct dim_voltage : derived_dimension, exponent> {}; +struct dim_voltage : derived_dimension, exponent> {}; template concept Voltage = QuantityOfT; diff --git a/src/systems/isq/include/units/isq/dimensions/volume.h b/src/systems/isq/include/units/isq/dimensions/volume.h index 0972a00f..e8c3149d 100644 --- a/src/systems/isq/include/units/isq/dimensions/volume.h +++ b/src/systems/isq/include/units/isq/dimensions/volume.h @@ -27,8 +27,11 @@ namespace units::isq { +template +struct dim_volume; + template L> -struct dim_volume : derived_dimension> {}; +struct dim_volume : derived_dimension> {}; template concept Volume = QuantityOfT; From 85403895304f30cd5a6e0e994a1e4810b52aa799 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 19:36:07 +0200 Subject: [PATCH 41/59] fix: `op%` fixed for the same argument types case --- src/core/include/units/quantity.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index c40b9992..03140500 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -367,11 +367,12 @@ public: } [[nodiscard]] friend constexpr Quantity auto operator%(const quantity& lhs, const quantity& rhs) - requires (!floating_point_) && is_same_v && + requires (!floating_point_) && invoke_result_convertible_to_, rep, rep> { gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); - return units::quantity(lhs.number() % rhs.number()); + using ret = quantity, rep, rep>>; + return ret(lhs.number() % rhs.number()); } [[nodiscard]] friend constexpr auto operator<=>(const quantity& lhs, const quantity& rhs) From b00cff8ec8b8c80eee3ffcc7d422859e65121d59 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 19:38:14 +0200 Subject: [PATCH 42/59] refactor: `quantity_point` construction now relays only on a construction of a `quantity_type` Relates to #221 --- src/core/include/units/quantity_point.h | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/core/include/units/quantity_point.h b/src/core/include/units/quantity_point.h index 93c38615..cbb5e2a7 100644 --- a/src/core/include/units/quantity_point.h +++ b/src/core/include/units/quantity_point.h @@ -59,16 +59,9 @@ public: quantity_point(const quantity_point&) = default; quantity_point(quantity_point&&) = default; - template - requires std::same_as && - safe_convertible_to_, rep> && - std::constructible_from - constexpr explicit quantity_point(Value&& v) : q_(std::forward(v)) {} - - template - requires (Quantity> || QuantityLike>) && - std::constructible_from - constexpr explicit quantity_point(Q&& q) : q_(std::forward(q)) {} + template + requires std::constructible_from + constexpr explicit quantity_point(T&& t) : q_(std::forward(t)) {} template requires std::convertible_to From c95e20c7ea90a5c53d5ba423c2a9420f66548348 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 19:39:50 +0200 Subject: [PATCH 43/59] refactor: `quantity_kind` constructors merged into one Relates to #221 --- src/core/include/units/quantity_kind.h | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/core/include/units/quantity_kind.h b/src/core/include/units/quantity_kind.h index 80a0c90a..ccb4c1b6 100644 --- a/src/core/include/units/quantity_kind.h +++ b/src/core/include/units/quantity_kind.h @@ -93,16 +93,13 @@ public: quantity_kind(const quantity_kind&) = default; quantity_kind(quantity_kind&&) = default; - template - requires std::same_as && - safe_convertible_to_, rep> && - std::constructible_from - constexpr explicit quantity_kind(Value&& v) : q_(std::forward(v)) {} - - template - requires (Quantity> || QuantityLike>) && - std::constructible_from - constexpr explicit quantity_kind(Q&& q) : q_(std::forward(q)) {} + template + requires + (Quantity> || + QuantityLike> || + (Dimensionless && !Quantity>)) && + std::constructible_from + constexpr explicit quantity_kind(T&& t) : q_(std::forward(t)) {} template QK2> requires std::convertible_to From 01745726454b375824caa891094eecf27663462c Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 19:40:58 +0200 Subject: [PATCH 44/59] refactor: merged `op%` of `quantity_kind` into one Relates to #221 --- src/core/include/units/quantity_kind.h | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/core/include/units/quantity_kind.h b/src/core/include/units/quantity_kind.h index ccb4c1b6..50c3f785 100644 --- a/src/core/include/units/quantity_kind.h +++ b/src/core/include/units/quantity_kind.h @@ -228,22 +228,17 @@ public: q_ %= rhs; return *this; } - template - constexpr quantity_kind& operator%=(const quantity_kind, units::one, Rep2>& rhs) - requires requires(quantity_type q) { q %= rhs.common(); } + + template + constexpr quantity_kind& operator%=(const QK& rhs) + requires (QuantityKindEquivalentTo || std::same_as>) && + requires(quantity_type q) { q %= rhs.common(); } { + gsl_ExpectsAudit(rhs.common().number() != quantity_values::zero()); q_ %= rhs.common(); return *this; } - constexpr quantity_kind& operator%=(const quantity_kind& qk) - requires requires(quantity_type q) { q %= qk.common(); } - { - gsl_ExpectsAudit(qk.common().number() != quantity_values::zero()); - q_ %= qk.common(); - return *this; - } - // Hidden Friends // Below friend functions are to be found via argument-dependent lookup only template From ae7aca5fa0b02eb2d305978ef779cb9becd93708 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 20:12:46 +0200 Subject: [PATCH 45/59] test: uncommented some already supported cases Resolves #206 --- test/unit_test/static/si_cgs_test.cpp | 12 ++++++------ test/unit_test/static/si_fps_test.cpp | 14 +++++++------- test/unit_test/static/si_test.cpp | 8 +++++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/test/unit_test/static/si_cgs_test.cpp b/test/unit_test/static/si_cgs_test.cpp index 9907e480..81a67faa 100644 --- a/test/unit_test/static/si_cgs_test.cpp +++ b/test/unit_test/static/si_cgs_test.cpp @@ -107,8 +107,8 @@ namespace cgs_test { // addition -// static_assert(100_q_cm + si::length(1) == si::length(2)); // should not compile (different dimensions) -// static_assert(si::length(1) + 100_q_cm == si::length(2)); // should not compile (different dimensions) +static_assert(100_q_cm + si::length(1) == si::length(2)); +static_assert(si::length(1) + 100_q_cm == si::length(2)); static_assert(quantity_cast>(100_q_cm) + si::length(1) == si::length(2)); static_assert(si::length(1) + quantity_cast>(100_q_cm) == si::length(2)); static_assert(100_q_cm + quantity_cast>(si::length(1)) == 200_q_cm); @@ -116,8 +116,8 @@ static_assert(quantity_cast>(si::length(1) == si::length(4)); // should not compile (different dimensions) -// static_assert(si::length(5) - 100_q_cm == si::length(4)); // should not compile (different dimensions) +static_assert(500_q_cm - si::length(1) == si::length(4)); +static_assert(si::length(5) - 100_q_cm == si::length(4)); static_assert(quantity_cast>(500_q_cm) - si::length(1) == si::length(4)); static_assert(si::length(5) - quantity_cast>(100_q_cm) == si::length(4)); static_assert(500_q_cm - quantity_cast>(si::length(1)) == 400_q_cm); @@ -125,7 +125,7 @@ static_assert(quantity_cast>(si::length(2) == si::area(4)); // should not compile (unknown dimension) +// static_assert(200_q_cm * si::length(2) == si::area(4)); // TODO Add support for comparing of an unknown_dimension static_assert(quantity_cast(200._q_cm) * si::length(2) == si::area(4)); static_assert(200._q_cm * quantity_cast(si::length(2)) == 40'000_q_cm2); @@ -138,7 +138,7 @@ static_assert(200._q_cm * quantity_cast(si::length(4) / 200_q_cm == si::length(2)); // should not compile (unknown dimension) +// static_assert(si::area(4) / 200_q_cm == si::length(2)); // TODO Add support for comparing of an unknown_dimension static_assert(si::area(4) / quantity_cast>(200_q_cm) == si::length(2)); static_assert(quantity_cast>(si::area(4)) / 200._q_cm == 200_q_cm); diff --git a/test/unit_test/static/si_fps_test.cpp b/test/unit_test/static/si_fps_test.cpp index 2af500c6..27fd6dc7 100644 --- a/test/unit_test/static/si_fps_test.cpp +++ b/test/unit_test/static/si_fps_test.cpp @@ -124,8 +124,8 @@ using namespace units::isq::si::fps::references; // addition -// static_assert(si::length(1) + 1 * ft == si::length(1.3048)); // should not compile (different dimensions) -// static_assert(1 * ft / 0.3048 + si::length(1) == si::length(1.3048)); // should not compile (different dimensions) +static_assert(si::length(1) + 1 * ft == si::length(1.3048)); +static_assert(1 * ft + si::length(1) == si::length(1.3048)); static_assert(quantity_cast>(1. * ft / 0.3048) + si::length(1) == si::length(2)); // 1 m in ft + 1 m static_assert(si::length(1) + quantity_cast>(1. * ft / 0.3048) == si::length(2)); // 1 m + 1 m in ft static_assert(1 * ft + quantity_cast>(si::length(0.3048)) == 2 * ft); // 1 ft + 1 ft in m @@ -133,8 +133,8 @@ static_assert(quantity_cast>(si::length(1) == -si::length(0.6952)); // should not compile (different dimensions) -// static_assert(si::length(1) - 1 * ft == si::length(0.6952)); // should not compile (different dimensions) +static_assert(1 * ft - si::length(1) == -si::length(0.6952)); +static_assert(si::length(1) - 1 * ft == si::length(0.6952)); static_assert(quantity_cast>(6. * ft) - si::length(1) > si::length(0.8287) && quantity_cast>(6. * ft) - si::length(1) < si::length(0.8289)); // 6 ft in m - 1 m = ... m static_assert(si::length(5) - quantity_cast>(6 * ft) == si::length(3.1712)); // 5 m - 6 ft in m = ... @@ -143,14 +143,14 @@ static_assert(quantity_cast>(si::length(2) == si::area(1.2192)); // should not compile (unknown dimension) -// static_assert(quantity_cast>(2. * ft) * si::length(2) == si::area(1.2192)); +// static_assert(2 * ft * si::length(2) == si::area(1.2192)); // TODO Add support for comparing of an unknown_dimension +static_assert(quantity_cast>(2. * ft) * si::length(2) == si::area(1.2192)); static_assert(quantity_cast>(2. * ft) * si::length(0.6096) == si::area(0.371612160)); // 2 ft * 2 ft == 4 sq ft static_assert(2. * ft * quantity_cast>(si::length(0.6096)) == 4._q_ft2); // division -// static_assert(si::area(4) / 200_q_cm == si::length(2)); // should not compile (unknown dimension) +// static_assert(si::area(4) / 200_q_cm == si::length(2)); // TODO Add support for comparing of an unknown_dimension static_assert(si::area(1.48644864) / quantity_cast>(4 * ft) == si::length(1.2192)); // 16 ft2 / 4 ft = 4 ft static_assert(quantity_cast>(si::area(1.48644864)) / (4. * ft) == 4. * ft); // 16 ft2 / 4 ft = 4 ft diff --git a/test/unit_test/static/si_test.cpp b/test/unit_test/static/si_test.cpp index 29b27fa7..bc7e16fb 100644 --- a/test/unit_test/static/si_test.cpp +++ b/test/unit_test/static/si_test.cpp @@ -246,17 +246,17 @@ static_assert(kilogray::symbol == "kGy"); static_assert(10_q_m / 5_q_s == 2_q_m_per_s); static_assert(10 / 5_q_s * 1_q_m == 2_q_m_per_s); static_assert(1_q_km / 1_q_s == 1000_q_m_per_s); -// static_assert(1_q_km / 1_q_h == 1_q_km_per_h); // should not compile +static_assert(1_q_km / 1_q_h == 1_q_km_per_h); static_assert(1.0_q_km / 1_q_h == 1_q_km_per_h); static_assert(1000.0_q_m / 3600.0_q_s == 1_q_km_per_h); static_assert(2_q_km_per_h * 2_q_h == 4_q_km); -// static_assert(2_q_km_per_h * 15_q_min == 500_q_m); // should not compile +static_assert(2_q_km_per_h * 15_q_min == 500_q_m); static_assert(2_q_km_per_h * 15.0_q_min == 500_q_m); static_assert(2.0_q_km_per_h * 15_q_min == 500_q_m); static_assert(2_q_km / 2_q_km_per_h == 1_q_h); -// static_assert(2000_q_m / 2_q_km_per_h == 1_q_h); // should not compile +static_assert(2000_q_m / 2_q_km_per_h == 1_q_h); static_assert(quantity_cast(2000_q_m) / 2_q_km_per_h == 1_q_h); static_assert(detail::unit_text() == "m/s"); @@ -382,6 +382,8 @@ static_assert(1_q_J_per_mol * 1_q_mol_per_m3 * 1_q_m3 == 1_q_N * 1_q_m); static_assert(detail::unit_text() == "J/mol"); // angular velocity + static_assert(1_q_rad / 1_q_s == 1_q_rad_per_s); static_assert(detail::unit_text() == basic_symbol_text("ω", "w")); + } // namespace From e0009bdb0d3715145a64e495d7924f7029c6be89 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 20:46:57 +0200 Subject: [PATCH 46/59] docs: mp-units 0.7.0 is here :-) --- docs/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b27e605c..a701abbe 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,6 @@ # Release notes -- **0.7.0 WIP** +- **0.7.0 May 11, 2021** - (!) refactor: `ScalableNumber` renamed to `Representation` - (!) refactor: output stream operators moved to the `units/quantity_io.h` header file - (!) refactor: Refactored the library file tree From 43825a531fa91501277161fefd94c50a3cf0ea96 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 11 May 2021 23:07:03 +0200 Subject: [PATCH 47/59] chore: project version moved to 0.8.0 --- README.md | 4 ++-- docs/CHANGELOG.md | 4 ++++ docs/usage.rst | 6 +++--- src/CMakeLists.txt | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d9443a3f..4899d9d7 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![Conan CI](https://img.shields.io/github/workflow/status/mpusz/units/Conan%20CI/master?label=Conan%20CI)](https://github.com/mpusz/units/actions?query=workflow%3A%22Conan%20CI%22+branch%3Amaster) [![CMake CI](https://img.shields.io/github/workflow/status/mpusz/units/CMake%20Test%20Package%20CI/master?label=CMake%20CI)](https://github.com/mpusz/units/actions?query=workflow%3A%22CMake+Test+Package+CI%22+branch%3Amaster) [![GitHub Workflow Documentation](https://img.shields.io/github/workflow/status/mpusz/units/Documentation/master?label=Documentation%20CI)](https://github.com/mpusz/units/actions?query=workflow%3ADocumentation+branch%3Amaster) -[![Conan stable](https://img.shields.io/badge/ConanCenter-0.6.0%3Astable-blue)](https://conan.io/center/mp-units) -[![Conan testing](https://img.shields.io/badge/mpusz.jfrog.io-0.7.0%3Atesting-blue)](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units/0.7.0) +[![Conan stable](https://img.shields.io/badge/ConanCenter-0.7.0%3Astable-blue)](https://conan.io/center/mp-units) +[![Conan testing](https://img.shields.io/badge/mpusz.jfrog.io-0.8.0%3Atesting-blue)](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units/0.8.0) # `mp-units` - A Units Library for C++ diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a701abbe..c24ee230 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,8 @@ # Release notes +- **0.8.0 WIP** + + - **0.7.0 May 11, 2021** - (!) refactor: `ScalableNumber` renamed to `Representation` - (!) refactor: output stream operators moved to the `units/quantity_io.h` header file @@ -46,6 +49,7 @@ - build: Conan generator switched to `cmake_find_package_multi` - build: Conan CMakeToolchain support added - build: CMake scripts cleanup + - build: ccache support added - ci: CI switched from Travis CI to GitHub Actions - **0.6.0 September 13, 2020** diff --git a/docs/usage.rst b/docs/usage.rst index a3f2a2fe..c753f22f 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -247,7 +247,7 @@ library release the following steps may be performed: :caption: conanfile.txt [requires] - mp-units/0.6.0 + mp-units/0.7.0 [generators] CMakeToolchain @@ -313,7 +313,7 @@ differences: :caption: conanfile.txt [requires] - mp-units/0.7.0@mpusz/testing + mp-units/0.8.0@mpusz/testing [generators] CMakeToolchain @@ -401,4 +401,4 @@ Uploading **mp-units** Package to the Conan Server .. code-block:: shell - conan upload -r --all mp-units/0.7.0@/ + conan upload -r --all mp-units/0.8.0@/ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5a1fd389..fdc84cb4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,7 +22,7 @@ cmake_minimum_required(VERSION 3.15) project(mp-units - VERSION 0.7.0 + VERSION 0.8.0 LANGUAGES CXX ) From 4a9425d6703bd89276eb296b4ddf9e9b866e2a03 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 6 Jun 2021 18:56:46 +0200 Subject: [PATCH 48/59] build: Replace `file(REAL_PATH ...)` with an alternative working with an older CMake versions Resolves #282 --- cmake/documentation.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/documentation.cmake b/cmake/documentation.cmake index a886ca35..9213c9e6 100644 --- a/cmake/documentation.cmake +++ b/cmake/documentation.cmake @@ -49,7 +49,7 @@ function(add_documentation targetName) if(NOT _args_DOXYFILE_TEMPLATE) set(_args_DOXYFILE_TEMPLATE Doxyfile.in) endif() - file(REAL_PATH ${_args_DOXYFILE_TEMPLATE} _doxyfileIn) + get_filename_component(_doxyfileIn ${_args_DOXYFILE_TEMPLATE} REALPATH) if(NOT EXISTS ${_doxyfileIn}) message(FATAL_ERROR "'${_args_DOXYFILE_TEMPLATE}' does not exist") endif() From 65934130812a6a37a431ed2485a74727247b4cb7 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 8 Jun 2021 17:58:49 +0200 Subject: [PATCH 49/59] build: `CCACHE_BASEDIR` is no longer set by default --- cmake/ccache.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmake/ccache.cmake b/cmake/ccache.cmake index 513b36a3..c2b5c96c 100644 --- a/cmake/ccache.cmake +++ b/cmake/ccache.cmake @@ -33,7 +33,7 @@ endmacro() # enable_ccache([PROGRAM] # ccache by default # [QUIET] [REQUIRED] # [MODE DIRECT_PREPROCESSOR|DIRECT_DEPEND|PREPROCESSOR|DEPEND] # DIRECT_PREPROCESSOR by default -# [BASE_DIR dir] # ${CMAKE_SOURCE_DIR} by default +# [BASE_DIR dir] # [ACCOUNT_FOR_COMPILE_TIME_HEADER_CHANGES] # [ACCOUNT_FOR_PCH] # [ACCOUNT_FOR_MODULES] @@ -154,8 +154,6 @@ function(enable_ccache) message(FATAL_ERROR "Base directory '${_enable_ccache_BASE_DIR}' does not exist") endif() list(APPEND _ccacheEnv "CCACHE_BASEDIR=${_enable_ccache_BASE_DIR}") - else() - list(APPEND _ccacheEnv "CCACHE_BASEDIR=${CMAKE_SOURCE_DIR}") endif() if(_enable_ccache_PREFIXES) From 991bb2b6ebe06c9d7bd513eedb2f7b601d1f16f3 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 8 Jun 2021 18:00:53 +0200 Subject: [PATCH 50/59] build: `PROJECT_SOURCE_DIR` explicitly set as the `CCACHE_BASEDIR` --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 63792cf5..1ccd73e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ ensure_entry_point() # use ccache if available include(ccache) -enable_ccache() +enable_ccache(BASE_DIR ${PROJECT_SOURCE_DIR}) # set restrictive compilation warnings include(warnings) From b35b0bb61adfcbc4d91a910496c06259bd344a7f Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 25 Jun 2021 08:44:53 +0200 Subject: [PATCH 51/59] docs: Doxygen updated to 1.9.1 --- conanfile.py | 2 +- docs/CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.py b/conanfile.py index a80b2283..33c6d669 100644 --- a/conanfile.py +++ b/conanfile.py @@ -77,7 +77,7 @@ class UnitsConan(ConanFile): self.build_requires("catch2/2.13.4") self.build_requires("linear_algebra/0.7.0@conan-oss/stable") if self.options.build_docs: - self.build_requires("doxygen/1.8.20") + self.build_requires("doxygen/1.9.1") def validate(self): compiler = self.settings.compiler diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c24ee230..0cefc9de 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,7 +1,7 @@ # Release notes - **0.8.0 WIP** - + - build: doxygen updated to 1.9.1 - **0.7.0 May 11, 2021** - (!) refactor: `ScalableNumber` renamed to `Representation` From ae752da50ee5547ba693821759008cd5035e5cbf Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 29 Jun 2021 19:20:10 +0200 Subject: [PATCH 52/59] build: linear_algebra updated to 0.7.1 --- conanfile.py | 2 +- docs/CHANGELOG.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 33c6d669..e3f2cbd8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -75,7 +75,7 @@ class UnitsConan(ConanFile): def build_requirements(self): if self._run_tests: self.build_requires("catch2/2.13.4") - self.build_requires("linear_algebra/0.7.0@conan-oss/stable") + self.build_requires("linear_algebra/0.7.1@conan-oss/stable") if self.options.build_docs: self.build_requires("doxygen/1.9.1") diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0cefc9de..dd533d76 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,7 @@ - **0.8.0 WIP** - build: doxygen updated to 1.9.1 + - build: linear_algebra updated to 0.7.1 - **0.7.0 May 11, 2021** - (!) refactor: `ScalableNumber` renamed to `Representation` From 95ac869522496d0c9e4689f3066ae146187f5253 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 27 Jun 2021 11:31:54 +0200 Subject: [PATCH 53/59] extended is_quantity to support quantity-derived classes N.B. inheritance is preferred to composition/delegate class to avoid duplication and also inherent the various required operators ('+','-',..., '+=', ...) for details see discussion #271 --- src/core/include/units/bits/basic_concepts.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index 4ec56115..94425df1 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -269,7 +269,7 @@ concept Reference = detail::is_reference; namespace detail { template -inline constexpr bool is_quantity = false; +inline constexpr bool is_quantity = requires { typename T::dimension; typename T::unit; typename T::rep;}; template inline constexpr bool is_quantity_point = false; From 8e1539bf2257b66693baef79b8d67da132a7539c Mon Sep 17 00:00:00 2001 From: "Ralph J. Steinhagen" Date: Sun, 27 Jun 2021 13:42:55 +0200 Subject: [PATCH 54/59] added inheritance unit-test and made is_quantity more specific --- src/core/include/units/bits/basic_concepts.h | 2 +- src/core/include/units/quantity.h | 11 +++++++++++ test/unit_test/static/quantity_test.cpp | 12 ++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index 94425df1..4ec56115 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -269,7 +269,7 @@ concept Reference = detail::is_reference; namespace detail { template -inline constexpr bool is_quantity = requires { typename T::dimension; typename T::unit; typename T::rep;}; +inline constexpr bool is_quantity = false; template inline constexpr bool is_quantity_point = false; diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 03140500..7956cd11 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -460,6 +460,17 @@ namespace detail { template inline constexpr bool is_quantity> = true; +template +requires units::is_derived_from_specialization_of && + requires { + typename T::dimension; + typename T::unit; + typename T::rep; + requires Dimension; + requires Unit; + requires Representation; } +inline constexpr bool is_quantity = true; + } // namespace detail } // namespace units diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index de56d789..c0b458f6 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -234,6 +234,18 @@ static_assert(length(2_q_km).number() == 2); static_assert(length(2_q_km).number() == 2000); static_assert(length(1500_q_m).number() == 1.5); +/////////////////////////////////////// +// derived quantities +/////////////////////////////////////// + +template +struct derived_quantity : quantity { + using dimension = typename Q::dimension; + using unit = typename Q::unit; + using rep = Rep; +}; + +static_assert(units::detail::is_quantity, "NTTP type description">>); ///////// // CTAD From 7ed29807a65d0bb7e6ef0334758620748188073f Mon Sep 17 00:00:00 2001 From: "Ralph J. Steinhagen" Date: Tue, 29 Jun 2021 17:33:17 +0200 Subject: [PATCH 55/59] removed superfluous `requires` statement in is_quantity --- src/core/include/units/quantity.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 7956cd11..da3825a1 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -461,14 +461,7 @@ template inline constexpr bool is_quantity> = true; template -requires units::is_derived_from_specialization_of && - requires { - typename T::dimension; - typename T::unit; - typename T::rep; - requires Dimension; - requires Unit; - requires Representation; } +requires units::is_derived_from_specialization_of inline constexpr bool is_quantity = true; } // namespace detail From 80eefec97c064202f7d17a2ae6ef9fec55fb8110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Sun, 27 Jun 2021 18:35:21 -0400 Subject: [PATCH 56/59] fix: add quantity_point::origin, like std::chrono::time_point::clock --- .clang-format | 4 +- docs/_static/img/concepts.png | Bin 169347 -> 137511 bytes docs/framework/basic_concepts.rst | 10 +- docs/framework/dimensions.rst | 14 +- docs/framework/quantity_points.rst | 21 ++- docs/use_cases/interoperability.rst | 5 +- .../glide_computer/include/glide_computer.h | 3 +- src/core/include/units/bits/basic_concepts.h | 57 +++++- src/core/include/units/bits/common_quantity.h | 5 +- src/core/include/units/bits/equivalent.h | 31 +++- src/core/include/units/bits/quantity_of.h | 13 +- src/core/include/units/chrono.h | 15 +- src/core/include/units/customization_points.h | 2 +- src/core/include/units/kind.h | 18 +- src/core/include/units/point_origin.h | 34 ++++ src/core/include/units/quantity_cast.h | 23 ++- src/core/include/units/quantity_point.h | 52 ++++-- src/core/include/units/quantity_point_kind.h | 18 +- test/unit_test/static/CMakeLists.txt | 1 + test/unit_test/static/chrono_test.cpp | 41 ++-- test/unit_test/static/concepts_test.cpp | 11 +- test/unit_test/static/kind_test.cpp | 3 +- test/unit_test/static/point_origin_test.cpp | 73 ++++++++ test/unit_test/static/quantity_kind_test.cpp | 30 +-- .../static/quantity_point_kind_test.cpp | 91 +++++++-- test/unit_test/static/quantity_point_test.cpp | 175 +++++++++++------- 26 files changed, 542 insertions(+), 208 deletions(-) create mode 100644 src/core/include/units/point_origin.h create mode 100644 test/unit_test/static/point_origin_test.cpp diff --git a/.clang-format b/.clang-format index 7abab467..756b6fdc 100644 --- a/.clang-format +++ b/.clang-format @@ -63,7 +63,7 @@ CommentPragmas: '^ NOLINT' # CompactNamespaces: false # ConstructorInitializerAllOnOneLineOrOnePerLine: true # ConstructorInitializerIndentWidth: 4 -# ContinuationIndentWidth: 4 +ContinuationIndentWidth: 2 # Cpp11BracedListStyle: true DeriveLineEnding: false DerivePointerAlignment: false @@ -109,7 +109,7 @@ IndentRequires: true # KeepEmptyLinesAtTheStartOfBlocks: false # MacroBlockBegin: '' # MacroBlockEnd: '' -# MaxEmptyLinesToKeep: 1 +MaxEmptyLinesToKeep: 2 # NamespaceIndentation: None # ObjCBinPackProtocolList: Never # ObjCBlockIndentWidth: 2 diff --git a/docs/_static/img/concepts.png b/docs/_static/img/concepts.png index 376773106cfa464856bbc22f9f33227dc19493cb..e8083e027574b9a73406a6636ad7241f23292e04 100644 GIT binary patch literal 137511 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⋐@1bx|3o5pa06|~T)Ls`@H`hofvp!oz) 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 literal 169347 zcmeAS@N?(olHy`uVBq!ia0y~yU~6PxVCCmvV_;yYobD;Zz@Wh3>Eakt5%=aUXGQ4M zz5hOzzvba!>Uw0eK&6mFMa5EP;v%u-QMd19eGOXm@9L_rSzDvhMY=@-MXp@S%D%mN z`?haoyY6kva^K2)ZFLx*IwxmBA@jN9LN@`AZ@=ubk2~{Ap4j4lZo>OYIl12x_SV1N zZufc%|Bte@sYlouSp*yya1je0u=pH2+rg>Wz`(?zfQ#r5=+I}xBd-w9z|`Wvx?_b8 zCoYRXE>K{3WR1%Tu-zgH7!(5-^|XSWK+18snxpXtA6Pjqf>pzTBc!4G)D%1(XJB+v z*vE|9%L)w+j9datq7N1ssp1R327!+E_=0XUXmG_62Q7m}L7qiRTicySIxHx;NAp~J z-RG6Z6*4MU@2iUpw)^U{9y#I#_A)32d|4Laf|TeQ^H|ibhQ=o^ecgC!LBqw(*VyK- zTOa?egw1`S335hwvVlP{fKQ)qEm8&w=wRBqb!)QiOIaF!?YjBj>UCdT z?UC&@FkotNV19f?16lCH!~;t_O)uvN{1KhND45}O&D>XJ!bAxcwk{^6l{sprnTdzn%joO-UrSsB@Mg9RWfPn}Ib7Ife+S#Y1xX#wNY zGy|lhUgX^%pt1d0a~`rS6^#|SS1&di_HUX0LREb3V%zU`_C9z%e2_ASe<&wW2vY204_;F)!RaMX|9_pc_} z|6TjH;0=q^3f2S}WETZA2xzd2w@yQLQ3|8ef-`IM6a&&?R(2tBqJtf`0MpaYuP$06 zxuR0Tfn&-{S7nw{J=&pyi1Ot`I-}EqnmF4kcSI6U;AiD%G}@fe;xMytsTPtUKXn{9 zrkr2x{vIg|pDbih3`i5}70@tV7vhR!$b43g#!r=BU&tcjuhB+Cf#uYhMS@JJ$EL1A zHe@q{Vu0OxxxLDWLUKYoQ;WmQNE4?8XLbaMA{kO6roeLQ`PIecNa6Dd6h6k?ZX8o2 z!&fOG8FHSf#o_0ksxN&=;UmW-z?7PHk)zS*u~#UvA(0IN8uP>Z?;(eeGboUCq(%do zk>yiBf`Zcm-q+?YmPNn2B3vK8D6`%FVygK3)eD{5OICkf&Hit}`?~*eywYYq+|SQn zYGj{M{@c%AzT*Gi(pk3O({$rM_MEdxZu6U2cqnZBzF)Vbqvm8>Sl(ytrF!(Jt?urp zmQD-eCVyl?N^z|E4jdsLyw9*8M~QA@BS&Lg-OJFkvo<@d-}9?#d82o_((LG{FK?~i zUwr@nhxpW~y;r{$ue&nC(Aur-`=8JHFJIj>e>p$<{*|xA>#sbi$c?DJ{Os(ntLy(S zsILFyUHfv4{);1z`(Iz4(c(~>^ccC?txU5wgfJe)i@7>;9Xb=I3^MB_Dq$dd-i2jo6v} zZl$Kezf9B=1LohTKx#HLHi;>)XuWuvT7;Z6<{fZoaafsr_ZGX}?Moi_S6;qZm^*Wl z4{KQUn|-UFou9kX_WP~9{?39-UpsrJBNq=Dj7|%h;^NfWk&^y9&J-&aFZ*k`HBbM| zGJnq1D`UARy5owU?Dqu!a{kijE$sYDm{#w)rFC}SucTfH!#(Wzr8O-AEBtfzv>+Md z$SuGm`sI_6B~tDw@>jU5c)|MpzU7wJ@2(Q{w_ogE`^lsB=^x|JpqM+lNBHY&=GT4N z9A9d&?(E(d?>K)wdt0tq>N96+ShrktQ2md`@n3uPM;&hCyQ<#zZ-<}dPnKRO%T0$P z^7nt9mv%mK!PI|JwLkA%K3rX2_pAGN>G}S;iw|!;dZcu>=5da%M7_gy+vWBS99OjU zF%5LKOVZ>t-Aev>x+E< zRe#?tymrmu{_fXtcmF?dwtC7vKX}bLulqaR{;v8t^}6*G+h;Ehmp+_+{>p|#=k32D ztNh>Ho8SCR|FZA)J1f=y?OWp9yJ^$LU3KTCN*Sjee|PKNtLH5admlYYL<%mpRtCij z3nJ3gI+4Ql9Y=~4OVykI^DdQs&gWKt!!&)@EY7=rb#HHN|FU%__tvVfpRFElKK^P? zv0r%LMDcyw6aTj9HlD5f{ciE}xH?~U|5+<8`&oMaez&{)#~J5-olCOi{}le5zaCrN z`e?FRo@v^u<=?*l`;+`sE7mf5UmKt1#XptdtM}yG&#Qj>3Y4o}y?S-Z_IA~dskV0{ zdbb?23y;YWxBGf!Q(tGq{PaWJNP(yzFqJ_uAY{@NM?`2dG|GX~m+b3p=kHa&YTFr} zwf%0{%WdmJBsM1=W{WMlX!+2vXyy6r^?Mg)KhwFwt-nv^-?f$M^H&7#D`@ia_S$Ci z`Caw<*V)Blr>?%t`5p*y?#uK2nFrUFziQ|zoMm3V%bsNhtXGk_#4xF{;%0r z^6X@E-Mo9jzx0&L*I$UW|FQDj@2B}s`zG#wa%gjCP|&U1^)q=IU%gtDG_PdG)bbrE z{1dlC`%7`<2;^r(T>F@_d)}Ti#>nA0!I05uLC?h?2}D)L$iimD;&p$k@!uuqU(DI; zH_`C+zij_sbM5E8mGgRgt&lM=-F@#)%U!Wfo73(uxqd%l^=W;(@Z)t!x2COJE^j)0 z-)W7%Gjzn^2 zn`sY95KZJ3U~={IazqZx8`B)r%9)nFzcsV+=1;3%8s$wlx7okGw)XlS>HOeY=grGx z?OdnF)~svelNH)GWnc92PYeEZtliqzO%#r+^f!)edigR6aCpdDkEPd>()4>gN1Q_Sg4G-uwRf=;dYkmCIKzzH>|b?^Wjd3+4Ok*MGZF8-8}a zb#V2&t-q(a2U&OCdT->_>a4s?dY$z1*rgkjzrWgcJ=gYvE610no}Jb7|-F>Nl z^6J%VFTGix14S1_bdPU7KK=t>?^82JG;2mtxx7+?)uwR3%UhX#GCG}x%q-I zdC%@doO)N&1MFI*eT}~6FkP@g!hr^n6ztTLX=OK1=yDQ#bqO`(>JlHfjR{lccBu z%P9^0qsXls{l+h0vnRiAidyV>P<6Hg3&t*S{25yU=-+uqjrA7JoEBo*4 zb=dvRNX_O}?){C`<&o##e%kr+n)OpBnez4v*VE%y?V80IZTtVQ{Qc$g|GWvmeJ65D z&QGt{!moQi?46xIXD#Pr{u@EcUyZk)Rvsz0KR;<&BpzSmy8r*-`Cosxi)DU(=KFB-{C`&h zt^VIJ-gb+1O5L8A-^uqb)yBN|a`yK7S0&p6UZuZ%uMxHNm*v@6waF1_|Msj7joX&L z|D>@bQ|{uO4wK&3MM~b6*nMgXTU~e8-($y)J^y8^$%Wh(ci7Lu(fI4=@zY3t5t-)@ zd-uqBiRAq%s~@u$l?Apqyz859y|21o?&szERd;snwtw-c``pDBvTnIw&)t5%XZg)y zv5ckrmmN0DU&+39>#o=A_E&57|H*B?>$G-lJR3pPU__~a}8^MXGeWeoN!y@+V(iRPd9ZUI}Hx!xUXCdtq;01y{F`ogNd{& z$CF<%`|I}BeR=%eb%l~2zxAVXM5RtXLkGomy%>HGE z0}J1^A~*40s@J+bpHq5jnn3#9U0-LFKh9m1p8>A3_2-$@o|ed-SL?WW-Coc9eLufV zyPy5vC;#kX{>G}?j_c?BzwlPhXp;PiHAanJZIchny72PyuK%)1h##q!*WfUnsl}nj zQUK8)&oQFF8A>wd&!~ z>877IeJ=eH*q&Q??5?Rv_Bp1#pI*J*Rd(&D)td_^qwAji^1f#NdY=4Wr}Jx~7Ee^( zc3E_KU1Ts{=hvA#J`0@KqkL2LSB#0Zew{-3_X(!^*8F|(Pw~9|y&JFWx8~e@eKWH& z5IGn7GdeB!6Jx#$xlMY2_0=miIqjR;JtZM(Z2d+or(EiH#%=DN>);ZHE6 ze`VgZhdoRjoED_i z1}|N0vvS+7oYyafB75II^~jHU`T6Tt-};$Gsek(9>oSf>28X2e$f~dO341sH-Sr!B z*Lr__+@30W&oL!6eCO{DoAaN|^LYL|d-kk;?r!m~E3P;rT80YktQ?I+6@?kRh}KPG zqsWTYvjcK_%tIUbrcUIpt@@z<^|#RX5<6|D1^?ETl`BqIZCCl}N#Jbr`~vG{y{Ttb z#P$5R z%@S#|Q?9<+_WO3r=?0}=0!&}|H>oQIWVPJ7b<68~_TG@N^zRiRtEaEI_~qBHW&6MX znAFxpxYaB2!aqlh?f8 zD)v*l`9OYF)~^NjODn~Z+>*mBz?53eDj|;~#wgHnl<(HvTbDGCu>_|cUVK-L|G^I%*tfGd;MQKC_*RRYjIdP@s6$k-d*}9UPNZU{qpPAvy}h4{$9T=tnPPb^NJI) zy6LBTtfS6Vj|>Z-zD5znW7_@}t~Lxp9w&HWh%cx#GQ-b$a zHwvs+p0l@loxS1&>6PZ+StD<{)Yg7Jxc9Zet>xKSS>H_6G>nf;YdwDY=GroWw*qf7 z_OAOjrzdlF{fP+s3D2wNeVwk8`AL;^@492$NL9?2zy^U8{RMm45aqbTHkPdH>~b@; z896xyp=vg_-UfIE{<~SXbfRxWwoqeE((kwBUOG`*RvbNR9u{4@zo+m0%R6hoJpT1- z+2zag)mdJxjC()tbw0-wskO_$v(8koNb-EV$#w7RqJ(*UN7bfyx~6j7`B;?qe8RDt zA3Amxum`?>x36p8)2nWum~Vz2le&N6S0m@2U%#HNUL@bug>Y(ftiq}N8hmBm&-#(v z>c*0lm8I3?YjBj+?%Iu&o229)I^=~r9eVrbL(GfhCYRd3o0eOzmS4Sgp8n$1)fV5> zgm0YJ&&;V?@b`0zgRRJ$r^$h>4l5IP@6|u?qA6w5%X4wtX1+as_MotO7)xA$*p9o- zpHB5`eVlS=Zmyn!)V!l?YkO)UAA6Tgo%*%+y-A$?WzjineMLmKst9$8t}hL*4|;p# z@|um`%f83_C|=Ay>EtruT~*TrR=9WVt!;IJ=Z~*|zW%N2i_4zU?S-qObV)8PA7$iyrBm z%UaCcap#?)^5;N{kSF=~a{ey$p1yC+(R~t9@SLT<4k|1Y1TzqYWx@xJBacHL=X6_I z7^JP*_$@&4s*BCe!hOT+3m@*X3xI= zF3-kk!Mm1U-#+`aIn=(+DA@D#pLNpPV?`@h*xYe^;-px9WRA`D?h~voH~&h*ZvA0C>t^;jDd+*fyQbNClNckWN^v`bz=UcNyCY zrk}s@BH>N7o7%&^(#^-bMMSr%33aCGyM@Pd^)ngos*W~YTasE^d-<%b>~w(@%Y*h- z_X(^hk7NE=lA8Low zdTrzVB(FbCR?qZTALD_KI6rA%Pz>PHVbVoZ$s%nBo}7HT*eq8{?t98|iR5Lswk^Kv z=4P>5{8nFC@xp%3nhyt$9XT~s`+on1y7r)ryE^|X-+UR{Gtp$;z8xu^mp9$};=pl5 zdhI-WZ;mU)t79sR#JY3kS){d9*58rnE#5D3!$|URnef}mPv!1!+_Z0F+SHWVY@2fN ziSbdlUfKVA@@e~~JJN>{&9E;{4FW5~BW#do5q3G~gzfC-?0S4{vwU#Eor`(w?mAbV z^p$PCruWT8e`CtYOKlym%cJ$etUqc=RwuW!_wKZt8Dq8kHq%@if%R*xtPGw_{APb^ zf6bgWKIvQ2C+$&w*(x4?&HDYG+vg6g^SEZ-&#tkbWm%8>{>RG}x{6-ARg}E9u!u46 z_QfJSgnI{;`25hq1HaaC)tr}pq(1rNxA+4(+fRK!6jdz_HSCC-B=BOP zL+;xjo%6y)rke(}5~mHkH8 z-|Oz~H+L?a_qpl86_>}G)PGs!gc6X5WEC$o=z)l$^zscAdy2LzXlRy~3rIems<|OgJTQy>;<=k| z&+WNY_J4wP+PTlYYvgAfkT*(M^8d+X|GX1<`91K|DYA}1G2r1kU1LPXdC}^SoBLL7 z-t|X)#nwx5m-|cna{2K*b+^+sl{FhX`}@kgJvQyl*q9*Kd;Q80X8nj51L0FoJ0oo8 zzjXMTX6PX3|k8z5c#-iku3YNZap`{D$mAP z)#MuO*6;k4y7T@Yd{)4IaoL)0#~#39*kK;G%a7@|Y^E=$MHKOlssi&Z3Tv_h1-?J= z-N?l^)n|%(TJE+@oXV36{_Es@73!X@SDO~Vn4i2Uc$tsnw#>)u+Ny7RJ=<8! z-~QRBPBl0t`&LY)X+cV%v-4qlmreKDpS5PLh{sV@^MgA6Cr<2BO_uXe zn_V~MX_$oFdDg6~tZ%&K0-}{qxkA*Ek9)>d@K0PK7&-5rRQZuP6Su3%WMyi8l9rbK ztMmORJXbiJ;}BqadM4-s2YlSgA%tnNy3dW$;>^H1Hy$L+)OFv@+qtT)B4*;5q@9cJ zM(uS82$|xcHhK2qRsOOp0uBoDEJ+(VQ?FHt#_ec6F@^P##bRCSj<(ctzIXo=A4}gZ z+Y_U3USEsrkISM;-?HCHC9udzNMPk?WV<%|A|g{7DHvo1ePwh^cr-~(I+=fJsBg>R z8{1;-a=-s%aSU9vaABfr%U4a%5Q508hM5+HNv@ur0eNdzPT+1^bK5c{$o^J}ek-voAEa8H}h z(Ow2d3E>rbqR@RH`2OHN}a6k%evTfi0PryYAQjKWiXk^e(*O`vl$1@8+BB zX0)3{Z02yL9QWRfaWmgzpN01SD6V4EPQr94$O^; z@_Kx1#*U5OlFjy9c2`!GzWpLHa`uEw?pmhxS7hIAv)lAb1mpyP7ZV$H@6X*mX;Rk$ zixnKsO5!}M+kDba^DUCQdh&v^w8~nperD5a=8YetQ)|y_f1P~t$!bZd$(!I=Wj`xN z<1b$ixC0m(HCSK0IySv}n}*z$R=eQTl7cB;RZS&kwv;yZXZo6$=)_AE)}8{-Y`N$d zq@J3RC~dwk{$b?$L#IMc+_-YF=-vF^ZZQv=6e*KjkP1m?iuAUI%kaDVLcelqa>(jFPcBisW+`4b# zbM|Aujvk%;=VIz@k-hM319bKQ>x$m#N5nm-{hzFB;-I^85mi(Tp9#cIEYQk zgxB;tH3EWzH|GZiX5Wbr-hN5MGg#I2XZnRS?b!y`yd#8FUcH_@dFKlUe{dA;R5z&m z^Fy|sS6h$2X~Cgl_cJG_v3@!xDb41(J8kFVt!|&zPF#QB*R_g750jD?ZvQ_X58pQ* z$@)(o3a9orJioXl6ET*nAk6e})~s1!>rL}g9!;97HS-k5@t*+?FXovgGC>+?)7SQG zuv-ertsJaL8*j`|xDgVl5`6I_-y*}v)J;{fZV&%DU%Trpaw0!;;`_>Z^L^B=r*Ac9 zgATek&Jk8%Iki)Dp&~RM92D$X?#S{SZku|fm-o@N89VM=%)68)SoS}vV$1BU4?pG| zJvv+H&U}G|dJtQGsTfp#YKe`G>e5=ntJPyFYP9XliJr~5?q_=61z&s-S9R2D-$t%- zKGsh)=Qsbee!u2>_}ZwghPx71z@{XBDmidW(bsmJ4-Q5Sg$9RdtZM%2?qz>Y6E?qg zEY&2E%X$7Kj@!T5rwSdL)nc>TVrGt)2ba>7SA{6u)QxfCNKh#F|y7SmN$fnd!Y0h`j1zk+XWDSoG?G>HW`d9+{--tE~*TzsO5LZvKYy z?A6bk7IG;Eulq1vcKJ40m)og3Z$3|1tDpR*Kz-uJKa0d(>&NZ7GCgH8qVeWn&%)98 ztMT}1xYrkQ_{`q+{=)Zr(xT?qj;!5Ss9fuF$xiTGe(r5O`SLBZr)%82GOHr%=BDci z`#*&(Shg(fzR=~UdE1&-+>z*=T)Ml%MCY_{bnYEKrQ}-HxF7z>O!KRMZrY>81L+bv z@UwC>R&g9nhFh%2c_fMbZC=x)9bfOn+L`4oUFjwzcvt4FmgHvDFO}c#@(bN@6_~3B znfGApcd&^wJ@;1OlSoa;kvXTHGA;TrW2Z-d>Ra7aQ>W^SbDjKgZHKH&1Rhbv}02Ib@2faryCp+ZT(jwK^Z;Px-rO(E)#z zX*+j!{($D@0}Px3OuPanhoO81CT3NE?xS8&(dNgxyY}o@)9HQi$+l{CrQdsQmu-o@ zU2C^?ZPcEUmzSn1ul9pwju+Dpe0h1f``VhH$K4-JSUVwIYfb3R%-gn4>Qdh(uQiiW zj^DIz>T~JjT76g@7ryD51T&6+9rM5YxZ8Xr_$2SMT+5&O)pq?Af3?Zkh=e|2Giat^w}}aS@T7$) z?b4FYj|v=zF1Q~%rW!1{@GSc#v&0_G_n$L!b&F>5Pq%dE@PTGH78Br}rA#KpIey zp!pds`({WqG%zqlbBBb6_Uh?=eRS;B4%4pFS(}#JRVt~9GI~Hd||rPpj#+Lz7RfeF7SI+b#3W_vDXjZZo4c^zuq*ndfalVQ6D4)0n{rCd z{ty){+DjA~xzFygrdbfXVfchajY&6mVFO&a^S2G`3=TzxB1Vcb_YV zet&aT&UUNjp3}!Q9!Bc&`4leNx34a=|K1Z=l6OdGfLAL|4k?~zb=h`DgQxSDr$c;STTyTF@9envR^ir^tM?=z zV~dStpjir4cocN7ByBuZ>k}ZeeO~A3DDfXMI+-pmPh)3Jbu&xs^<-)E&DsCguhX?# zY^zJe{2+J{d5-(awQKJJ*NBz>57>FzF=fr#4gYUBZi$_y{-LJg|Af+Vfk^v+9nBe` zMmOJhXPqs|hZMF39H2J!!$roa&{*hjTd=L{kIQ+nqrK^m!V+HuOZz_E;H99Mm?}Ka zwDSN<=dWL>{_e;&ALKmpSoj-X)1sp7%_nx;b$-XEw7uCQk9}fWTIHc^m7ig1JRLp> zf5oD=tlGHoBCAUc#H%Md7!(8CA~azG1FdQT-ACK14=$^iaO-LEojm!s;x}#9-kanp z`!-GZ+U+?WYV+$%Va-|4ln&cYPze>Wy;+0fy}XgAo1RS2&Lu{ks*%q=ras-B{A|q~ z!Qy%ED-W)6S#*=t9cn9jQ<^LCfUNPON?rEoY&FSj{%PE`OJtSie3sHy?J?!de)A}B z@jY*ys4sWgk#d|ug9AS_pTxB;SK#S*veM>`>lHD9N?V=DoyYG87VRsv?&$d{T2ZI) z+Ix1msfo?s8a1{hYM>nJkjN>(BzmpNNE#a8FWMbqV`F!2Tzfn+x!?Fw;a`obH&=UZ zzkHlUEpe~HL?1JA_n7%e%eEv1R;*mPQX?$8RhO$=U~2uA<`b+g?>cto)S2y^>%8fh zdC_RX~CUHZY$`znnoRtD_5?(2}pU9d6CWj znXU5d4cFAxd=zqZUEArBbhA5hhMY5e7>pyuBjHzx=-S9&(RVVRQcmBsUmMsOxT85E zr>*U6=FRQBUpB0f%M86ZnU|MWyXu$Hd2qojGL1noAaSkwW|)<697mEu)jiVs)?`(E zj7sm{ccE;{Z0=g0q#Nwg!u{)Ge%9G%f3gAv6nJ#lVIH{OJ8jC8kSSAG5-n0<9G<*W zC~`j|`F3h+rmgN`^)*-jgVq5Xaz8d!0cmrX#=_CKiRJtTXwH~m%eejb@*CXGB3?eS zE4wHn_x4-hi^)D_SHExMTMu?4xX$Gu zuKALj-F#bGYMSoJFA-P3jnfnR7!(7(U2ounBxZ*M2G(C2ey2B26uPE$=V@?Ej<|l@ zoiA?~ww(!pI;4Stso7=0u3c5T73YNuifnB=enxU8*U4$8PrOySWopHCIcw?d<^y-` z-MH~1rlfRb3&{TyvYA>Oc5YMp(hTB(X7hzttX}ixI&RMxgmw~9Jv{503PzxSl7_Zu$V@256dkK+-{EuhBm zIc`v8C1-SGHAm9{Sn~h4tl)>$EDj8fF+v?jzsW1}S~@jaI=RiCyydppZ{uHC zMmI~U_0BfNfdl@Rz5~aVdS@+&pBo(bKy%dR4KH2aopte)j!D|#vnQVzzxi|WVd)Z6 zXnu2GXxztrBx&mJi0D6}%CQQW71O8o?6jI0Qx$yQ{gE$7RbvdO-?3G6p*)Dk$Rg0; zvtZr2UjoX1eS#0~)|jrXN_c>lORjFZnDEKey(UbVFm9Lt#Q>V?^#%AIZyC z`{wgDZgn>`F|nU{Q*Q-$T+KiLwAOs#83|~rGI+pLS{f=YF*9G7f!D&88IfO~G#)Vf zzeneteLm!Ja6BW>7f7FP9uaPxh4R=f!Gtllzz&cwMpm+Y%dJm@=9Uh5E*bHLuDd zixb~UCA;*^>g)sAv*C*L7{F@zS z78rlOra=GnM+;CGJMeJ|Fg?AHbb$-RV_@R=60ab(`sbFM3lIOV%}A{eh`(P`_TPO0 z6I2?Mgj!Vv)~{U2x#z+9No5)K#*c6M>qlPt^ZU>&LvR7c)(>)DWOf=P86Q|6&~bFt z`)Q%=8`>A^upRwm>hxj1Ox}jUnsf7d&89yXrF|&Gx)(^2V>nU%g9lzHG_Le*k%r^NV(e@ZGO^ zP1E%=BYrj4O?d`hsNSfNM_obN+U?nPb6`Nyk#V7s*dV zn#to3>2uHtD{Wfyv$S0@a<|6K3pFke&rHGLtfY;vx>LTcuqHnNr-7hxn zvsv*!?|#3=AGaiE@OW@-(4Gc`JsvtGb!)9H~3;XYL%{;gEeOjXL?3Yka~uAbR>r0hej;0!~kw-p*3 z=CdYkT%{Fx`HClp$-adP6J6(Xe+K*7Aq-UU9XhuFVxz(YPDZB%J}ZKR!KQ+UgbkcW zUaiXgZ8;k{ncIA}=_jbb_^Ic>G3C9s$A75S4XzCW9s100OBtB{iYu_Z+OH@o04kS3 zW1&;0F5rhI_7~e36a)5iA}>2@;As3I1PbR?We1KBi|ms=&~W|&8b|x5%>d5dV8Q`3 zv?iz!#Kg!Va6*vLX@N{6$1PA{0J7>Iw*b@E`xCgJ?gC{B0j7_#AZaf527wg?*Cv6J z8;61cXlW+f-*5&7sH+?p8aY@v8kHQDurP5bOi*TOaj@JZu%!`fDT;?cLBqhvA^_V+ zC(_5D81Qh7sxhR^l5l}rfQk3ldIkoBD+ED3mj(|`&}gtlWX2aSdo6&(!$`LALa8mz3EA9%D~MBrQf3wx9!3-c0mSi|@_ya9XfJ zWhJat6bYKU`6YA#6z>xZ8$C^hmqnicoqddLfdM1{!2x5bkkIs?L$&v`nCn$8?K+*aAsG3`{#!9XO^$zjibSC73Bpv8@imtNFT$B(e}q zTLpszChytv-x-K0UTFAeEC6-Jli3W40sGcU`~{T&w&E|eSav;Kc5_xl?9IvI;L&|*>D3ZW|!SMu?FJwG7bKuUPZlvK2I#HhvITkiA}DV@_7H_6Do`nM2b9|9Ze0LPX96df z8J!l`M5si8I{m*i95}AHTOh4MIuXg}v|vuGloWK@vM~m8qx@QvA5=(zpM|6GQ^LdyK}HsV7mFDb1LPl8 zfT|==xC=Naq=Q1bEHeXAnJ}^x1vUt1h=;e%1BFBe3rFLk!X>a4kwSyRJ5WfUi@E^K z-5gIE859HLbcA$4siIayf#sF53{p4g$r=X5fOC4hy`Yc=B{@A%R6JUBL70g{L7`W~Vl^Z;^fC>zxB~gEcBDUx4 zeRj8E_ABXGyVn>O9Vxq&f4{cm#X|P%TZ!!%UtY*=vwZgZ{rbyqcA97Z>`E_rCTU!9 zsz>8pNlsgoOsEdb>C~2oyCZ zL_toEK`pIMR<+NO_6n?o?oW`r zD))x}@4x=~i{|gOrLrTJe(P=^B<}?)+0f&SIpfR1O zIUfZa4sb3ho4;ktmTwYEcI@z2Ui0usLA!st;|17CR+}{SyB6=YdS!Qq_h<88V~>tz zu6@6*y7YfDf99=+!6i43KF@k_L9uyib0x@9(9p$&BqLbfIe{+Yo1s8&h_tk{rc6%=lirIyzAJp{`|g>tD#eyr6=43 zH??wtLCp>LgfenZX+k2_e`Sn}TPX8L>E(!+POx8Ba%U1Dkc{f~d$H}Ahc zmhb19Z~0C5a!FC-Nk79z4$y^8g4%+Y3{r>%a<~loKPyR|P6_eTf z_gwWX+w{h;U)f)t7W-fCJT5PO&0GHUmC62B#QkTl1MQfZ|L@QBsyF}VU22y$&wh1W z?d2Ndw2bflO)L2A@2qg`w_SPv&oe>W%~`%Xe!mcQua8+ir>4oRSLSBw{P+95?~|)a znJ8EL<$cuWJD(pG{|=w>a)-a%!pwHxm!D>Ay%Os-FWsd6Ug)jt^LMxYd71v@Kr{c! zeG4O{?fwJ^uhuTTCcb~c-_yrSt@dpVTYb%DIeXpb4Pxq2U%%ace?oTt^JDg(I#ybJ zd(mHRRag7i=d;06_d-;o-MC&51S6;aq_VUMh zxz!)p-|C-#UEx0Y_49S|e?q?h{j`0S;or@_F3nWee){?O{y+1t+5B#D>%ZryKDS_w zUHKpN(5NV@3-Qj!oEaLK#1&YyKCq@$LG!D?S_Z{{E%QP^1#OXMgMh~Lu;w@c2^psK zd%v}(0d;J?(>t3Dj_qj!JPt<8Psv^MVVp0v2KePwrZ({*?Jv`!S5@~`kadu;jJr(8{8 zwU4*$zOv_!yzH++$5XB1bCxPPZ{yQxQn;{azwOHRcfa0G^tg00z2@n^U9UcITiyLQ zW!LEww#64&(_gFG|K9rVTYdfefVA^_%dX$a)_YrUeIj>^+^@@ve_fL;U%lFT+MPdX z@wFR|z1#detTcETdq~gaJv)sL8)$qjeEp?2|L=0CX?pLAa_#Cb?SI*G`QKjWj>&TS zV(VU3YH8}dyYzfZu-}!H>hrI>wDrGRr&$3iNnbcM2z0E6wFDJ#<`JFfeL>+dw)#9e zdi#Ie`B1TaUQN*MusfUI-Y?!=wQhF(Y}lqFJ%hse^=o35YNwyQ{_O1RFY@uf>VKWh zm%q5>F#pBn{nk;7-SgK!d#YXf_>lFNXS4HPPd;7~bKdU%q-$%Vm+Q|hUBx%gB+$rh z|L?=|OP_zQyYez`<~K&4t3Q~(F5T>Rjq&&N_Q&>r`Qx|O{?6NZ*Y2|2Kf~Cni11{7>{h-4aLOwdEwWX_gA{u|NNQy;T0j94Vo$b&%nxWB*(Me$+C#Zsa2s-cL-7OmRV6LOPmP}D{uZ(4o zc>U8HUrUv3svBB4n9RK|F>sDO}4WF}q?(sKUma1=0&b;Qj!AAGodd+*#|KUUAb`eyz8HRbnf{lWV;^)mUy_WVDA2^ zgExO2F_gdm>cx)So!?$?A9UtWXgFZT!qNDn3fl5xVA?C7!19V!tRK|=s00lzrE|OO z=6JHx;a9BT+`Df#uYFl6%CytECU5WC-w!9|z&3hCm!10aMf^KxbA^)5?VEj5za*c& z6KifBV;;;d8?iA|dZl&szn$OCuI-!U%|9XN_{pX0iYt|7o8@17s~1vP5!n9kQnSQ% z<+OX(*9W-Xtdo@pQoPW}KBe99%D2V;O3edbrMJt(te!c&KGmCHn%1LtkAB{o)B14T ziZ35@YU5r$3`;s06kC1w?89{nveRSNcy4^SVImn0QOf3#~IX@OdTQm*|zMvuxGzt;01Jt|Sz3mK7V~mIgf9$RI zw_dKhe`Vdgi`G4tpxcZ;O#M<_f2n`E_x;q%S0i2?pH{k6TD3IY|My()*sqsw+T77w z5S{nCPC{Yn`zM}vi=XuQc-ybi-FpnN-O9~)S$$Z%)#oQ`+X}va*ZFg-eCnEfzWV!b zA6ULRvC`^g%VU$W`FnTqEDQSEzy41A=VvhsCn~$Q?5+x081nnB?c3*5<@}a@pDOpI zR4i)gs~x*L_Er9lEh<+$JHLGD9DUGGvVs;PN?)}L!+aX1BZ!+_`FQz z395}>E~wUC_bY$9ME-VI<%NH=UakNC z<@!Uu6<3bmjW0R&@^YwM-u<d~WKtwAq$H}9GiUv*;IK4A^p zEm`}WH9}9{)%>z|_q(fq`R$f`5m;qD%?31zo#PD}m0*YV&2Uv!^SGDX7ri`N`M@r# zD&4<*3%@aXzuK{J9h021!Y<@Zai}HC`6CiQMq`LEd`O{Qt(|xK0iq2eY ze?5u&JYV_8E&oeOWn$AG*L^rxW&7<&(%(Pg-(NoskK>mwG>y#_m)m*o?()?OmaUfc zp4)ph^u#o-wfEw`H(n}FTYBAt|LY~^755@Ofrb`0=z_{^d1&*b!9kyeqp_;-=weXv zoCg|CzS(q9kEv2`0$1#}8@1Oz^vRWn`mA1QLp10q-Tdr1V&+D{*rQw-(>VCJZ zU)s+3QnB}Uq}GKOS`R$$^IpEXG4-XR`>%6LzX+@_x1M$B`7Akuxs}Iw<{CY2@zV@C zzAZOL5=WhRB?-sFsULP2Hw&lb3YGJ0* zt=(E*f4?nHTl)RSt?c|4vn;v49_rRF-{HSv_j_i0&_q?0k^{#TVbyuiGKG=FPDp{} z(Q42@4`O+)!gZEQ{Q-y#zK6HpTz32A=L_@Yu5N#~BU)E?t<}%Z$6xncwp+hQNxw$l z*2lwMOSiWD0R%a;w_ors>A7)Lu7F{9oO#b<@5GtXRFf zW!Go__j_0WF2B^g>PzL4`^Pu0tuDXwF)x1pci!9^8ysIIFKL?fEiuO5dBK;Dx8EP| zY7M&`^?1ta=*wROR#_X@f#yHHgfxIw(A&Tdp72m&d6bRCHwv#$3MM!Tyjb6FxA1+< z_x2+9?$GeiSF>iuU+lB)yJxgDWX6L&n`n#rX?!*dZ2m-6JupfBmHu_9vH!aR56c#w znN=ISBY4?r0kzVa*xwseY*`8qPPu(@vQ?IDt-^NY=jY!4_t^jY@BGp?>dRg(;yxFY z>FN2yW7T)io<3-S#AjP38nRSg^}1b)r~akTh^e{zX5UGIHja@EK0^?$lS1yojjNL1B>D_8www|l2OTO)0fb7R9=rX^pNz1#OZ{nyc2 z{#Bb}b@~6jOT7DWZnc%n)@fDuSxxu|D<*EYA1uLTRz9oteWflxi_jEU1eSI3)=Ab`r7`E(eW=0Yia{NKbxJOeXevn zc)RPm)ggt~FVB(Qr&t~mw`QH!^)q`sl->I{>gUK=m2N%ua`%?1UCKTGe}Nhcdqovk zUaf^M5)%F>#Z-J06so>cp;N{-%GK_4!=E zf0v_P?tC71rN91{x9z_ar@ZNxRK@45UEFV#b2@L~Jelz4zdTq&=e|8t`Sj}b(zm7C zPqZ2>c7MNM^Z6MI5A$2Q9B$*i`fQq*ss8Wwx(|ovXFoMwUHayt{B=mT!)t5V+vs1n z?zBej{Z+Yj|9K6Yy7v!VcYTfizw*%|rMbUaCzt%$FDu+;^Db}Me%o*5f3Nq~E!=*; zPMzo3v$*0+iKeA?FBgV}AK#O!-SX;fdGmA7pyfJHt11r^P~gH0N2_Y1!z+$W^ZX9B z3be}zU9OC`^3~(W`X7lHEV=s6Z~m2yX>a=ry|2FTrLW~*fSyv~a@qe^&pFH2Q~dfT|Gvsx&rvQU8(`@7`PsQC+|8Hl z-+Ane-uE+h@1IkzV>j)(YZV^%>#6SX7k?p#htyS+ME|mNU&*8wQ~dqcpD)k%bCoBS zew!(?p4WNlx7U-3?pL1i+f{fkG@8|ArPXb&g;l@qJ^&pTv%s1WwDac&ESD%uP;=lo zavd}}p%DWbd5?`wYje=!TykG@^V)qe89{;D<|l2`@|`PmUC;Xcl}w9ASvww|NIM(3 zpuqjin(opY3ny=%;@7JFSo{0+J(l4)mg{uBI`})ynD-{D@avs()7t-iSs_>VBM{t$ zZ%+H)W#s$&hls3Y?y7C_rkf5=x!gQq=JdJp?}W1c7w)dySNq(y$a-3z<*yF~<`Zv+ zUitUPQuP=9eX?19xcctS-Qv5r7Z$y& z_SWZ6n6MvoNY(DL5>Vj@N)3^q0XQZr@VX9W6$cIzhYLKgp=%D%NO6k;v)fq*aH8Q* z2;cxUyf$>50fpgZ6`m0b0>hsR^>> z8@>n*oF*Fgam3jEKE}5mw%N3H<@KA^YO9NutRy3goloE1{OJ=F{AooM`JelvXfO}G}Z@Jr5 z3+u*3la}y7%}I%E5YTw-?Z6BQ=3^|cvb6k7<384>=P+=A(h5Yk!US%nWA~=`n8nM6 zYPUE9dIrJL)h5u4>Q~hTAb%+&GreIsC8662jT6wIzQ+QM3zpr|v)}ctQbp+!piUow z(h%~oJqqD0Yf^Hclkr)d0vcMLub`fBxCTlK`&djszE1H;cr9?^Z|JqQxvBgKGwYo&NWDnWsC4K)4icK!f}eGHUe{mvlGm@?})aF`r;zyoWz z{RBni{nzf_K|=uBKxw`X>JbJe4&u}N|M`1=^G#lK>({>hJ}YF3#aJC#S@{(r9au#| z7AbfLI2ts0No`u9_`F9!tLubrhoFmqBhQOK!OkX0!-Y+YjyH5Y+;d&){<`J6m+jhJ zwQJR`Rljflztit?m2dvm<>!mv-hZP7_A+SB#l~SNY7i z8&bG{6VYu@@UBIaTsEQ#ET5)KKL)DoAw|OcbBF{6nrHdMFjWmIqEHP=9NV{@0nG|2 zuq5#!!a4;s4Y(~7Ue-1&XKHbn_vsQivqB27%kT=dp#e0*BDdfYtl&yn4_XFy4OWP+ z0XY@o=*Aq-8meuG+TlY;gTRU4I4Mw(0x5RutUzo?y87VIAaH^?WEQNbeFK^ax_8US zm_@*$L7>AFlx880o{-Db;&3x8@ENSyn#U!;RC&r9v>pjsQTT(#6QB_Sno6u}@R|%w z`xEwpbVo<0fkyoWm^QLOtOpf|n|vDtG;V9bi>(8}j7|#vm6@Po8&b9XdJ{CsPhg{rcKt{vJI`)8`xfrwM4h5l#664T}e> z85Ae1zf%GViXR|1X>U)TTl(To>=zXQSe^dC?ZHF#^b?uO=e_ZLyyev{2E_@lmzaR& z*Fdpx6Lf0l*{i8}910U&GqpH8jAxAA_HKe5vs+ue(ivz%VBjvvxbJ1PEno71pwX5L zMkj@9pg|pQj814`Pz>OThyg9~Y4K?g&`4q3EUBj$@FV*K4>)F;^c^@v{zwTjwXSyS z5rZZ#CKU$`kp)QxA}j(92T~cG6s9{GUyxA@V7u@V932YJSvVRGg%oNj4 z_94>+TTqZKWKf*YzQfK`R-a{8`mu;MdV!Zl5**jhL^hEL`Dx zC3K+$WJ*MXfW~3g1=S#{ok2;Uur_O!zzOw?UEm7(ge0TWf)CSY326K=O<{ut^kN3Z z3H>)pKuZ&T=s0jZG2X#`SC9#wEG=~%I7I$^5@u@M-v$jeMwS{81(r{Ov)6%wVLmHI zV-4H)1=ffpr?8xrqw!FDozsF3*C$AVB7;Mrp#e0dYL|3b6y(Lt42l!ZKaeYN=Xk=X z72aKb%j7if+ZbO7on$ve&OI2vK)UE>@v z1s1OQpPY?{;+@mLvDU!A1e){z+2I=wvJ`X>s$FyS1zAK{HsLZTHR#(T#iW440e40x z1^JCHLEGUzL^cSVNH5^urOW~^r;4H)1T_9URcGO<=bZ^V8T*HZ1IH6(vsh3o(T-by z=_k)S$MO~jSQ+Ht$1T9ry8lm$!^8E8#*nPZzzCXkuQ{?z8x%?Dj7|#k58A%yLzFKk zGQp8Fe>9R>93B!ANyXMIvr5m`L~i(CSiI!>85#Ad+Ec$LJTY0xByFBMS??~}42f{F z723_e%BL&$S={-t-M_3>&-ORZ)b;!BCI8v}^|{6}wGW5u>!b!&EqJb!(B#umPnUp{}oUw`_U?(L^%d1o&vZZ~`O zJwZ)ONijg}%H6k<1y02JM}a091soU}bwG=BJ~0{FvIrp3!W~l;mQUO3R_1v8wl;cS zeS1%7dykBCsJ>}1j%jZw(|NFmw$F@}AmxagA1}!;}*!Q0E zQtQe#rMSMk{iV}i)%=y1d|5!FLtT!uanGOL56g3%6zb=^WQ7)$n_LSb>d(73ZX`AZ$wpZE3uC(qq&H#zlmxcBMR(q5fH=@NI}-~YdwN8Z*o zuI8t`Ca=3ci?5u$Pu8^+lP=Xd?zFfXaO8C1Z^0c)tm5sDJ-K2M$?@fO{{GW{TD_k% zZAx9@w)NCLmdPy+eyhdryyj?Zik5Z*)i5CcGm0p%a3usvfYzKpn8cvo7}Inn!MMdi z@<{o@Y$pYAf#N-#`~UqqUD1DPPrKOZw(Z+byj(t4>9Shygdo*!X`^57=F3$&r{4c= zFY&+j5$EyKXU*f(r(a#0yNBEJ{@>5XP0{lH7l6!a6 z$}g|Vx@C$^C@u{4GZpz*)Ktf!xANTeenU&sQX!^ZIeX`@wRN6;wog-berz+lw4hGb z@>RU++_H(EN?RN>C$qj|b6Rj0k46jecDhmZ}O`T)DaJ)4OVU zujzTrKKr$$uS|9PyL-02i~lyuUuQmDH7dGe^7!A0Xa6&o&yxvWujJb0@iyw}lH%jn zisD`t_xRRty*kToW69E*Z#Sp6olGs&pC)Y;qn$2dt^4rOzoPHgH$CZm`svfI|0mwv zz27lULbJS1GBe5}5B{x6HY zJnvdQRDGA$tKNS%y(D_?tyZJ5C$U9e0{>4sKEEnV&1YUNU;3RBjYW}ryK~#OSDn>1 z(x~6_b93F^{OMu3Qr+`jbmTmH&9D6W@9x_B()*Ry@A=jC;(zphY zUcIk>JV zadW+b>h^DImn8q5_R{3^UOO%UCTK+sYBvhhfvP@ei{T@vnY7<*4`1W2XQfj`wc|T1 zWd+t=TNY~kvMSqMGwRC;i8FKO*XWh=$|_si|I|?|>U}je<;DUV%a=!llh*zIvRPlH z{>hUaf8F%fMJ-*#^X|TLm#Fnt2mAkjKf2Gf`dpX%=cC=N{|^{#d-m&<|1N%TK>pK( zL&u*SWbN)foAmnmn;_LCm77&ldq!Q0;L%B%{%Z@n~Tr;$<3 z6_My@-o#^lG8$J`#YH6Ssd|)h^V9RxPhYB^9%y9V7PCvyuErz(@xK=g$94(cS?9}b z`F4u%(|0?$b8cU9NKd$*cWFuB-x*~kJl)fDrrs=metVW1+tT8{73%T$*z~T)eP2{r$o;hbwzthAz6#-!5C0amL_l$i*X?#ZO+Q z&olmKTV-=iU`5>AsGx;4mNSdj|Fybsf1;r>+o|L7?lb=Bg^|L6C=F?Z^6k^XRz_ciAf$G^Ld=h(ce4p8%%JK2DtYl~pM z@Xd=49>*+M9x7Lzw9{u+nZMWBCBjUWFFl-R9q!jinwPb4_wrAz|EFD4W|L5tQIel~ z{*!2S%9|rIIS-5Py{G4~DUU_I@W{hY&*#^x<-C3}*>6JTWOoVme5Lu<zUoM`D-BfWh zsPf%U@!aR@-<@5br=dG5R`sZ#{Z*dxCMK_}6I$L>ygxkSWk&7#jDT>x_0is^rq~^~ zsTIpVca6ba-rT(O&<7^QHS=b?x|%=Zg(m-Bm-U(1(tb7G^Fm|3z5RX9jG^mJee&{c zMc&U}Cpqb6Ydl(_|GIqUy~PI~@A=vNale(&{ zZln0>$Si>qok1JcE3$Bv)k?@RLHZjkppH}mYoZ0HaSmEts+W|uLet)9!7bC(p6lOj zm+HU%EA{{SPcJ5=8ogiWex^6$?wa{Fi8JQJKZ|jG_|^RWw0nQsXWL(&ujU?HnHg%7d#(1_`Ni^y^B|6}c|2YN<@|nTv~NKfJwdzk0Iz8595AH})R5 z_v^)~>{;eUOWtF4JhJe^g0W@6vRUE8jE9Df~k>Y}^6YW24| z?c#UUI~+Wox^aknw0n8v@zdu1vQrBZANRWNbFJU9thTDu@DS5i8N;+ymA!qX-+Bs* z5?hO&>0S#~*mZI4_0ML>hohMnnP1B{krQ2}p7CX|`Wm2$qQFuA&SXKD{yhZAMUluR#Kjt$hb=J$a{P}y<6~(>W+!nxmyR565Z=VhNb0+Co%yOUk z(#29v{)FCB=n&pQ*&zJT#abbkIscKIls+1qlq$M#Ltic@%dJ5IR#@oi59$;u`3 z&pmt;bv2pkzze^%{gs=mRqospkDtoud~DYCmsS@{SIX}e@c4c0J^NqT>;JzSYllf^ zYySE&=ihH%^O$s&V^Ob{o(?~GMe_Ts>mfSvero;lS?kQ-p4MaW`nucacICsPrA8?~ zTsG_5K3%-uT0C@pQqT9#`uir$+$`V0xpwWrl1-)IH{Q>D@p}(nqf%{b;QqeCU%~sW z_x*iW{djlGb=N1CAAIso`Oq*=sM2NrVsu(CLA2)~sQ0PKA;7e>LG*(6UcSbX z;?grG8r>>{e!ftZ2$ksdVf9p+TL%=Y(BlX ze9XGFytfpaqfNiR@be%Ouew*OXdH3r0kE>?3v5P@N31|7f~;jx2g3?Yo*UC+-2yx z*UfyRxL(zzIiDsl+V%!0fBO8Bd)kRPzr`f}uf6swZ$h!xTv2C{TCd|$XKuDCl^vXY zP5IZyiizdyneNxjzQ`Kyt-dFg{Oj`h{U>&KZhrFPao<$$?CTRYrJj~}zqzw!Qm#k- z-EGdhzRRio{{G%Pue03i&0~MNseAVQOnZ?U3rb?w-S;~#&h=M0YW-C>|Lm)i7P0L8 zcKdW*Zn}0Ww&Vs^cl$r#zxX6HqwiN#j{ok4;tX;*8@`@8o?_6E@!uovG6JF7^opo!9 zy}wy6|Gq?s$<;spzWmllJGX9n@-aQfpFQ(}P4%yg#}k`Z)^RkFP%ABYzx{%5)a&EB zK9;{cDt@v`@7UaH|B9gnHQM)ytrz9KgZoXPTG8p{`Bjs-@e!w`uB?pDk$#R;Xsaksa8d-!D5 z3jvSjsg2IZPW;+#CT+a!-_rV)gTEvUYF)yo&$gDZ-*zqL@ZOifZXIo57v*bNqNnFE zpQ-QSYy9?qQ+!+B934=D@n^9u>*XbZ%qs)ePMTA4iPQ5w`=ku#TY3hwtqkM8eChbQ z__`Z=@~_V?f(`S|T-Wok`u=9pvCgekrCH1W?9k@5yT0$otUJa3n|8b}>72Km%|h6X zUyPSmSw8zjGH=1!>;u2rcJQUn|nrJ3h-4-hF>=N3W?v&%E7} z6_#wcZ$9z&ACAU1Jd@Ar-aKFWrcza7k9!QvuktGftV%k#d!B$sg=wM- zq#jWaNMLkYz#!hf5Y*wxO!K5cB_xk0M7w%V<{;HjM>V4#sD0?S`-N*k&K2Q6*x6tT&iL*lOnHRHPo1glx zTes;zvM^^O*XCK99?Ll`c(XzoyayK4PoK}i(OA>83^W?4zzm)#EZ=#0L7T&_#Qncl z=l8gO-Sg#By~}+~;rGdR4_vLjzGs8qG5>wm4^KbXYHQ1R>G8SfC2xK{pY=X@W1F1c z$+w3Dmw$JQf1YyLxTtp1+4Cv(+s|FqJK^b1n2SuXoupIq5#%Ce~~Y1c)&v_EHN zTy`jXeDT7IWq!H6!8sGlC%-7|Jod1pXW~Dhxlu*8!WR9!Wvgd!Y5TmG)v=p*ZON|P z8nPxp@7cr(zt@YezqH=A?{C@sk2j8quD*7xW%I;uW-_jZ)_UJg(RTsvpm!*92|mbOjI4wlT`^l{mxv`v%e z`qha~sy%=7v&T0J3tr#leo}f*^)2jEgZ!A5`iSk2=4fOJ7h(f#p8<_AID&>Ni%KP= znK%?C%wtdtsH$_^VcnrP;a}*tJwLls9xhTpbJ=c}Wccnd)0M>^U4!-_wsFiX12<2)o=gt`S!VldEN;N zp{>C;1T=o#Rq*qj)aqb$FTVb-@3l3t>fLg+QFga>YA3Gzq7n$|A!J-s?tOhogz06) z*DL3q>E2Gg=iGg^JSI{-=FgeSOM~0Zg4XBd-oEU=a?R7)-*ppC8b6!$e%rv#0XGxk(;T-K~EuV2j_a{1r^eroo0UW^{*ml8dPpmT&yluRk}ZPU0%`BpF!oX z_f{n(oI3JnhP$8Z=2za=?^pjFf31Pen_cOE0{z?CfpsmeyVW(tKre_X(?9v@nU0GR>Q{ zrY>>rMb}No4@Sy&PkT{VaIrCB%k;??yw{ftb-jAIeD%6D+Ha%Gr*HP2X5e=$^8Ure z{pFV@+a8xGF1fQQ^8WYK@ch@ii@sDl*-tF5jJ&Hn*OD{;&aPup2_nyS`}mu_Jh}OV z`o+f&zPN&Srgz4{}({+{5w)e5cu5azCjJAB{&0QKb zwX4-mRy=dMz=@OQ)x@>E*E=s*x4mSFpKSE({;2NljS`jRr{A;xn*gg?rr%<KT#?DX=Ey{UZm_|c-<8`!kxT5S=ly)rwm>-Wct-{oEH#kB9W?dUtYt8n%^ z>&87CjbApV?ET$8LHBlcWbEmI68Tfel?9aRQ-8H@R_M3F_y6dKf2`3^xms~PED=m55 z{^ysjmh2;I8;*NgUt>_d`re55>YBvxCl|{vE}yLw5WW5Fgm-(}PyYM+ySKh;-?f)j z1%J3xix-+sv04Ac(x~oCf@aw-P1beSE}K+Eeg4NTKGS~l?C1a|h3vhH)tB5~KRu>q z;>RDyi_hytK9DVJHC1KNS`$<7PML+vPgjBy+5u{DXb{j~aZTy~4bmxsRzPryFSxyj zuhDCYg|k|ZoKE_5t;BOt<^s>}?KeoPAp#JXZh3R^FQ-z`BNC1kI$OD z^qPQ1(WmEM&F_odjd*+YahT=)Gdm4mU8`I4|JA);=Y(W`FDZ2Hoh(~d8@9gEmF;Q2 z`R?q(Qs- z=k|2Y`BPbaIV|$~t=XWiMA7eDbCDn2_1PQ5YO9oQT9lmq`p*7NO;6%eucxUYb@t$q zmuJ5|s?Ya|yI=G3)oa^h`=jsIPhK89iHYMpssZLKe=f8HXyHh!~O_^Hyh zvrkK=&q@2?dXIO@o10gUy)XUpSls>j_vvh3^?N0oOj)cSbsTLO`7HU%m5NV45`#9oi9Qxu{`%lY{V8W#%ldP# z9AEVG>ki*lA*&Rk7JJP7+A{gtPta&r^d{~J%`!}xx>0eLBciruD5=jE`TculU-FYU zCk1m6KR;)F`@->ruP<+g zdd(|s`h{nOLaCq32W-rvepeEqEOh@-!%Z0(o8Pd~-u zLA|hJb0RKgH%TzP+_5dU-oNUrWZFC%%a1LOm&V71@7z(ws~mD;^Y`eTzvs0-`7K{J z0n`)!x@zjvH9|+vG#q=WRzfv9X8)|}Kes%6`|REep4a=qNdTw6xSp)MT zN6-+;u_q6M7S`-!`o2T-gGJ_Xse~oJVwYXNJ+~+5zTMtkCtR*?J*7Ja{Kb1#3Lw4(0UT}wy@`Bcbh9jOVvvn}>G1k770;IaR+JMVjS zb(#7-f4*EkU-V?6`-vHx#;I3dP4C%S@t8MviQ`|Z%>B&Tf+C6mr%r1WmPG0N!`h4PdHr?obQBiSsFZ|fsQFHIshDbI($?V@hc2xX5V*OQU=fCCi>pLsI zBtN;oI(&D)vA#XteRi+nS!b0A-P=*>Thb6X+{JNThGt$32-l{bBg|&O$-j7z1zb|EPdc2pvx1KMHV@dMw zzu%dURlA7kRVgKISh~FBi(trC{oOZgBA=E_w!V2%;_ig`*6;s6*{D8EmG}CsEm>)M zxL0LdR6e`QO16Do$ZVs(_hwv{y>@ir*UR75?_K8E=$pCxugdK8(cD4Ii+rQEoqkbx zdD1_>%=y10Htwt3?%kU;RcKz{<=)EDu756ayqV@@+nMCl-@33%wEorWKI3?O-@fL| zdw-5@+kblE>o0 zu?$=>qsx2Mbs?suT4H-%b2c`G3%kJ@ri`G5X+fa`Xe0ZCWekb|vlzJ4ux&y=-V+(Z}IDL zBzLZIjNSR=(kxDS&L#aGw>A`R)~S6~d2`p>*q?d#zq?5v?V76So^E)cNOiylZdy=@*N)ei42m;Bj2M_STcH z=4KM={By1xd8xL2a)8V64Zm0CryMQLc0K;#p!@t8(w|k&Yw4NluhQz3j!XMJsbcx# z3znH3-!Gnv{q*M4R?tk+jMx71y5ZaXbTjX4*e7EBSLF86M_c68KbL0fW?BET-kSQl zEb{B2)0=W{SEv2`lAaa5E=Dr5;HGNO)*@HSKOdAlcVD~zcHZ80srTnDp65I+uYP%X zkHJ3iH+GPEt<3=xzw_Gb>eoc>K3DPmeBXCFgC-B&pscH_w0xz^CUiYLeXC9L)v?+D>f7z+}SUnVX-wq1=hD_Vsu&{AkwJ_ z8X9XAQDD(hiD}3ywr1hFa7BWPiGwBP!Q|Na-skO{&z9HRY~9H?-)TYH_V>T#djftu zXyzB=T??8zcj(oh&gRS^@-K^o#UqorUUaSjRicxZ-A#_Wz5e^#ORHQTFZo{7xc9)d zToO<1d90jt^rCm5gS_pIzjyglPHowF?7ythg5@T;mlTeM?YQI1=%iq7YJ6EtF(B>E zOW0Y%PFfBeB9{&s=7837fR@ZLFKLK(;&_tRI4^Qvlw05IX<>_@s}lTI^X9oJbTC~j zmvHU>xNFYbf!Iz_qP zMrpU&>73E!GoY-5eT@_Q$L^P~wE!PR#(F2cIF2Wd;n1a}4(GU_i|}S{{>*>-2xsG= zFvDZrpc!G%se<4|i1u?q3lbr#DPMa(ZgJRWa2edAa_9rCvC3u?AiSK;m*a`B$z9Me z3?v?Qobu-oSyyEk1!=?yoB-YI-p1_!TK3xjx`kWr(XSg{Wbd+{WS4*YWurTI5t@L5 z!giKt_w9YpX_RH<`C1*>tjfYw_)!9OEaVS;2aYHEEp0*3UB@ZF^i%b1uD$fVds_T< zUo;#iY(KLFwAxl-LNn9yxmBA?R>Ze|XKY>bt;Io6TjH=QbXDRR&@%dK^T8K#>$7q+ z?z!@He{QXbj690~$GiiZ(!)+_uiqzGp74B%mG`c)or)FA=`I`!3ZmLmoE2M`S{xL0 zq@2O0YC149o&hcJJU4G1XtnKnkXd5OYFPwMls3lK-PE6(cXG0P-H&{yu9J`3Jz78I zm_7ehmH3ZC;XxmR;sonH_)$KPqmx?GW^pJ?n9S7TU>RAa)(cu`x2Ec!>P(Z|yi0Pk z&36aAdvQtgWoZm(CP@C^sf>+%YZLvuA5!@uh<@ z^>++E9oQTEbj9K>wY}50LBowKLfisO8=b&R&~&f}3rAznfk#20mUarrtKeX34B)K! zaL{k(;^zv-li%Ha9Jce-sj9y9&z-xC7`2tn8c=oQi>v|*o{0W zp~uA0;+AmsR(R^4CA%N@e^(Iv8GlfI``&Fc?_Aj#oAKqe~}(1Asu zRfSC24jdvkE*Thr0wtHxX~7oGOi)VNASz){(X(f7Ve~00_4y@>Z2mmpv3xS2Ie6c6 zX>fr46I5VHQU%2gxZ;OQf*oB78kso3!qMmyX3*Bnz_d`{N5%8ym!6(uY?XT*`**kJ zUaPHKwf5#9hwlXKC3vmf@DuDqg$4&NrWOay!a_sPkvm$9P74C2b{|w~aPVMxX1l{f z%zoRN3yarQ28v1=Zt-9E{<#~-#n(Zn0@bn_)Pp07MZg1e+J>s09w-GnsXB0otST~$ zU=iSGJaE7MzwX*wch&6wekqPxT>IeONzkxF=GKE}K~7!=+K8C-bS7xoF({@*ycz^n z1mxTSwQ*aV8U!>%Qj;cdC3^ZQ^E@du!Ua73Vd|R-M^jA9d?3qs8OFXZ^C%z1zQ)je3k=Rh4_uj*dFSPg3tzm6QO?KbElX`1Jav zpVQ(B+iOqzUiZA~o$d8odY9;qXY1y}P!mTzvdwUFJoPUH2|EDuJ_}g@^)65y#O~a2^DWb8`tWZ3La&+laK$ z;Di4H|NnxUQg82OwOSLgZ;g+X{gofzQxqq}eZFu=b<>B5%Z0W*zP|>1h#3cH<3mOE z@e|PahtAV1_Xass9kk?l!Amw!YD&0q;^e3K*UgWd`M6}V--MOIZ6`CA&wXUUa*5l$ zXP(mQxN7ZXYhM^>u2!5W16s8`i9vCK_XHEz=7yb$4jfaYOVg%tC`_0QIw&j>d^+ko zu9{7+jdyWy0(=hyvn{lzPzDqp+jbWZ+>SlcI;y7i07 zFKhuVQ%u>&pco*AII^nYH&ctlyV;jO`=ta#7@Za@2x%%*XmGf}dhdV2@;yJVsong1 zHg4y>T5rp@S0*Pfdt$=Ub!SV_)u@}l-+mAJw8ogD;m|${3411vAD||*wWTbm$O07= zGeGOpV{DIs>S7f!1(u{%P)z*eSR%#r(^#v@k%5tA6KJiG_3Kk>z$K-C!vSSRCx!lm zOwc-i4$yuxhOPqw0uBo5EF6tRi_Z86F|sfzIdF(fa5CV5<{6H52E_o2S4T8Jh4vxP zp;&Ic)u7CEg_WZ*$ow%Mi-5xd&;gsRQy<$w^_&3hotUEox-tuT5~7o_FN?s59iW@s zy$>)5I4HD(Y+P}}2i60*B(A{Xb$@~w$m9i}ssYkTK-w~*Z~~M8*6}67))*h)L=0dR z_%;ZfF!chL973R^=K%8Ye-@6$Kbx0L{o}i zgMdcyw=bY_vqIN_043MyH)RvwSUMy0;ooUL%@uZDGF`(de&h|>dI~R?N zply*2Ts~6fEtef6qr_SqB%78;L&Z6kgW5H(kF5Z;FV&e^9Q>vj74ssGif#urz9;$Y zm33NhC;6K4FVeN-RG|eIw-sbZBL0#a$4}}IbCOF?HUL`5tEZBXpsPz)%T-gx)fQCs6Rlp_hsbaVFj=;oI*|I&X~C(f+9?SpC9vJiA6d-u?r60*9E_50aX7e&eKDvF z2x?I^fYzVyao_>n{@~%ZC+?}fvMr_aQP9q! z%AI@esRnJViM0Ijpm}b|MB(cKOswnA5Sh!&PtWRWvHx!Wp`&K|`)WzZ)X#yhkygBo zi>$BpJ{CJGb!x5o_UXy}ni4JoOgp2O#qc+Ve0~$8nsRB!!lGxA%WpptVmi9Xg12$a z4A7WNrET8S%l_6!@4Cudy2jDi6mH?P;K9`vK}dPm;LyOz(a01d(+2ANF41)0n4-3z zeY-GIWykDPU;E89TYF^8&&~;*;I!bxf~=7BDu>ygp7d0oC$QL`nIMK40w?AQctl@3kb9wOBv} z@qwd>8K7!l7HBw=sj9*nwCOzZ+Lqgj7ykeIZhv#ZNW_h2X+ys)p<{>0_e^CpYO)r8vp`5~PA2{cny`ufVGW4y1u zH(pM@|8~Lb4B=&GrajfZHY1>HxuxB|C&7J-);5KUe*m6OGT(>PtKXImP;H zpS_r|QA9JyMJu+VG3NfZr6H@M3}12|N8Z<$tXKc<=kz%hhdu_ucJ@u57Hw{$tl#<{ zZG)sl@rt;$lS=mNn>r`_myG3$12&zIiJ|BBt61Orec(sr&d;YkKpO$AT<0&^*k)hGyeIvc#mbnKHHTW)y%&kvTsHSi z{f~Qifc9-Zvp3JLn)>DJYpr(KvK1fmPd2IU-dcQXrTXd1 zr^8Nt64jU3dVOo~?l9ArcQ$T~)Sf#z?(>mLQ{DbYoj?65PRG1tN7y-yvM4A1*HIU~ zOJ(v(UD+S9E+-(o&wAT~-Mx2W!Y`_CjH^#>e)H=~aq=FkzDcTG-dnS#E=m3D7WC)L zW$rcJ>e9a^o_u}mA9O$G)3?3Ry`}TtSSuE-pZ(eQd9+0!$C5Z$5%f|ilH-R-Wfj@3wZzo+Uh|8+f+^NB0p zlS?>6B&XDcZ`rwR=9Zj$I}ZH6Cwffpmz>jr64tx>=L?*u4UU2iT{h}~ZsK|L$jFpM z;6x>((}D+jjONY?cSGvF+P_Xc^JC_xyZhefs;`}${I~kPUaxeVobZ7cY$fv>mCyFp z+>L-O;#)lT@9+Al7lqSKyfR%s<89RaG^4z!k?Z_ne1=!Pxq?8i)GTcPAYrP6XKn*Mn3j%`PaR{ zr>1HvA9nYh`1buj;YF_XYZz0%oc|(ndDGMLr=Pt1ek?Xx%7jn;(rpfl#m$b}uTAYs zyf|s8QT4kTiju*FR~M?Q-AIK^l8_1;ctb(%eNK9&K3i0 zl}}n%oW1X59kY7%l$mThCLiNB^lNglo5|I@&V&f-PNz=MrJ2hqZZp``{dGyoMlrtw9 zi#~a(&+v6`7rk|SVY{5xF30IFii@9@fwue`O5fS#XqW#_Y3Kigu6H;!tn+!jX2stPh%(vj)it+nm1LO;cg~xxMa#XbzDlRH*#5fce(3Bh zvr`s7m&{MewVIh+vR~?wOr4A1=aBBZGqmD=z zT=mv1ITt;C@k`~-J9UA#?)9=QarxUPu4nX(JAb=p`Yipsdtqw<%Km>mKL6O`^J!=1 zrL%>Wz3+!@oGWgQd46emxcJT$RicjrBY(~70_~i$yt|{9t^cR%B&~`z?fLXd`dR;SzcbTsnXZ=nKX;Aq?yZYW-&Q`?ExOcs{4~4#+bNER zj~&0_b^GeK(%cn~x4nITvcoVq*>CgNd4_&^YXZ*6OtuSKm;Qd?qSCAWUw&O_c+vY+ zI`z<#o6lZumAa~Z6567WzP@|ox-TiWXLN2pbKm&xoOhG2hn~}}-6ojuqU{@Ob7VdH ztE($j53@Zz8hihmz>5Qo_9>sf?EG})($r^nuC7YoK6~kpnMYNOu4`U?er%4%<>RYB z8zgyH?#@^*eScpW<1twa`ngF*sVXlcG3Uc3+5}-+P|tO*%Q6(oq^xYy`asA6GHvFV_};S_nLPIXxyFp z;@{sE*wjV?=msIg)Q1D;xe-RjuZ9H^tJg~Zl)Crgcm6re(rJ+lcWbV_{&FPniSXZlGvw?4c(U{G{mU;GWWbh5+wDI4+B)xb%AViqzdpuw%SUI~=xKlI++(fr>3-ghC})N2 z4GU`bLRS&J`TdW5arW-XvL~Gsw!SvcC^=(oqx89>{MGSy=E{)?$>sfbm1i!BSDL@Z z_w}7M{ogN@8b80s>SiJIGosmNuiIhAT9(8o!nSOGfBs?hPB~Z0-6MZ{t^eQeFM_S& z)@Z-JbwxNHwCk`~%FjQcXSRuVpZ&XtomZW;)a`--Mw2s{nuA1 zd*s9M#O37uY>vi1UzeG~hCV=N(4F8u@c}fY!vgBV$I9ikI8+@)jRzT8e40lO{d1)&Fj2*=UVpnH-G&;{d#(u zUH+YpLEPOPdpBQK_^iL<@z#arQRcfAA69w2Y~$VCI$L^Oq>tw9j4}^g{C|>N()66* z`1RgmOgD3H%&#urkPh9vO-p?sLw5Nx>P=0B}%`nG4jjGH7|ZeHXHtp{PK9; z9dJ(g_-wVhJsYpAy0rQJ zWGcU6fL7GM7;pTC%iKwQ=*F=`-J$BcykhjWw;q{`KK>KB^KN6ot%5zmZWI01N`JWK zzS?!&W;V7erQ};n1cO$k6mFb%MiRQA?RMqMl{5G3`}s`ygUNzfHgzjLzR-KUY~wcD z(nAHBVQ;R?*tSOc=*5FGqSsyX4S8*CTHepT7v;2CqS$}Ez{lrg4r^he-QeBkVybHAY z@Zxu`og3GIcldprA*^$e`O>VH$4VBj)|1~G1uCF!i)eo+|m-Dx;BaZ*q=R<2w zhg@HGy{+?Bzc>@?+uw%wWa|F^ZP>H3Zt_HyfODXZwoy>+BCx%s+oxO(xX>W{T565TsgKVS8|>G<>U z)3aY^b6s)w_qehyGWOQieNkFr8sQI0!oKjfayGv4+wRgHd-9f#nfdOs-(EBv@0?i5 z<5%bYW!9^!dQ&zkzc-RQ{_NPUOJ=4AWQ^<5&R9=*b8PYQFL|%7T&rOB{_=a_orvF{ z?R+x|v-kO}eH=SIL*`elQR1nb$bCt@mA}`T$Lfoop5Dv3{SQ}TQ0#QSYk9lss`g)w za{He8-EVW-j+$&X>C+?(VH^%Y7!Xnw9PMz2^QW^My(EF^ioW4%xrI?Qw0{*s3t|dOG%4u!<`gK8DUQ9ez+T!qBvVTvH z&8aiL@|6Fs%PM|*wdg+c|MXo#On)=x%&AE~{=2Pnayiq@*4+~?&uryw-1Dohr{;g| z&0Wr7x{+Gz_wKt_vnJzQz!(7qNA z(1i6J)km%zPg08YC!Sd6Z$I6R*}coo?)0yffqN(QoO_>dQ*`#%#=J|n_x^T!?Jlk2fXj`z;R&OfbObF z?0g~;%jOyFe06HqrFEsnmb+6pLA}eKY*4U$uKjy<`_l6N51%c|o_Q(#^c2pYMW;@x zTV)yFZBRE_=JHk~E$-S*t5{(_rv)Cj>;M1VUi0^BTxIs-G-Z)nTPmv?t1?%ZWxvY! z{8zQ}*usaGRuo=N`O5veM{klXpP&5lYpe73SzdMNZ`MBZK5)~0esz2QXY<|&R^MV* z40xqDVIIfZo7F4c{4JXwxa>vwYSq=9lXtx`&8xBhhqS%UaC!LR;|t#3eO2Qey)tZR z(xJ%{P9F2+nBsHd|9oMlpZR|M(1xNw5@<|byni96dG85s-n-o4Xe?>2KXW8cSvBOHc$4FKA4{2E3*B_iMC8|>?z=|0 z&;BlA^nD`ycg9AS#}^z@&h6z+`FGg+Of|GsC;B34{oMTtoo9CDH@@9kcgB2XdvJN| z^X9g`$-T4hZ_G7{KkvVAHBB(#Sj=|hX zVeZ|>{!i%?Jn{peknOSHT=p{&CAbc{V)6E zsea-K=iw)RjGiAeNx!?~y1P-YtYyHe(7hM-_?gfBx(l>(@PAqC?Pr(PzV1C1pZ+?2 z&UaY@r?NfY7k(_>ZT97UX>-w+7RgOjXSI)&?z(AS`Nv>ob{QPa%+D-4anu8jqPrlvG(WHNtC7-Vy#)Lxmn?zZIQc2KLv z=Fo+A)o%ZFZ#ygShL+WS+j*wCVB?-W@4n9HieO%+P-B0q)#2BEY2EdiI%}g$46hgM z$~GvnSDX+%>D^Xmjwka}bzviye4wlO945|GV&VW_yI0`-K8)kb(dqG?^BI*>o~zH7 zoP5>2_Uo&g8&={)^=^Pu{)9Z?&;$3m@m3 z*u5%z+RM$)PChz5ZPtWRy_K4W*`6QW6MSq}=34RW0~gkRf9ob)|NpOj?x1msd)lQ$$*9=huIndS=dFhcj%clij{9jlcJ{=!jsubaKhA%sFp1 z#^&v)5@otu@ONv`>E5?bzcaJ8KH zqy3uG?CtkHy}3&>7ymkzEVk87YMn21yWGMvTTUu3`C_?LW^I19$13xeHC1K1Z*t82 z^8HQkSLxn@@cQ{*7C)A_v%met?{+15^JlAbRae(QPD(-oIk6zI$O?BzUFQ5Z`PA(5WvSsQ@ffKohQ=VO$f7_PJ zgyVkyMa2o%-X4>_<} z=9D}M^V~}ZY;se08%-W`+N{!zV})&0dnVFyH@QP7^uoI-&6j;2rzi&OT4$BF-D$zu z=<*Y9@3P;xcKw}T$jPwUCwm=FPg_52TDbWXA=PsRc^mW0)U(xpJ^$!8N9Fbbzwd$h z6Ae|e-Oc}%CjSQ=U^HvmSCv`PueGikzHnH(U)}H6!p4IAj*D~dzfCo-+-Z(F>YfCO~xnF25w9b32u{PS&_^|lvLa*NweG%&at>{Mx+H~H7}*c`UG zd26+Kt)8FzZD0AOGu6{MdiQ{;NBFVYdG#{p>gu!`=Ah%JRD7 zufFfSt3LPt-NMhm4R1;ny?##Q$og!>fRt&w_uo=Jzb;03{l0I@YJPlFKc=>s&0c(p zuI}`!yCYu3mvz2iD}Rz~`!xA`gvQ=5^WSUwTeAcH2T5L8zgzIhjoc^Zc_lmdY)$O` zIQ>@iw!G=h{C240>fO7(roPXEZe8>JOnXRfxOu45s?Wpv_rCv*Y|s5C@aE?m&fdn|sATs`c5A^$ z;Z2#J%NDa;G;{5iQ>?80{B*ADd+FTNYK|rMHJ6^#(wnLs-m&}Nn^&SO?~kXvKG8d0 zm}%$27kSd)ok&v9S*H|G-+7w&jF*ZH;FED#xBrQ2ahN%4?d0A+KE1tlf({CwnSOQb zlH1#Us#R2f0_ZTv_a9FEIdRCCiN`ov+iAg>U$?*dafs}hWuOG>kAwDXG;|-n0BYBp zuyQnBV)^o+%t?X2FjI<=g-LaR`mZk&+vZwrF_U9m`Cj?)zl6*LpZ2f9TmVB<_JCXOd_Kno(g{WwJK+%hm?5h!qXkXQYA>{qW*;-{RS z@B8gfA2DoR5_OgPZl;ZU)IkG@Ry7tbH`zt*j-)tGalw1F*U%>DojW_{-np`Ju1wJh z#YTzf2)4#V11(n$ksd416eeE}Y_G8ssLejf$=tt3rAzo>U(Fz z7+H$E8w50Vd{rZFox=HL0wzFk!UaGgsh*a|~4D0ar#R1#!dJtS-=^idnE#7%@xqt zu{ALTQeU}%7HQ<$j@kuUtLs2?7~akMyr^jDr-QNv%8-@83hk_BdAGt6zD+*HJF!dj z)YA=K&zAXdOtGx4g2XFBqX3rxQ|pEd9!W+PfdbI^*8*D1({JX+r6fqe7t=si8qML} zF37aA!9y4lN6^ctgR|4R7?^f~wr$>-CCtRS-3+>jhfy88l4#G)Hh~k;;Zd-?P&%Of zUzZLU>4Mf6yMQK5cz%5WjTh~ezQbq)TdL%tv7zdyQj3v_1IHA_id`_x1t7<6&g+o^ zIabMmyWYdSJ1?*?-PF0Ts8V@l z?B*;pf5Q*O%CH?G;9`jdv>C?ZYJv`EW590EdibhKQcN5z@ekJWMyDKm!~W#;`tKIA z&IEfuI~nLMT3WJJTKw<*Me3>l4)=>@tje1kWwfH++@z0fI`k;*g@r+Ii^?P6PGO{%3ZYcTr*(m#4b02%<8$olh`OI{dS9Xf}^egM0xtVVP&5g7~H3(>2d7AtI8f*`?Gbm2D|L6+_RW zI)CPsI7)+xQqR=l@GtVRFcSw$@Ppa5)v3qU zu&4fQ^VQ_v5H~lfD7;PX;I;Y-5;u2bMmHMXzqoX=Nq$-Csp5xhpwO5Ny0&8FtTUkf zBcKqm5m#XOG-n2Q>qQTz08?tuygoq(1qPbwt%jh-?B6rb_dP`PSC{&D=w>p zHdFL7C{D0H_oaz}>7a1L$2(CotsdL4Gyk67A(K)aJAaQ}QR-hSzFQxjP2voG2AaYZ z$=Gvt>)9vI&b{69a!MFz{8@lQfT?wX2M_2*2ZUh#a~=5dtk>7~5o8+dEJeAIh6&phPckH`Hp)cCBw1k5x`-7&@T z` zeY~3QZufnEK4pie72jCcezGf-J0??muA9k?OP3wu>o;$AFjj8+HgT4CsOR#^ccA?5 z1lk{cYLj6Gw5f1n3WH+6vL`P=TX{ajH3*!jPObv&kL0%5{>pWx&EL3icF?J(PySV_ z?YxziC|zCj(rc#i_5_8{jWv-oP3kfdXFmn)(oopK)Z(yESC-iwT-Y)+`hX5icbaPl zs!b+s{3hQ+`bmEIM=1U3^*OJ5WVRY>05Yx%qqTmi-H7 zr_U|lxwUyq&bDBP-;yb?X+NKLShr2a%5_msL0H~PVl*9AufAV{~ z19LQP|9d}wGHb}2zuOY^r<~n%vT0K{6O-A2wgwKSE?&_kiklz)2TH_3Ol%H)~(eUEM5eNRkZ_u9(-dCIl_f6CxX9>bYh z9Cl7hj{}9;XQmd1ndWJ1ECMHb9a68lN!EQ`Vx|87eEqkHn|IC8S--Z%+ic%w#~^N5 z`?M8Pwq{MdVmI?%#o^oUPfiegti0@I-flLd>|-vLe>OB5?`1g#idP*)2ac3Zvke@u z#3Rn=w4mmt$ZJr{Oag7Vxz}SW;Gkg7@`|gmPv1Jss{ED0yk}>hynG%vZD+ZSKw!w< zUtgcxuit)5=UboULC%KWNQL&Ihkj>b7x^H;eZ$Ye6TKY8=>dAq%z2U~kgKPQ`dJ@()4 zx;gQ6KSSAgWwr0ueRpO#o7iqPso(ymjoQu2-0!B&Ez8QVytID*Prr3iR$+C2-+u4d zdev>A!0TkV_KYEU(-#UzxVs3<@4f1LOuSzdC2}OBJBOdAYH=hyyQddKMbycI#Nt-Yzgrfi%RdS}y9c}bHJpDWfg+jw?G_*p-7 zIlXRfD`;3MjYEKG=E4&aumRU}M4hI^US{(RttW=d790C$PZMmItbG5dz z$+;IrlVU6%FnwHqUt#gOy^5=@os_+G;={t}kx`$Xs%obkJ6rCyX5&Ri_7iI)g>`>w zSbH~bvS1N7q0Q*DU{98KH>i*Sbvt6X1(=@hVm{Lkn#c76ZDQKi)5E}YO*G=`Gb>5+ zOt&LU<+n@4XPOo-db9ujzJuRc=GGrvu)=lD{ns)tFRxx*%Khj5sdbXYlh=F>bzKv@ zHumZP&{bUbVJmj7|%BHW+CzaVR8kGCC=EZ)tQ@XmFUu z+SWTuCG@Jaa@yVn`TUmakI#HqZ@;>_{^pj<;v;3R^b|_XCtS79z8-pNYqGk#&gR6! zZAR6{SS)`$U|t)?^cvI(3=&dc@#^fI3u+&LQpZYAv+S)+sd7VuFeoWrNX>F#Xq?5= zJ$;|r<@9@kjYT&W_NIJ08Sf$c-B~v*ZvHs;Tky8ud>gl}JHDTo!mh5$GOP1@ zUowej&!eV2D;ixvCH_e+0VY-LW8a`&dXT~Bq~N}N{v$z$1J9UR9L(|!o+>stv>bS` zF*xSB5MeM8?X|386BzBg(P94XuTg3zv$1K$An1a!pU@;^R(3`~(?761SCKkYiW zSUD{>Fi6GRZ;#cZ`_JwFEV23VL3r!GzblmaCf`oGKjG=r<>q&5Kg&&a7q^i%?ARsj zaaZsNIMQY_C{DO*M#Zzpf~dPjD< z$Lnjl%K!fM`_`Yjc~^hc*Z0Zm_Imkc)W%E;pLeh1e$DT_U-qZW__Mn-du?MEm-Oi` zn#q@?=j;WQ7TjC{OpzNjbzqyp*JwL%q};u?0n{>9h-Cz=FS{wv$nwec!TbH&PaI`- zJF)%#-+=6s?s9c2&de=NK4WC}>xFUTrZ=TOzu#Y5bm-&pXJ>ae^sxHwDx9`w->0=5 zR-a$~b^BSgW}_dAz=^#KiUIGc4{$*fheAIKN8_gzkvgEgh#o-=0vetMX6_7)dqgAl zd@-GA_qng*Yy74C(@S38vdn+&Rr2t3T&(8g<#)w4?yQoTQ>6ns(ZJz=A5)7%*(42>Pz&T7Xlc9K`6C<(6H*&5CNDoVt5kGr+TF_KvQO9T3{G9Y_uGk2 zS)1(V?h=00)ZKon-~Mk*_NTjLcU|S`68cOsE-3u&P6F@Vb_R7wn^Gg71^R~N42lzM ze|v?3T9Ke@hbmPKR-Ere!NWJ`#rnU zPBF5-doIDw<;uYLn_GbC=KkX$9nglU8kYdm%#M=*AR~{ma5U;%6PVV_z$7VnV^`_y z63gA|SNvc5bLXQ?bw$r!s;8&;Y4h!R@$_lY=Qq2Rr*p)I3`~9k3M@rV(^m>Ivh4fyEBa;m#R(i8hS%d%)wkH4Gjy05DxLb{ z>SU!?vSn9Qi%y+V6jT{OI`HW5q)!(PTf+n&9DU41ElN}}b zKu(>&pg5s**1;eF2Zdy&&+>Iaay36XJ3da=sWM3}jw*fdaIuR0Qn)51e;L@e`{ z%)Y9+S&v1)K_QdTX~B|{H$dl4fGW8;psTK)ybHEw;`*zLvaxHq@^u_&FHoLn|KFrzw_uuY0 z#d%Mx8-IO!r?&UJwRO98GHA2Vffz<7g<@MtUPee_&Czq(P;ebJGzUund$GEHX-QQ1dxYxT}v3@^q_S1&H{~wc< zTHdL$pyCB`mWL5E19Mn__VRe%T^7b7P%w)@al&OQzr7q5;R!E4O*KmWl`F{b{JWL= zuP?8%s%NrbDZeqT25dF1l>O4H-7UH|qqSb>Sd!n;A>MC9LPuv29`f*S-hd>zWb ztx6pSj+BSbHkhyo7=$L=-qsLflh9K0G4-wcp_RKEuH1EawQfPp?>)b6Y2DoL(DrBT zWi`u{e>pELTB4E0dA(<+=e3`!lj1NjboEqvtR2t6i_C8`GhAF4k+*gn5Q!g;T_$6k4j`F7Bj>YPi?txS~5R9%c@`db(@anG-)-r zHml&YGgFtIzSprL_sR$DC5JoLeqNR)*2TcYp#r+$b%n@nQ1JpTR$3fnm_Zh;W#wqh zxf|Ez%+RR8GMo{}S z!$?&L)ZXz8&Y${J`;_v(z23|Fj9zqc>*{}dnI3=QDD$HIr_--};k>luWZ*%mxTrlb zY3FuXFPi7ZE~~IP-EWF)c}~X9s7M7+Q=^MPF+eNp4eX?bK2ZghqMX;7GK?%T3Jx4k z8q|W7m^fTG_Wb|nZdCB%#)|SwXJ#0=-D&mJS^MqUEG|jox~waveKJ-KR%I5B|9-t* zpU^wM_FL+avS#);mAQVo`7fm+K}SMN04<-fs(J%Et*K8~fu$(sw59|ji;Ri`$CCwV z!CFilSA=$ap4a}Qb9r1(fM)hpr(^w+S($6o=f&%6ziX%eN~-$1jrXs4_haR%o@7=& zSjZ}PTSVM+>Pqw2^q0RPz}Bo|Pz>1B^aj+#2Bq{q(C9$OZcQ;p78x}Mjwc)1ftE;jMqyyV&u>HLZ2Ve9&KZFAlSNBA^!gG6uy7GiUXHb~J)~vrSxqWm9dprT`<045(Uq@GRJhiG$@nr%A?( zh|2eW`;|=CVruryslAptEo4{CgRP$qy3cosoxNG885 zDJBjTl@G7FLW>?>u@t=hZu9rJgS#8Q-6{Uwa_rhtS7@^ zIZreca8S618*Tp`0^zV7(sy*`ceZ+lu5u_m0L5bZmzi3E4h!-cPrWKn z`LUu?Q2OfXaD~ljep43r{rK;`;_0m-=n%l8n>{aAlsdVH;Jb6d|;d$Yfijz*b(JS^9xZd6?%SNBD8=Jy9qm#<%19v&Xp z-}D%i(QknE6!XO{0gY{fhNez{Zs)$XVkXEdCw4I?23$KiQ-G00N9V%>W&e|Z+Lf5a z{6D7|Jw0}DTEx$u+3zPzpS~yUR@AHO>-Ck}V$|N=nl{T!jTux1?*uKtDP^A_4{eZq z@@f#!Sbyti5~yBS!otxw=}{6W&UYSoc6N5^g$o-$-FzPJ8e)}l;b_qPL|G-p?nd9FkyRWRU@#nD)b&fdN{vAg9q!pc$$Czm8^s=LWmu z;`GeV@3T%?)GQ4y@+P(MmY?{e^lHY!^!eIPj?35kRrBWd<*Pcg#j04pyJ7HlqXZ}* zHh`+~t5%1qVDWef6pwlQ-JnAM5~#b|-9J~*;lMJc#q0Ju{&{Wg60-c>%*FTSPF{UJ zzW%T7^76e3Z(ml=FW>g%?Oolsg%CrDOdM%U`D<5BFnqk+EoAFuKi=kYX4#Sl|14Mj zxO{%!gl_g8pUQW?zP@6W|9|b_k!za$2m3%3w;gDCjq~&fWoXkf!mUBzgwfgrMNlR9 zlBvaE*<>RHCXO2}37@{)PPzGMs^HZUtF?Q1_I+A3CqzYN#z0uBoOtnc=H7mWPy9g zcSZa(RbD?u`1Z8at&3hC^PPG%TU%(><^=~-o!R1az?u9lB$H2OP@FJ#m!~ecp~0ar z0d(G0kFYW5j@JpspdR~0V?!p6C!Gf-pVygW{jSO&X{)+kQgzJIWnZ-QfZjK;e|Z|pbey?b;6l=@D9&YKgPFp~+IdES7!4fErIK*tv*h@5ca z*z$4i_or*G)&>4Q4H`l?;oit^_bbFK|DSf!%ir&}uYa@mx?H68%2mH)FFroA?X{lu zX~y6G-Ctc_KYeSdA!tkIguaH`cSH6ZZN0SRWZ+Al;OuxOh07X}pnMPR>VRte7QJ9) zCJu{Gh0BT;rs@7a@!;X(Cx`p(O0^72p{W7X?ou#-lre=&(Z}w$2x#mRj0ROu;Gjul zbW-30l`RMMG0o&_{PRysvh=R+H`XPfkp_@Q9T*scS*+&Xieuy7b7IOyjz*uv6ai?a zF6d%VoDgi~JC{S@flH%Ly92cA#;JZO$QT;03JnfIOwf@&&o_eA!A=Un5|W^yZ?G>w z(|1$+g4LNgECN9X1;j1~9lQm$_&^m?i^H|ooZ8R=m9d>efXQ;n#VMT(Ono9JLODu4 zw(gaA>3b3E5ip^&uS@G=c*yld3M`LKfXoM%4Mm{&L*^|-?U(200quh_ET z4L_`PF2sU_Kt?BpZnL&jP^k;b>&C1cjdO06uX1BxOb7XC@%a$gi3J=Hpw5cd-2_<5 zeNX`!@swv`P-tlA1vQlK#CU;9IIz!jv>Z56E*{&U19cbn+7cX^42;^G0!)!BrPshF z#*m8W4I3F0C-lzt&IE@d$ce739F01+B&NYyGv`DUSc=l_uashBnWN~y@ubHtSQQq- z395`v3fiU3u%VuY$Dp$->Nyx17?{k&6j(MD7Hh(Ky_ijinV>=OH`bxb4GqSik;seb zt3YGtVE?UAao|WfQh4&h0B^)T0`otAjivB1vFfei4h-eTv zaqR3;&}s&7&>dLB)Z!qP%X1o*5YxE?m@GHH59wuKItLoJahtyqdp zIv54^fPlk+k4!BNefBI24h)Rapx(!hol`(%9LQ3Rh>!+>6N`EiBcbkk;KS&okp6A% zDnW+>l1ybhjdg$DmP=YC?a8_EBW^?I@4xBtJ5ztTSbmw%Ty*Km^Y{p*$!hn7=2f4$ z+Pu{Jd7ovZx7Fld+N)e+H*nVay}J?S)-R=UJAZ$y)nT>0`Fs9J)!$ol@}g1kt%{qu z*JCHm>z4heUGQ4=bILzw?!z+WXJ+cmd*tN)G3QtD<~5%~PkDDw_YVDP{ps@g{VcEV z*Z;45`a+q1`ep0+Dys98K=Uhsv1hFG?0sOYSoA3OzscxBk`^TPazaQ7*>rXE_dOG#FZ26SQR@)3qb=?-Hu%Ewv-}L0Q%XK&4 zmOQ94`t|ByP|TGO6W`TaBefQ~Z>fC5Dw1~AnM1@nBe<3`cE$eZ``nw3yQ(pXJ1uZI z=lAWVn)LB0SGRC9uDK?74OFLsBBxJGfu*SAx27B;3uvfj%1<_7rkUA394YJ4l@?o? zvfSG9Q-9~*bw5A-5I(PZNaW5k$7Z&ow;kF~uLS$85oMVvdQO1p@Bh0UJNF1{NIx%i zTF|n;Y}*Y3kWCBl+LZE{ZFWT5viCe5B`ZHVEpR!WXw5R^!1enz`u?`NJ^V6i*X)>W z%C~rhb;G;4-&foz{=eAM`R(58az@FoEG(a`P(Ji~mMGKF=$^>WDZhTtJ7u-`tHq9r zW3Qgy+>zkVF~vju&1PS-zLmSS{QFnkeWp62(ImHKip=dp%Dhrn&Rggy1{~|02};PI zB2d5sblhv9_BK$C{N&pppmE=7+U~DuzZMlNnkvYos&%w%BMVbwL(Pwm%ZuLcIsT+~ zYW~SmqK*Vj&WWam#fJKMayJ+Qy}b$K0sX7QiGO{ev&yQQA5UcY~8yL@%j zyz0clf;ktSuQB$Uniw7{wQs^KuNM=&*w4;VzkL6D$hDVW1UkOYUizu`#QfSd0!()e zQn%^EZF2f{H$8vnhJ5~)Hx~B3*^+#?M^T6=wP#u*bRd+W@d+zO<0SKBeii`-g?N@v zrYygHK95g*7<~S;_xe3r@%4Y_zS;EIuPEvEwM*asT&}nY;OYd&ZR)43@9I1TVdPb8gBXcJ(tl^#nchulZ+|_o@a?kAkQ0F!4KMPzt%p&YvS&eUtZshjhZ6TdHU(3`hP#ocbq-kZ>#!#&-cU+8{<=#>ON_*y9>(R z{T1vzlC_3%>Bh@@r@xglnIIk)rPUoDDHxYMIk|7ryV%_<{kJ3P_pW_cQTcJ{(oLIc zNFL)JzZ&lT(g8|3c-sOl`%6u*d2%j~{fMoqpc7Z2F~3LN9Bw+%>gwWJ>vx z?>qJX3Q|1Xq#i%v`n?Fzf9tmA1nSgQ%@@9YH=_O3!&h7DcK&ZXe)xI&1v67;g{^m| z%-qiU{u@WF&Cyn)#4{Tn91VQzURxd)u_YvLmYMpSESvX7tn{u%oZr90WnOLK#+rXW z!ygt$_P<+xI@uxBTKc^^Z;poBI~->gg4KwRr7i35{h{c|J!q zZpFMRKYL|nar5zv7s))DSNGR{IhlU&{@nXDziSJOzgB-;=6T(td(yLm|97XoUHG{A zdTiOcuht=R#k*&lPrdiNjCa2E>s9twKetLXKG^Ixu0o_#zdcCW!d^Uhmg zUpKpNzr6JI%(+Sbz6Y#2zWr9efQGE?H&BxVTv7OlDX(-qnc3ZLxZD{c`0C zFYbEgDld9MCcbRWoyzykTdk}gJhHpA-oL!^;nAgm&I(&UPFlMD^ox(dhkhTe+PQ;k z%Q~5w*dOa!KA*D)r_{r9u~>aN*}TQ(f#%T-CASJ!oB zPHA|>+L;`UXI|v*;a+}>`{d&Faw^@^_o%(DnJReyOx0JeCx`agKK*h|{p1zN;-_Dy z=DXf~HcOCs>E}#YCA}NVZ;L-ZdK5H*vHf1%{F;wX%>&OXEuVWU&W%q}fmiySz`vbQ zhcBh(pO_-Kowa#ygnVfB`+2cT>-WzC%|vG9PV?Z{l6uD=XK zKf;W@tnzNUe|naD^8KoB7T*6hpPyHBd+z7Oeao*&pT2AHbD6#Q>CgH))7<6i!}k6D z*S;cqb>+i*5=aXLeh~k}3S}sisin!tO?N;&k4~BwockEe^ z&p)&D_TGaZj{oTVnx|;&q@Z1M|8cGVVo7yrrlnOpH+5Nprp>SW*2=R#E$Bx?@csFo zkKH_emmOzcdG%xU;VU-}-uGPSzyI^@(@Vv_^8KG@*ygaedY&%7?XM6E6Qgf$zUZl+ zywEuPij{opHqY-h3y&E-{*!U+{rQsXiBAPIuIQKUnX)xYQ~b+I!O#7yN%OwE{=uk- zJQT>0;?W?W;kDJPVKnptgQFw{OtV>dHbvD z3Z%C#i_YKYcx5iSu+^e#Nbivkk0Y8+$$d$%fNU=WMoWHTS&sWmjOh=k#;3 z*{o3?off3rpTGE?rD5F}1Iry38y}WR{oeNX+wGIr)s?W~%epS8XUn;jV^%jfehlan09xsz-ihTN8?tQfsuhC5bjjPEg`V=R8 ziurQMXlLE2H6O~o?jE$LJvHOO-P~jIMMcdfN~^~Pzs|cnYyW8>%et#`#A7cQOX#%! zOK|)5=87e{~Y%g!IojVb;US{zPxZM0?LP?({4 zI0d#A0KC(4f+M5T0-i@kCZN&YhUu%2m&V7UL9(&ZC&71YIe`+qp}{r3Ak`o{S?jeqQawfJ4rOuNdQwcHyoIw^b& z|118@()`gPk66VCyClq>fBXGp;_-Q$=S1Hw`u2YRf5ANpvb%y^ui8{zGCf#6X@&o; zuM+wdtGcV7&#m6}#d7`XH+w$&f%e3ldRuNUvBx9gb8;C+N?85l*qA;srj^|DuE!Qn zHL-fZ@blSi`IJY!#;&>HpBFcE3p(phKXzP3aF1~MrCxLI)UU@rs0pu=R$D%=DCx(4 zzwP?Ry5}rx^nZ21jV_u1mkdyKnr+TLGnJu?l~UR!*j zjen<4U-nDhwrQub&)xa`WUKi-p5G;J3YvQ4EHz{*q<$|m3sF2PI{oWZy}5pq+N^W* zL#6LceXV{!==Hgo+3vhkjCaowk_+Fv{Q2GQc9VWTx7T}`zphhCY2|_C>HWq_V{dO- z@qYJ;%w=q0C>i4WTpcGYm?6KBeffHKyzgOJ9 zoH6fYo5M;u=Z`&CcigO~_ui7McCS$ESLK$^n|Iw#e|2{Ib*t&~Z@=YvS#>SbDC-OF zr;qCM*~`Pr_xbMoH|xRsBeUjbB(_@V^U2n%T=DBiF) z-&;Pu<9h5`m~0Syz18@!^8I@;Zzm@%R%_7@lYYKx)jf^owq9;~E`tSN` z^YKgfLHD_>cCQva2o3+X{_FJHS{*_CYoqrrQ`$54rs9OizrE#!H!Bn)S@VsT^-WIh zvr>wg{V{3zu88{2UpRwqe3|jV?7YqYq7Q{l3;kcnnx%bJz2$l?Ia=&A?_>8?W{0i4 zRsEMkosXY7zyFWaoL$dOKkhvk_4?8@qr^8KqRO|d=&s$IzuUj=?_2ZC>&tw)?)au` zk1hB7;ir)7ky+F4apLfg9h#ziXJ;7sMajPA%@cat^j&oNH|~AE-CH*=JfF-xf9=fNd$d9W*m0=NixThYipb4Ornbvh6;#B3wT{SL{?3A{HpIg^=|w}rhn#Ca5A}RrETw$+{`|DH%F)L|w4UpI zop%^Cf63}^BmcE<)~h>K<=1#0>E%rN@}b4SbMi*mekO$pmW)md&fGKtojp7u8&t}~ zRaNfn*Fvhfd0V4C9$#kv zbe5s{saacJH~(LEZ!4(R(_F6Rvin7G;{M{No4U{S-#S+z&fP11G|NuNFE(KJ-*rEY z-XCN=xbdo0`q?=eS`5MSOI`;i-?4am?L&OqYVM}Z={_A*hQ}k?Zz@iZ{2Ti92)HV# zaeDnY<OTX^@x^7*{x%+8X#NYl&`y+R))MmwmGtfM{4U}hPoI52}=RTTy zeX^xlQf~IQxei%!U#*|Ex_UodmRY>$o~rm;!-9ohCA0g!#{U1;K0oEfiI1QDvCF&v znP>XCM)2+Tf=$oeSI=3V{Bu^}J;TQqJiUR}?>d^^Upei}oEC?Z85?z>V;2e&59`1;9$;r^3W@xEu7o>h|`u5W6+wv zo&}NdTLbmvOG=Iz<5-ipPE>)n4!UDk<+O{$6kDuD<%@9dl2=uio=M)8u-J^Ma5* zMbmtn-Hgne|Yt4NeWNTOQRcgP@pBuqJfj`UEF63yuG%+EQD^T~XPEfx$0J-`y;X&&XS|a^3FPLblJ&uJAuA`o21&tx)N+N>urpw?bc6?5yAO zK6O#@wNf6{sA@f@1-s6jKl#nswyyX^2j^C~_ode)m!JA@a5}5}ZLznLGtQQ_I;73j zzw%2+a`n2;i>IEu-1%?2)23RpBh`?MKn>N6651QxtH$5-0kzU#8` z7tgOsVJqg{Ex$iiU;p#J!&0E>~&v zNPkD~eFp!+g)#PZOWtgKF85IWsW-eG#{;Tcxr#?R2H}%o8vst!z`q7N8`&t~1 z?KXI|OI!2W&MOt_UfX)ERtZ_ISO0cf^;=lywaIU6Hp+2|zfY=LWP00{#p~&Q_D8K> z!BuhCtEw;289b%wsrx@yd+gqpx+%E#_)0aa_FH`d8c6fEEJivG98(e#+CZyIiZnpU zY*GKjm9Gm6(qco5tyzrX7;aUsw@tb8Vqwwsz5MO+tk;(oyGxpW;mW+QpzcS9=k|GL z>+_~`jLV>n?S=2MF9FL5B9q|78uEJAuK1h_>@}2v!Zo)1(cJb3X z_hMyCyMO+g{r>67bn%nM=l6+h^(*}z9JzX0(Y>ANo`H$Ug*#&o-t8@aw(@w2@9x4a zTQoA|KIi*%=V z`}Zp>=JS*v-IbjA%24F|jf#C?|I5|x-JkTraPpgarV^8EDkdA#eJs+`kF zI}`t`c%UrRE1%3E@>bR+YyK`Lh0W*0v*wkY?@#-=Yzbj~+Tyb#3>ia+M zrXEnORl4^vaZf||=k;a1`fld`T=N&L^?0(#f0KCGzCW*|C2f*oejJKv7w(@Pn*TH9 z^Ru%D7cR0b(z{#Lqkk++d|m$DpKO8U%|~`KWPG!3Jo93GRPi3}>YE&mm)?4xu$%Z; zXQsf38^NMnwf_(I7ybXkx>asr*yq1)AN95^`@HD;tp3RE>)S8fn#|eg^m_&OZ0~9N z)V|w(s5rwt+w^{B;vQrF-o^Wbg^%$}uKj+~`qA!%@3!p9|Cd~Jf6wtl_Sr>eCK}~_ ziU@4XQ#ziy=<88#jaNlmE`5)^n_2LA&hFHM!spx1UioP7;?uvaP46!7*Z+B$zBBL7 zm4pJxUlQj#(_}$y**`aTB+SpS?fiEy==REnv{z?#emb;hsbP6=f6MD@TZ@mp4@*9~ zv5x(U=(ky=`#Q?wxJ1LR|Gb#>{AG?zaH*{J#d|BoZpHoGe(>Yk{>lITo|_8p#m!JJ ze&c$3nt(>E<2O)t0F95Z_=qU57zs{Z2;y{eJ_+VX;qm0N-ZIf=zRk94k1t+nJzD+T zR_ptn{}~atB)))}n?|L_?tD1Ee#e&iUtZSwIqCQCznya8=+6t=I^%8_#w}P|xk5r; zj#vsblQQl)=n!)m>?rHW>^SR*z&D{THH{r*s?gEZ}*Eo9}EMpfBbj2-~M#RYV}jc%I!Jw*2`&@ zUS5)|^lnz*!Bf1!>D^ZMuBZo>pSn`owf6PKieuulr|;hx<`!eT^4jAkS04AX#odeF zBUk?6V!^AL&liu+KY91Nt=nQCSa$ltxsO|8J~DMxe2#efd)+J3dD2(+ zZ?)VvHKs5!9#m^KmrJhr{K$QNjaK=+zY|u>Yq7h?^rvF$>{OZDw?B*2FKi0GKfzFV zS!;iGsrkK=>RYGI-29H`|77c*wU%PW}4w%kQZ4|zC^{yFV=MVue^;HW*j^IP;&3p^5R>* z$xn7nlbc!kdha5+?c%>y806h4bBx~I>48LBvB8_9oyNW%K@pj)+?|*wf z`R&6or9&7eJF6v#7(qANbJ=4v$J1$D>&*`^oqqnQph|H2@ntAnph4}5w zqD(U{PIozUY?q#%+HSV1&6oXh^_AOsIM@~~^xspuVt385do{aPJl2@lU$tcxm*=-z zpZE8B1<$Xj<<1p<&s3-M`T8BTFZUJ*N6BlyOY6;kyYAI4*u0HR&SE$A6IZ0y370NU zI@=%lb!qWL^DT15``&-NHc=x&EBoZujjPW7=-V>uYuh_6uj?ny2zcCOHBY`a_tTfn z`mNKWKCknCY`yl1+x6aEULiNce(g>F6T7U=yj3n-YW02b*bBkGzQ2xqeb+E;j=s=e zTN(Wt&u=m_U)A#;iEfWP9rs}8b5RU8o&n~eU__x6Rzf@VEjw^eNy!{CxuY&UA3N1EV|1J1J@=V6h414 zxBT4t&k^CTZ5MtmEPA`5aqGJT&o4=@L2DC~`|WkVpQ~PTuJYD)>$of2Po3YN;*>r7 z@t4@Gb8iGR?yU@uwTa)8(t2j^XU3l|pU1zt6H^<0we|Dg@Au78uTmh@cJH(n^(?nN?r3TsJv&@@r-qG!GeLS zs>1KG)>cKl@>6*Hn0K+Q-_;$xzwTNV->R_ubD_D}RH}aZO6!dM|9Eywy=MhsdrQ-~V)bKe;I` zcKZ4JdeIvG&Rx3~+`c)t`Tgq|)z@og{=aZ&LD?1ojVo-W;s?6*b*D~!y1Mz{q+P;p zta856@|x<~vUO$sY~sG%N&eokPPM4eZcDI{;)GkvS5+qyd<^z*`h;hBeu5oy_|Jl{_)~nLTk^j>E83Q4iu9UKZl;p&H7dM>*w=> z1&Ut+kF~ZQzf#$gcG+Ufy8CtiW96bhtg-og=h1_Y0>AEF+?^h7x$o=7X`GGQa&9Ue zcK4n1-R_6Rj*?RIZZ7SsvGu0*S_WozV(XIIg;Tzqa6G7>e(U`vzvWw}Z+)%hde<>1 z^6R!8F|0v%_N@G3w|(^%4b84!vFk0rQ>L^WEuQPb8S9d=io9Ev<^xPv|6jO|jw#<39$;VtE!^RR_e`BYJ<}{UZ_s)a z)`@}zvC-V>7ug{-oS^R$Tvv? zP715bJHA3!eKafv?K-@g*X7E<*v=`yWVz;{q{egs4dxX*pcOR{J`DmVl6W^BEaGU) zx!~dj?v*+)F#hHcV7j?{dI)IshXgA}qlFr%DGBlYCS3=PDY=Eu;IaKmK!N4a2awh` zpj}w^?*&0```}PW2xW9qSY6gu3UiJ!XywbzvMx6Ukd|*!?$`0MpIw+d~k`O+eQ@u9}+&+i>{61GGDD+uTKh4hIxLtJO12QbC&!zz!4> zQefE>U>v~(8FtB!C(xVEZ{DK+9^mViR~FTm{sin90{DreEv3?EId?inBoL&7i6# zta1SDlD)IlIq2@*Yjrk!=S1AtKv@nH?#n?-xt3nO(#gQ&Cvu{Mnv2Rfq`kKuma1exwgj8@N$p?T^*EoIRZQ`ynsP5 zpeY~+o^})_m@~CFR9@Bs@8tjmWSD>g%O)rB2++9l1WC}4@(v@=`J|vUqR`;*4z$NF z{rnlIeG}S2+HaUl1Kk9uqT#?XML}dXG}|yRaXjf|Pz<=YrK=U1{u)F<3$!kK~mznuX&6{MmPBoIP;@kuo?^;u{1sem^?{ z+k0B66i;@u#i5q;?lsK|WccHnj4 z>zy-aMk2}!ffJJ&!s_eipa0$)x%s1o#by;r(As2B`B((H^7*sa2GDwag~d#A{nc~S zjO-RqHURB$1|@1xKCl$NAolCe)VpWr%tP+nH_ibS98>0>1T6_)!%<<=`qw1(S6Zr( z+QtnH+h%v{o1bxOpQnD%bbpsG=O^9kmlXh=2{!ARkIT0%+lg_iyZ+4i*=hhTMrs*j zC$lp(Hi^EzzW)D}GdDRK&s<4?t!_QBl0h-R@8?Vz@S5vJAMOk}|3H1gze>JKe7h$9 zefl}v)Tc1M%$cE)hr7bIHNHFJ_t80S*Qfo^((*s`!AL?5wAFMfgW`m>w>%9Yp>7e~ zAaLU5-{n={+O(Q$OUA`F3l3asid*zjy!%Ar%aE0wKGDzDOU*nd0on~UQ}9E@o#UBG z`Nw2qC!em}x9axeyyI+OqZ~o)F&3~fECL&P8IT)19)*R8tC`MT^%nmdB)Br2t5eM4 z(DU0LCTb=daxihs(0cH7*ZOd-ecxbf0fb`nJQFVT$FfGBzP9e}k6fnPn>ay-%OI8l zgPRTVpk~9DNnW7Jhh>iTgRf#`lN+vin^-EVvc?Ku{Bk0;H1f&n6|bgTn(?NEfk{&Q zgV=6)G2e6E8A`EfKeSf0sc+Gh1{J}4;tDK9KNuZ;f_=hq1GEI$@9q-Fs#|qVlk96b z_uooqJb$_9tB_#6TGsWLs^z7xSBa-4R-BxYBOI5((bemg5T->~H=Qdq|*jZ^CZur;!TjgwQVdt#e z;2^~mm;cakQTBTk^OkQt=i@8Gihge}1qFf)qm#n(uXDN}$$Gsfauzu}mrS9?7))jRC{VJ`3 ztG3@y^p33jSzW(mgZ^$%PU!+Q5arFC zcRs$-(dhAJT_%o{@B@!EW7cr)8|0=q>*}9gU_uCc~`(simeEP! z_16|rP^t!1)?G|34w{EHN<(ZA6a7%ZrGL$3xAxJee}A6e|I6{})vNoL?6BXh*x(?> zvghc#sf#>kat7~x`Z;`MA(L9qQ2|g_EEm*{yzIpVYv?&C^npttMwU0q4?c>-F6gX_ zU(;0*JMW6gOR3k-XPwY}{U_A}#oiUC0}CHvOB{G1&6_|n&Hw@uy}`98TbLvf;q z_Wu2^bgMf8Sed?wXlQ2M3*%>rGu^mLej95{DyY~za0GGyz=>?oktTWa-JnzsN-dzx zdNRC=c`{$`7agH(6E= z_uM;_wTiGPobAbz&F|NI*1!EAfP=|Q^h4F1{T(Or0#9Gw zqPpm{Y_I)g*Zm=vpE_LJVz@EFWMb;;KcTWYr`$k`^BsbiS{ytJHyT0`5=TU2gTRSX zcN25L#SX_2u@4np=PtR_Yh4r5i+#Ui+oGz>7teEV%We8AzyH0E?URd7)#6>RZmm#m zXxPfy)jeBm=a#0g8^cz1&sos9;(cv%)a@5Whr@sFnm($0?u_%i{yR6W_z>hPx-}u{;QPh?=yS(P#sse+Mpf~T4_z&v2gT@d*x$%G*Q;Wm4Ox0FU@ylW1aNu?BJ=Us7Q3)~iaYSSaP{t=Qm!J4G7s18J0TmNje3Kyu&_-p)6dmjt|~t^3;91>x+|kxV!QT@WwLvhZTj?g*8h8}LND8H z%h8m0!Nn36y}j-*S9ZurEl|e31KLZsk9`en*}jjE0*evnq(q3rPAmWwz?;;5o!+?Y zg6r#7-^1-h^Eq{+KJdCUUm$kYwWz7f%D?|y zCEoV$?Bl}uD>`+I*V)7c0@9rWZffIzO}<-_14C9>pz5sY;Okd zYEsz8pcqi2ybTiV42?FR{^Vr0jgS!nzYtgJs)4n02=dSVEV|)(fCMuBP%pepL8-P2Fx?*f(*)7xE*+1YOk>COK0c? zJ)Sfh`b}xO982e;O#OrG=@>|cv+nUaQm9&;aVL~lq|MCw> zU-=XspV{?7wXS}v{%>u_xjXw=I2u2#j$b1N%6bf-k%$i!cf3s|^0oPf{r(eroDozt zfO6tZK@H8a@~fsh!(40()31Cr+}HK$_2$h=X^sqyHDd7U>)L{sMfY}ft#bdo)9hLw z=*TUkV^=`tL<(wr+#!G2wMs(m_r>SyZ&_<|CxAvL85mh)v_8+g^t7de|V&=0;Hm|RRhNYwm`hb&mLxV5tEc5(*(T)eN8Tpn^Wpg=YGSNtI z<@AJ|cHxc>)@;o-cll#l-}HO4Bol{4#DUj^^?FL|SJf`aefz0hZ9Sv)5~wSNcDBa} z_Qpv`<^Hjg-IbgaVt1`wy`oALeHsNbhNCpq8tCk zxj62s+q!;HRaY+8QUOTo#z-X~Cg#Ser$tk{G9e=7LpCXef1TI=e+?wN8t z!5w@s?4F~o>${e1UE8|wwRVl@)wc}bdS8L%kpwieF|u=3*yeqGH$SR=>6&hxufJDY zS#>l9LHY(B9t&JQKRe6J+8D&?F*D{K!xcQ)*ZqcrPkk|ZEQwvE|+|ncK0ekvTW3egG{~Kx4%b+`yzaQO zGexaj_A+%5yYu|yOY>qT+p8$#uh?C;E$^yWSZL_qncrscG%zr6Tmg+E7l0fd1UhQ) zZl5j0nGOeW51rRwYzV= ztmianbkTtcGzzA$5!5XeaBdLja0Z=i0J1(uJ>XH{`m3&9JgvE(f3ALYb6o@%IMxcb zI80XaExT3s`&a5LIgP6(YkkB67oO)+TM*K%_O!8K+p4&|4nJ>gy(&N3K+PGH=aJ5! zatLS;=wJrzM~B$);Ny<dG|fsHh*`MCI_f2I$+3jcbDhEc6qUBJ7d-b zU2N_z5B`7uof<=p!mc%!O!w|dn4Nv~)~Qq5eI+J?EAC(x*p}u3(BT%&(*8Fg;dLYO zz~jto5yIDxoe=QYfByaYclpn6t>gt;Qpcn_%RE<5LqkI}R(taQeb>|fZ&`iiiT77O z`Pj*!yVgzr{rBp=Eyq*9qbbhtGs+5D7!)Tc-}0FVvBAP0)cg=wQMmS0>Cc{FhALpduZAYCWex{S%~< z)e@2!ofM?ar(Xi+NP&V)4xPtqoArv;UQ}4{I#)|;Rebp--mT!$4ph-}n*{KPe{t8U1;y{+lfsZ*!c zUy_~t7nJ9;LDMT6wLv?*Ke;vtXvA9`wE~HQCKfV5b-=U?qZ2!l9qwP-v*^*=Q_!lE zfssW>Afx((;_d(Yj_dueUfv(4Hfu_kp0)ah>^Z()dS~qjd&O8g_1&$oci;E_P5hN? z#Kgp*kWdTil78n$@efsZ zzjx^U?KNio(&VhArDb>e57!KERz1K69>s||5Gr+nDRtJ0-L+3LgkSv%c8L@9)#hhm zTHR;yXvU{jZt*;0Xd=r29V)uIEQkkmnqq^1#_0z>@Ro$=hbr##BC*w0NnyThziUD_ zZ`v)D2A-umA>R1t(W7SWl<1WiQ8U-E-+z7i&XTSA;<53Xdf`9g>;LY~0u|goQq#dr z;@hBkv29yL+8CISw>*IA=yxo4^1k(VYqf#0E@th1_s3d zwg5?37kQ0pz@tL@W!+y4)@4N>*!ug|*Vpx1uVsN7)(sA3ET{VHs-EvJyR$FkGIQ#y zJb6J)(TQ(;XY7tLsdZIYuy$3re!#x6w{7}9&@#-OTY$-O*I$u-2Bu8VJSyjjci<=n zrM|{Vj~0C{^_`y|vr_LDYhC?Uo7dq7xWK9Xl4!>5ZMl2z*Zp33=IJFbSKE8OCZfOI z%zL*(>C?m)pH{7V`Sk0yondQNuBo}-Vkikd>S93~gQ7q?s24f`bok7xvNxc4R!~By zRJyRpb@G3fZC8J*CGFg0^Lq6PD`Wpt381lS1}0CgDI%glpkk4Mk>!)ef!CTfjxMiL zVm6(Re<~zs+wYaQ66{+;mOb|lIe}YC{QIuEyYP9-d;gC;vNh(*0qIAVPSx&Pb@gTc zNe-~ulN*}9g?sHh+0ctF! zG0FK~R*tE1Tv@fef1TXNWuC#pUU#$>>0fuPJ}b(x<`VZd?e9Np{?9Vda|Q(n#}d%A zk&?`AQ1emAiQ`Bjs1*Q`=@ZDfx98_X)^!d~s-;Y3zW*HhwUmVke12-BUO-4liNoHi z#-NK^AI!De<%8_0zAf-`|t<^%Z};d1?$~-q8Rwgany{L^^esL!qHT zn03)VdpXztcb~7ncePXQ3TQGbB6dOO}5H`m3jT*iLt%3V99sFfXY35RxRyG(z& zYuVKNyQ`*$hlbYXADY1f8lh5{pvdU7fajo*4ikrkQ-i<>!Q5q_zyJkR0MorkhXNO6 zPVSZ3TEhu*%9`B}eY=C7|3 z$OBt)Q#|A1p30YI;R}2&yY9X0-fCC9d@q;pK9Pw}qa3Pz%UQ#I)?9tR%vOyV6yO|B zd>RBa(!cohFff^crY#+XHNhnms7x2v__*V`TV?x^=XUj14|et+ng+IECD)WGBBI_3 z0b&y#RM&>QxU6w?W7eDR-5HyFu74F}ZEX6q_4W1j=7~PwR+qqr4$#q9QU{F$92E3f zIT}B0%GCjnWHKqlOH4*eM{JN+-%gNwK;Y|cvUE(u?mQ8ja2 z_N%=4i+wiSTD01_)+9GlK_DVDF!1j(&SWDNP>-+y=}?YJMF);4;<-uCri4PmG>7g- zhs+p#qXi|IUQVvr_iAI>*~1o~gb)nsO4NBc9^4jmajQ}67bD*-O2#@R6R(^22EWg* ze!TtuznHHN+vW2NlVgs7npXlF_Aw|<_*#90OVHuKF3_OHTV8E&LF>TK$irD-`>x#O ziNxU#SMBPjS~~}W(uP7pbYt4tS#NJIaCBU`?DZ?X`9^}4=X#P#CzihQllSG`v#&J! z;Hs~$um8_FwgWu&sW1U_%Ky*n#$ljSl?4@8Hu>pCfSQw_Op@Yx;I-}?-Cbq|NmjZA zE$6pCT&$zpoC#{4?-8;1c0;-B=lA<J;x)@Wd-d*^yDryfTP#ZGa#4t9 zG0F88)a;2__iy5hPp9JCU2P_Sn;x%lqNE7nuj*WH~U{#<(f_2~PeKbDuwUN$vz z*NWY>Aul%1=KMAPW)28S3%rv*D)azJ5sL_~q*(F0IC8mRBhs0~kc z!{z`*PkpGEwbOL(f{@EhsZ|DFCLZ>QxITZ@iBAnDihL(uuidA$AD;A>K?_@Mlz6!@ zFkS|=m=~ugfUc_9)^PlD{hPb&B_dZBvwg@HiV_GoC9K(1!ZK+>4g;g6mpkh}F@X>k zkw6ijjD-?REKCbkn-+C2EediG*r4FWE~wI~(x9*);jq)>dy^`k^S#?;ee=z^X*YkJ zwR~@L^4`v;<>`;_|J?E2O~va##jbz`CXodUtQroC*-Sxo|Ng$L{+|1>&2O<=Z&rKT zGxPQyF{6}?w~og~U(cJ=*sG|h7=8Kj_qxZu8#nrLf%J0NFt#}~nlG0TWYu_J$=K#F zZ*!Wr$O4B6oCYjhn>e2rXgV;06!LLZ7_oG9bgYP4(s3nbQflEce{Kdg_TAADA7hiY z`p@g}RrR{F>GSRU{d?amtBT|Wxri&^fXV@Z4t{13=Q*nclV$#KYmj+2L^g;qxwhSR zHU$|Ca(`2Rg7x+XAI+=U9DHY8(XM~&w(;2{m8}gNbqpJiMt4ZRC{|5aeB;sEU!|4q zd3o<7&99u)(txX36Yqi>nD%KO5I9l(yv=qoIC8lvf)2zgPBL_W-8a8`JKb8{-xdVS6e-bN)QrB&jZO6Jq2 zTyUTBQrUf1s*KS-#wWds2bS4J?!3+TWcSjzFegYHeE4sYa~QCEYK=^gher54aSa_7F2{e1D>+(Kp5Bjn%WP5_oWJ>qmptdEW7(CLw#}I{ zr#o-e^sAusy?}vrkJ15w6WVWbrZ9V{UNYIyC&))B|t~mA7Dv}WzW9=*wOg}HAY|s{2&~TsAfaTL} z&E$4X2gZ8A1db>A#z*UdAbIkOsD=s4q*RBZNA@RG{%|Esp3>jDu=2(hYjyWOGojJ1 zkO1=Nn=3^LA`2SWS?2uE=i~p<My?%N2Lw)pI^OeVm>^Lap?Imd0lQgpAc9OSSBjw9({70Ky4-C=71 zK>pgz)SAn#{`C3%`TNT6i|rQO0Ldo-3MW7z`jh#gC}E~gPo=B8xdBG2kIcHltnjuxdIOS2PKgEb2c9Tr(E#% zmT5}r`{UQ%?w+vwy~4jAkM);+PCb3Et?g^};^g+|6I%-2~Yn07upzFX6w@qt(Zhsd4J=Pw2~Fj;XKuv`+H9?HJfAui6& zEcaexYq$NO`|AETOI8H!RBAiM=TgyJHDSqtzw>RBjzoSvX{Gb8Ky}{h|15GZuiZTK z^vum-4-cP%3lG~rI@(yPV`u;Cap9hi&y-?z6-iDOa$n@sTIBdUr|^Nuh2RFo3G;TX znGFuNCPz@hI%9O)gOTfns=$tXmoGxedqGY$0Xc}{Xp+bUje?(_M0INNE$t$IFFj`6 zu*kJrG4I3XjO*J{53o7z|69eBEEN3Vcc=ZtNj72^d!?d&$XHhKBnvHbXmNaXUVQI< zCV9QsR>%;q6PCCI2xYq z*%@&2(wPd=T$xt)UFA-1qf7%YKAS`^&{@I_}r~57vy@bwyWVzJZ9~ z!>@O*E6T6ZEPiiyqSsuPF=IEI%l{YrMjkdY@TJTHluR`DN z8wFT39_(OnRycmPf*q8WxdINvfKop@$eqZke}g8d{^Vf2qpYy4A$n7dsaX96rdPvB22QBr= zdUf~Y?dqhbR3=Y@V|A>6PpD&(9_Q zy&k=x^tIlfiZ>Q{cTOCZEx*(E>}=A7zYqIXlpKE>_PhGekM$CB4MY_cg(gjQTbMP~ z>&E}T{1KbWY>hS-75+RW>f(0A{r^7y1%7L##7a97d~*7i@9PrbJo-hGGvmery))sz zOWxlS)aQB8y#K#l=f=*xzX>Pwpq^B$F`PN^(Rkhi(CcC)AV z8iT6re@ScNcHet8(}JB}_TUM_lc#DgPddIJ?rzjFtCYxN>)vmgqVV#}%*|oxhpz2( z+5J7`;ngFV83FtG+V*_Wv5Wb|x$W(Z&;@cEkKS(C=p484dXq>UJ2t!x>RXJ50*HZhtf`o&?kn8dGBpEct4L^M7+^!~4^_Eh6mo{JA9 zr0rRjdQaziuzaHP;)c&mJdJa8TYDVM-;guR7n9ruj&CW6ne+1&jd z*wWUPvF?Tqi{ZK!!+ZMY_`POLTDE4##!|I&ZN0ZA8Wpd*de!NX%{8`|VpJa#hZ$&ayF-`+jA0?#1%QVR@qY>l^m`sS(i+6FL92 zKIo6Tp4SwOzQy)($CpgGdCF_HyZp;0#=rBnNbEOUpcS}BW71@|#bIZ6>%KCttNZ)Q z^zti(zz4s2r7LRRIW5i4694$~*ZOSoRLRo~-qo3=e@YQdH2fG&m4PxB)U}8 zrmo)oe|5mUq=@%AFkgM%DvqA~V^mjneQu~h z95E+@EZ(7~Ed(`2XXvevj`QHo>eFuMP5! zhTYJTy4d!!tmxxmwuP~`r$x;UJ2ls`nvb(n)1u^uJ5RrCN1yDi8Sl*FJ5zF3n+IOF zXgt3l;^HE{ zof`~L3X^~argvfq98dBBuemdFu}o%gUXU;=w{I$w$cGgS&IR9u81PG9S)H+k zFFYq(%-&4WJnuKwaTvE}~r z1MT)z{N$?p_0poKX#eqj%HNjN!~JvEoN@#lOYbza3P*Yc+e9+AmwXOfj!%I)N`FaGE=cb4hu#GpqWAu9sTspxF0ir!ncw@B~YOyl&mr@G7Z{50kE)oXW{h^6xWnKdytqB^&v{LIp+$=`YPsuQ#v)Oy?}{b$XlN5?B}a&0*B(<51E*`q5j zjc3@YGV)4a*=iMd?Cq-~ViifdcM5nOdNSpv*N3k;_v2pt{BfA|*qdKHo7uQnmN7Ul zI4~!?57ITZQ9mGXqWD@)CzA-uD2Xzt-cTk^B# zk2)I5URBu7t9evkQGU@V=jN_p$?D@}YYl%a{ihN4Xa9sF66-{^b-CTyu5K&+Sj{i| z+-FI1H8I`y*{iOk3qJVrvN6tfcQmi_ncvIo&L97?NAB~kv+A#Zea-fm`&n<_y$x#* zc&Tg@y$fwru2!5>DSwt(Cvd;v9l_NVYW@=@yFwQ)Y3JCaAe7vcMq`)Z)v*+2Y%E;OXgbgW78`Iseo8H!WHo ze*XW%PPy2?H5q|RKmGYrBV$>_({2ApBB`|hR~N_n{*52?wQp~h)c-7M6>DYNFrEFY z^F<|BojlRi4Lz&lPTdP*JL$Q2>IdhT|8uPS!-bbSvV)&c!uM8!< zQp?AcwoAS5CIxPKcYXN%cK){V#lskh)OW>?f#9u z#s6a*?o42;c>lM*;KhgjikGeXUVJNHU&mDR_hTBbqsjpRjSjWh&P&0KxmXqnrk96K zd1*Q{DhMWUh^PpkO$=&ang<$=sVv?mF@x#8yiL!>$3X@E4!Nc_Bvl)2)Y4cL=$!i6 zeB;-f>-YcbyB=3BzVkQ#ECHkjv6w;l`nbbuuHQShO!vOSUMF`Ek%Nt@gIl)A8#kTW^B2+blTA8$#eqcjE$(XHA07HU>2?S#cP!TwKM)c9+b#^(bbHFVs)oktTX$0>oX-rZ|m^o!m zT2yRGoI}o9vlp%DA5P9Hjo4dednI~f=ceWU^AA3ma($}7v0I@_i(E_I-;$KC{iFHM zuJTlp>V%(Mv!VTsZM(KcB|7$H_^&aMGS1WTn`@Pvb?=7%=eO@}ZO?Aqaq#@2jEl3M zD|RNNLrd6YzqP_wbv)txxFTq4P~$?0^L|3|5{nKSn$>Z5P1k$6uQSzGghL247G!i$ zMh(xJaOh$ zyL`Xw@m}f59hLgyP>cp`}U>-OKx%%xg=iv-*YA=_4Y3L zzCSD0ct{z3aW&a}Jz;0;U1QseyVJ|Nf4T0Tt`pn4-Yh57X+zleyWI=d^BmCKK1Jt3 zzixDSQqd`yRM87RS`t~$$#K0|-n)2l!*9^Y$oWa8;56V+z-7R~b*}RH3QY&b?;Hj! zMg7Xzpn>E7hXzFfc`mLBcZZxxv**365&IKYUurz4|JC_AyLH8KjZY=aIT<~7_{mwRiC z`N!k&>QmRAJ2EYOkBqR#`4b0^JTZB?Y^CSofcw>% z%#VKtX?x7T1u1`7X162re8-K8T$`mk7B6q$X5wj#Iq-Nb)cu8asUbhoJc6XTc_Qyk znmD!Ez7gb^fCJk=Lr#hyRY=83iQtKowhf6NJ;h4HS4MGqK5o-a*Za7Lfpre3G~FZn zehIk9<>CN^3LnTIY@xEC!JhNYy~(ZN!pmpwirIBVx1!WXXOXn&m*t5Y){A`bL=3z+ zFmnBv$l$DCKTD?!)G`K5Vc40gz7b&65YS-aX=F-Ov*hDqX+N;;{U(FgTelbf`%?)X zF|hMrQ1@r#C&>GX?e+rOVyAgP;Dq|}*13xqSpT>*C{CE~BeL6*k?Y5N24{u; zvyH!jW*Zn-H5RlpI4jtOL_(U=$o+tV?F`Ne<=va?KxNo}E(4ZFiy?C&A`2P>5;%@L z2alYxYCHgq4qpFLVa}={a0k?mt^Q|O#TDS-&e-N)^=MNTNV~{_26@n6_TrOC;h;I1 zfCK8R5==jzY}pVjvY=r;XbgUGXOg+51LJ?;1db>5#mD5J-ufbtz_FxV>op{1-C2{8 zlwK*xXBu6Qa+tCB`{q5jS=aL_B4qZGK9{#+(A?44^iBpT)>q}?tUCO}vC$vFv!v1qIzkM0G zet;%^=Fe9un*bhg)OaAs*ybRYn5GOiHNpLWfUKhM$##|{(pQa)`2M_cwoMAxaA;%@ zP2dn&AbdJ8uz~5G_y#ei(Dh-Wf9F*m`aL(9ALLF@8u&2dz{ceL2?rlNWxX}|)93g8 z_jl)aAGbQx23DYu!5VdCZS=2Gx<}8m>NfE6*~IhZPMA8i^Z@(rV|sxNOpIy=1T+q) zO*y=ffwji{KorLl>%GbTV7(1YA|F6`DE~ae?d1%t8Ui+;hGqUbNv5Co=4@~m;Rpdu z%~@@h5ogtSP};a+#fSAyDl7M1w?4!Nau{gn`oUzTNpt?kR9)LwUc0FnG!X5;$i*_n z;qR}n-mOzLisEcns2K*X2;c7J(0lbd+vn5k)i+eWKF4%7iQ`GO@zH+)3I(8|v1ZQsQ(aO=c(T_siQ|cF^)??yP*yMoWd(K&5rwCA? zG3~%XXLrNeYqMFcjtZRE{;YE^sN@$o0h*38-_6swC;j|1O$SgZ#Rj%sD?yi~i)TN( zanP}sxAe3@5eBm0z;>2R#e4}rR;aW&>@(GU1Dg13TmTwv*!waKi)-2(c757Z1POzN z`=DGkdu5V4D8sR=0oBL8y6{OfMS=O?a$*;k0n4SS)2BjXYG0w=1!<;-LP z^=_~A%3S~&S&FTUv;;R%0uJPZ=1k6p zY+MX7ktwV}al-dy(-bFse{<7_RRh!?1*JR2SXK$9m#0pj0)9TrYlpKKa}o*BhHkmj@jaknKy{$o#Qh^ptk}y$yxdL22iX#+HX2e8Q<* zcwBaSbxB{JjBT4CXK=x@H)HUVY5J((V4|lZkN9~cI1i4 z(zBkzZi_M>YqZ}^=XhcunZJO6^^VQ~ffHvJtmy+)6oH_|Ix8skf>H=l?fW2?(ZAK< zc>n*di=4rVOmflM=`K58uFQXUf!|$p*8kGCOQ!I1YbP$+RrAtl*|{0rb9Z0*_+v4D zqQn1t6I9OcI~DWgA6LzelBt`FGQBQogscv``fz0m!U+#<-k+2A&So`ep7X(JPzhaG zcEcRvj)vzf5=@onX6b^PlMSUHhwT2IqN&|@B=p9qnRouOPc-_=`{(C%PZ3R_t~lHO z?dnw}t{WG*)@J=WDo6utW7};iU9$B*6hBFToq0YiWAhQ+yoD` zas?dt4yua($!u%~`JE~DK(OM4Ri>{$Jlk_rqdHnrMZMQ;?X2?I8Are6-G6uLK+l!! zpq{EKLltPQ;l@f?CuirHJTB1WV~_8gw)yox&%V1>w$19iz=`L}rpYdHxBy!0u}kxL zgQf$cKd2Ef#pE`qG<0C(`T?q;?$49|28sj+1C9zMmR)s^+2ZE!7KpFe$qDU+sqzSg z*VWnWyS0ONb9{Wq>+9cRxGps)1&qidKlm@++x# ziu6=moQf`KgsctX{JsA_WA?Rm?rC9qdht7(PIUZwasNB#m6f53FTC7a_IFp2+{IP? zcA#NOfv`m^QTMKk?4AEZUh7^Q{P*K?{+oY#+>bu^#(}~Tl)!hmFGy_O)sc7Qg6-6gJ__3{Hz|SC zixk8i5LUd<$~}F8iK;JWl3d1RCg=D{xuf0U%^cBT>m%D+yX}LRrfy2jKfL0hzS63| ziiL~;adCF{X6=_)eSMw#?69*2I%Nu8Q#95wNNk@Y9KD6N@?~VrjxWMFw>Pe4@SD17 zszKtLfYr}`bcEV%j;ofAy!o4ZuRn{oQj1Wy*Qbc(|F<(bD?Fbc4Vp;b;ohJ)p;{)A z8&qg9F;%rYyf)7{YW-gC;LZATf%74yyaS^-_m#E5!t0m&7J09Y;d~b>yQVWP^9<6P!iwXVM)`1B03YI5wc zhtk{U2(K>v^yzcpo`^u3>;F9^79E3C0ulKGUMwNFsd=tAW7ntPvtl8u{ zd&imWbA;>rIM(+EDziQOuQg@6Kvnv~Af5P)Vu(V@=V#0suUXdbZEOA=b-S`UntQSP zzBMg2&#ptK9-iJ&Ds**kRZc9?@tUgj@`{cDOHo&^d0+!mo=5`66E~kQ&>D>cF%Itq zR@6?9V}Ugt9NZgEe5f{1PMvdF*MOyH<^)kt^|YX&8c#Dk6`C+ZJX%*4VxHgc;=BY?=YsT0EfaTa^~qd%X5N>ap4k?%uH9nI9Mh9{1X{IsJ zGpF9BdPnGPTUI1U(}NkKIi-9 z%+uzq=hTeataYPJj&&?-77z^n6{( zRqibFINE-M1KBSxP8F(rCx~n*Y{^B;G_at^S0msce8t=;)Lc59mrHyo$`Wm zj*?GLGWS>|O7+RvuA4DMuavv(_}+%J?^07XxaT}JvrOH#$u?$dR;Xd&oexauA0-UW zZm)U$-N*mSyPJ2PhyxYv0>b9-OHlNl*7`)VYWQaa^73LTQZviZe}ceard^G$@!^PW6B z8Q1^d<-PtW+w|u@KE@kbC2IY%tMsxwf4rg%so-s|YMoH&yl5_HXnBsWiEbs&k(~~Y zjMlvioG-lOn#uiJ>kxy*mVN);%knhNS@yUW)B*yH4slKbFC2p}JYv;&upiWTE`N8U z80`8D`U}cAwj@3-TXJU3>YVvzm5(%B%(EgE1V2mv+A-B>vih;d^QyLTPcd$@_#eK| zW|>NFP#9n5YsmD)vNd-?*9#b}PdWMNYQ&FwMJvL&GkF`2cr97-#3Uv4z5DldvL6pM z*o7U|`u)n>+koYg*3lx71r2ea{5L6eugC(23)}^&0T=9(0wnyk$?KSpluPGx7OZ*7E^Qf7YOoi$!uJ>-lqT2(foPellSx}`ZfP5oiN3M zX{q=0AUh-b%jtJ!L~Pl!K9jK>y7uUlq)Tp;>ER7G8Z`nJ?FjPA=1|$zD?Q)DJMyZC zc?!d>lBxrV`JbgFn06jHK3mg)(Hu04#;gQhE12L5igIpnpkaw}TW5vOqIQTiDp7Bj z+_?1iZMofnRi>|}ggQSKZkxHSTG)I>yMoyoS>c#D8dAa%CA@lq10)Ls;dNE0v zt$1y*mL*v1YhIxt? zW^R5yVZw|i=l1$5TWW8;SO0fpN2jsExqpT(?a4WR1TJUEf8G@*bA!FV(_wT8BkLQdo`~Oy*)8k%r=kb>}sQmq&_2t&r*Abg?wr*PF8S^d7 zG;=O%n?uynh(0Ef3*HTi6XG_lna(7_Q3V>({m&r)YJy{oB=K>-kYtjDE{I~Wc=g~| zlzVFAv04864@u|i2HBbMr<{51eX8b$s1r4! zK^GSt{qX3s|H9%V7n0%zI#lP(z<8b@9&d-nZU!j%t>9NLo4Hf;aN zOJ+d6vyH4UEu3{p^YepaVfyFiSay2`rzxl3|Gpw@t(ID!bl<6|T8DO|&i?TnGSodO z=4v4pV&2@D+6Nmvk2so~8~%6KC{2785tFG zm-w?dpSQa#d|%$GXYK9sn>oiPN+xhT=@2^|)WB2)n)7g;S_;ZJ3 zNl#aA{IK__+4)-=uRYGSE=xSM<$B>`H@PD}ZT-L3iM-d3T$yuxnO*dYCnqmglpZpX zv8|GUE)`&1wFjxm{Py-%r#lbQ6`N$gmOecdTC*`v`P#bM4fpG88#krqJ1_sX_Ttjw zXc7ImJ6pEKCcd>;bza~^py9OT46Ju_4+xyNyJ$^6lgNStpfc%)1}NErMixP>!~bVQ zt3hJ|4NQHY^k8{!_Jdu`iU9>@&E35j<3$oUo^)?MWCt3PQam7_p|EUXGq?mnne!6i z2m<%=D`36+11KXf0v_rSVcy_T36Tqq4T=-^R;-x>uKH_0qY~ejH4*Bv=Yjg$VSZt5 zU_)StjS5_#M>O+x>o*@WqP{Gpg&oUE1z9PnaOE z`l#&3i?I3bp5v^)6dsuHr@x9Nef&X6eozO)}At8xpaK$R`7a9 zmA9^ukQk8x4c>H2%b#YtZ^zv4=YE4G+xy<$PRRKq(C(~|{NwYvCRK~lUpzu?M;|?G zzxDgh0@>P`IWi8fr=2zUGWB`j%f8#(JtrrMKec0jv{<&tMC9Ye#Ef^-7C-)a#d!Hr zS>654Ce9*37jC{^yTY#~{kS@hdq@g%_-;Xg@5U@#9hpxQz>O;K>fw9UCK9j#Ds#{f zkS8eREtt&UtS~phHsY=S@jAyh9||o#9*_50eXh-6e%&|INz0batdh%6oFEa=`>I^A z@{z=q6?Myx@?=&9zB{PN+p$cB*Y!{Bg}%P)!RO~pE8FsiuduW(hO^P-cKO{IszI7`GY_MmPu?O{<4uBTZ?EMKJ>bV0N_fl^JwM`(S&|ed_zN>0{-K}`xz52gH zt4!k;T&?vLy!b)R_3G8>Cw*tTB!2o)F-0@@R`cc~%a~#hggYzfzI*peHfgnP`2OvS z-ifn+alCJ5tKhls>wGq8v)pi}AMNrv?3X=6!ba1p6Xp9K-gP~_q4v1mogEX|KYvcyvL;8MbdGhsqos1@xjW?_Pp?_kao*2G&2I4E{Z>6N^Lt7_tcI|My@ey6dnwQdiT)yts z-L525d-B|0x%q2o^hfer$Csb4Jg)fJx{o#Nyvdq)@y*Nn!~b2| zW%Xxc*!e4-$s2w&i&_+X*zjrN+UXmgpPPGpMT@4#`4eHMuB{K3zP!Be@c&Sa^v{v| z%HCR)y+3*6(D!M{_ZywXQe}A?&*a-xzA}lEwdb7~xpSHP>fibAS-0*8-&0{4x5%DX z`pV&HYpp+CJmp{b-~sPzcB&e@)MSBAeVul>|iu6emCr)JpSKUS$1 zw?@J)dOPFm{kM`{W&f=zz3}*A`_x}uqS{%dc}Kj~oWGuXpfA5nyH=oa&WO-%I13TKzt;8ApVZXhqboy z7TTZ!i^=1_eWwN9)Af?C&Dp;3+vW9Z&N-EYSS*q@Jz~v0eU{yIZI(^f#go~OoPN{! zxNUKvk8-!&YUc$vrq4gTNi=)H)V=#JZ1k0~7ZN>npC?$RvN8L$>xO9p8Sk=B-uU>o z9Mp!oRCaQb>c^^EDjm}|z4B(U&_BMf%X_+>ru^61UF>l+`}`L+9&hcQ{^4c%>y0Tt zrT+Z9en0H^J1-6uturTW8x#)<`POQMe>2--mc8hcQ+Uj`xD%_L7i?VImhks_w6Ejz z%H`c6oUZ@Vs}{a?mNm$I76Tf{IWWUz=0#<;#|!n|a_u;=sYlj&zjM(knK@Rq$5yp- zOn%hPd#HKtZ7~k_D~cB```fi$zaJBjU^->vBfYt|lTz+n*wt8X3$0V_%TUwMrYe^J2r&W?o8hE z?#I-1se7Kiy;1$lC9=Fn_ky!Rd0o6q!rhI|(tCCnti1aC-jBOtig_6sD>AKe|MIO3 zeVnIivul58H`9H=^!e6p4(CpN1WzK0d`N9vCMX!XzV(!;v%>Xu5u@qTV=e#j`is>~v!FDG9A!SLRU z?H=CZYu2?H))#8T>4|9uv4pRS*%}%DUVT^chwi^q#V5?;X>3`zBd$+6JBnASX>MI@ zmDr2-hmM~9`0RG~)cM_od*@k6D$Oz8-*O++;9h0=dPB|8sMU-O99CAPIg8hX3F-&+ zuJ+xs$0oe|)t}aGiMbPc-hX>zT5DpOX(G4dzunXG-(H2ZJA6}%T_d9rzD}o4_W#lg zi(1#}39puSQ}@{@xlbZ@Evx6VgN@goXFb{ASn;Nwf7Y+65ADhlW<^Z@>?&{F3z&L7 zzPFy0-~P%yr3;(HyDWay<`wwM_V`P*WtE3+eKFbk*y_v)Wn4F<*Z(T3K0im}ec#5P z$s8(m{QnAmXauF7KmPB1{<=-V;m5z_8i1B+Owq{uHFNoX{cB7yA9dcJJaO#M_i3V1 zkGl8sT-cpn-f;X#Fz*{afukRbfA8 z-+pxT&bs$TQ>ThQYRLQS-7ny=M@HT-Yf)zPmfi1GHHEt$Ra%s2yY%IpT6V+CEUCJG zKh2+>zZP~b;`i;xhHV}^l`HLEU0K!WJ$-$`!9`1dB)rtRTyW%mi1_Utol|v=d7qx? z5EW-}+gjLT@7dW~bst_y?3U=~h(0w%b8Sg@&iwKZ7XmvLyqKN8-XgDsh*VotxR;Z};!Ymx&RPpN>4fJH`I?>dR3aB9d|P>-*|h z%kM_As{i{TEj&3rGRIQ=mFU5v9SfTa{P#wk@|v^cNl3S`pV}TPp1Ibx39lyq+9~8X zkt5?>uFzT*oky)ZEYy$wNZRA}b+DLsNj@)ZK)8p=oUv#@O;dx>D zRj(ZtFO8xx*=fnENj{qwV| z%if+i@}lkdzJ}xSwI?2_-ZH=c?qJ77PqBwha*7iwZmP#Edw+9st8a9<(lLR?dHtoP zUynw;m|#`A=P0*N>5HVdt^eZd=O4N-@$tvQ59OzFZrxVpa+*6vSHJ0Pt3%S6Zn63n z^XKe%N= zE|JxxtDF@I_gy@b*|{Qo`LvaqTjz6V2B-TtR5Z^%xL`+E{ja5)&d&a5^uGDWOpdf; zeg1)VVh0~y@mxHW;l!Vy^_K$IKML&MoH<#;M@~MU>yb-rJD>bfZRg_;zs%h1b@f^L z+Ky0($-!x$Z7fsHAK4iue2mxqWzhB+yAFbdRDBTqo4ZE>2{dL zB0iDUt5cR-WZmW?60PSq&+N8HM5jVRnwQcnQ_~s09=)pA`ghru_*24)6BZY*e0ozX zb;}>Vjrs|@TUIMxDE?ced7E!m{^4cEzq_{VKIyqw_nd+7`QLlW?G7yZZg0f9X~WbB z$C#9K?*5HkRwNgZ7+u5n;=c;pm-lZCbe$F2Pga08<8tkYTu>NNvD=38s=41ACOV8X3%;jmgGXvI8GGnA5|71{oeMY{w8Y|325hE zTIRnYf>H6tkpWWURyuL1|-*w9Rir@bimY>h7__44rEc|ao@iy@rB4+0Acp9Vbmg}pj z@i=>Kp6c~#frq!`XV6@z^bEV#zN#8R)3=7kKYIS^YFJYBN<-ziHjYb2mdY)!>T{8d zZo9_hv(f7HL-yMXpVofYa$NGWyJGFVXZM{GQ}=CMur>XD#QG}MgzxRviAOGoPYv~a zC$WCo`%Tk~=5aL2%=NA=&Xt+2-|q0}rm&;u>#(yr=k|Yk^4-;9WpnV?S33{Q6O3Nn zd_{4?wC6rk5;>NHc0C1mbq?HRGVGPwHqqH>(vkbZMdf#w{gPmM>GnG3C{N>@sgG+# z7Bnmd1*K?mB`7GRz(IL?)zLnWBkT9i4RA|)%ewo=&R<6t{Fu4iNnzvFn>RN<|L}L= z;Tv00*|+80PTeRwVXwf6TlaOs+0~O&kKDN#d{JZ3zRb3*dk$O`nsXzXQ$=b|$w#4M zs%MXElikgArrByv!1;+=1y0OdJ8?_T(OZw-pA+zqb?NwaMRCG3qi6b!R~?rhTfgC` zmRwzHzdQZjyoj|XB}XbQU+Yd2{mZGmKAN>V29W@?gGCD(+q4{q={cVr-1pW4VbEi%%y|a67!fTNQ4h9?sEL?4o z&m=S*7}s#}JA9$#KQ_O}Z^7bi6R=d^-Xp-!)IPaP>M*qnC$_^PY% z5w+JAD@i{%sV?VuS?!`m+@EKw#ImPP+qmNW=54!<+LUY#UvBka(bqldz4t^1TgKf_aVDLe$7Y?smi+RQ zzt3iQ4aEx&7uzeA-LU9zzIinD&Z1K_rR^5R>bcKcuB^+f{I~jJ{?YxrGbFdYzmZy4 zHd%00&CX3P?ryd|VwV1B{?+Nzrr&y1eMNi5k>}4=`@gyRGV4I{oBp*`b9fuCoL@H0 zz{y*q=q*fLE_rfLjWY=%c+`MC>j=g@h z{^j<2mGazTy2hc4?U;RH_ghtL+_ray^|7?`{$EbtR-AA#&HqjZK$sZBBh# zzUA7_;%C2;*4lm+IDKQ=+O_w4Qjd7;n%7@`RQawIcn8Guj7(W(q>WPV#5(%=B6Jx2 zckhmq{(6_8pqM`)?w-I69?rwYMny(@FIwDQ!ob?(-=G-q;jE>*4wan zRCk*1h2Ne36^;JLU7i*Yb!<^yh;95c?HQoTvPzj{)3-^Hr`NNV+uVQlwnO~3y8m3q zymyQ>Kfj8l-rimOTwmlxm(`OkSNRLyP2>pZoxb+%gMYt%i?sF0^vm=8Um>!6yX>5* zrE|9ayqc^!;n(lvw}0e{O}F+)N>ao_=@^9xZ-kLnIxAncQwuwRMvp<^;{W>q; zar(?A9#GSk>xJTiIh-n6!Dcs^{?RQnTC}8y@v0Dc0Y3+uXBMGSYJI z+iA(*F-Jzw;{OJ<$<7NISZllw#5*Z`tu%h6TidhhmH4qo&%d2x*;IC}&8j45ze(JV zik+Kcr+o}!w|SKMY|c*Z4+k%WE;D*nm%$lZW5^=J{HyA)S&!`eMLoVOTFmpSxjx_f z$?)ipSYhPtTkAHc$LFm4{6T;I#v5_ z+ybtRwhwoAPkS`C)!TP|q;bLV8*glHFJj&&#MHU3V{_e+_tWm)Po0_LqF__&#S~?d zo%3sE-2LhM{J%Hc&B+AI@T3&yz-(7XYd#|VF`kAjb zZf~9NE5E;c?WJQXK8|JY7=vXSMVS8ny3Ki{&*R8>`~S;&)~B4Dv~2np&`@ILW%UJF zQ@!|XziitkU#!L=#CU7t{Q85txu++-{+6%%YZ2edH+wa{yKtyjWz^l9^y9NP^Y2CH zgZnMFq)u6Vu<_@q`MK8no$KQEZMwAjims|I&sDX*zwH{u=l#wv7l{5VaKB%0vD%{p z2M>GAP4$|7Xv&g{88VkoEaDY>;5*MOnp5_u>Y;|2nw_V(OCLXdRUupDkt-6$uDR&N z+)(Yr7uw8;9bExoM?2pN_|LQ9-6-VsM{jqb^7)X(TOVAJP2T)Hr9r(6wDRGe-4J;>>PPtTn1Ceza$L7MA8tGfEt`(u|gu+~I_@?W+- z+tKdijZY(1Py4Q=A8a4JopI&n=gxn43qO0y?pyKy*glR5A-CgBb8HL${^DKpKZ`r< zeC_o|tV^s|g698Mj0;ff=?sqh_3zVb&L!vSq!-D4J{_FS)Va@RmVwaIQ`3(A{45@@ z?akUB&+k<7$QsK1=93B9m6E&K@N4&(^m$b>%)jhAS6^SJsn}AL_{QSDwkTjr->hsJFpei4cNgVcRtubAV<(q-YKqz2toN=vmpds4uH%(A6}12N zW%DKTji(gyPB4_bE3o&P#uFUox##;qu9W982WoX^DI62v-1ulo#>M~Jyvj{20@!O7 z$?vTyIUc-M-nI2ps-n}P_`1KcnZ@@EZ6Eiw8870?c6|L|hj>B0aI?_2j`tHIeADF~ z*j`yG>&7RWvhnPK)sICVZ#MrQHP28m>0C{&oL%H*KkveBqgK}C^Q2~5v26Ng{p7~S zctPtL8NWXtr(Y`9jkcS`e@XE1p>3_f?Te~v;$7xT-w9@SPG;BoAK!9ve(gra%=PEZ zTgzVkH2U{WUZZZvydRuiLF74@= zvs3Tt!^7ssU0iL{ydwe^bSoKb{`c*(k;+PEH@9zm@^WIkK{GyRJ10LZ7dUZC%q!|y zh%D2}aK((3&azA^x39PqbbQ8-gD?ISs0Rm@=d!CeH70%()(w-Dls4SAVsFvcRd)q4 z^3O5yNEw|*m%Um9beKgTXD}Df-CN(PqH5MmHJm4X<<-7r9T^qpH&@7ww_w0^!Ur$)}#k2gNX8`P9c%50r8 zE&cK>nJm+i>o>Oi;S+q=zuZZ|P%r!Tq0UeTPeY_EL;*SF8yn?iu$xA>7;5_hG zoWLNY-pMb4W^aFIQk(a7!4KP))rMAyU00dk9qqN1f6evL z{I`8%_2>MrtK+4*9lYjrZhEkHX;}QV>H6Vf&1`nfrSZ9LRc_mY+N)Z7b~`ON^zYi9 zjLQ|@dS9&HJJsP@+%74>qmq(I*~*_!-}>oYnsxoan#{+AzyD9Y{C^Nnoaq+bg4Xabo9Yp*V8%ME`R$s?bMx_`K)O<-rm-) zeqPmP5vmn>-r2cUrT2bybUe$)YNfId#ToavO}(mn*v8aMcfa!yvog>y`La zu3gH&`p4_QeJ6!R?L#wlqst#Ho;v^0frIh_LPA}z$%C@=P!<2#&0pj54bL`j74WF} zar=FJ!bf&_ZT;VVbM2TvI&G``EMaqHr>)ZA_XqE67f=4kZXW&$6mj!Ab5DPRPt)xG zB(%Hi?5h`7KGr?WZ@C|}Y|Bwgw@0jHx6X8WNfz$ZW)Ujw6kj;otiG9l+PWj(+xs-W z-j99jSCVz#?dB|x(_RXN=k1@LOT6ixy`k!D)lnA~Ufy>rdzV+)c1`+Irt zF%7Dx!)Djzy)CFNuUFjC=CJ7f)zx=9U%cS3x$%>+gZY-Tlhc~A!wY-Zf0Ek|Lp$>oDWV5h<=n(;VCTYSf85m?1)vRem-cr^Fu$p;&1YEWe8f- zK3lUX$&bZv^RoW$C$7as{d(%1dc^B=cw4XY;uCDAX6C4RiF{xB&hn19uH)>(Q(x6E zJ1fj>jI;%}m_@V%M6WKW>k!d$>R>FJnes==@zf;MpNZ9}s*&#|&71oA$HA^|THg+y z=M5B;cXG;KzFY0#)SjL>H~sFPmj*TGer#ZHR*;`3Q`XBQ@*$tG&EcPI{k=DT=hy%3 zefZJSqU6VlOTE9oW+nf+QW&=V&8IZ`n`W$AxFpX1%DTD8(}6`M>iAm^%Z*XlZ+?h; zsolkX#BAcdIMK%*_t#EMj`JKjDjtDWANY5e@r z{9fz0Odzq9zq;eb)IB|aetT%R`%)mDhuYexs{!m5M*q;Ib8Cz6p!G0N4NQh-c4=DeL2&TzvHp5=@oecSDuT4#~JTD zZDY)B3)zzF=60;q{K`@A;e0~QYD(&P zL;c%JJokR8H1C?brSQL}N73n?o;%G_w>VZPwY})zX2>f%y+CEp?1>XU&xwAOqzVpb zhX%z7{60*(LHnto#{%qi+xnwfG~&<0;}+%rm`+X6YgOxAeBt@Z;{n^teAyhT7H*E? z3UDxIY;)jgEUDfRVF+@Py|94X(L{jr{OxZ&(h3TA;;H6Fb zMGPdA*c_)lW>`6GFXM>=zbCb9>FJqs=FlmrMaoCG=I;u#pT6Xxq~y)uw_Alf=9_nR zte6+hV!x|8XHrkx%Sg-9cVhKlgA1-q#x{p}V(HbO^@yO6w^=KnIe@ZQfC2-H1QY84 zl_CysFuEwHsqKlb+gJ3?Kbtr9)|dA??dRXrlD@nmQQA@^W%E`eC5KaI&S-v_qrhAH z;kA+90WjaY4Us~0CLL<9Rbm+25KydkM7LBCpF7T#nH?6{F!;n7wT|v zH>xQ7eY4a1yR2o=lU38Im^S+OEdHQZ)bV9!a`NP`(NV$)BE!Im{--DH z*|A~c$q8nj6XXMG>o$5^{4*(}Jqb2`-{=B5VQ1K^gc)wF1CyQV0f7_Cmo?8_$iT|v*`OGpa8~U& z6PXBpS5!X~0u>WmKCaN05n? zLAo8Zj}o+sKoYdA+gS7sc+Pq~hXl{Vy{eI2lN%+fWhXTFe{S4z=FA-5Z>K&Lf9H}| zq-59Lq9?Z1>&EPf6NOX%89SG_ur*|azP_KH^6W}^et(2CsQA4PS{)tz`QW{P1}5Zz zKMjY*1tJL?B2zA(a|~`^5^;FE;={F{6CNonoXysErY6$s^r=&I@y?NA7abL>tcs?w zMCM#g-<6V3la_Xl<@0>WMTdkHJcX~uo|yjhT4dzT+a)igR)dP*2f`o^CQ04kuVqJTS{Y3qx|BC-5-I}QEzV4Rp zd8S>QckaB>Ezwi3)sWgK#?U$c_z@SADW4N}eqa5=VUk*EN{af6YmT5J9Rd!3Hl^*c zVa%DwB*GEHxYv2XPwr`t7WZFg(^GHA}1Mv&iEWgUa*~02RS#B!cuWkbhdQj%h6MOM3fPIh6iuuu5sT{EF zNDktlf=Kd2lD47dr8s7x4PMihTe)b0>=|GuP_%- z!JW(0yZF%Uzt!*j#d)W`o2IxlEiFy|dcZW-nh1qufs4h8Jn9Y#_#f)%>6s&Gcc&E8 zwq4MGm<45E&Ec-lVtHf(E=oZgFK&Zky1MR$HRu2amPL!CuJBKEN@nEQU|l4+pD8HI zEv)R-*~MuUtW6DyR*(D{wy!?6$xhjLd9XrHe=>OeqZnw90m$9>cEK}hCKyQMO?~=$ z9T6{YJ-uiUk?+|Q=sA;7PtW>qwg=Vzs;V_jUG$JxEr-{rWIr1<7C ziEsokwmC3bZIlsX)p$?~TG%_E`5PolYdioQ^H7s0c7vTOKw$<_^Ypm_^J!Jim6DQ{ zyWdWI`uv}!fUxMj$Z1RTuj~~+7?76suI9gtXf>!ZTu=boBx(h!{a&aXKwcaC!I-hl zq0TJvjUKCpfB}}Sr;uds}6V0y`N zItyAb)`8X|pI7U-3+k4K9Y`<;negOwp^*T)!kKdp>zpQC?uwZjT>k#{_vQEbX33U& zDOg!;TFz2A^H-W=(D^fG-t^B|H3hWsOXNc!s4TNGd;<#k|Dfr!dOk}gkk>>OG+2Z7 z95_!b1tp~ox(Nm@JWV>s8H04I!;C)cQ&H4aR#v|p7g;AagK2BlRjs=0nUlh~di;)A zOGa8UGZkNv5oOg7SOY3dN}pNgaRoS(GqySG65b4{))q9xa~QCE>ds732OTLb+R@4R ze%k!?bADfrIxJxJxBA`rbg5IDJQ}!N+}&#w8Rv!`wwX3@rgGDfJq+@8?Vy9^CW6k0 znU%u_I!*($C;fcYW>cuk*K--Le7ZU_aleKGW4%~MSC)iulR)7+|9sxZ7Kr9mH%q5O zNy!fe&P%snJv=qRDm5)_J--ke-()5c4kpk(27{9_N~{_WWI-viFnu+sDAI6Xj0Y|2 z&Ne>uFQ9?xpH6~-gx1Wtzk`pQi_mkJ6udsxISX{~cfFkX?{{^LD^{%d&pq+eKdpex zJu@XEEf3$luapfgfDwkGwgv+ln50-Fm@*xb1iAj$SC`8@cd7kf_~-Lkrl#+quY1|! z4y1XeT}-n5U>DVz6?n1gI=8-nsEfFZ2`=&wOHg|GhXPOOe2aH4mOH zN}bSAQl`Dm)t`$cBsVs;W?giooqjx{wn&Zlls~&xHmvG*d0jnaJ(sOJ1LJ;90j8h1 zE-(3+IHvS4C`pGTU zq|P9OL!qHTo`s|Fk3rWLMn)E|pay{zD($Uqpc_Ou6fV4CYH?WWcaBxi;lN_1z183I zzTYj6=MPe1c1@|?o|kb^`1-rwn-8qjnXf#-^8i=qJq53;OX}9CUNn`O`&+RHWcYPf zj>bK9O4;+3O~uN7k>e#573P;LNorn2tIpi zwacRkyDW>-pN0yyg08oj&(U)Dp`O>Z8MXCnJIXvyicbpIdSCB%;-5vX-C?_?EoWe= zE0(l1A5&;(n9p*l)uHZ{d@UqJGBi%( z6kytVrhl`b!-3gMd#k>_+EVnCKkdG}FhlO!Tii?4Lqb;E;D6fi6T4her*rtrBb@$$Yd zH%bS^|2@GMlB;ZL-tMzM{_Mi5?^{>g%GmPnqs*xwmc}N|koMJTnHST|R|cFEKRtc@ zOQZUKf8KMKDQbc4b&HB@5Lhww;7%DPjw$^P=jX+4_chs89qv-5IX~`lF!U0t6P^yQ zBPT{2RC>2#%4Wn;8I%p zdWKkKjONN-mq+h+Pkma<66LHQ!{-;Qq;9fv+N9Qr9yRN)?XbJTWC1dCfdFd1t}YU~tNDkmQb7c%^fBv%Nl%*U@Yt;n! z!v8vU&b#xb$xBwM^UD5fS-cOOI20Nj7+Ei<0}3z1r*_pMPeJ)JaAp~blq383sEj>e|LS+zxeB+gVKi+Z+`u% zd>yN<4!VuhPMo84S19X}qzN-pH{9)4U3B$_$C|pP>Oe1r3%{6RcbDDW5q!Mt^sLy( z(`P3})I_}A-k}ZBrz@_&lC@LO6m+rAKH(L7p>m6-N+~Gq*Y$Y5<&JFUQQunV6`LZV z2R3Q_&RnaeJ&~8IV&Qk!lg>)o^Lkvw>LL$Rtpwcz`(aH(YGkzb-l_>=k}67bW2`m> zO_95ww{%@?{kuE*Hn%gS;>4I97JPVmMKU+4B-Z5Ch0Qt)FI1Q~e)u&AoG5qpY8P-| zX#6Vt;_B+~<)N$VWE7(2Yb*U;6R(?jE~v^$lwK!L)@62o%n;e&-aw-z0FWT)3ExX5Oev;%A{056Bag!K%H0sE4sfJ(0#P*g@SPV5$rn!75*@%}8a zz+c}ymLzUCf8qrnr~+(YXF2rnouew_=4JH;%b#Tlo_v4%;`Fq#0HujDq`J?pJ^fNj z1eCXJ^a5gIZ>mq+@cpl)MfPKL0ON*Mj=3!Yo4OlxvNU-qKkJ%UAd95rOw0f)iOUwpcDzN zShecb!q`?b<0ihdOZQy*l;`AGVLNS7_e_Tsce7@GtF!qRsds%54=5L@HU_MyE_Gl^ zyFWj;IO98$>Z)yeQTB%In?xKJsIaaHxS+$jd;R9Zs3-3)X8iduDaW7}$HFRn7@kDTJUeeY0Ic5%Q8&rV)arrn;Af%&e7k^V>zg)Qo+r)3&5cV$hTcWGgBmBW@Vh1T)i zG4j2~+;>fVTnq`wsNe&en##MUao=6{@=v*r4BtO5&AZ`SjQ;<7`?f6a^7*gjX=M{U z9&~yv`M37Zxuqsd910h{F-;TQ6SIX!XyUoNwHFtuvofvPwocFPI;aKl0F>r_+j%j4 zp1n16b+^*SU)6gqu;1!nVB%0=9A^Uy!ZLQTSCPo!BEYeZ^r+J-V2sS0KOI8hl_YGD!G9g@DbBeTBMPQ6sSrDJC1?CT3%<1R$`-u!S}^z!|< z4GEEP>cJ9>ECL#f9L~$#{qE1A#rAAR&9j)Lp}DbZ>VgDkyIkeiva&&R)t<;HQn$7U zzS`ZwSJHVj>3{a+V}&5^D)2KpEwI_3(FJNTY;w>DDXnr){im>~@66`8##>*kykEP$ z<`k$&vuxh(GRcmQk*}{*6{uV*sGfIysRbw*Gce^Ufs6Jnbsn0WDOnAdF74M7n?Gx9 zqiyw<7Z)Wwz65&x>Y653S(er+_BTLb;qt3zXZ|jl_dE#HeAAeL+=^XMvN9ufcTH;Y z+dn@)??1oL##I1RgtC4Y)_uRU%pucqtDe~WM>qQ}7O)6tSTi~;*d$$K)x*G4C-max z=HGsuEm795-Ahj{&c8oP^*$4)ZE4w>hhKf3hlYl}y|B)yUP0-0`kLs~rXX&u)Qfki+AbjA55*($3(2BtW%4fPp9ma*A)?Qch) zIs0ox$~k}UeWre$F3Zs3`qj zlD$l9r=3)9|C#07(^7NQHtkxUaW&j!_TT1Dzs@anjT5}+pK&+O%KPjSW&cPPffMcr zHfi~XM)4L!f4X^PrOQ0;j-GzE$LpUJ^PWGvnSYvZONCX|EH~wxSaa$&(GC= zF1Y_{U|{+ue&RKE=YPu=ilC(6n^z{&H&l(qEFBpG2EjeeaAp z|N7$M>->3_L95`0#s*QoS%24?6_vSm_N?zdcJ{s|$kqi< zK;6r_jtm7Rjw!1hN;PiSFMJ}RT2y1l7Inqi>vRa`mf1p`F8j_rzjI|%n8k|ObJu^# zoak{lS$F01Vo0-9!?ZC#dJ0!snKmbvTx#vJ4ah{R?ob-`{gp}uc2PE z4NkQ9&Hc18zH`sQtv-_v%zC*~=j|;2yHi{l82@vAd3AO5AxDi`&+RvvTL?_7Y=Ussj+?5A2fW_`N6$@J@aaW7RFzP zcSv~n+w5=rLaFEZZmB;PuGjjZuluTSt?=dKjcw+iY^FcrP_Y(TW!uQ)_^#Mqar{-f+z3ty1DOG*Ksu$RW7z)I{laA(yJx18UJ%s zgnnLYW-*ZjkMihb8?O!LkJf9zhEKA5ID~ z@8m*OEn1&(*WKk%W!Wq5i=UQ+y}FsPr7jIpM|njk$gH#R@8l5)jJ-Q+rK?=HSC;a` zAHVZbK_&4lu8^>>yo(F>{<6C2+PQC$-mQeRD}|s8ud4095wgkI`LKY)0e(n(R^^xW zQvZueSATx->^{ShF*8WK+yCryn^T}}2dMY6pH*k|s}oxjC)~8p_-#`yeOc*z)?Eu* zvDxACpYIfLXJ`}>T=6cjGDm3vo94vB#Tl2Pv%mkXv;s9y85((*9u^c#6SBPVbE8tfAvW3~p$Z>|q;@{V7sGQr>US^MgS73tcy%>C;B|J@n?q*yOi&|yI? z%bTT3mnKcnurzKL(-B;I%suI=a1kga3ls=)v^S^SJbES4ezoh`mqMLq{;M~DI(#d+ z1em72I&nddMc~7nhSbQnp-H9xTP6ihIbm2?_Mley&zhK-Gpx$>><>N3bO$w37#LYj z#Vv5}m#b!B>fEQaYrW9c`gscXyH=!!C>ZWtx9;IhoAaR7$d)G5{+8ZOSbuB&d$F|! zRxyiWK>f>&-mVHCJ+tbkhCRP_^p*P5Zsxx(42_;Z)b^1R9Y*NZRi z_-We!y5e5LlhJ9xBpETORtBaxffvwz-;M|uwvK7BpEEw&yPOu`e4#nf!`WHxd7ub* zh=7qr;6&tsGeKgJSHnvd^v_gOQIdXIvq^KsR~=zCSo78%(qOre)cESvDZ9>=z3=@e z+j@*nX8NTaC|lO=qIBP>9n>;h#Gn|U*~gXZ z#LzfNe1lV{c-JLnmnBC1$M!9A_5b;>Jv3NcCt`z6|7UPR5|sQows zR`{=V%lugzt7Ese^=h#dsKp_|=(J$bh9FHQjvtW+Hm%ANT-*NS#_^|WKUQ8aN-bOS zaH`Dtg%Xft%%Koq(kN%U>njh7)-Mg!T37Gwd-RrEJ?-^n$*zc+thnca5{xV{tU9M} zo!j`{-+H?6KJlg5;cF+|YHMp-x^8MP10xHUT0(1cw`+=ddTZ2|BNm11 zm_TEW0+Uw>I2`y7>gD)vne+NyuNo22|^&QXmHhcL#|Tyc6)Y@HtI=32T{K?)19UcY)&eD~BROC}DHxC5J- z9=n`=FlE+smqj0IzCYBidAvf9kww5m*@5FoE@&j~iAF-?!JY5&PrurqHBs|o#$gdb z&nFS4N5Kgc&cA}4GcNc;vWCD1(75D=-Fa7Prv}w-@hIin`zJxl=-&W`b0X*kj2?}e}|rs<&3 z(IPPgmQypknm7~!)-hdu_~3QalLb6~|GRD37t17@*X^QYKW(+(UpH{TGceY3ec=g} zn95b;026>c~G-TO~!v-57&U0V~G-Bq5N1@h7-aRruB_j`;592WSnta1)rp1t(4 z{`+N5-#*p8E^}78GPTGU)Yt-z>j`XNJ@Zd>(bZI?A_q4i)i4#Iey27DCVTFPu!4q+ z>Tl=8ZpKVGQOr5<3adU%S{>x$}1U7r_Sxk(#u{P)`abPEq7%c;Ny zffX|DbM2HH8df`8Ul(g#^6JXF+KZQzeIK$e658MC@=UL6Z3isNH8k+Et_gU`yC}rB zZQa_H8QZgN^V|J+p)FrFS5I-mbWmq6X5qCvD_s8`e0n6pY4t78@O+&30s|(FEuEll zs?(HRx?dlO_GYc;fAv~?o9E&kpq9e~#|D9pXix#^p)9}`&KI;O&;Rqq>5VRn&cCrN zzR$=9D+o2x8MQ@Z)VR!+oBnQ{6sWYR+KhK|&!V8W`KkSZ z?<86FC?`Ztt#w_UK5J{l$@NMTfBe4pl2g}}p|MCnfkmr5a9KZx!i4D#>+|kzi`nY9 z`@3t&^ee(sr`eTm{L!;VYl#8O+Yf>nwMF)LPl=hbt=j9pP^U@E#`Vez1bc= z-S_&MmnDlcN>_4Uu4Y`DopxL*u2GngWshpW-Nn`UvK)J^y)kcwPA^ohHs2z~$nr0n}PZ({nCrSxIe9%APmdljPl$O3m-HudUD1j_K#t} zLhbbPc@d8uzq@S8GK-_-aHu=0%l#Fut2STC*y+pkw%z!5yEF%5K9>MfW$~R1Q>Ld{ z4jdutl>PS$Iw&k|NM#l8m}VQyopJH%#SCW_D_DAFXj}%GJ(<(-XWPu~pzAJ5U$;MK zb+F`!Sa@pUqAMTP)P@@QXNL;+UNet(TO~8$g))0(FyO<6hDm9s4K>mjpR##qLT%9SZYZ5|Ty9(%&G93oLEyx4X7BCb$%i!s zAHoE88hy=4V_Z959Xta8YIpqPh z_gw$_FAepL)%mxfU-N|&Q>v;1M@ZOV-*mwbdl(caJa3=Cr_kV_$hxNBL$Tn^dy(p! z8@M!mVj)dQg$LoFVN?^&Lo5})DUXObH@M6Z{xpvDI zWOGbe%b*x=lh0Px{lH|V7KeEUQjOh*MyeEF8;@LDtEoOJGX6ECUq-M{1F@XPCC~;;ePG+d#g5XJlwnJ>7g7cuP2sMIe6yVrk|6!BH)0_ z4;<~y;hGaSu2g5!`tojby1CBD-A;bs5(-3|@;R_+&05#>Q96svaxazYo_9<7xG(jX zV|lHL03UmQuo8dAiLl6BTcftD>pUWL?8l1NC9I4rmq5d<(FzR>(^)tg_n1U&5oKiQ z(n@G;PIJC~I#_R$mQZhgz!mObOSp%W8w)IcOcAm)T=+e7N{nY!pE)?v59~ zT~E)uDYeEmugmSRsnR0bi-uC23{1LW3M^TMilPb)4%%D-Ok0)AraLh-UJ~2jGSl9bDWnu@*oVAxA<=mxAO$Q&1v~d+eJp_+b}=;)Lt&6TT@oI2>f*XykJ9bcH%U;29`?FY1t) zdT2w*SE-wta{d1Up4pV_Z((&>7;v5IYQ=o9ms7XSjCz-G{o(Oh-|xqNiRCPBU#8gL zFp-6$v5UofD~Cb=qIFgg*dTDCd$HSW$nb;10uk0V0ap_Ot75WlPnj0{I_ab4(i>^F zT0nj9bzw#GyN@vGc0RoL;*Pq2GehGiQ3V#Q`x}=(=Rh)Nfd*5HgKOf_AXt&%+*q)q zI>2+mzRK%YnLda*)+I&-jy2?5^?eI|0|*H)#eaj z+R9`!-GQO8iBo_{v}aP6fWv{;Of3#^@{YIqq22hUDgu1r`_{U=oquUrz3ZZnvR*6a zZdtmA_0Ypr!c$&k>T&%Kin@9Q)O*-2w%47ZaS4N>z;`Aljtb8PffL?~U84mZ7OVg{ z`03Ijn1hWQ3oI<0I%DSF%GG_fBV)_IpGJ=t>{eCVa9VG7$(^ij-}i#5>1p}1s)ATc zd}Cv496L)JpMi#kK}kc=Zn_&o;~rLy#!qUGSy%)7)HZ(ERWcE&--OfAoyx zz!4G>rv;kk0ks~DL^d39+^ip9u=KUJ(#0R|QcpNe_jXW_S+^^;Q*O#yO|K_M-R7?7 zJo@a~RENo#OiUb87BDCVaPo2aIx#f%Fts?`0nL>ih+=e7$YX^DgTsOiOko-pep7h- z)|xK-dT?XJVd>VrQd<=#L@r40m$MaWJff|%DKt!dZMM?JHtCI^*~v|u0!)SVgxt!} zzPc}HQM}LFU1Fiqz1QLc+f+(+^0KTtd@y^f$F~Ic)3=2JOecE$&Cb2xqSwj5BqyxE z^65sy#Tb@TF%1GM&g3)f>IXHG1eglV!8r{?u!?g;gcVH8xVhEytk*MFrH}7e_e+T? zJrLNiW}S8Smg>kYZ)WnkbxZ9|I{IqX&(F`-GYNn?WUdVY8se&_6dD{>atJU@J>_wM zk3}G(n9*s0nLLves09f!+)iW#U%2m;Md$tBMmdFl={TB{c3y#xg-b7?b(NmT()Z`$ zHm(Yf;$Po=G+ks5V@L-B(>^f;mQP^mjki_V;KukD@5musJ@JZPJ_uK7~v#*|Z zyQaLJ!mm6rV~>;(3zup_vr>$73@KhQ(kDlTEx3G^_=tfXaxa2cK%SM`tp^J>b*jIW4F{LaqAsj2^!V60wq{B z7J(0wK(2M`-lo*x5Xj2W*mcVLDb%$A$CyGxL#?;0zR>NmWbtIj&OL$Rz49@~OiK2$ zGKFdUSfF8PTrHZli|fU#UAunV5sT>x1`Wojfii^vhr$C@MkfXRUa?$|dqJJasnbs( z+`H=VLCL5mJ3`v{q)qa^zT5qIpI))tuKDc_8duh8Ezo+lW6q|SDLnlyj~;(oF$*-0 z;o!&A;$UeQ$ic|s1!`}(ur;MAG&tPm7GT=?SK#Z5RR;Godka4V{F-;$f`USb)#!3xd_vm1i4f-e>=?6_yJdP>mdE!Q?* z(8+IfaM&9V9{%64Qv1U1Bv2p)Pv0fzu;2odD|e$&?w`mPd;#*XMA_gV+_+om;*X;< z{^(3N9sRfhcc!?!LG+CL{dGOYUIYVl7ouciwwm4_sOCyEQM1Wxq$ z>s>j=F_5K5NP*>4XQvZ~LVyyJD`%t8U;f0-FEi6X*&M8XpIAWW5yjHtXPZR&IzGg_ zdL2FY9K?+iLLIun)2)YE92SD|gsxXDheCi4qtk+}#U-QZBkCBP)eH1+vh|Md_(8Cnh; zM`QzaK*pa80<~+L7lb-5DBOOq{zNbo>&!?f?Wy*QryHC)2ZF=aA?Vt{3@S*`0*Wk;^dJ_2*0g}S2X+N54)5HiKm-r)GqpI>Nw~iM z(kO7kI@#4*(4j$~qZ(=ji@=9942lzeUl3&4DILfJ=~LQs2r&Ij6xn;3-AUnnkEpII z11LK{dkq^&(1|FgvT0t-P-PTKI=z9%0NnV%kD{+50Abg?eH3}qEkV9^p#xvJ3Mu$n{UoA{Bf zzRymVt?rQ(cT`yHkeuukSNm4C^1(y(C-w1lQ$w@b-_~n}^XzfZ+Wj{6L%_l*Z72R1 zeE4Flf8ubz-(>rF#a(kQJfERmu~b z`*uWayH|C(spM?WW!vv|I+xSWoLO!6nYrnw;=>Pz`E*{)sQvXay~y{h?l;@w$0t^& z?w_}C&#kFz3pVm_UvtoMIIwllpc0=uczc;3 zv7hdXZil?TCFf?`&+fmQa^-|#nZ%Jshn1WHOjB=l{Mc>V;_y!{zN)?9K4{6b*`hDY z*Rc99m^^&P{zmoer1qI-3!UySPVLv*ee#%eeoB3!$-~2Qe%S2HzqI(%&;9#0bmwjQ z=vGvFR#a%sn^)e4pNM~ayZ!gl9yv>wvKxiF=lt54bku8S?jM(#UytoBiuy17WXX+=BJqNivsON{=~ zo~;z%1xj~|9lpuR%LA&&*f7XK+7n11AsP>)M9BJ#W|Tev@*Z$8h1H?e}#j zo8PaBSF`{2WtZxsGsWjuJPhxOjJlTZ?mf@=+V`IZ;)j>duXTJk??=J0nZ{{r;_4sA z?tFaC^IMPJ=b&q;)92{A%au)FVOqMi<^J^eI^FBNGTPnZ^;$c1a;JCmrwVAaF(?KY zhO9K64C)fIA$N&SC?(u0GC6Hx^XJ6mvXwE@Dt~`GE}weIx&QR$^Lta~7e82EeJV7Z zXM*2ct6%4=e!AMoteP?_o9)yw>Hk~y?YjN&&!y-WU(Zi|eR;M+`iTdO-#+E#wR8T; z+xu6q^7Gr9ncww_toQ5M>0=3)&P(DEJBz0J>?odersiqs?u|QjK7YF!?)|nw(K7qR z5#he6pU>HyEw5(T`ouE1c0T{zcM{LvEWV=p;>^xxpZD+k(IqQ1^SQ%kqia)}^`^w_ z-xO8a)*o#@X@32dgo!b>Ia_q%_uVPY+#U0Ji44$(k)UTeQ|EK!x&fPqFvl`y)X#RbBURvWXrt&xPKD&d28o?-}mcZKYPj3_WB;i%9E|>C+5GeyfLrz={BAA z$fk2TuIbZcb{0KgExIys?^~_O(to7Bm&_JfE}i$hpX=l{EAtw&$NwLBuRm%1-tC&? z`)#k!72R0Kej?EQ%e1p*cU9iTPRaCFc`o%u{kwJCzlyT@-@M7jef9NUbq%v`%uY@7 zdsE%>XWjXWudl5$7cV?l;+6hlo1;$BDwEX?smKH=fDKFxIxJOt~$5apfc)?_H&LgWY;}c$wWyd90R^ zc5G9n+3b&Zyo2t4SZK?9@=OkA*gI8s`O1#JYpyS>{hfAU?Z-J2=e&J<=k&3+KR0|n zXYFzJM0D!CKdnYDHhq30o^K@k`MLg-g{IqY$j^@anszer`K0|Ty)VqH?O0}K=)BD4 zUytp)w9fmA;juaF)ie8i&Og$vbSsNHZNq)O>T_)6yPeZhA1+e;w)t*;pPftH_3sil zOD6kXv)w$am}_r-%FF+67q`Xf?J~PgC`j z?aBEqr22i8p}kE^*~guqUQ9`U(!2d$w%NRA$9pGUkK351Fa7-2%ayHj^HZ&u*E|vb z`^5C}T@&%xg0?vqo=bSHv#-y1AAeeO`h0!qoC^yh3m=>R+?e@oo>SP4pmnlEGyfj$ z{Or!ZdHs1`<@MW`4Ywa=@j9F@k)AIzC#T)=c+B&oGuNM-D=aUzIj?%x;U7G*HV)tJ zt@hsBZ~V6NiOHT%UEE7+cb65N-`l@L_V{IgTSvdw^^bO$_Y@nJyw;zu+~82g=%n!7 zx&@K|bT{PO{9bfQhBub28gw&xt3_ zdA|JIq4#$x-6hMuE=`KNak3<(S}gv4ddl;yVtO%3$=UC>&DRa)-|X{c!)pDF)0OLr zZha2wsa5v=oiD%k^DNM)tlOE}Z&g`7efx2-ish7VgTRVAZgc+q3OZnU`N$jH;$JK6 z{|n6bZl9~@@#>Ax^VvN&zpeE=m*u(rNoytZ=VKQizm>G!Z~4o>^5>Grsjt^=+tNIt z{{Qp+pN<5dziF>CW2r&juEdTvo4?EX&YJt@Q{KHPIX)^W&3td4_CKGa7PcbDs_c$~ znEua@JelHl+skTqgVawpta{A$7S?_+S!w@sC#V0U&CNcH&->+GrrkYLlR2$N+WsP6 z=$U@4muWXu(lcs*zb!ASJ)2-yZ8Gz)1|OI-1H zabuy$>BE0A57m}U`2IT17UTw{+xgqqX6SB8c&M~9`_bV|2@jL36?P~7nCg3v$?UpG zHTxZdsy%<7pR=7j=X;yv?eliOx9=7E^S=JOboH}qvrMy}TwHni>Bg1kJ2v~CtlJ^^ ztf)SSjgiHOTYzcjec2XJ|4$>g@rjS{W|8T|ZiVaCma*BM6ZhEk_xJlXw_5^EMjEbs zZvB0+iML>U$-$XP)9#rnPW-7O)Op(WyYDppf4@^FPf&@h-#FiR&UwX^)i-z8%HR8b zK&0}|Ny$lXQ|CY7S$o#(c8FVS{nR%bf3GXMeo6Odc3N!j{>S%9Pk(M*wde;%{e5Qg+rLZCeEwGb-t~?6j&E-zC*|+^dyP-g_$#w5-k@=6DcxIL4s4B2_ zmz}=0JLl@8T~As+zrFfT{p&AC;?mY>Ty`Q`oo&G(*6N>0n%X}Ea(*6G&Xa%pMb&L;oYiO${G`j=;e z_w%{4Of`RA^4T@>{L#8|1$ON-8XjMn{Ci#Y{M(-sH{G4t#Q%KKsg?SQs;~X@?Du>P zi$0eRvHaT0Iaeo1WvEP__510z z+a}TNc9H#`|6Gw*pA&!YtdH>X=xOK5RCt5ZpIR`lx?=8d_UF0t!OTmZ^vikg|GDfW z&%!6AlkHd4Y=6_frTSORkBi5P-hMFLw9Ig0Uhj`5JI`$|Dwb4EmlSS^wSFR0?J4?s z+S|3;@2lqTvyHBj-?Kla@Mh(umBGi;LTApW9>&F@{%o1W*t z4GJN&3H2 zqPAU^Y_R-2b=Q;kk?C`E_-#MAOn!Q8lkMeYeVLHpR-evk@_3Tw0psfurd4~6yn24~ ztk+!5X{Z0XOR_`-HwdgS-MUjuQQ$iRa>LU@`N5w;h1)%oaw^W1o(_KP5$kSSD%QL5 zy5;KB6Au`Rek8I#GYvcE+ZpW4^89xH%V|}{;zd$R&ZQKsGoAm7ZH49apOsnnC%;~k z{_E3wp7TNJ2U4Px?KmgT**jHyO2=N2+pW+4Cf=Pr>)hFnd`QF1IC<*H>}C5r=j8b> zNl`s%-f~&@>olFoe&?xmlZVe5-2WFW$H+1Z)bqJ72q~vx8J}-<+ZB0o z=axH`w~s}-Z>#@5_p91`*6Zb(2AiL(j||hf`)TLVx^o_O?IzqC>SFfg#V;s1-@fes z$qzYKSB0LPCLFixi}cQq&#YDKzB^lfU-Pf1X#eADXE&6!Wv8hHxVpCfU6b`~zs;I* z{mS2Wt*XD3ZA*Q2>F4ru8TluTHyPhK`K2cJ)`L6!C;pVb^4Spc&i<6bg;}6oaVyVm zu*>;Uuv1k{W_EQMaS=$tnoZBVNaW} zi=K4GS<`z*s<7#hEdE3ib>Tc2}Tpu!R*#bo(??aM1G zgC`59-?n;n?wtDcPafOD_Wo?j|F+36vEe79!rjDm*=E*$+m{C#C7jsCx34&J>lFp{ zpQ`1Ld(EcIcITaXZf<$brIshh_C9;-liu+3&!xGUZBvVP@~2Bam-_f}T0r#Ps;O7} zcErckJ?%~N-u$#UI5oOWKh}2UG0n^KJkAy9Uj8J1&fF!qKH=n1gZcl0#28s-fh%88 zXrgYM*5+_7ebSYgXJ`KVTb^YxpEYzU#U$K~slCdGv^<^Y;^)`7YhK zkx@Tw*PK{zg&Vz+aoX+A3tu*WwmkiF(v+LhnV?4gJbV3pA9P+8-INHU1>6~-nd&bKP3lHzwR=?+m@XDS4!hXJ5y)?V##@FAboZQm4YxCoC z0t>!7?oIh{fO|>uao#sdX~)jrxcy$NIJfxCw%6x`R=v{O{btwXKSi(CzOl{Sb}P$! z=Fd|)JD=-MRxO>$oqqS_x6hv2ly_cn&+16E^Z$2XVkYNgpZEoH<9BV=Eu3z1-!fS3 zved_u->m8{WS(T({qvu}l)TT+bE=h8>yH?CPrFl9+*|T~TlnVcdpqaEWyKen>U8e+ zFkxcs2NgH`GT?z0ukZ)I-`7tGH1D6Du?E!SZkkhCwSP;msd2E%f+ruG`KCPCSGR0I zrQ5E$E4gJHk7K@R-`@ZK9Jd8C?{gic;(e9JjP$q8*pNE8*L>2dgz%fm{dZHo-?j2y z-Y0#c&pJn4J8az~X}9aA9vz);HZwPGUErJNJvoY#Z+~8xIsdYT<>fnnZa((6Q~z#n z;o5Zf`^4AlcKV#rk$?U$=2Q84+w$oP!+9sjmfxt06%0PU`TSm$@_U~b{7t`^R*_mI zmjBYYsHm*}_N0=X@1#R_)i-BE?gVv_Zg*_Yt>K8Xm92 zF8g71>GHHF_q&nXi+u~9_Y0rXKbdAfGke{>kfyue^FA$GvhuiO($Y4MbMkgZYp>_M z^3eM_F>hPIC-1yn0-DhcQ)AfwtzJJpjmP24*2&(5D%W@NYp9y{?mW!5FX(!Q|1Qh@ z7q+J~->q>{SibbL?;S|wo!Fv2>1BVh<=!j%o@7N#s$ZEQ!XziCz)~cy;iOQm>@{Uw z!{V*(pCii59(nTYhqO{`qOpp3@>(mYL6c1QaPDtM(D%uj z--_LqF`PCry8U_KX5p3kzh^vmGVXr<`TYO8Z+2Q%#(i2Uz1e47WLL%XbJnKCh3_;| z(pKI#_;V`l{QGB1K;7P2w{xZ}MvrZBj!68L%Q|VC{qi60;?z3O#QW`zX=U{sjb7C? z8L~_qCZY-~kNO-Aurr<0zwy`qm2&#Lx}eG19fGf`+5cMM{A5dT9VnHAo|#@37e)wx0gWgLmSbeEntI6F2RRoy}9eiB(~l>`8eEvzsZxJ2RhL{Z^#$_?Z8clI$bu zx96_8{iod9?8aGj7O!`KDbwy2zw4cn>%Zj5kM!t&$~))Gll%{gs29!qn@SiP&4d+L zik7Rh6qzq_$>g?3pT@KAPmSfP6Za&i%Ny%|ol|v+v*?B6-Y3^Sem}A2C->WPb3eA% z6}>uHd)-z(?e};4l@EEQ2hC@llzZw6Q_!ZqC*58zzwzpPD|Xw|3n>Xd=XtalEc<`B zEk^6S&F@8f=bv9+J@e*g@l$Tnro8(;MSe23EWTsoJX3t7pZ(Y6AI?>#K=R5u#eijh zmw5fo=UJai!TvHDdVF3lZWo}H{I9pv2B_f`}CIL^c$x)tM{n6x=A==o(D`o&hx zmRKHVU)lS9-`{(2&z>wi>3^cBfBKSGWxKEJ6XSFChTf{}D%!hoPX5Pb>o&h%bNG(@ z_WOnFWq&N)=Q^j*U*-5d*PE~W^p;P`+x#GgxA?98QvrtsJ3)1NEVM-`X5js;Z%5*s zzcq>94EDU4wE5|Y!+et*9xOj_;EY(;*_qn>wx5>F5N{6Rf3EZ4N%~3gjx+Vv-(5=P zz2?ybMa231lQS>O&fVp?`L$L0?j_TT+foL;-_=h16L*Cf?X z@A&xr#P<7j>esLHO#55aHtVb9eAW87zfEUGeqOw8zt^`Lwb$p*KPr1ZX{GnOZC@lU zCG}Eo3!m8eJ#g3aJ(vDPJHI{^+90qZ#(iJzFJF!;X76G|8CkCRHwa|>y<@@MI7#@& zhsFI*Z#_&t^5%XL-{;iZXSle&zR1)6n^vdr^C{{J0te@<+Y)Cb}>7P zrr!CteE*5no9|7#B5C!kSXjsA!-dD6&h&`C-4!%FDSOkz+_sqx-gZBi-zoT9QQgT| ze8+5=n~%a&n@RQtOQN6YMjqR_B`RyeWpf$nX7^_}+;jQ{5gI$oY$9K7u0ljHOJ zc0Y+cp*{rvy0q}cW|r*)Y1t^Lnz?)z-u&B!ljbgHgS!ZvHgjG5=p z9k$W#+xgY+=cE1cx9aEo(wR`hsdCw8LFnr6)5*chZ*NXJGjZ2v0Z0d7$(clPOJZEZd`fJ{=13gmkIIS?R>IFSX_+b>tg54__k-pc9+TR#wzU^lwm3yr$-CXlqjn7(87Z zLwpvPKWH*eS#P_$BPea}zyBv{Coem7`~A6X{)O*^6aHD>p678+-q1)la{62LX*E2b z-x@y^ba;>sj^##ZEGPUsYqr^3ZuYM&ds*`J+AA$nk8Evz^Firrf!_0~hd-B}E<7%$ z_xASo>Ff9ZbNgrZ*|f6g*5{%NjlWN}%h&0o_3yuu-uPr+y_$+q zY|)AO)9F)J5;ghe^OXlZK@G{xwP$>CjVG&B?y!}&T02Mo_Y8agyV06gO?TGJ`C0t@ z)9#taPWQZye^-5^PR;cEgmVsRm*=^)R=Aa&b29pVJXL(Y^4@Qo-#kCg$}N6+?{|AO zdA%PIT3T9f($lw3UsSYHUbERD8?>^p&FH!ZXl0!~%4#)n#?MPXJnpxjSp9D9os@0< z+b)B9-c}EEZk9}bcDiCl!_#9IA74MKS9C3T-v|C3AABmG-4svx)id*3)U))t_tu|W zy6<1r$~z{{&X-9{erI4W_Qm#}MCGHE&yVO>KICaEy1T(*=aY!63CZiy?_HBI`y*!P z==sTG+ht2-b<-Zh_!IAI9|X?)_T~Pyxzlqcd!9^^TDC!S-IVP1m}@zgpQX5-Q+;vi zZSWR5^PkKA|GC50bcSE+C7*SR^?UxJBMaG0BeU&p&-0jRrc`!qJ}54EuP?tprAiE=(+h!THA0jMJ?_rgx!FKSk>!!zhwg^Rd*(vDr{{jRxdHO+zquuk3X7h-+`m2k zP@!C!+xM2;@)M@VS1!K!^5pZjyH@XYuE*NDojGl?*qu+%__ccFjP!Fe*YDA*pH&cl zE8rB1)ban%Jbo4)<@%kv@QT2S8|NiYK7Dt_+jslD80EXW-)>#^_U1hPV8c1*yPs{o za?@(%)5+(T{?z&Tn&--#^Al%&GtoL?yeYGM+jDnep1H-xJU<=s-kkEUo%^k7|6Ipe z@&EiT^8e=)VEUQwmDBOemb}OwTjeiZSQ{{ zSN>(KT`s$Q`aIj}6BFCzRJg@;r&+(7lk$J(P4#D+y#HxfzuS;2+?%q(Ax(#bFu8k#;m7V)-@f+q-MQcIeE>C-KnRa%zUYTLVNvQ-8A9o&C~wgtA3}( zE`P`SjLz)*eLut2$r@g(JAGy6oY}?+5=IpbGIci^&$?+vPe|sP{mp$5@3&2*+~T?$ z@88?=s;hg+_4PW{WLz$_j+FE?S7}zE?dU%;FTeGH~nfra> zp5Jv>>dyV#fBs*pee;`b-sv~<_ivE7wR`%WPp@vjo|a^+zk5#ox0RsrG}D(WD$5M? zKh1b>=*$^2<0Jf*E2hg-pGn;GR=-~Hq=3@ppoC|Z+F|zo^D461j!27jaK`w^h8|pZ z>G=-jrKj_DpO~UPZ|nTSL9aa^^|M}h`m~+9GoM^7+davB+w;RE<%g8}ZI$_LKea5m zz5RG(UG4Ngrf)0%oP7S|AN%qfS5?2CIFstX_-n13-?rbgm)<|M`TY4Q`}h5rRm(qP z!TTGF`8Lj%J)3_0${i)pm|Nt8XKVKxZrL`6g`@FQ=9b(0*0(t1+Out8U}Px*ZPdBj zHHqVg*8!ck1`p49ev6*-Y{!>Jo8Ow7S$+~W$i8>q^rPa>*Z2R;EA9R9Cu=F_u#5?_ z85Ae%7FGl;Z~CL2@NM$W$}_TM9?49Lq}$?EZC9`UbN!;y_Y-?eN-oc^ezW2188!RA zSA=JuS*7>s=}I|9mQNxIET@Ef9_b1xuw)6!t1CA+XoD928CgtsUND8_Oi^xf{{HBH zpYQ9xO|?5SDP86#=M~pSMTcK}{N}m6M@lPp_q&<#tW(?=7+In~>zDcT1y;tYM&h)R- zC;ygBw`VR=XmEH5+FJVV#*dAuEe>@up}$%h>RG!!iJYFE`~RN77oNr<@ecDd(+@h& z$~%;Ik5AV0k5~11RX)(MAEuxLytPuV)O-;O6UQHwgtUJ>()JrU+izNbo~1bbq}c3y zE@38)DLWVx13LL9oS)^+@nkdOQfrPMF%1GIo-_M=7XYnnet*92WU2D8b*oE2UE*FQGU|JAeS8`sM_mF^t^4hNW- zS{&pgROC%33Y>6n_6!%$U}kh$U?h>Us{?d;SH=708Q^B!rqt6*v~Gl+vwSRaGr2!D zQf^7Xkt;0>OrUkVJCl(tN;}qV^mF3!l%uDvetP|P_0u`V{?p!WyUQlWBJiPuL2-gR z+bQ+4DwsQVz^maK{)5--O#x?a@Nz$nAC3(IC-@h?m}@7%RGGdeLz9W4Lx8DJ9I~9R zfq_X*6x3g}0LLOk5PGcLqViu398czMT(p!!!GYt5Eo>-E|@=NGu7F>c+d@$%xEV%=hwFXktFaRd zGt*irrn?3;8%kbpoBsUb3sAs<<0OEK>GLz)2@lQhTw9~5HPK>8-nl!GOD`PTmgl@o zpyTCthh(Y5yppD7PUaZq(PFS0*|LvzG z#*M4AzBjTrP7+v=|6@a>HAkaYQbtA#KTDS|6KnI|QtQey>~_zgHO@|Ef)RIaA5Ytj6VweTQ-NznxV&H^>@qt(~`^Q-q5=K zT!|w^sN%=POrxI{mvc1ka23#)z6$sdv-XLd4kRue7W`q^a^myFj6XX*y{`NvC(Kl+K4leyV!+Bip0}U69Ri&c zuEl*n{npVQs{TMX(;Ln&pI3a0d3Dr!hM6)X5+xYFv1GmS;0T%VyDN%I-+?2fA~?(C zfM&oGffFI?-~Kmt-!ELRZT)tKEJOoD7enL!-*4`Jda~tt{kqJzlVueH+5|G*8f%_k z%DUs{3dqXXMj_!HfBnCkRjVnnWLbH%IH;CgzBH#4l;3zbM8X%GPz<!;$PMrbrQI8=c%jq>H9f)19w1xV@wJ>L<|3@A(^-Er)7;U<}gBsLE0VF7QG59aMM}$-9EH`l!B<7A{Ax z@im66iO}5MJ6~h-y^8Bw3*X)@pK!PQb|jxoLcHaxj(eMKE}Ok$-sJqo)YJQ>&ziXX z)SjQ*Pv02(PYd>cH#=W6^7Q(sy;1in9^2k5y*@Yf`&}z@P3!V|OgmrA3fz?DyO>AP z#(~fN&4HfM%(YMNepfPD_f0PH+h6{q9KGF7ax6b>XjT#6IPvQ0>Lq1|{(kzToquAZ zyS&zP9*gK(+q1(j?AsCg?cbXjG3H5YVsn0MXe@fb_Sv_6g0key;(V@I7b! ze!}(2yjJ_aUyOGydnWet{`B~hy~^uBgIRa{PX7FS)Z1>V_4~Sjx|oeIc`}7tbM}6n z=6i1L&r3Rz=5>oeLk-9J$teeqdp}vkeQtvAFPX{3*4&{VHXdJonwj5LFFI%6${xAW-jbWO z)5Su4Ij$(#`MDhkZ4fvy6|v#mArmy6(a#NTIYWv<@Wz1O8r#Y^zFcf_E&96Q;-;FP zMcjfR;4C3nC7MfJvZ5orl5GlAMs*9lWi;u4}C<)83!geuG->m)6C$ z!e)7nxvh)a>^80DlmE{8OUXj3=Z9~QRC}kTtN$?O+q*6Q)K5e%|DGN6@{|1Z)4Gq} zO)9^)dh*};P+jNsG759e-dx#o=9B2RGqcju_GJ9u$+@B}wss|Gj!HK_p)tGQ+y|>i zADUAxEPZ~<``Xqg3M^Tja?h0>fVQZ^H$4bAEKmWppxax~+g7zA(bgpyR`=E8@o>z;5uAG>bgTiVCMFDdT zSoQiK5LCoBqPGu=2 zukq$oKI<P`zfW(!pLX)h^z@VW<7-dPo4e(x*zD7t zwfz(Cf3=LVD)~`)>~#IV&+$9Ujzs)?{=fF#n_1^1jm}+2xsdw&?_*pMtEuPu;#f zpjumyY3IMI3mBMmg+7#Ue3`HRPhEfSC%0|}3rSehCquVUncv=H+ux`9TxFI{3gxG+ zaWyU~es=0kCHEa^*bWzg39C-kF44NNb%9We!@D_aC7CRp#f7V4j2`4<-d{I2Tls#) zYulZbZ{~yN1urgMH&Ji*`=t4oZ_Jn=p1x15+^;6W=fISA2FAT@d~yoa@2@Vsd3@%# zi-meu%btpg-^$(d{GNNt%S-vQt``1UseU5!uYZhrxBAZG0lT(=HWm~)%};*QKk4+N zng9Q9Gc*-i^XKKg|6eYje{$_sb;`j*N59p}*B&{TbnbS+;WLRdja7=-ypBDeS1mv7 zrE%J+mCOJ5ttnV~$F6Qs&A;{fvrNykgiMe7^8d}<@;Sm+ZyorUK5bFN`ln)hzv=Dh zo*keQ5pXfvSwz(FXjkkKZmn2{E}cb5t^ykq-tSE~=(XvM(v8-g#rI zLL=*wK9fAlCja@=zsa)r*_`*5#xrN8pR-i=oNcz+{MWm;+wV`;G!2hTEw0~kN1Vsn z{oStbiP^P_4X%eNaXhKcn846Dho#Gm!zB0D)lWAjpMMroX$I<)gG)9p-GT#k)t&be z+CD0BJXs&np&)R5>A$xQT#ypt4wDqeu7ZmC>?w{C@=Xr^x>|XdG6fQkobYyW-(|t9 zw9;$k;;?D^{7{IwIkt#a@FxagevcI)*|?`!NdIhdaMc(8FS5!E=QaH0Br zy-NBV<2lP<+s;_Jf)bv6Dctm!@Ak8pvL=UrEkF5~3S(d0XIlcPX%(g(&{Y36ExGTV z9G8HjLj5r(w#GS&Q`G$T1Sna*zp|o1>dw!P$LBwJ+;6|JNyA^a<{;OnjDVCgCk}=w zIN5*oo_>19$IDND%h!o~&ycYWPG@+$WS_hD`#9Sp2LEc_WU?pS3BGK(JnQn`dF9_U zH`Q<7yJXR$^QP4$yS8(?#U-)k+_^lz_WxggqoOw{7W#i(mRjuBz1(r~#>H(X zHl^mD+%jwR+Fvi+n|1g0y_vVgFJRTREz6T`=UlEo)w1!h&}+7x%a>Vi`!0Ct`3$*B zyFypHgjt=v>$-S($F-ZXGcH&8%&@u4^)7?KZ~2m9f64UzOP9+S z&t1X1aS;#GQY*tJZU?VH8`ljEi7b8g-#lJc=bWEY?j~?zzQKJ*g>~M4Z#RfQlq?at zaM9tiT0a+Shr$H=WW{EO^84RAVoJ~2{CBEcQovSK_v>Z)Osm>yHv3kE_fWM!ZKGPA0^ow;1@x`xDK9wuJNf?YBj{@?2ix~)8K z-@j+GmrS%QV|u=&V%OboxARoPW3BBoy{u(#nv`6S-1KbL%j-Tx>*AMWv-8RqP1_Q= zxOc1e+-VgrIzDzz42t_{+3fJ`mwTDz`}!A!JO7-r{PcZ)ZU*bFZ8!dWzvz6fpRMbd z{~X1wrKi`}vr9e{-NG!u!lmVE#j;6Qfn&;C>1fc957@Vn+yX48X6ZfVpC6Ie0rLH`oqNO5jSIu>UM0& z-5q;M=dI@blBn(7?);N^&13F+&CZgQ{d-PM@rmix*?W~`J57H4`FPEKZuYMi``-%s zznf_JZQHrbk73bkx2}oWdW!4Hi!G(I^LKT=cp>$7N3(a_)Dpj+Wg+LCm)t*DE3|m- zn}lh7X`g1j^8M^BdZvi2yh^Tc!WZk85$6Lv&y}{D><>}iW0YBJt?RfT=gJMX#s^F+ zjZM)Lg&?Kjifb3wMsUo4>y^da>uS3$y9Fe!tM=uOIIC ze6{3Thx+#uGS>Xhw^V$)zi6VDq|Jkp%$ti^V{9^)UD^MyEobvrF{8XM0zY53NiR_; z_WN1(@4@Dj{k7jWT(WZK*m^f``5bAT`pELRZaVVN7#($=q3C z!_vrg-NjdsKTL(yPHI!?OrDJScB`owvhv-R_6aRQQ@4THngHaxvBZI{Ccl z;ER)=Za)8?zP9}G^6>sOTCaF6?Qq{$k($xpR@l$twY9IWc-6L$;Mtb$`(Mnmd+g3X zb?f!G)3^2(9|>OdY3K5zmo?v>vweN!NR{=u(z24?HF55;v$jl|xOv{UDfv=1vyDD7 z-Aw$QyJr1m-}2{o?&)<~Hzc#~yu>=eL_U4PN!zD!VZ3i{bSMO@Ys%?&sA6n#_#yzQ zMFboa`k7c7KXpheWH&i5PVi`g4Dv9ta4?B7+)Nj5km2TH@8@f@-p3qP zJ5iDux47-n+QpyWRm-1ZRaQUw-Tu#uo%8y|ZdtP4cKm?_WG`T7{e;N|hU-EmcCiJz2fj}tDRTFRWm=>)yX;yn2UDu{@iGn;VFeD6Go7HTIv~Lw26B56cdl}i z!@|Hx&>=EQP63uvo%&OHxdmB@`u5zcyS+B$&yCNn&5k!~j5wJrnKi}xW!2_dhehx9 z+1l4vSAM#wI`v#H_nNOAZhaC8*=x7DEl#=>ykTw3PA_OpHN_)&{l>{!9U>)Bd*bVV z`=-SfFShyeA^6fVUuj9>qJT?vCGF=F&TZV=KS8+PUMsLq;h;`>B-^+5>Q<{x{$t@~ zvi^|$#MbLoU)`MqydPVY)fOy=%Ab}nys$%Kc_ z=O&qDZ}GfkGdc6)y~_8@l9p+!{=Bb`KmBfZ*_4IN=O&n5|6{E2l;_co$en0*HEjN}%r^PDDkV2wJNP%O@jfrM9u(bff z@fyJt(&G>AHD5FklH?0ms7JtTPc-#?%Ai(d9* zr#vjyH|5%3(X7w@X8ZIx)!$AAeLP+ly)|d%miKG7-;2?cv-L5%Q}B0-*tv^lyZSEe zxaj<3y>wneZZafbzM9`ZdE(;ar)$gaiGMfA|8{Q9L7nv%o$UYZa9ZZK|5i~<{@(o_ z|2O+ji?w#weZ2i%o&UPowcUF@UbDWm$d&tI)pF^nWQ7wfZ2adh%f9V1v!e0MhQDT( z)Bi5+x8KU-D7E9`uQhwG%_@r8|9Hu5yJ|Hihgo`et*qAX3DXwuotMNKsn#p6H#>iy z=i)W{|9sNknej%X^8Ma^Db@&+10{Fo%znCVx4d7@^Eqm|w=+M^dHrrqQBwZP(klx$ z6o=X}ikvI)Bmn#fx9= z`~9za=hJJ|Pd}>9pZdQ3$HiG~c^4}GuGw0%X|CA&-|y=ua86G5(%E-q7E}JC9}hR( zi@!E?V)F8+#S8tc7Eb^2@~U#6kM)eHd2{8`BQN!y`}OQ~{?mQz@{`-;YTfqz`z8JJ zxtjDzNA{AfHD9e|Ex&#>zh4pc03kT!JiFzoLSgl0+0ZLVDJ^&FuDUPzW&GDwYcESTrsYR^Yg@ z#n(+>Mdsg|){r5KZ48bJmc8d@X`Ho>SEF$|gQG$f8`Dow1&%54@kP+_^F||akVe@C zg@DVyHkU)PBL|b|d^-n$6+gGIs(OkkaJck4DC`GS;;+5mL0ug1jESXj);4AVmaM4y zZ++m(g~4&bv&-xt&D$2Jur$74<`4;LPzX@mdQ%+YAdV?>K~BmoYI5*>ef}Qg{163> zD>c8sTE(WcCxV8w)6uDjOf z@B8cbZqIMUmjb!^*5O-yR~=>Mw^MwqKXc-b+b13}Ke^z%%XHPs%vqm6v&?(H+iESJ zb0zxUrgv7Zs{&^v#TR~!nQ8vN@5s4z`~C=ZhJ-)Mea_3vyJ<<@%srcSg!x(Ro4#h> zudIddynkORZ$6Q~vILE1DJAB)9#W-}W0d!8a=w*PqxITRz=(SIM)8k}YhG3j%hh9h)i0a%#q! zn|Tx7&G~+?{r@yZXSb8j|NlIs^`G(Xw`ttx-@mW)o&4_Bww2oRPv$$U+GMu;e)0GG z^j&2quh|7}4qY8~^3Bfer@j{F`QBO@mmP1DHX~=p!C#Xy=iQuU`=ab!^|}q~9XGAa zU%0M&*6EFJ_1t%D+x$M$>~2Z2<%fpaCB?_HGB2lnU2rz`(#v(bABydK*EW0ds}XKyw|c8Y@-G9aq8%T&nQk7Ozk2;%&v~`~ zR3AFlZeY{8a(1`upPkQs&0exCFY*?<+Ci^(bG0tFpDfd>e!FoskJWpVn=j<+v!@iA znXle?WueSA-H`p+eA8}zneSx#h9k)Ax8sYi=696-|9+M2DcW%UsMYPqVc%CCe=}pE z^O9Y)yJNZnjBX3DWZhbp)Ac&2cE+0PzBPvgIf~A4e_CL1Vr#C2>N&gV3i}!BcA780 z|M{61%O!>jYq#H5-@I<7ws!bBuK+7%hhN7HZXH}d*XZXwg@9iS`HFpSeVQEJZOh&M zxXdW+Ny5#V&AvvN-zNEZ3#@oKd#Xaf1Q9Z#t+2Gsc(}$m|-FC-Et#7x(wp&G)mn^!l{ZPitCpKJH-yhPid}f(;xqeo# zz=`*FX7BWPtXpK6XS)5Y+3)2(vrU3ZS^{>~b1<3a@`DPGe~E8wPgv@oF!eS3b1wDs z?TJtwKyli%8eeroG zOXC*V(lB1x%x(Xw>Nz)Oi^Rr(3ayhIOs2Kc0ZibWI?Jg+As~2#_({9NJ7(nNnFqK! z#cxPrt4x^WnfPX6{CE2wEnjTjIJ{QeP*+qtcmlY@ze-OEc)s_tanOaJy-Tm74D6pyn0bm_>@kI(1VPu%%AU%Xa(d-3s( zEqQmfR@WHa>`(|$i+Z?Rl|y7-=E7p0*K@>=ZOz^HdfwUh!TU~6@&1>{-e~vx5BJXB z``S~_>&;!7wOrPAz46{OxeM7>+~sPc)cp1yn)UF&zZV<|%3Gd@{TndU-p8YKB&$LhYs4 zZAJV{OJ|=8KF^rH|97L${KDQVy0P;XyuMPHKGWnMQ)Km8)7h(5O1}+nb`VxOKjrwm zh>X2oYd>-BU2?mw`eao0x{2G3gjh~V=Pu}({b<*emk*dseIK~6GhJWq&i{Z-yP~lTnh+|MUGo?Z%Zt zLM&eT^2cgd$KOsXy8q>NzP4&uwEpF^7+v}LKbcCe<=X#wxA9p8M{Uh|xqWw2?R%TL zZ8x*HE#F>woO1nKU}WyrYn7VJjtll|NSmVRxS(f;M~nkwlLPCKwD43-2Z0k8-^AB` z?Y&d@o%z#=$LCL^&;L7r&E{`WmsTck{bIFhch0t#_NgB>Z0u}(d$)TQ+g=TxD#rEV z$-f$2y-bgrkea_|az(Ole$cl2W!aXWJ~XRJt(?@=)wQJW^*+u`;=F&qZ2o`ZZMm(+ zdAt8fL3e-2l`ok(|FdrHch@byPZZca@GlLPd%{~}nzQ?HS&;GPTSxTtB<&AXai4ts z`N-t+CtH)%)b~l5{m?nB*werJugQag1OKW|Z$7_Y=ezxv8CUco)3zSm7M-uzF0*C* zmlt&l-ancbm%F0YOP=TJi@JuAjyH2Y@s{kDmVEyGTl3AUQQN1n%U1@;Ro5)kssEhY zz4R^L?UNU6`KRvveoHqq-tk@v_ofGH&RzWf&Ju;y;!WU{>d@$~;%Rq@`L zO1~Z)__sq|?f2aeyXCE39B!I>>#YK)E0wqZbz@85?^R_*j|$zrkMq4<`}pPc`1;M4 z?$q4A`{`Kpd#~5m)`BK6PkGk%=asD4@q6Ap=XZPm2UfnCDgI>cce@SyuGuaA$1cBP ze$Jl2$6I?%eAm5wsnfns@%IH~|5M!EaT`x1oG)J=TofAiPQjMnI-=}G-D|h!eC3v3 z?#I1uxcU3jt@CWJ*Q@V-d(Dy0azpefbI!vS?yZGqet(r;U(3SD)OvB+%Tv$no>xsZ zj@_M_G`)ACU5a(}f!5BuOSolPEBE~Q@wn^2{=#z#6Ji5w&wbs#FTKAxSZ?{u8#^xx zv7B<%|DM}z$dU42%(8y{7xTUD-|IcM*M6V!`q>?&&(H2BKHO1X+&u66-QzpL?Pg8? zcg=ot!9<&1N1P)69lPDx{-WyK{kq+`PaZITpSt(kjiaAusa-ElQhUCq;rh#&C2sqFr4`4DObc9heB0-vTYP-( zWH#S>Z@qo@_eS^BM^8>Of35%ix9apX-8I#gvX)DZpN+p3yFBpY-k$STYu6un^tI^t zUH+)=K~+Alj9Zw$zt?h?EnKl?f8D2&lDO}0tLolgUfnKJb>iQ=-)E0bR0zmT?vw`Psa?>pX`{+umev;MOr zi&wZ<`psSPyY}-~eK(0r?ltSQ->v_s>bq6UzmMB_pPb5mrs`XpkiVc*+VD$^<&y<} zg&G$qn4kJ~v}B#*g5!!YF-BK51yW+&R4`uOJ z=GUG22uj{3iuL!rnVGt(G|Ob;KEeMdlFy%*8h-xk8~?JlT?xM${w?pk_h6^}%zJy} z>)%W)IvQ$jB4wNWy!t}p?^7EZ)75@?t#ee!U2pxqGT_~=-wT(RYrXyZREp(N%^m)T zl7DYbFYDjTWccgj?#NR64f_i!>MP%Lrmvmo6?go{N%b$&-nGBc57wLe^ya&`<6U$6 z?HDQ_9t~eR+h%=n$Fj@qXP)!hovw;_#&>U*{G`-d^JeXz_VDELdDBl$k9&Dj?OgJ| z9rtXXP7$s)uR45w{ryb2{eM2KzO(6p-0R$!=OtQsm-l|V5z02Vd{*fiEBnMbi#OSx zyF67ncEh22db1S*%yJ`NIW92hpT5mHC!6(6`uUw#H{X9(D`?&!=7sU;p*e z&FI|B?GEd9mCXwcw>=*dXne5hqyWHVc1T>QUjJv)C~T5?h1<+{gj=l+aMZ>zLjtZ(Eqzp~fn!-dK7O0Pa%z3DEW z=i9g*#|1g>yhWE>X?CcJx&QycO<5eU?7J$5$T5A_yh;I~B9^@$m7V_i}DOE$(kCjOSRl z?^o8QqNiTxrH!ro_vh`{cV67Z!{KFe6K%w zO!}{F;o=A7%5Ov8y|4cf=+-kwWBtBuDj&BNFPRZP?;ZQMy1$O6_x=0z`eeKO-+RaR z*sW~pkISD?l{;T+!jqi$Ik$qpe|>iQebi#nw+*Y}YxS-E+gN^?keBJsxXXP?g>8-3 zcKP+&a}Ha$|GcVu;(OiSxWr5ds|e);qHoArCovu9qX+?3wm@8VOsPVdXd zN2PaID-Wz_JSg06A7xeE^~6S%%W;8%d+NVSBEbSDvZu7q_u1#h^wLVuipe_E;8d*M z`ilmTG#O%Cx~8<&`1`WkYgfJ8`aslJPs~=_!v5WB;n?YEuT+&&_wHZw`g%y?KL4-M z8{S!EpKj*2*POg8Zr%>I%h}UCAG@pAUbs5<$#1Km?+dT*DZle|f$7~)wfP~}Kg_zH zKL7vxJGJ+fH$CY4Z7bh)n}12^l-+*Osry4FpYm~^v+MoGCYFXRc6HY|6JyW6*m^ZJ z{LHl5?{?@5yJ;R%2r&D;v@58`ae=7)x(PQXEj3#EEbHeV`*@XGVe7R^rYyAOc31n} z7k9kc?C%Bbf;Zor=7%MGkF`Gav9`+V_o{7{y;Uk4Q!Xx?H~q-UCWp7$_3`Pw{7k;8 z0o%Xu?tJ;oTKcV>*!uIQH@{xCO8vL%f|V@L{uoo*X0-|X4w_Z|n!3n*<~Mi!0=94V zXRB^MJ^jBncW+_&_r3h;TLbqsIh5b~Ji%1x;6It`zd0;_9=UfdiuKopS8Y4DpZXL1 z-mm7poaJNFInntu&e=U?vHbGjZ)&gEYVW_V^G_X}e#V2VDz@O?&TASn&yT-n3%dO4 z?8SHG%u6eGEU)}LOUQ5eQE9uPphXpl`m0`wid^J=`!9WN(%#f{pUqx3`^LUM^t0jf z6XE`eb?RR|V>t9v= z?54bZ^?HZ9|9-zsy&ID8!S(ms9_@9TbKd%Iul+uuyN%yt)-k;kTiB|Ke?_hFdv>Q{ z_LXb8pKZc31-zH9_V~KN#KXQIea-K+JO5bi{CkdFDE{S%Ny&XyXMSyupBLw-uytR? zk;-dd`sV+CzTYVC(U&Ef&rRZaV|ZjsroGv5*zDSgRUd`3Ctb6UtiG6F`62$d%Bdx} zRwX}n9GQLimw_L1-tLmF2=j_}b&L7sm&F=+nf-k3rg=Mh|A{TO>-YUr+nM+-H*8*1 z+e7E`6Zs~73%h^yqP11%0=os<-QU09=vq0w=hTY(wqMVDHY$2^#pV9hzdVu^ZEr4V zX6@x%8#n#@F2{Mb|CZYSzFSv)s`cUlrL}N2{PMX zoUdp0ZChOKRL_04)R*~5W!jo-u>WZlH)sEC`*lA&#qQMYKeO-Sv?cpqnacLeOMmrh z`e{%PxI3=us_~Asui3u7ES(`!b%HT+y|jyf#^iazb+?x7&^ue^tMJ`);%9T$_0lC? zD`sv^Q}3-g9WL-MM?J;J6Af}-Tiv@_xt*k-g(=vZ}BvD zy19N{;+F2)(WfszpP{@YfBw8p-)?1}6#xG>Xx*-N%a&xm-ct9jTBG*li?iGB3CqS# zePy$TasIu%RUX&(mVdY5ul}1iulk#&(dVw$lh@rY{r@iedq}#>{`-$MtV{oLv}2*T zkH;7Fz4_8N_RlvhozCWK_vc0MOtZ(U+>~#28*(hUcJt2kw!)nDkEey6sO~EHeX;oY z(qOmKe7FBva<};1wMqD};)r)lmAp~LftT0*cCdBC)tTnmN^fBHw9@i<-+VnXJ@@=? z#lMT?x|h$n;9ezrH}+c0;@;BQb(h!cSH0Zo@-c`t`Rkp3r&bqcN4*L8UR!1JYRaeB z@3(AMPfy`sYP~33eEP69$CT*4oL+}I&?x2g>32@MFL=}J@Qz!5ZdTTnuZ{C*#<9J7fx!>OOn%|%HTzqfV-kbFoKYX5aYEg0CeDjPcHDAA)hkg9^W>a^M zv}MG#AIXl{>!l}c_P4*dE1-DY@5TAEEtjW#*fsIP?#3&Bf8U+*`>sQ#oYk+)0~aoK zF1T{hT~3Sn{M+dqYj!Mey1adQnvd-4F9NpLov*!KbT50!k!txGmFBiS&zKHtcfFm= zT`Tj>eO>t2^!j=KJ(;Ug%llt^+FV}$exKq6o4d6~vv+ClpRHBPU2&sTSc=ul~wRp>l0t^uJ zxXb)6n^#9p_noln)Hcb_LM*3d=v?9LQsr3k+dMrKKN2z|7>aUW-I+Aub#y1_g6k=e_hHlfBn=K zrdO95+wZSxyQue0{Q4Kwxu4Hjs=l1_-gMTPO8%w#%U=9)`)>cCLb)$waa~hP`YY2@ zv$EGsG+{b?&u{;1qmN4WU;h5HPWaG{c^8x4d|I71Av$ljdEi<_=5rGkSIJE(seNV| z?6Q%qannwH-p4oi9=oefSD0|UcHzA9&(H0SUAODq_m!$&W9({QN!+YDeRgu!>VvZv zDj$nx{H}2Qs@1I*UxNF+t;D{n&f#|R^V)M`TGo=qdy}hE?%95~*ZO|%d&l!ByLa7t zvBgt)t?2=yp8_nWT(s>oIhmdwpBe*efyKlzrOLBZJ-N6%^~=%eYEiaVZ`ZstH~uWj z^67QmyKevQhaJE3c2>)ZTK~_HORLf~dsiL|s-m72vRB^W7rYaEaA}nJiSv4QzvqRo zXP4Zy_xg(|+UY(UmOU(Z{_yLA1A5KYAD-4#n_Zq={+vUyTHf)^-@H|O@(MOr{?_)0 z+;dC)jKYNQ>K*;f3Yl}v@4nl&dU5ubXTJT`&yU-d_N;qeaPUI$n(c~TAFoSa_V(pf z{jGEPY%A<i^j#8tnWwdG%^V!ycVYHNXarc#$y`@M8y zul&o$R;b7!;-Xof*`>T@BQTj(;m^Rf}x!msV>)Uq!hhHf#DEY;A?>HaocxvKV z%fQouPv$%?_kH}e`gN&~b+gU8*BRg6SMDlp{_`iO_Wjde{rmr$zFb?gUSYTK{+f9A ztPg3Au4oG_uDQf|_)hNgJ?)>O7VFNwIDO{6EenoM^LzPbUtF=&ufJmLg|>?wHywQ5 z?`<=~|LdaJb`!3fu6VPOYwMh&5-g{_?K4@EY<)ZV(mlP~3KP!FD0uc#y~}Uw)0&^B zYVABr=RVpee(hpT`kbmgp=%cW4Y<53p6Tl>&LgKauD)21bNz)X$CPaUGqu%C4m+hM zIVZAmFo|B9y?5$5hnwt;bAmN8jj#L2PBtm+z5C_eN_j3xmP^tqbCrKj4Nv~`;xYHr z-tG5%zj*9d2v}uWc8A~iF8|Wzdm4~Z@22QQ^EqsMvXfU#-z*DCA6biI_=3N?*6wO= zUHR(Gy5`SJcVoBBulsd#)};5H%ja$1cWLFpl9I`P)k2quUfAW`{d#7Z z?cLz5mZujTT=r`2?UVn0zf;})_LgHwV8nX=U3Jg*6_)sSKR@H|uJx*8=hOUs$$ul= zvtq0&r+ihod{?~4(w+6|H?Qfw^UtVpO!19o)0_=0xqReTz5Eh>xP4Bp@Ai!Kmmlc3 z@9Pt{7I?p|SioI>c}eg>0T!;s>7sW1Nt{f&E93RjzskRp&MCLI;1R0%_-eOflf}Dh zmlD?XP3gXRE&BSB(yym4`R$fC_I~y>MQ~Z9_G0T=>xMTxF+1P0?`ewK`R#+k^SJea z=I8!C`)zgUE_?7^o298m-?R5C1ekGOTyA_h`*oaq+4g10W$R|YFjYF5`Qp2@(6O&Q zzaQ4^5vFBVEcj+$w))H3FNyoOTiD*R z`zf!#sC(|^oIjszh~e9^tgT7GZ-w+R=@toQtGyk-*n zdi{KxB+XdMrYRTi74F*hG27glzx?)+S-Wj+Keo@Xob!|YrM}~wKYeEvQcpjrnar>J zHorTr#&_BIJ=bQro&ERX_EoE?&yGp|-+M8SyK+y(T;|}va<^E&&gMIpz3arZxsxhk zYXKH)>tW&2nmWJas1OTRQD30q{%j6k;bS{JK5tyka%rWIxZUqXFHBCYwEM~9#%lTe zXY6H`(n9~!&ua|c%cw5lFH4WH^4oT|>U4m0-h|?%*G0CUbNaD$|NZZE*C#sGEr0WA zNw&Cbph@ks(%x%vTep9WE;hPa+Wxov?c`)PzKN^mmQAqyoHso?{k*@y&$*ZXzIyS! zcEanK3bkgTcF^*pBY1+{+}Dk>*2z?z|8ilm|H-N0_h&@Z2Y+9#AH`?$JtVSxZmHB; zyUPnE&221ZNxD$C;x^mg-okmmFZ;4DSKhDgzbC-#Zp!1H3`x!@g5hyO)OAy-(M!JUAghutn5=S3WJ4mD>UHL}j(H_TzQRu&d&B=4@&3w`t7~NTUHm#| z@29AkXZMT3PaTbU`{~6B-nm?e6;u1v~c-vxA*_8H9OvY{ofuryQQ;#>Av`>>tV~m z#2R=iUaHAK>1GehrNF|?&+ln{&flwTc*|XW&ij4Q?l)JT*4y+l?f(?c$$H*BzjUT5 zO!(&VyvqEWNZ9PWJ%N`>J+JRAn|x86Z<6V?4B@QjzNNVvf4y3L^3+sq;oQO>iR`By zeD<4uZEdvat^N1&CxX(AtYe-08>gSK$+z|QpPg4d+vfkF)1AL8wU>T(s;&CEL2gBL zZ`wDb%O#+ZoMk!J`uh^3i~dz)uL}76cx&GLzjNbd|L)uV+4Fl)_x#?=3MWjn^<)j@ zue&BnWX^4}V10Rc=MNUmcDA$fH9tIOntc7Vq;AdMvKt4CrRQpI;$^a2pWY;u{j>SY z!ji=cbM5c$UuS(~XRu3H^xN+%*BV2bC;KxOUp(cNJoV>ur@EhaV>6%T&3HW{?P!f* z%G)WT#!sscXIS|8Jl=h2RZU`6@)jezy0=@G?$@_D$r-Odtd)!%|HF&FU&w8`DmGhnncayc@;549-af|6*6-zW z_u)MEJNoAp%&m4V`>5@FVV}g4h|kX8X6Tm7m{F(Oy4u_7?B;?UNlpaR=p<+xvdqJvXo3 zYU@d6emk}8Iy=r+8NB#<(foqH)kBGw61np~ceArJHf_oIcS*!s;Dqhfh*ev!|2e0a zIJbLFqrhG^=^Ot|EZ*r>jnD7PcEc-kHC@>R0XiuhI{AKK+b6 zZgqN6o|VP+>*@3B70d5`FF4iu;%(rI+CIxWQSnFTRb9zl_B~+ovHpyd$EKz4CNQR- z2(;zTG>M&lKY!Z&?`3x{-7Q|aJFe*VlWMCSH8J9?iBC#x(yW_Z*BwuvP~5X`Lg~xY z>nCi#+fLeIz5XS8^ONV{Y1<2TO`mn??)MjKWI(5@-6{RxQzZVMPTb9pye8bjtW}LwJ zS(Tk{Vyds_aVc{Pp5`w3-7*K{P>Ee z^5knbPGA4HD1Y&*{O#5IYQOK2`*y3`>g5*iY<(40# zZfi(K!^Y%U8t+_hT)9s5ZmsnR4w>~|Pu}@m{Oobu=cC#O9>@JZtGz=0m}OwK6L<(^ zmcrAEe_uA=IeB^gmT%ed%X9bN4O_&o|8?@)_q7w^=ISk2s4v62H^J%A_tN#YWm7MT z^G@1&Ek;>08=OGPWmjf9TQ1M``@U$}?zc^U=4CJV*Qq{#s&rn=1fziWHH=y>-cOB- z_nTo9Jg?%@&X(|1E5H8v^yRnRiLX8rzV0=V-`jUtv;O(LlIlfw68+hy_rG3b(6i-G zqTFrAzJno|O;en=U;VvD@$m7^d)sfzudjP1S3C9W-gUPv?rxlsRqMb0z~7vKgV5Lp|4V!FbyRW~OR*>}stwY+wJ*8IQ zM6KcS{5AeE_DY!ttJl9|zGH6i&V1*W-o28+$GiGIY_R{;c9vCH-Sh6Hr}M-=)GZGD z!sd{_L~mYAWYX^-E~d=C&%j;Mym_Ja-?xZEmmgS7>GuCV@u{iI|0|QLqF*nwSU#`% zeRKaB*7x@R&x?nNoipvaQ+(pJ>yM6w&rd0`znvbEw)f<&XTN@Wnim~ro3H9FS68qo zqR#wz-TiDg$9p1tRmPKF`Fy$TZ-08Szy15&0T~x&JJfQ2Jly|Zck}Z*YUl0#2VKg$ zn}6rm)5s2m31Sz1F5B|&cK*Ud{nIhGFI#?kzEeDYYFjApqS{k`15V^Vl3P1%oy@z^ z-9dX(U)LR2bo}7b$?nmYBdfliUM9u4B(>0f#-;r)nYV5}Z*g$e{h0pR+6!OrvCE$_ zy?%DOtNz|;8T&%`8H#gHFK}~|>v&eh`mnsm@^k#IH@=b5tor&s^;>JFa$89_=4fnJUZTdz7a zvhDb~cz>#H^tLV6k}vi5EwZh@aC4qMZ_0J=|97JZ?@! zrO)M7S(a1BO9Lg`qSh&V*LM6>vhH}=grXb2KS-5c%iVAL^ibko;me11rZZlAT>0n4 z!cF71rLK%R5+%rR=91x z)xqS}zU~>%J~y6Dl&C(ERI1P7=kEkM^28rB81YGJ(^~Ni=5sIArSmq-tNHWZKlRhn z%~ESyAMI=W7`5MJxtPV@DUVa$ZoNLKzW&qBD`)nYy;NNEn<>t{^~DQ;+UgVg9&TBF z@51bs<8tvD#_4DMs!oKRFl}_>v32LOE~)?duwC@hs!;9B%W0+e&5idm3H~bkaVC%VYiG-KV8;!>04w z{|Zs_ojFtFNU?oLp}oLG_HL_937{PodOyB0)x6uoT6F$zzsj?&YpqvGbH(QNo%;9V z?uj3@@=u=KeZ9;}{#Kk#*y&C4YX1M_-*m6)H5=Eio!5CkNpnugRIWOE^Idsz@_x;=LccY@VW=ZbY`}fvm+f6=~ zUr(ty{`F<%+~Z&Ve0=Y3H(7Fe{Co@coz2F(e0SANebxAILSy;~y}667F&o*QkF|T< zwuE6Gn`1k#)oHF*Racd7D@=(0&HgeuE;@B>+O!YJW>U_zQ)&jtSbI=e#fI- zM=G!VOlteAxXSK{#m|uIm@+Tin&%h(`KpPsJI{t?SFS$TcHMNTvHW-GSF?^6?(N@j z&UhDFZ`^yIoh4z9mP%C18!zjfth@b&$(H-(){8fst9)0y<@(mOd;PzAXr{lPWALoz z;_ud)nm_0EzPq?B?z%_ae%HGDzhlc^e1A9H`HkJ8#m1NK{!S5M*;Kpt8t*AHjwRRE zTtB(hDS9OcRbg063pGJE0ka#MBs>swLo zpW-XO_I~=kR%kN$Z)!M%B$G8Qj9m{%so_o%`7SI73^H@&V zaV%LEmmmJKvik0U9rp{qop#>uKQBtF@>Qq8?cK|tbG%N9{{D7e^{q&`-^WhBPr7CM zx8In5ef$1*nSyV=tX$^8nIxjp`+LznTdtGZ{OgaN|9UJ)JaAv#xwVdE+Hv_CUblgZ z@#?!G6}Bp$s!k+}+svL_Qhj&9Z}}RhD!H-+q5DhBH5?}dN&fu$)rqw+NSA5$s=PSm zBSpFAeNHb({aodJVZBV;1I$|5Wv@ znZL@P&9banX13$2XK~2~BP*(}#DLPGmi!W#b8o-YJentV&i1e8vRcy<9~bF!-U#Ne zx_WqSJ6q$kbNladNtC{mIC*;ZpLaz9EL=4ePgN5QSsRUP&uh)N{(kp$<|_M`bh|iZ zkw4q6FL;$Yz0X@}>htfrg`Uh=k$K4KIqS}CTVKDN_vy^P-E2Fvmi0{SHUGC;-ZSj} z@43}`<@C}w9gC0HA3Dq5Z2!WWG4WQ4Z%dm?&W6mjJH48JY1P3a=Ze~0`>{sWQ zvR3A{DSP9oQ>VU0Z8x&Jxb&xy#`&)JdSmm*T_rECOXfI(t`JrzVQg}!pYTfN_Tpo{ z!m+Q9{JqHT`s+Z*^L^XwZNFU$`-xBu(ABeN&JSzhgRG=WGKbE6 z%COvGQxsz$1Hka7OQ31KZ5Gy1TFaV)!s+ za#gf)<+S}j`@TL8xg7jz>)VcrlWo=~m+S@&`(4|2@#4w2pG&mcmtCK@wq5SZSt-MO z_N2SYDNTRY{g^9U8lO1#b5qQ1tLhomE>r8K=lSkAQ=R@;x9Jbtj`Lg3z3goMBi4FV z&&uifLic%_el=YG+8_6QPFazBW!1w)F7;7h^Xl%i@11wC zq)O)1ijS6`^FG&Ty1KW^+<)#7S@678^Sxs6-?Q6KOFt_OjBs;&CHCY7U(x+p?r$P;i#?Z9_t)-HNz3|RWVg@Xe`ev) zub#@LZ;M{OKRRQgv&(zu*{_@hR;+w-Ghc#fqDQK|b5FMM+0!DQw^Y=;ES;I>UIl6| z_%Jp(@SXLy|J{FPcK!0N3ZBi5zozx{rMOX%^{GD5VGGr|my~z0OZPFd@c3Hg@;iSUY(D)kUKAYog13Ho z-_@d!^UiCx7u#LRd@NJ>#d2Buoa$#MueGK`h~F-AEqy!N(p+!Ca`Al$wk{VoZMj=$ zZMir;K6CfuZTl`C%(SaA-e?h~Zhj_Oq4ewNHQmv*)kWW9t-SUJ_f6fuX18C^{4)RU z1(%n^n$^xRZ4KLJw^HxbR{1*>mt{MD}c~@2Fa*<%hk$Uv$l#U;R$C@=0g< zlCqOVub)NyEh%y7f5-08e&U?weTVP6Ex-ScJ1zQTVb`+D?3?`UH=o$`vEuRC^0ivI z8-FhQv_7voy1U`l<%*|C@+KTh__?>;sR{0MS@q-r^LNkP2D{_q^-}~+Y`eHUSib6s zXJz6=?L~hhe($=r@^0VlsQl}1x1X0=WM1&jf5zLDwPDvYtI{4SRes;gFU%#mAjfpYmnCeY3@p=WpNH1#b82zR$f=_Pe&|{onq`{gGwy*6Ygs zL7Oa_{Mgg4-`CzSC#&zbLI3o*x85fF{dTYB_T6ihXa3!NQ+;RRwfuI!iPxvdH#zvO z)DOyWRJeM{^!vNL{{<^QJY2r!zVO@2zu(+-^|Sb=5m|iJbj?@JQm)v)OSqU`mcPr6 z{$5#iZR_Whdw;Bho;}uUpO?O>JWt*IyUi6T&+m`BM2$**RIIH3%d6eLuKKOoVttt@ z5ucTMiWl9jK4kU$XY6gO>ebgfR?S+Oye4zzr>~r!q!(Pzd$)DroXazR?)+Ul|77VB zTdtaeZ@;UroBnlH@_O5{$&0JyF0I&aHeF%Dzjyt6E2_guA`qTLBe{KIdxAy(o@2S=Ac4jYL znH?(lxr%$^r&fe}jZIJxEb>Hts zCp(X(dofRv??35eV7kc-nn}OrJgcjVD_csuJizkz9Pf1Rxu3r5Ik-6G`M0-E4t@UJ zE_5T;Ypw#n{_IUPalh3#u58i0ByxS}uS4yAb7%MW$17OM|JJ!~v;W_-+e;LtS0C}+ zxhvrPGwpz^{Xc(B*!R8BeXZbwcbOueH?FUFE@^UM+WVrEN%oEle71Ppp2K4GZqMaB zUQyBRO}fFZ&WGQv*RA|}G-rFdHK;@hXKZp{WaVUHZ8>E)b02Hz@mT&-TO`BPi$E)x zEkAu|E4h%eVD`Cuc`rIXc52R=v-th&WiD?- z8^16u{We>^torqdIiMkmYy0*tN^3H8b~XgtGU8 zy0l}?RAx8?2hC+zg$r3N_-wU5;uRoUh#>%=oMB2xceH_&?Ww*3BdZg>A_{r3N^ z{F=S)aHQ7rz+1b&uy}nnw?8xOk|smxtwT4>?v#`}HFGRrfy&#d*E9C}+h znV#;xJ~jQ{#f*|z!}{M|E?Pwb83K#1{@NJv=C;hIgkVq%fo2dGUvhwANNMKnYcpMU znd{a6`zb!tpmLebHUho5$O{`dnK+gR6s)^k09&zoZ2`mEa>nPs zvX;-g676TXar^VAfTPb`1vGXZsnn-UtV$D4 zUFI=dcQW*d$mcH=H7~dBe0KO7s3~s7#L~#LN|1$%W2)<>?e{AE&quVu;BeX1CwWH%dL^y6Nh)*-Muw zak%Jbc{K+8Jp)9$8J3bJJR_zSE!xhvW8y@k}uu1*h? z7O!K;AAew$K`X02u3^6^;x zbj0H7fAN=$1X&h|D>i_x1!po9Q|AbI5f}06cel%`GDDX*uGPzyomls=;_vCir|x#3 zAP!&z57V|ocK0!Hq$plkdHP`QHmiR(l$XBWXuJ7@Zl!RO!@riLVl1E58)`x}`DV;x zx_-ByJEr{bS|0_4OnWlZe4mn3oo!$#^ zqys}^4QSW<^qdVfvmfmWxo*1W*C+2L(FxG4@>4)3O&Ddq5L%hGW!I|x5=D`(Ud_nw zkgzuUb#IFQkqN#*dFiJrH{SX+Q}vLGser=*572oAp3Z?jkS&w~8h(sT4!*bZSQ=+t zo4*%w8e#&s0LvnMk;x7wK|6hpWXxW4=Dx?_RhySCa{ctDP3h92gEm#6t%cRI9$fqs zQIoklY14u=90~z{m{=OS_Vcb}gl?iVNd}v2fo!saK!;sG4%5}EQ>()yj%{9fDtE>+ z$D~>IGet$u@3<_%%Nr}L6}2X{u=p!dR}xk_fuDf#z&$G93gvh-A_Wc zV>&G0U;*vyQWiwn*{Sf$VI!x@>eYE-&c7G2(CP%5{dO99t?*zUE$hb*gx0 zV$b(8ho?j*ZT)&&j1052=L;UbaeMKd%}F1BZT|Yc&QZZvxHs&s;xd_=8uFK8Bv!}X z+Ik~K19ZdudIrY@k8-WOp!-glTooJyR%A+dqHbcn$lm39K$|0_%SN*QdimzpLMj|7 ztW8Q&-*-sdR*@87(b}fxSShGc)i{ZZNwhXQ0KDOtkwrj*yYX?qZO|{d+s4m#K`I{U z^G1pO&J#cLc_}n6<6xS~ARP*tr4VpfpuqH2yL?LKWcSuh>p_*ulzvSkHM#Zj(x>=N zEXiT9Stl~?O}4$u)XDMA4a z3IPrplN1{qHVbInQkd}S=p*mco6`B_+#XzzvkDoQIDT-JyxXxkXaC)6btjqX{RK|U zUnStEpnJ4fe~*rQ-Ita1jUF(yn=bd=_S#)$eIjf1RzBZmg@BAHDd2+_7*r-HG&pP) z)Oe*3usLvv0yIz>9E3RpSU$OfTIKsymOxSlLt_n>0L!W6dX>9bIhZc03pgy80V*Sc zvjfARWrV{4MF)Ws`>ny%45%t-U|?DbO3ETp8!KKp2&|~M)ip_}p@G9up$eA!6#|wp zu{8dX?gO_NAi<}>$_Q=<9Svr0ayWW9Y>EgY3kTChc8IJ4L*pV*1&$~8OIRBJ^g=!9 zpb6Sr-WsMe&q{zrYu>g+OE?r91Ul?s>5oHXErX-N|7FTZTlBpg8x#UGw79y1RErvz!Ac=Ho~SMsj|ngF=t29&+P`3OV=Yym~h z?9r&9e$-?%DG0oPL^dd8J>=w(wA&Y$=H~2t{it_byu`h@F7xFjjtd^G6;*|7_Ge(+ z-f-P?BBV6#7Gp}}7GU9up7KY)L18|Vo1Kw=snVI_`%VahQZ6`cDMU6XT$nExGrgz; zWCe#pz&<9H##7thevU0}a`-8xRuAf=H7EqknDwL;6y2b_V#3VWs?*Ch`5qSm~ z;~S%wo`&t8HfloED>OJbG=k&9ATv_!@vbd8v*&tEpV<(Z_(eRJ&p-HWYFp;K;53~O z@y1QU2GMJ_X^3_I4J#8}eu!0Afg{8qtE`2ANs;4;Er*Dc9t=?`p zxaxk?e%-b;^Ys#&HGf~dcFmqu9b*4YP=O0Nb;evBM5ge%6+(OkvKgE_|A}z=$@tEn(u)6{?cUi>Q>s+t70UGvkSWp9s zIsfS3U>0Zvt5gaPHE__K@=<{F8=q&*{&eux>$>Y@4-fIzpR?3A0xQ(uW^8guy?7=> zsBw~@0!N6Eucs?mBaCSLB+vot<850eas2q>($9xa^+OJo^NI!~m+ksnofljIxg@GP zNFLTc0hJLB3yy#~;WyhP)Z4>+o!@mIeO28uOI4fm zu;(3Ka&5`IUAES2_4Yq@Z=}p-tS(!(Ha1MWY~K@bw=$p#)IeD8yHb#8sg8rdiYd|4 zcY#d?M>>d5RTEgd?v;L9%(P8W%XWemMY`Re&HMStiWjqstPk(75L+!BnG_Sk4$1`z z{7fv3pBlWTaVShMXKZq)T&$Xm;unU-4XleMo=R16yDjpwF3Zc=+*xbd?)~OcQoCm9 zYO!@_wlBT$?QF!JeRDfZT4K{6MWu!=sCjjD-W9gSAaMnbkXO1se_=rjvX!AxNN~lv zb$2!&GMMKZDtma!VX^Di?#uUv%#3qf04@!CLuwV2qAQ*zdO5GJ`1AF)cT0B`$Zs4^ zK_boHD2#Yq4-R~{V^6JXUtka>| zPixS;|J|z5pfM$F&;d>xH$qR9gIVgZkaf|;Rn>R1e@Q6$>-JrL z|6Ip=%dS_thAGz1@B0{@?>s&|F7y9d=OwF-iAYWeVQ+G1%?tVlN*y9g9ZE}oKi1|c zp11phcDUs1D_5`9MopQz=mLjAz$Q?_*_OFd0^}-iS_2UQQA`&zQkTwft6dbfY-fO0 z*j#~b-TxMr99RAo8lK5J>8P++O>VvPlqq_b{>ce$J}zJXd%MK3l^Y}OK3=-iEf*ZE zhr~MER=0I%2FL#VC)Ry^J70A?II%v_auCo6ciaYRUqDlq#tet&=R#+%iOGDIHEUCv z&AyU#*ZUS<4ZYs2xZGmDvFp43(@0SzA4Paxf34?>6xGuVt! zEbFh82Xi)7=H|YwpY7|Y2|n`LA&{%2Bg8hdONG6LXQp`f)%gKaM8P3{2^8|XDp$&Y zYy|~6xR4I0W0EafXLDkWfm~Kd@ns9+u;}vApPd2V4A{7V#p=zT%lFb;j~e&ZC#M9h z+4iq#!#8K}FjE8*OXHzQDyXFnLt~oahO=h3*KB)dm3^i2#J6)yGnM?0J^p%kmaC#B z3&?7RKrWZXq1U@-?s+#S?8u50FE&+toaE{nsmayLz@)0{Ah2S|?CGb#nF5^IK*Uo` zf!=NMn#(ND#a0KWT(8*k@9C$Ig^=FuP7W6(>$e#mM}-74-<~-xQmG)f{{1}fdpY2- zB<}`=fPE<^#lblqPAoXdVpX>0&Z@+zf%;0>ySNN>#n#K;N?}bt4o?2A+7}dqOb?1= znmnDY>9)RN&%1An)=IFtGc-;TQ{V`>bk_SRBr>3J)A&jBg+OL~ujaE%y~cQ7!(GQ8 zm-bIx&tnQsb0-K6s%l`P|lHb#nPHVxny^&yti&nhpkryvE zp8c&`pL^r&)a&v8_xpTO2Gx`3Cv<^RO#=fHt7wOtcDcaiiXfMNH!TEGVg&oI&y7Yn zQmDh_R(xJZWncJ0U&Fr6{Q#ZOSgv>VYRhkeO4aJG8%AwQrfCdDYch z0+k6z&ujO`?5p{?{^?SuT(CPYac;@Iz3r>i>g{_ji&$PUo}1{`e{>q3n;;{LK*l>J zmd07t+<|tWAcDs;L*pD)E0K}UzgLkNc_cy;-`*j zt%b`wws;246i@p2%eHIZq7Vi~mQ$d!iy}>or=qn+JHo>EDzz<%VLu_V_?U^d+SO~< z{)y{?>}~ucykgzDf2$KsdJK-p%vknq|B**uS5KeMXX?h#m;@TJTchi~6YLp8j2nq{ zxUKS;-+Rya=o(O=I1+PL)lwC!SBL21z|dVzCk=yx_}Hc6%G zpI1z_Rn3myr5E+(+V`cpPHzPqaI_^D7~>l~mVAnE?)kZo(|70ALu*!4=AN8%z2@>H zNLwR=Wzoe|9f`A;eGU6Q>uyneel+Q;aqZ=aAlZyIP}C$Y4p0FF5mMCr;dWUZI``<5 z(=JOkpT8H@>EYXabJ4PG+rDl7Grh+alQ(;QsF}=1O-f#Ezn1wu`IOM* z2?sw`{Js2Bi~lDmmH!k|;Fyx1_zC1eM6e2EY-8H}?pEI4`1)K!S077N2Ss}`*Q`e$ ze@QZ4ngl+oZ^2AX7p1A`(n+lK+dk>eQruks+gESJ`t|=0nd@?bmX4-@+BTBre6FZv zxqwEGgUPMB|M!=(POAU;_M%AT$se_Q7g+zf^vM=n!d>Prc@a<<;oNL!aA22x)Q#gl zhFPEizghd9OaTSSiP#2(fOle>wbPUA1b} zwVbPmWHh9Bj8gtGRPTAy|Fy}EYr-_h5v7%4FZNvatB>Cq)!mph%j#>i_WZlGtAlH| zWo=#bY-;$uzk26gm8)3<92OvYlOV4^OF%}JF2@DIzrWpHo3*mL{j?+Zc*%R7xP%;VV1NGuIUR`O7mS!}VCVE_z6IEjNnW$W2Y?9J>QDIly1)KX@z)SrFGE@XQ zx7h#b&$Rsh;jy8s+{%oM6_IU26dJoSN`E&7CGrUbn|-{!T=Ce}Wfud4yLD?XLxcONhCuJT9TO9`No92L@N9T@ z{(90ZQ~ST0R;B&?^wfUJV)0VYB@25%gRuH&;Vi%rxFGrXT(j7%t6KHK*7589wY!$| zboKgw#b+0}>V&;(Kl+_RA;6C5Vn%4a;o1l1#p<@It$3$?1SAR?HafNQ>q_YPp3oH1 z;Bb#cY2vEbI(`;O_uuc1Oi68vc+GnDo3A$$D3`UcDoy<6{zuT|{iA5#V7YYyo1bmH zwbcI?G@pZp|4(gsxY7(QY!g|mLc+gpS!QIEQvTm|R{!jzD@PuG?f)WG2Q`2WelQ>NE~isz%C zIguMtJ)b}vnCBUoI7HSu9Pi8hzcDLRyL#_}Fgwwoj@P+={d_*vc$#kXx6q4WvzkD8 zL=#lCeEt{lJ-ygoCHPFXmR8TKqusCXe}d#|2Bvy00hUGP;OYX22uNu3SYnjr(Yo(z zT~0&n{?v}Z%@%RxzR-c6S$iGYE~nUCNsuz#y7jBS>F=&U2T-s}atW|xwe>npM2r7Z z&Y+63Jorpwl0-H8ijSA~uNM#bo&Ym#u7gR`)td&X3p6jC-e2H0S0c?X&8NMTuY@vWK3 z*{kdlNwzAnhnFYq@0b}O^S67F;{qiPg@7Wai5^pH<8GhXUep$IH)(0$=d9SfxA$dw zf~z9|j|PPR1vMemRyc=3fJEb~S7mRtd!{kFoDpVz^Rd?X%&emymxi-=cng8TFM&yR z)#|<+gPz8=8M|3;ylh_P;cFB3zXTdk0w+KRVY5Z3Ko7u$J9(|bIhU6B8M#%Zp$J~(87dSD9xG4y& ze3Rb6BVc&z*V~ICJKy$yZHoH}NjnZRnC7ltWfpn!l#IqQwuU3`XFi^8^(lSp)oW`i zUoM?q$F*4o+!Irnp!1;I=@>WMwXkrW6`>&2yDodieqNKc2@}@LUT3jPlXusOU#Hj> zFI%_n-DNdBtKIGljYa}51XjvqL@lmQ3BLboR?$_h&5P1bPEvjU1CpB?96&`xk(vs) zO$xImqmL=~_O{%;Zm+u(UJIBUe-y07V#DgQ@6a5~dw%{$Th&*e#= zLDv&b3!J`*ZGPkte5R}}T3SiJOR?OmIr8=NY3~I!%osNx&FW6tcq9L4Sl+2P z`rrP&*8SVF?)|s;mwClONS| zF(dPpA(M<^gEgio@$NsK{&Q{a+tO?Is^1o0v#egfHU9Vf>h+tymDlb+fBx3*9rwTg ztlJN&!xylu3SVDy@1pXj%mr*m6A+ncQrv?TGHdtc-CefT^M0V!j3A~K2hGqtHc%H3 zoDLKk96qqF3R`QVGT)=>gZn8CL>V{9^T7&_U%N`B+tq^Szu;zSaj=2UK!GY20S!i{ z1rAduAA}mjz_d?Lf#s9$%Ai$?vDw1W*c6}a2Ctn|7BeUY7=^Xk2{L`;fg1twjZ&+_ zW4EQOS#x;U;9;#$$mDPTc}~uaEv9RjTO2x9vzPbjIB*=fjMBnr6zULRS{q?y9`HED z0FmfBgZvmdFe4gUxCEF~r_7&yT+x9;gk5YpJZM4b=M%R8 zlWKkM3q@EEJ}75&QrI7EQ2NWCV~W+*v?VY%GB9y0X<<+d@R~By5pD#hr~-?ZhP`>e zbAx~epN<|<%ri7T5m#XG`X_bK85V>G-ZQm0)U8i=^<}<*Mrqbr511PnSp+;d8J!kP z(J*d?$BvMe1ILtrx;(jd2E_oG2+y*}NwBp5F-WO^f$5~a1ILsHH^ax8I*!`r3Zt-1s`xc0So@POV(0e?C1w@z&OCuf4aXd!3x5zJ%w@{Q7^Y+Hvuk z)35A^@U#56WJBTpZ@;u8ZR=J|(X4Ibk-z2cXZ!WZh4cM#wpzEh*DJ=?e_nfK|E_K6 zaj)(Ex%}djc(=;-?fIWiPoMniD}9Pp^py9%KR;vlo`36F|GzdsZqA>UH5Iu_W2(=F zUfSx-t{Jjn!R_tG_vp=fcyI4-mE0E*H}^a>&J5V!XHyWb{@Akj%ddy+u|`>UL>^bw z#$H~q?oM&IwPx6w86WpAzG{@_ZoA{bXW95u4O=E|dVc->(!+1pF3DY;Cbz{)m_s3f zOMvO4&JWiHffM>u7tKeCG=&FV4FV@bg~b&os58y4-4`rZpVYVJ{szlee@hnaef-v3 z`k>Q8r`AtP@;i5({PlJAlZBf89yg7aE{$KW7qlhfVnDdbf*E$neL5BYRCm6)^eWN* z{_gkuGfk@-_iXuM>goSl(=iifuvwgi59yl#GSo0|3hA5m^SGj-x?zuG^ZX1+Z` zYy17O$s&4x{4+$>PMgQ8;pV*h-p>FdHy@LAQf6EFm!J2E>uvn4FyRa++r`NKN)uIJ zc~l9nOF;c@2TlPd)>U(OjxA@hV*K~*)c4d&QzRD&zt4-mZn7(A*PWYwU1GYAzUl7U zb#B+GrK#O&mv$ycpPc^w{>qumzxhwBC=7nOm;YMF-{LF?bpe-y>&u;qta*$*6D_ zUbzdgS@D6!-sWF#-urSgOw#zDpt8;-gEf!eu3cKWIs5RT4H;X%@Mya^8_$nZIDaNq zhfSeK{|p!15>(yC>V3tUUMq*}DDd!jt{dxA(n#-E-N0 zVwmpw>94M?@>n@ZwfAHZul&A0ucRx}&T)Tw_j|Roa&CFH_xbSYD%^`pr+VL?7yIbe zC12-R?CQSLxwWQEKcl$!>5j*JUsED}e|tOq%tYbTyT5!5w>wiZmef*b$#kD~|Lt`q>KMS-XGpqdDhzNhp$`1BYnx;&uV2zhQ+VX)8i}8-Z1k& zeD-mluHIg`9no2_QMx&%;hTEm&udFrr1TWlh2+gyJ4NU55_t}lpaubriNEex%P~4F zsMxXt(JEqKWSJD#AfWNm+l8H3=fiRN->Gj}+b%6^@q_#Ir*DFV|W#!WN7+eK(sfBU2L^nZ0<;WVGE ztEL|M_3!1j^GnY+2o^m!(5Q2D`?t$6E0fv;j?WKJdK8wse12J1kHoF;ZF#?A-1_Hh zJ)c|Mm%{f}`_%DGO`OYsp{`*-zn{g;9Z{o6pZcB78%(-P8e)h(B zy-V5rayA<8_wGLyA($pLU8k}srYzGm`DwsSqjW1f;rf3+r}xaa@VyuHvu>KG+p^x9 z<+W+|qQ36asebDFGv_y-X4H}nlQr?-x3*=fsrFgxU3r>u`|ixP^f{HYBEns+t`7FD zD%as9PjRkhoK8ulNOkYXz26ks}f^ypDe5d{`61-tE_5de6*@;xi)!ttf9EO)rp z)I4XFw0xGByvXKW?%ledsr@`BCDdTImZ_fD zYcCPwmK)pO^GlkP^t`$8F?8DYS#H+*e%!LqesLs7wKrg)&r4&O zb#sp5_s{2dJ3p>n5S^aP+P!a$nN(563A4mUCO^OJmfw75k>g*hqWiY8PS3p}Z*Pgu zsXe#md|zH{g?qc%v8TVkzn?DYf7aN^tM+B25A&}(;-yPx1?!%5czO8h>(mPq43BNA zyZi2~%K0<3j$ewC>oW~ZOA`2xZ=S!%_V}~kCJ~q3GJk#g^`=+ee*PVNjSIL1m{|87 zIw&cx7*LRP(gPmqECLP=E*y;&JOUm)4W&yxpK@!TSn%(zOL+Z`TG!isr+3YAR{tr# zWBuffSLggqT~~KO;aJ_W)9>z9r~G))?z(;TWl@>(k{spdQ~$3Qbjet;aJB!unyh&n zjaCHzHoLSc_40u^Z4m~_TNtD=FaYBGpn*Y&u{-PWlhtiZ`tv2&Q;%E z2yrQGnSX7nnxD4u8vE_*lcK(!YoBD8w8$bic-ie*UJq$i`**)0OIm}TdWmk{5fPqY zx_{xuJC(=R9@|lBdiINCamvBZ`j*??hFE87ENb*S_TXO7;wsU{LA-TsJo6QH9i20e zx%7POcIn$kMRfuk>i(r}KQr_DqCH|$i_OdT)7H(9&{Nxb# zIpey#*oURxB2%B#-~XpDJ!HMo_N}>!>2pJG?MVCCwLRt270F}u+rORM<7nc%_t>tY zV>atO!|Q$Ln8e=uozQ#n%+XLigRp?PRj*D4%D>LoYQpRoySDhp2|>$c1&TWtKh_O; z`^f9qsl~F^`zIwXR+ntkofWS=*ZPi-*tE#`k3XN9KH1u88}C|=Tc2L08~s~&{7Fx+ z|J0D&&X= z4@xQjz4G|{IohAabj-GG-n1_3;siBl(<*uQ)@^HNS$;bcb2TYmcS+*$J*?hOI%gL5 zib_xm^xonS;HZPo&ydcT8`gmq) z+t=scLVcjMa|VmwwcJx%^!NYWcReC<5o4ER+>Jt$177E4^pDHOE4|sHn!V%Em2Efs z+6s2vy?d)vy7$)%?E<~^OB1i(4cb#-c=15WlNX-Hw6u8_v3+~1wbZLsTHfNra-X^< zo{=AKc_{~YN?*9kapBDM?Dgx7wr#t7)#q^gH_lewYw6zWuTEH#`#LRXN5H}h)oc0u z&c~ZL=N{R!oh?MlVQxv1r=)3K*T*w2y~E|dzOGz9C*aeM8S}e5wrH=-^^n(O}>R%8;^yVN zbh%0@ddJQ9G>#PhjbE%j`z-d*HddNjnPRJc{NL zx65A(wYv7;>*AX~$22f7tz+eA zj0rAGYyx%YVi@wk^9tbMum%REdt3rcm9IUsId+H|Fi*%x|K^f?dY9Lsdu=;KXRn(f zG4tm6k8?y`uM%6nLFJmo8pi{nU-itl{k3{Fqkh|*&3^Z+bHAo-lg<1TSD%;1ES8z- zw#2x9jbra+OZQvbD&v=P)^FCUn&x}#L0qD?`xrvg{CT(Caia8WLoraR-114_0_8H_w7Fx5t&@Cr?k*@)zZ?|375n2Z_P8kviaV5 zsdp~bY-`WY`d9w?rdOfp%x*ykg=Gwi0X|B49zu*x3sf{&?jko}8S_~<8ut_~5oLKK zYH*nC_bb-zZ~y$d{oY6=c~8#GUy;*t&!1U)qeOfA8O6Paw+R^E-rmMN@sQBou)}S8 z>;EX;uifw6CugVA-Y;VsR#UU@GxyIAi@zRA*>CH!ah=O1cAjT{*E%-Y>TH--{zT-8 zi}mLh&<@nGT&1-ejNZQ0&M4vDo~W#T@|gd&Q+vy|PnVu$#>1U{ra(2U_Y2P)qx5-- zp<46xr(fA|oD)^ziV#aiafltOZ3#~3kPkV zwmkMu$-EWgxzv8c{9cjM7cyO^%uBzz{<>|@(oe0QzRY>v`}W78wM@p=B5S9m$#0!| z@i4o^y!%UTzgi0ECW*Z6Qd{l6ayz3jMnHk(6l=&VmjkU1e$EP?@62*;=WEZ+PP^On_Ez?~N$X;*JQg;wZvJwD zN2$+xTg9{uPfko!K2~XFoUS|Jyxskm7E-Zai+_Aby!iX}`6-=SLT7JP%$|@C-?=6K ze%(nK%fM@E??2gLq{ZuEH~S@_-pUwvg(aIXD4_tOVqv$EB{+nW_a%I z#p~tw|7$cGACpX6IFHw4L%#WOg`oAlVcwTl#_Zf=l;a_9`Ep56WXGD?jcti(y>quo zZ81-}r@p+j_q*kTDwZJM1_6z$TJP?E6k__hz3ht&Y{&$Z=ww(p8Y^@_4Fb!Haxc$F zznwbo?B_R4u0_G0)sEdXeD=EE{@dvroc*VEzh5tAtDWlNW^eiYjnT3Gwc5&W9`=+j znYiu2rBI7qlQPb2=I(8953hI;srB@nR(6hd_@0VD%ePyCQ?B>hpI-3g;<3MO{Sq3X z`nwFS?73OCWva)ulhwbyRE&Sz_OF6 zy{gj|{(O@)`}tITbx;9seBQ#gggbk|vi}B`vJC!4E{TfzEwOgmvuo|H-D14ap-;_H zdds#=x?NQy%fzumSb?SJ`H|30&_GQM?+ZrQAP}g)s?c!Yc%rE0t0>UkV9L_DC3b4% zhQFH2=jk}Je=~5Bm@8AC_U`kiFLPRt-Cei)Th_~>>u-a01SmePkG{RN-8k+0n&(Sz zsNdLLw=0&7PcAp-^RK;e`bz!;nS|Kwim;0 z?5JdU#MyXe?cX)46W1_$?zP&wB>nsDB_0!#d!lDQ7kgRXzvb$j(xp>tb@D(-t=Thn zZb{h9OOb84ccad~tWo{UJ25NsZF2kVXwTbWXJs+$<`Pm zroiI$^wsa|H!TkTR*COL8RC)vjr1yUsJI=lI=NOm?b5Gu^RTZo^k2K||7SecfLxI#VB>xFa%g%jfR(sRtee9`jQE&9d8aWnJM^Zk1ez z^5eOC*3@pEpZTQh(>)%cIoooL!*{ww6$-yRqnsTe{Cdvfz{kr@Rm-mt-0PRizNB|j zeA)YnU$)E(+I;M2q#W1luBq(1O2v40Z2Da!%@o-zlI@Uax~)An?eF5;+_bw%=j^6M zv|W44mb|tj>gPFjqoOm1k8NJ{chA~fZq0xP_cu?xq93GtcTQyL+iqK)VrizA+X`RK z6n=7`k-0CLKW+Q5J^YL;n?PetAq2*nw3)i&>q6E1D=%e4pZB{cD!Xgbv6@Ve%^4?) zD&MuHE)u?XZTh^Y#u*OZH{{+}Gx^m-wHKwL7p`RbpFHgyZ$4}DJmbaxZ~HoY{Azw* zYT?QL-F0HWr=?9iw_)SAyH=I?@trBWGv{tMBL@?G``%$*lNj*FS|zT-w|DJ9oy$ZP}bxGTVsP=$QSN885=p z7aRTdJlgfNH#(yCZQ^vvb+Kicr7y3q?iSGvGx6SjM)%nl_HS>$B}sxtKO{|3dNw}N zxaFmvdwX9ltg*20pUdjhEykB@C@(Ok}yxA6y?SY@`$l|%=xb7p9~!PMfg zv3G}(B@0L6q{Vz+Kr=25pb=dVVI!o#@`+u#s)i9UaS=gVWq zioQRD&f8$JXGQe#X-`gz+l3119=Z4-`C+$r>apPS z|BCPR9}de&>k!CPz3}hv@6=CM)SqrOzi0UC@~Wp_i`?7I7VeuFz0-1QZd^)iZc=<_ zNy2|d!|<0Db2CNWo>4Yl(J8iWMy)~fjLqk@l=r{CtNr`?f6bSfwwqeAo_&4RH8o>l z({1+yyM$Ih|6A_0xb5qvD}muFc%%(4-k5fN-_!a3*1T_c82Kvw?kU|{*V3MOX)nL( zw2^16_M$~|EmNZ+wu^7+SB}y>JJsf5RwgK|ZDyPL{odWUyo_50XCe+?uspv{Cs0sw3pwxHubfDgTgKbMFIbgcovSvKS7$mIzjU)pn?k2H(1BQ(HLV`D9E%^?ZegU z_r0E-=v*XxD=!|@j^UNQa#l#@#qYJxw|;qByFMmh;T{=Vtxr#<-#>A=c;0l~`FYcK zZOuN_-95ega#+r_w;N~0gvaOQ-o0~Uncw+eKYu*-Pq}7%UV62|nd!DHM$Bx>x1IeS zq5l4@_QW;XzInT!s_oo*wzufV2gQ@~_b=EuHDZf#|Ct94+fPcHEtx*2?$*kp4-f7y z{9LqV-?gc>zs|p9Z2cPb+R}YjY5cPZ_xf%>*|~OpTcN+LZTz!y@hVa;?%sSUrhGv= zYD-6k!H$%d*+$jpxR1SBe`>1MsRR3BmxipY-_B*ith0NgX-Mam)Vb>nW_h%Ixx9^jldGox*K9%lS12y|)*w>OGMh_pZ;XguaCFt&(mBEMvsKsY)EhsF zHfec%;a!?$;hn;T*=ri7?5(@VwCO^vuJ+ofZ5c{)t+(-V3nxp?Vw@8ER*Cn>E-m-% zwlX)i&lX(dx@u{u>5O3cv%g)q4xgF-{@z~qV?GrsTP~fuWnbH8efOT%w!GVV`Rji< zEV_F<*LNo$Bg-Og0j7^F1d7eqOuK$1UiaUBV)y&?)2?RQP0PJqCK28EQmjxs%qCpQ zbWf0%T>YLNiSHW(KfJKtzdzf3W$5NvPtMP`UsHeo{|4_g8&m&#wfVg=wp9_Q=12QU z#TPHVvO3nAOGHP3-@i7fVmYXL{BD)a3ZAHC&RoW0d!b=H?Pig&M_d-I?7y7?r(x3@u!NoVc3bI#dZ zs@wnZnf0eLf5dr}d9~X3UP_kn_1^4%zwdt_8;@je%=JHQ$BLfIZkN*TofCJ>xI$@W z>T^cRq9+|W_kPXPiP{r$ZS8%LRo_#mhY8<3w>D>{@#Zz(Hn9bL+c)Fkt(VK^Dk-;p z6XoT8yI#KThAMM=k05W_9HvbfZPysQm_1@SOKLjnnOAwR{mMBXy}@PP49n{~T*5cK z6svf)%CuUy{$J&G9w{rgvNu0YZS240w#DGgt$zFef4ryZRmY0ySL=S+xpSFg?9Oc; zuNIv#JnnI8!o^Lwzt44iKj{}+$Jr0k zf{#V#A2?NRH(_G3+%#eDsZ#`J{_QbNtN<^EcruScG2q?JOPjVcwK&|Xx+I0%@=}Rt z5YRZt`rsSK5zPhKrX{Lp=cJ2EtrmZEb+67ju^oS=$A6P}ZjgKL)69)`qh^Pll{p{o z#0AQj2SCFn?{zXY%UL-Zi>^<^Y{LpS11;E>_Ob3+si+KSF4|hWpr9_=j+na_nRwF8P zG>lY2Dl?k4C1SwKhh(K%2mSxHkx#u;1$Sb)FE@(qF;{ejs_8V+Mm_zyYpP1p*EV z-3R)2*G)5gEI+Y#_O=s}>GRZb^Y%HeTT?w#L@$H`vh)^I1)oyR$eWzZ=(Ipa_!4pz z!=W;nK{3E6w0R$>!U0dP9TZVu;Yy2bw$O4~pb$3I5FE7-*$Ib0s|R9g+CWYO3q6_0 zpco+MSUg*XTY%~5j0tSWW0eXsK`nxnQeRkMfxrRkHXFQ_Iua|!enX>o8|qm>L!JD~OrXqz1?M`O^AA3X4dMkkaRofgapJ|V z3|s3(oK?y5(KkMk~x@`Si59{Ov8?aFyWcSXYWPW?j|tpR%~99>dc3eJ8W8 z=e?NrM|NrZN>HqLT}@kq9Cr;4S65AKe=@n|rIPz$x7#b~?utm*I>Tqw1x|1`Ud=W? z@y>RC+uc{t1uM^v{@uyWl*h`^c*mfXAh`b7MD_tkeJHua3xBlj0YI z-{-lxAyZp1;L~)ir_~-DQ$F=GFd#XG#k)a3BjRg{2~5nv2(%C(IrPQk$qb4D=Rs=; zVM&aG#j8O;Bj71w8Hz&?NO5Z9iz&?viUR#;iZ_ONeTS_Dz@nfcqpmCJz zTmd3D1UPmvC!z=}5 z$^+_5Ee>{?B6s1jUZdl{@#OKNr4iRT8-vz7;6d8P0-HbS;Rk62`P^dwM%T`=X18lgBhF@{4Fze z#6i`v;Phqi-~+AhdC&SuiKXh@&*`bRgg1Y#E4YJHSVS}RzPdg&&i388Yt?h_xo|v@ zRONlTi9slte<^lb+GpF zw;9YW4)Y8ydB|}HFg;~7+73;v;Mi~6BYfhmz>253<)_zI*PY(YSg4MOe18@{>#r#@ zO&=@z-%?`v)H2cSlS6}m2LFVeC|UE#T#!3>*X2$wZ+_^9aKk*VH4#?VCx7E;v`Jht z(FQbB$()jhGMP}R?!Ymn{MsFO;r(GYXqA(eTYWKTAyBa6J(RI@Pt^$>0xOD-M=!bM zDy}w_c`m#H3W`j4dwl+hFOug|6hT8b%au%z`*BQ}RhoVU;UEr{Foi(HfaiU=%-N?7 zz%$T(PM`UP?E)wAT^H})spP;hMSG12QnAj!)G4IE;x)zQJ3OIJa&HjOsLXQo7t(g% zm=aO{4qoAdYB4!(0j5eGuVR?R4g9PejWrP_yXI&!wK(iN6Q2cSaZ_yUu5kX}$K_z}<`aH8FH@##^gkEl?u zuD>5&|2uYG^p8y;>%(02R>c^;Ve^iQQk=P1t?gfA)c$vuwsRJB%)XR#ZUv>KIi|4n??Y;bTvhMAkG=EUZV4>%H&TjRV^z9q(D@PqppQ@|7 ze16#~lRdk(#YDa@(u~^Dk^Xms`IPIW9p7SZ_3EvunCBxgTkhlTrym|3{&eKb&QCuk z7awk0I)8QI%i1SPguOlYoF`iW@_iUHehOnT*;r&g2P>TuF*<*bkc zfmV-?-Rs_X_{G~h ze)7a*^>ogLwq;+Z1pEE-?>Lb=J8qU+cDH~=6^F>{@BQMXr#v~9e7`QbW!I%OAt#0R zyy(lnt-$gr_vMQnpvIG2^Cgsx!zy770va3t#of8v&3Qj%cF5O5svfyJX6AfP+7oBv z9rxvMx7i-P#(lr*rt8FP33(M07_1c^aqvZw&FzDhy(|6C>lIz@y|M34+P;W?{y&^m$LcVGM9$lX|>tr3}-~mF@CQ3bMyPeA#ztL7l9*^Qq0* z|NeZ|pJ`dW??u+qS*EMJ9v*5f`g*U$Vdp9D$9AB>*uaf1K%1LDMJu?(JtC&S(v>^q zO?ZW2;rp~jW;bPXZF8RI?x@teE3r22^Tsd!(wh6< z-xZf~p6Vr-L4` z%(JU{zq~8#7tsnaxaY2Lecg3|j2|yNH`N@CK9;qkZ~OL1Y+qlW+PL$}Tt|*6*-Mus z&gT?h`ne{d1gSL$8lw7P$Z~7%@9@YC1)Vz8UwwbR+bzHJNa68Qs-}9=K+6e@mY$z5 zuePm?uX(#a%g&h-LJYT0uDUhP@7$h`izW#P0e&g#SPb;5KGyZpKf7I1elkDsN zZE(8rJ5lb|-?!!VC;mK-pR_%EuejN^vhDX$woKQ*zyJUCD|U(b>%U|!pQj^yJoUuQ z^r_Q4CKu#|8Ldb>%JuZ=LC^lyJVUL``(sLcE$a3+Gqvymip-<(hPF zldK5;dvRYIb?Pd2uK8cFIk36-^juxvb$g>`#oo7g)_C8~^h&x{xT4AKeG^00R|Ou~ zzpqbpR>a-2RdWh|tz7r}by~NwK7UQWncVWXyST*lbeOBkryjc=lWH@2=i9{k2Xppu zuUl2#dZ#YhTQhFYj4v)I##>(={k|F{Q2T9r?tR70Y4+;!Yvb}; zLQ_x8QPj=L$f-G=^S5O8o!a>Q7or!j3T&KbyL|p}sr8qu-|Rp9=Du*8q$@Ym+x_Kp ze!VPdi!JN9!!qexS$xc=t{w^7o1u5#?4QjorlTNwUO#`0%%!UN1vQ+<&u{o@?U8-q z>AA8^Wp~{oH+)cieBby>o#IYmo!pX^*y7Nh(H_jmt#Z>>8kR(<*W zvZAsbO8eRcP6Yc&eFn8Q`n%n)BNvVes~he+DavYo9==aM z+U{=N9}9Em1sSy)zrFpnjCbkr+H$XrNv_WSZ`d(jUv{;(=+#N}Q&TcGAKK<@bbmqe z>-)d$GK+Hm1_(@wjEA2rpI|%tM>h$2R^=iJ}1`AErn-7@j1P@PoGzD{N404|I`%sbSpdmXVQA>iW*Da zmn{#mc)vgLR)_hQ7x%vMRhAu8irk;LIl2Dr^CK$394YhHlz;ZQrC#xNVZ=Ek)fe;xaySMXWq-S6c6I+d9_&&=HJQFrI-K17i+w+fxEj~|k1MEL>%GKzcUaNC%BP$DZ0wwUf91Dq zj>b)kk5xBmIB1QUXf{Y4l+BTkYjjxns`ue60v|{sY#MdSIv9Vts z%vcz?E$hW75%-|Ns65dMEIQeR<^3e!)GOJ~y!f;g6(KLlDgz%8yjxsqGV+V4x&iW1+&RYk?!%Rb#N zKF8&|?HHHxo4;LKg)}ZE&9!>pkS1!!3GE=8qe_#CB_noZg_ow7Yi=99H`u*OB z$EB~L_h>h6`fTm-{`GNzjQ{e#Q{Nt+opPtS|I~N;H(VdL?th!M^ZB{5g$nBP&M#gk zCp+_|z0QG?=ZaTopE<@OuktI>AU^NVOK$CX>bL&SnjSJWxldE({9~yyUB!THFDsG{ zuy8aog$1-V!pFEHMc0$T@2Y5SicZN0N3#Hx5-RL|eYb^KSC>Bn`~k6BGVcvfX`Ez|8x zZ;QKP>*H^o2>8CoF5`A)YLDN(($|+x-VpOUUvy*7SL2xmg|j}+f3`aL_q9tqoo@#u zY|Q+;{FB3a#f8QmXUty3$KHrX}ba2kRKqIBi`!gic_a)u5&TS9b z8zuU(EZ<%8|NY{W|Bd#WZL~$t+lQ<5_)ZT}{eM?X!#Y|v_4)3znKtQjL!;Q1_D?j; zHgB1=XWPfCm!3CP9}3(4lK=Ce!!Pw8U)>V^z52Q7c=u5OWO{t;s(dAB@Yedd=Bj}zwy*4Dk5f7#=Fflm4QeerMSTk{s(-j=8L_SUuu zkNd2{%Km=YY-98{Gji9PuPgSKZ~7d$WuN-Bin+J?%~>v)ZTf6|;%s^Fn)~*aUoU>& z9ce20*6!C{ySg(1mizzg*S6dK{)f}9?=mu6vrA_mlDqp}=&wI-hux2ixgXy%rcDU> zJgM8Y{`pjm!a0T7%by3#U+A}e`_wS=c>SZ@qEqw#ec!wB>Z{%F*YlO?2X(AiJ;^NR zj#BY+{jMK#mp*6Pnp@gzl6y%b`Z=2*Q{_jKOKt)z9F0u@uE*dl8BlXZk#T>E!?%+X zw({wBUYI;ykn(xy!_yZMg`d0)eeXWUr_g$)*lQn!yWetNFQ0#MRk^)T>{Npl_x~o= zUi_^5?!93|+54YYUv&Rvs91h-VfFhg{i<*MU+>7@wK}uw?1am!`XhwjSN)HeT#y%2 z@-_JTJ!hwdSI(N7PGx`hT81m^P4vN+@h1K<)*hNNAc~C zN5hX*8a#V4r}XJ0+klc=*Lh2)qCqE zwc}N#?=?}0WfTA9oat~pRvB|KZsWf7dw$hzZU4JA`kun~^0y+}e!cyE|GQNBg4!P! ze|79HFZy+}$24yFx6Q&#sn5$N%znQtVt;+ntHtlndvZMaV(qZsIqlpm{eGYMqQBy< z73{lnGxhMU)en8&|C{O7vF2@$ysb;t)ir4`kH5&g%9^|T-44??l9%kQBqo>zndRI{ z+T$O-!_KB~#*0_;JoN7hmA}-^Kk?`JG>g30mG_f_<)!qdYKQi8PZ!Y8)6?Svjp{da zpS}Pe>0lA?a0MlR({Yu~Z9LNQS{H5S-uC=mX5Q}m=QaP^)uBb%ssU@#kJ>3Noos2< zm?9^aJ74Bfs64;#2?5^iYt}~yS61b&=`7!?c1>l@Y)`l96Up{h?(GweSyJ4bbkp_s z&bwFdv47qx^}xoWa+jfF+CGyD7dDH%$-TjB_4@DIgV$9}^(IZ6$^2wTa<}yKqnozx zzTIq`dwAa_)tOEUZcV>F<-2{1aFpufEnDYZ)z-JUQz!0XU4J~&G_dSnlbyQagj&%B3i~p+q z!#CfpJ)V2aG;hB1-fREZ<^5LI&8;(ci`c1z)XIXKT`$TCzD<`ixwrNAf(w?0m6A*^k8GN!`{|*3_S321 z_b08rZO31#AI2f_vPZU>V~Ox_=BjejZEp?ZH>%zHYNhX_kn8^c)z8LzFZ)V29!Lt>{pv_l{qCQ$MMO1#_gVW5~L`ZRy6NOG;hiRBl%=^KF*>D`Q`9U$&^GQ)uC` z=3g;x#+S|quAaTld|TX>dGDWWQ92scT;aUnP0jvW&J7-oo4>t&+#9{bdwbo&4OjXV z1Il_z-sJ6@o%HwL$49%h?@e{+m5$Z?e(&zV8}}~1-2CtB_4`uV@n88FA5}(X=hyqq z-S*4mcG+ikdB49uUaxQd^w9nFlbPw_r+)FyKCGw6(zU!OrrTi$Xq5=~kSJK)%HnlE zUol|K$<)mn8`YL1`O3M?nov0F%H_>=cK3fS-LvNnZ)Nq>>P7W}GA~87SvLK*nOC=C zW2Y(S^J}i^S=HZ9Ptcv8XTB?AU5;hZlNCL4KXmNb@kI3T{MRYhZv-|UK6n1(qh{gN z`>s{HNEPdFXG?DkdwFD2d9nU-heLLi;^%i1KgyBs502iu>%OjTv`OI{i?iJQ5#J4d z%d9Qibt?JLl9!R^1dQ*mUd^1BdDrHd;_EzTg}cvun2%_M>P>kq6|Y)#E#TjupNA{% z+Gyt;11(oBD%M{=@3e=T)TyP*zfL+OK2P5tRE*dfT0dDB$KNNdHC4~z{>Q?;ueGAD zpXcq1zq@T=?$dA2jpyxik(ynr9k@OB*e$86XK&oK$+!G@uPc<9wI8;uXtr)g=1$CtJi$~k;|bTrlD*o_N2#T_{tOJ2`B*?(q&<@tRX z0W<4m*Z;p;wa)kUwX;w5Ra>>qt$uLS{q)(E#g+0-3w|7(>!c7nGh{=8WAbgQTFbfF zDfcw>54D4WP)PfLvGX1EG&}9p_kJpD={me>+5DH=*3Rnm6MJ31egC7GPkKXpE7VRU z_v%iYIJ^338po1plFikUw~b%DJ|1iDxqjcwMd>SN>f2U(o%hiSe6(Z7-MiORqYgaW z#``wL=DzpFdCbe_-wxmE8a-9ynOtxGI=g58x}==?XziVw?maEa`IuB_pV#70IQe5+18AOd z%LX29@VGmeXbchk;LY)*jC)0da9Eyt>Y}a5{7zr=^Vq+>*DGDOLh{$^e-XE*RbJ%( zJhRvI;p*#0XMHKXEnmE8)oW&EXW`6UveWmS$$eyEQt{*9Lqq=Z^XJm_<`oAk^;UkJ z)&KO~J7(wY{o7>k{Imad`oWoxn?B9u?|EIkOEv~NG`L}5wdu`yvi`rT-<+RRnec0V z{om9zUyS0juI+Tbt)m#fCf)E_@rt*{KW&&l*RUkOKeOg+Xk?pwuC>MQqo6g|VtP?p z`g&1n``_Q4zErn#$DV7dm$rTFJ$6&^nby1tJM)dNgs(iml(*#mbY&*rKz>a`{{KyIaIp`Z&HvF=sur-MSm4d~&D)agIc~j-nKd`QM)&)78JSrdI77W`SsZ(G#%SH;#7-yO4Caeis^;=jN7Pkb<(oN_c<+c{?9yv-50 z$A0asY|c=;aKB!j>-Hm~s2#cdmV4}kPyDN0_V@Z)i`}I!Ra&{lPkpNR`{#6?Qgh2n0u3$9Pta5bVd`}!os=Bk$5T+!8M zBkavz3uZrE!4|}P*}eT#`D5PRrO*GCx3cQ{HFjTDoKSY)-_OhS%gnyttKAJ+#r3#& z#lfq6`unD2UQR!~`~CX9UvH{YpQtVHTPENUI45kb>56!Fwr?-hj&_Nf-g%>4_w~EW zvkCV=%S-Rp%<0X3bL`joIosx6-u#ViN$(Wi+1n)EUk=E6^n(YqAEr-Rxzsea``PuA zzUF2h|J<>4Qn>!~>7fSDF1$Slc;K_h4h)SU!l3eOOK-Q|t&;b*BK@p3E~)u@cDqs4 zpDPz$iEQrscG6<`{uS4*%7WJCE}!#9{^CiAxi)6uTP?OOUhPy;+TrK++FQL{?nT-1 zI~SHrEPQw1Q~3Q!p271uW}i57+PLx8_jg+6Cb=5Fk3KAoU|HlQi+e@;)J8r7~|8GNoPwd3b z19SM~&U5qsezN9QhQ^)!{^pje-$-uye_*~*{=cNkM=LE8qq~m^GtK;3YGtmmJ&ft4 zZS#+qSKr&&HvO8raJ|QBxv%L_w_p07n(v}ot^c&9m!8;|F6~O_p8#;DY(e}c7ORD7S)aW)aQn6I8xRBv-ob) zru_cu!-urj_uT0@E5~%VF5CO%osVKaUq5hsT=C(GoQwO`)vZ_#S=EgIBQxdVTxzYjsTA>b97my{o3^e)d;buD@Ksvx1zeUp7vAyBi#Z0*|@ESFwz2KRVs zZ`Y6QG)l~=(s1~Y#pL&X|C_1iDJM33?29#2Uz6;+LDr@sz^$h?VwzsHt+%z`~_L^wLRbNf0LxdPo6l#SafIO(Yu$9l+LYPbbcS#$(0*diH92BKrRM#kzY_FP9ata*LVld#tqg&DTrW>F4I@i-&0F zn`VcU-uZX_YxB!TPEHEq9x;=IKr7Y))7X#}Ry(}n_@T*iY1NB|FPn{zoz&m`JwN4uj?7IgE-qhv zP;X`3M4x#^$~jM`R@Sd|tcvp2jDB`TC-&0wgqxqtLEGSE=c|9_t$I*)KQ4ANi^H$a zd$?>%T5qnodH&>-OykWxhfhDyy;fn;bLs6yyFVFwFY^D*{_$~fyT{sDS9|`;zW$r1 zR&}?wOcpd@&TXZ@zAxtHJt7)F7<*rS@{g373uEek+za|6DQS{L()4c>*45 z=QN4GE{olGC;9K4HSMznJi?pz?s-$1ymV#T({JGq54Ao$*O&XWcl*8GAHS9EH7H&B zyy!mj`#s+$_DI-TzAB$K`@J4Gi~ZZ1C_BG$-~8F{+cM@WoB!Rg|NhJJxZ~f}E-h}~ zw(zP={om3H5wbSb?>+}MJH)D9dHiqpl7FG$En%rvlJ~D|YxSx5@$o{~(rb1v%R{Q7 z^e^7G?5q-GQuUhmTWvOjV!)=*mVcnJ9atW6=wtaK#`H2_|KE4)$xby-t>q9?%?$;m+m1-(O!{Ju~L|j(sB9 zVJbO~F0GtjJ1euv86Ti&=~tys{Q(6 zS@G&6>%x!Oy0c@dw|?|_QC4v=?)SeN`r6_9^iPNFk*pHC;vX(xikSL2clv^}`sMo- zpJS7aie7I!->Wz`blaAg%M0dh$*o;nXcp`jzwy}Ox343W_x?_AQ*&9HzU@fW{@I;z z+Z88#bG3K(j*C<5j*H4$!)5gP+NMh3m0?>q`PAl2J2PwVfrO9V94XffG|s2)(QYjH zWA$y}VYL&tSKs5WUc&x$Z+yw>H4)KgD*ygnb-&ko|DRho(k}ezyZZjvuC4l$XGfb% zd~~$i^>6LOxebTTmS0=Fe*Gl<{r_(L_?x`%i}k{wrJtYfatrsKdP?;0wvSu3y_`Dn z_Qt>8e!u_p=8x;AM~|K!d!NgDUT;Ogx;wX)wO-k`XxZxfffs%5d^>!r?eew)zuPgh zzQ+H##8vsf+4Pu~OYO}4>0hmP_|1)q+?LUuQuE}4;N$zUKHRm_q|EmOMVaMmE%o}l z`)-Ec{_~qZ*EubCv*P1C1yIKYV=?N7WDb$FF?s(sS+|~k`|`ru$$8<|_WHE(yb-jD zxP5u{-}>a6GhdwUt-AnP8zr#5AuqG4{`|qBz^U9R3HS5nv26eNP4VXX`ofdi$Gp^w zXYWXPpTFhbPTpISGJ9GaPKNOQn&iRgw7}(6aX!-Ag}{fH27wdBm!@O{{5PsP_*wtt zj?VtJW4D*5i|>4S>~&G;AIL;5hr)zz(DLleoaHzEZJX`7-SPDF{!BOR?UncD%`5)? zq4{v{)fshlf=sDv6dFFKXG7DO|=Dy#OlF?H99k8o^D{~~Oge*C56o930Lyl=WJssFL;^P#TiCtEhY+?0MkKk>Pa ztJP=Cd*A-n)Na|eLpEGsTU?QK*g9v0^{i{2FTZ0jg$iLLe{-m;1{H5%YCnH{J^O#(`ewUM3^!DndH@}X72JSj!)mTp5jS^ydx=w#BXbtmCK?N2imQ&}74_8kD zol<4_$^qqI&I8Jg3tAoIHeTR?SvMhw>2ms+i7$=koiutT>ixXx(S_CdZQ#Sy*20z> zpXAM8VFazZwrN@-iJUAw_&}$Otzh2k09tqfB7`&@IHq{izMJa~Gfet*Y<&7QXg#Bk2mGYF z2GCh2HStbt4<<4wPH>-Kf;7Fwz;qIH>X}UG0&%drLHdu*<{-#gi}K|o{XD#v)F zE}(tf5{p;g#LL|9_-c#*ZOCi+QF#G0K@t{t49UR`UEBgpOMfsQ z_yC*mZqxwn_LN(x=D;x}OEi5C%pVL)94s*k+np7bueE3LJM{tPi$({Ikd+~h$9m=7 zoQ$}^cTU(%>LfF0y}QFRF(kbT6Uv!($};8N*x_3B_4FC^b(hC_y(Vi-)vmfErZ_>p z$7B*aQ;S1o!x>$eEuc_Qc+XN~&2nktnz+r5akaHe-`w1*{+{jFT!flUss*n!)lZxD zuA9QGZ=oOkzPw6UaYFhOlPRY`3lVvIKBKs3J5!|~)6=&dJEUQmqQPMkrvQ^`wCf9h z70{M2UU(paF0h@#pct^=)Jgbhij7M^$@0{u3!3bVP6~2}5XZ0BNnswyJFuLCe_6G5 z;~mRFQMmg+_q@3@2%J!FT{Ii!mj=+DmztP8BCo9!1G+@#JcJ)y$Dtrl!sxVMLHLZ1 zilB@IN-3StZP1ONZ8YV6G4Pw7K$3Q#^BO%DBG&glNM>|WkQdiKy33DaN)l`O4w$8& zVUM=T;Rl9;c&R6910B${wy4gH9;D?;4SYT5e)(-jvw{jxK5a9X~aQEJtSW` ziYu^iRkcdW!^9@Q4oQJ+=SFgf!UJJOCx!VUU3qYy+leW#d@B4HwB~h-gJxJk8}jj% z7eM<$;u4R+SCp!N&Zhckx`6#13&&`1gA)pY;BNF#oZ!F9AF)K9rADhDM5Xrbu3qQb zTeZ7n0~nnaG>A=0L`ne@R)J=aqAHK|!fFQS%D6jsBO3%d)R~bp1(T`+hscT|BMDdr zJYde$;;>IM)T?xgfX32OXA@xM6)3OmbNKoyRL`>N$&2=b@|wzs!A=jY#+si}Yh!mm zyt?F-@LbPIMyCZ+>RA{-H5RnkP^e(Ks<-aTvL~m*^(&Nzopr0HT+sW&i*H diff --git a/docs/framework/basic_concepts.rst b/docs/framework/basic_concepts.rst index ddff3461..bb3f9708 100644 --- a/docs/framework/basic_concepts.rst +++ b/docs/framework/basic_concepts.rst @@ -23,7 +23,7 @@ The most important concepts in the library are `Unit`, `Dimension`, ] [QuantityPoint| - [quantity_point] + [quantity_point] ] [QuantityKind| @@ -39,6 +39,10 @@ The most important concepts in the library are `Unit`, `Dimension`, [Unit]<-[Quantity] [Quantity]<-[QuantityPoint] + [PointOrigin]<-[QuantityPoint] + [Dimension]<-[PointOrigin] + [PointOrigin]<-[PointKind] + [Kind]<-[QuantityKind] [Dimension]<-[Kind] [Quantity]<-[QuantityKind] @@ -60,7 +64,7 @@ derived dimensions. Examples: ``si::dim_time``, ``si::dim_length``, ``si::dim_sp specific representation. Examples: ``quantity``, ``si::length``, ``si::speed``. -`QuantityPoint` is an absolute `Quantity` with respect to some origin. +`QuantityPoint` is an absolute `Quantity` with respect to an origin. Examples: timestamp (as opposed to duration), absolute temperature (as opposed to temperature difference). @@ -68,6 +72,6 @@ Examples: timestamp (as opposed to duration), absolute temperature distance (``horizonal_kind``) and height (``vertical_kind``) are different kinds of a length quantity. -`QuantityPointKind` is an absolute `QuantityKind` with respect to some origin. +`QuantityPointKind` is an absolute `QuantityKind` with respect to an origin. Examples: altitude is a quantity point of ``vertical_kind`` (as opposed to height). diff --git a/docs/framework/dimensions.rst b/docs/framework/dimensions.rst index 55cec054..4a8ab10a 100644 --- a/docs/framework/dimensions.rst +++ b/docs/framework/dimensions.rst @@ -106,8 +106,9 @@ Quantity Points +++++++++++++++ Quantity points have a more restricted set of operations. -Quantity can be added to or subtracted from a quantity point. -The result will always be a quantity point of the same dimension: +Quantity can be added to or subtracted +from a quantity point of the same origin. +The result will always be a quantity point of the same origin: .. code-block:: :emphasize-lines: 3-5 @@ -132,9 +133,10 @@ The result is a relative quantity of the same dimension: It is not allowed to: - - add quantity points - - subtract a quantity point from a quantity: - - multiply nor divide quantity points with anything else. + - add quantity points, + - subtract a quantity point from a quantity, + - multiply nor divide quantity points with anything else, and + - mix quantity points with different origins: .. code-block:: :emphasize-lines: 3-5 @@ -144,6 +146,8 @@ The result is a relative quantity of the same dimension: auto res1 = quantity_point{dist1} + quantity_point{dist2}; // ERROR auto res2 = dist1 - quantity_point{dist2}; // ERROR auto res3 = quantity_point{dist1} / (2 * s); // ERROR + auto res4 = quantity_point{std::chrono::utc_second{1s}} + + quantity_point{std::chrono::sys_second{1s}}; // ERROR Quantity Point Kinds ++++++++++++++++++++ diff --git a/docs/framework/quantity_points.rst b/docs/framework/quantity_points.rst index 9fd23af1..a13ee71b 100644 --- a/docs/framework/quantity_points.rst +++ b/docs/framework/quantity_points.rst @@ -3,9 +3,20 @@ Quantity Points =============== -A quantity point is an absolute quantity with respect to zero -(which represents some origin) and is represented in the library with a -`quantity_point` class template. +A quantity point is an absolute quantity with respect to an origin +and is represented in the library with a `quantity_point` class template. + +Point Origins +------------- + +We need a `point_origin` to represent the origin of a quantity point:: + + struct mean_sea_level : point_origin {}; + +Quantities points with this origin represent a point from the mean sea level. + +The library offers a `dynamic_origin` +for quantity points whose origin is not specified in the type system. Construction @@ -14,7 +25,7 @@ Construction To create the quantity point object from a `quantity` we just have to pass the value to the `quantity_point` class template explicit constructor:: - quantity_point d(123 * km); + quantity_point, si::kilometre, double> d(123 * km); .. note:: @@ -25,7 +36,7 @@ the value to the `quantity_point` class template explicit constructor:: `copy initialization `_ **does not compile**:: - quantity_point d = 123 * km; // ERROR + quantity_point, si::kilometre, double> d = 123 * km; // ERROR Differences To Quantity diff --git a/docs/use_cases/interoperability.rst b/docs/use_cases/interoperability.rst index c5cf5fed..1fd7685c 100644 --- a/docs/use_cases/interoperability.rst +++ b/docs/use_cases/interoperability.rst @@ -56,11 +56,12 @@ such an explicit conversion:: For external quantity point-like types, `quantity_point_like_traits` is also provided. It works just like `quantity_like_traits`, except that -``number(T)`` is replaced with ``relative(T)`` that returns the `QuantityLike` value. +``number(T)`` is replaced with ``relative(T)`` that returns the `QuantityLike` value +and ``dimension`` is replaced with ``origin``. Similar to `quantity` and `quantity_kind`, `quantity_point` and `quantity_kind_point` provide a deduction guide from `QuantityPointLike`:: using namespace std::chrono_literals; - static_assert(quantity_point{std::chrono::sys_seconds{1s}} + 1 * s == quantity_point{2s}); + static_assert((quantity_point{std::chrono::sys_seconds{1s}} + 1 * s).relative() == 2s); diff --git a/example/glide_computer/include/glide_computer.h b/example/glide_computer/include/glide_computer.h index 8185f95f..ef9631f7 100644 --- a/example/glide_computer/include/glide_computer.h +++ b/example/glide_computer/include/glide_computer.h @@ -30,6 +30,7 @@ #include // IWYU pragma: end_exports +#include #include #include // IWYU pragma: keep #include @@ -88,7 +89,7 @@ using altitude = units::quantity_point_kind; -using timestamp = units::quantity_point; +using timestamp = units::quantity_point, units::isq::si::second>; // speed using velocity = units::quantity_kind; diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index 4ec56115..7b68b994 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -205,6 +205,52 @@ concept UnitOf = Dimension && std::same_as::reference>; +// PointOrigin + +template +struct point_origin; + +/** + * @brief A concept matching a point origin + * + * Satisfied by types derived from an specialization of @c point_origin. + */ +template +concept PointOrigin = is_derived_from_specialization_of && + requires { + typename T::dimension; + requires Dimension; + typename T::point_origin; + requires std::same_as>; + requires !std::same_as>; + }; + +// RebindablePointOriginFor + +namespace detail { + +template +struct rebind_point_origin_dimension_impl { + using type = typename O::template rebind; +}; + +} // namespace detail + +template +using rebind_point_origin_dimension = typename conditional, std::type_identity, + detail::rebind_point_origin_dimension_impl>::type; + +/** + * @brief A concept predicating the possibility of changing an origin's dimension + * + * Satisfied by point origins whose dimension can be made to be `D`. + */ +template +concept RebindablePointOriginFor = + requires { typename rebind_point_origin_dimension; } && + PointOrigin> && + std::same_as::dimension>; + // Kind namespace detail { @@ -216,7 +262,7 @@ struct _kind_base; template typename Base> concept kind_impl_ = is_derived_from_specialization_of && - requires(T* t) { + requires { typename T::base_kind; typename T::dimension; requires Dimension; @@ -236,7 +282,7 @@ concept Kind = // PointKind namespace detail { -template +template struct _point_kind_base; } // namespace detail @@ -247,7 +293,12 @@ struct _point_kind_base; * Satisfied by all point kind types derived from an specialization of @c point_kind. */ template -concept PointKind = kind_impl_; +concept PointKind = + kind_impl_ && + requires { typename T::origin; } && + PointOrigin && + std::same_as && + std::same_as; // Reference namespace detail { diff --git a/src/core/include/units/bits/common_quantity.h b/src/core/include/units/bits/common_quantity.h index 1bcc0cfb..789ff5b1 100644 --- a/src/core/include/units/bits/common_quantity.h +++ b/src/core/include/units/bits/common_quantity.h @@ -31,7 +31,7 @@ namespace units { template U, Representation Rep> class quantity; -template U, Representation Rep> +template U, Representation Rep> class quantity_point; template U, Representation Rep> @@ -99,7 +99,8 @@ template QP2> requires requires { typename common_type_t; } struct common_type { using type = units::quantity_point< - typename common_type_t::dimension, + units::rebind_point_origin_dimension::dimension>, typename common_type_t::unit, typename common_type_t::rep>; }; diff --git a/src/core/include/units/bits/equivalent.h b/src/core/include/units/bits/equivalent.h index 80825870..dca2d65f 100644 --- a/src/core/include/units/bits/equivalent.h +++ b/src/core/include/units/bits/equivalent.h @@ -81,29 +81,48 @@ template struct equivalent_unit : std::disjunction, std::bool_constant::ratio == U2::ratio / dimension_unit::ratio>> {}; +// point origins + +template +struct equivalent_impl : std::bool_constant && RebindablePointOriginFor && + std::same_as> && + std::same_as>; + } && equivalent_impl::value> {}; + // (point) kinds -template - requires (Kind && Kind) || (PointKind && PointKind) +template struct equivalent_impl : std::conjunction, equivalent_impl> {}; +template +struct equivalent_impl : + std::conjunction, + equivalent_impl> {}; + // quantities, quantity points, quantity (point) kinds -template - requires (Quantity && Quantity) || (QuantityPoint && QuantityPoint) +template struct equivalent_impl : std::conjunction, equivalent_unit> {}; -template - requires (QuantityKind && QuantityKind) || (QuantityPointKind && QuantityPointKind) +template +struct equivalent_impl : std::conjunction, + equivalent_impl> {}; + +template struct equivalent_impl : std::conjunction, equivalent_impl> {}; +template +struct equivalent_impl : std::conjunction, + equivalent_impl> {}; + } // namespace detail template diff --git a/src/core/include/units/bits/quantity_of.h b/src/core/include/units/bits/quantity_of.h index 832f273f..4ec1368f 100644 --- a/src/core/include/units/bits/quantity_of.h +++ b/src/core/include/units/bits/quantity_of.h @@ -85,21 +85,20 @@ template concept QuantityEquivalentTo = Quantity && QuantityOf; /** - * @brief A concept matching all quantity points with provided dimension + * @brief A concept matching all quantity points of the provided origin * - * Satisfied by all quantity points with a dimension being the instantiation derived from - * the provided dimension type. + * Satisfied by all quantity points with an origin equivalent to the provided one. */ -template -concept QuantityPointOf = QuantityPoint && Dimension && equivalent; +template +concept QuantityPointOf = QuantityPoint && PointOrigin && equivalent; /** * @brief A concept matching two equivalent quantity points * - * Satisfied by quantity points having equivalent dimensions. + * Satisfied by quantity points having equivalent origins. */ template -concept QuantityPointEquivalentTo = QuantityPoint && QuantityPointOf; +concept QuantityPointEquivalentTo = QuantityPoint && QuantityPointOf; /** * @brief A concept matching only quantity kinds of a specific kind. diff --git a/src/core/include/units/chrono.h b/src/core/include/units/chrono.h index 5e5d14e9..d85496bd 100644 --- a/src/core/include/units/chrono.h +++ b/src/core/include/units/chrono.h @@ -25,6 +25,7 @@ #include // IWYU pragma: begin_exports #include +#include #include // IWYU pragma: end_exports @@ -38,10 +39,13 @@ struct quantity_like_traits> { [[nodiscard]] static constexpr rep number(const std::chrono::duration& q) { return q.count(); } }; +template +struct clock_origin : point_origin { }; + template struct quantity_point_like_traits>> { - using dimension = isq::si::dim_time; - using unit = downcast_unit; + using origin = clock_origin; + using unit = downcast_unit; using rep = Rep; [[nodiscard]] static constexpr auto relative( const std::chrono::time_point>& qp) { @@ -49,4 +53,11 @@ struct quantity_point_like_traits +inline constexpr bool is_quantity_point_like>> = true; + +} // namespace detail + } // namespace units diff --git a/src/core/include/units/customization_points.h b/src/core/include/units/customization_points.h index 5b3a3d56..04827e1f 100644 --- a/src/core/include/units/customization_points.h +++ b/src/core/include/units/customization_points.h @@ -88,7 +88,7 @@ struct quantity_like_traits; /** * @brief Provides support for external quantity point-like types * - * The type trait should provide the following nested type aliases: @c dimension, @c unit, @c rep, + * The type trait should provide the following nested type aliases: @c origin, @c unit, @c rep, * and a static member function @c relative(T) that will return the quantity-like value of the quantity point. * * Usage example can be found in @c units/chrono.h header file. diff --git a/src/core/include/units/kind.h b/src/core/include/units/kind.h index 5494adc5..690dcbd5 100644 --- a/src/core/include/units/kind.h +++ b/src/core/include/units/kind.h @@ -27,6 +27,9 @@ namespace units { +template +struct dynamic_origin; + namespace detail { template @@ -35,10 +38,11 @@ struct _kind_base : downcast_base<_kind_base> { using dimension = D; }; -template -struct _point_kind_base : downcast_base<_point_kind_base> { +template +struct _point_kind_base : downcast_base<_point_kind_base> { using base_kind = K; using dimension = typename K::dimension; + using origin = O; }; } // namespace detail @@ -47,9 +51,9 @@ template requires Kind>> using downcast_kind = downcast>; -template - requires PointKind>> -using downcast_point_kind = downcast>; +template> + requires PointKind>> +using downcast_point_kind = downcast>; template struct kind : downcast_dispatch> {}; @@ -58,7 +62,7 @@ template requires std::same_as struct derived_kind : downcast_dispatch> {}; -template -struct point_kind : downcast_dispatch> {}; +template> +struct point_kind : downcast_dispatch> {}; } // namespace units diff --git a/src/core/include/units/point_origin.h b/src/core/include/units/point_origin.h new file mode 100644 index 00000000..581ccbfc --- /dev/null +++ b/src/core/include/units/point_origin.h @@ -0,0 +1,34 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#pragma once + +#include + +namespace units { + +template +struct point_origin { + using dimension = D; +}; + +} // namespace units diff --git a/src/core/include/units/quantity_cast.h b/src/core/include/units/quantity_cast.h index 655a0720..1472b701 100644 --- a/src/core/include/units/quantity_cast.h +++ b/src/core/include/units/quantity_cast.h @@ -39,7 +39,7 @@ namespace units { template U, Representation Rep> class quantity; -template U, Representation Rep> +template U, Representation Rep> class quantity_point; template U, Representation Rep> @@ -234,10 +234,12 @@ template Rep * * @tparam CastSpec a target quantity point type to cast to or anything that works for quantity_cast */ -template - requires is_specialization_of || - requires(quantity q) { quantity_cast(q); } -[[nodiscard]] constexpr auto quantity_point_cast(const quantity_point& qp) +template +[[nodiscard]] constexpr auto quantity_point_cast(const quantity_point& qp) + requires requires { requires is_specialization_of; + requires requires { quantity_cast(qp.relative()); }; + requires equivalent; } || // TODO: Simplify when Clang catches up. + requires { quantity_cast(qp.relative()); } { if constexpr (is_specialization_of) return quantity_point(quantity_cast(qp.relative())); @@ -261,11 +263,11 @@ template * @tparam ToD a dimension type to use for a target quantity * @tparam ToU a unit type to use for a target quantity */ -template - requires equivalent && UnitOf -[[nodiscard]] constexpr auto quantity_point_cast(const quantity_point& q) +template + requires equivalent && UnitOf && RebindablePointOriginFor +[[nodiscard]] constexpr auto quantity_point_cast(const quantity_point& q) { - return quantity_point_cast>(q); + return quantity_point_cast, ToU, Rep>>(q); } /** @@ -347,7 +349,8 @@ template template [[nodiscard]] constexpr QuantityPointKind auto quantity_point_kind_cast(const quantity_point_kind& qpk) requires requires { requires is_specialization_of; - requires requires { quantity_kind_cast(qpk.relative()); }; } || + requires requires { quantity_kind_cast(qpk.relative()); }; + requires equivalent; } || requires { requires PointKind && UnitOf; } || requires { quantity_kind_cast(qpk.relative()); } // TODO: Simplify when Clang catches up. { diff --git a/src/core/include/units/quantity_point.h b/src/core/include/units/quantity_point.h index cbb5e2a7..4da06901 100644 --- a/src/core/include/units/quantity_point.h +++ b/src/core/include/units/quantity_point.h @@ -24,6 +24,7 @@ #pragma once // IWYU pragma: begin_exports +#include #include #include // IWYU pragma: end_exports @@ -34,18 +35,32 @@ namespace units { /** - * @brief A quantity point + * @brief A statically unspecified quantity point origin * - * An absolute quantity with respect to zero (which represents some origin). + * An origin, unspecified in the type system, from which an absolute quantity is measured from. * * @tparam D a dimension of the quantity point (can be either a BaseDimension or a DerivedDimension) + */ +template +struct dynamic_origin : point_origin { + template + using rebind = dynamic_origin; +}; + +/** + * @brief A quantity point + * + * An absolute quantity measured from an origin. + * + * @tparam O a type that represents the origin from which the quantity point is measured from * @tparam U a measurement unit of the quantity point * @tparam Rep a type to be used to represent values of a quantity point */ -template U, Representation Rep = double> +template U, Representation Rep = double> class quantity_point { public: - using quantity_type = quantity; + using origin = O; + using quantity_type = quantity; using dimension = typename quantity_type::dimension; using unit = typename quantity_type::unit; using rep = typename quantity_type::rep; @@ -63,13 +78,14 @@ public: requires std::constructible_from constexpr explicit quantity_point(T&& t) : q_(std::forward(t)) {} - template + template QP2> requires std::convertible_to constexpr explicit(false) quantity_point(const QP2& qp) : q_(qp.relative()) {} template constexpr explicit quantity_point(const QP& qp) - requires std::is_constructible_v::relative(qp))> + requires std::is_constructible_v::relative(qp))> && + equivalent::origin> : q_(quantity_point_like_traits::relative(qp)) {} quantity_point& operator=(const quantity_point&) = default; @@ -141,7 +157,8 @@ public: { const auto q = lhs.relative() + rhs; using q_type = decltype(q); - return quantity_point(q); + return quantity_point, typename q_type::unit, + typename q_type::rep>(q); } template @@ -157,24 +174,25 @@ public: { const auto q = lhs.relative() - rhs; using q_type = decltype(q); - return quantity_point(q); + return quantity_point, typename q_type::unit, + typename q_type::rep>(q); } - template + template QP> [[nodiscard]] friend constexpr Quantity auto operator-(const quantity_point& lhs, const QP& rhs) requires requires(quantity_type q) { q - rhs.relative(); } { return lhs.relative() - rhs.relative(); } - template + template QP> requires std::three_way_comparable_with [[nodiscard]] friend constexpr auto operator<=>(const quantity_point& lhs, const QP& rhs) { return lhs.relative() <=> rhs.relative(); } - template + template QP> requires std::equality_comparable_with [[nodiscard]] friend constexpr bool operator==(const quantity_point& lhs, const QP& rhs) { @@ -183,24 +201,24 @@ public: }; template -explicit quantity_point(Rep) -> quantity_point; +explicit quantity_point(Rep) -> quantity_point, one, Rep>; template -explicit quantity_point(Q) -> quantity_point; +explicit quantity_point(Q) -> quantity_point, typename Q::unit, typename Q::rep>; template -explicit quantity_point(Q) -> quantity_point::dimension, +explicit quantity_point(Q) -> quantity_point::dimension>, typename quantity_like_traits::unit, typename quantity_like_traits::rep>; template -explicit quantity_point(QP) -> quantity_point::dimension, +explicit quantity_point(QP) -> quantity_point::origin, typename quantity_point_like_traits::unit, typename quantity_point_like_traits::rep>; namespace detail { -template -inline constexpr bool is_quantity_point> = true; +template +inline constexpr bool is_quantity_point> = true; } // namespace detail diff --git a/src/core/include/units/quantity_point_kind.h b/src/core/include/units/quantity_point_kind.h index 213de447..a2c5f1a1 100644 --- a/src/core/include/units/quantity_point_kind.h +++ b/src/core/include/units/quantity_point_kind.h @@ -34,7 +34,7 @@ namespace units { /** * @brief A quantity point kind * - * An absolute quantity kind with respect to zero (which represents some origin). + * An absolute quantity kind measured from an origin. * * @tparam PK the point kind of quantity point * @tparam U the measurement unit of the quantity point kind @@ -45,6 +45,7 @@ class quantity_point_kind { public: using point_kind_type = PK; using kind_type = typename PK::base_kind; + using origin = typename point_kind_type::origin; using quantity_kind_type = quantity_kind; using quantity_type = typename quantity_kind_type::quantity_type; using dimension = typename quantity_type::dimension; @@ -64,14 +65,14 @@ public: requires std::constructible_from constexpr explicit quantity_point_kind(T&& t) : qk_(std::forward(t)) {} - constexpr explicit quantity_point_kind(const quantity_point& qp) : qk_(qp.relative()) {} - constexpr explicit quantity_point_kind(quantity_point&& qp) : qk_(std::move(qp).relative()) {} + constexpr explicit quantity_point_kind(const quantity_point& qp) : qk_(qp.relative()) {} + constexpr explicit quantity_point_kind(quantity_point&& qp) : qk_(std::move(qp).relative()) {} template - requires std::constructible_from, QP> + requires std::constructible_from, QP> constexpr explicit quantity_point_kind(const QP& qp) : qk_(quantity_point_like_traits::relative(qp)) {} - template QPK2> + template QPK2> requires std::convertible_to constexpr explicit(false) quantity_point_kind(const QPK2& qpk) : qk_(qpk.relative()) {} @@ -159,20 +160,21 @@ public: return units::quantity_point_kind(lhs.relative() - rhs); } - [[nodiscard]] friend constexpr QuantityKind auto operator-(const quantity_point_kind& lhs, const quantity_point_kind& rhs) + template QPK> + [[nodiscard]] friend constexpr QuantityKind auto operator-(const quantity_point_kind& lhs, const QPK& rhs) requires requires(quantity_kind_type qk) { qk - qk; } { return lhs.relative() - rhs.relative(); } - template + template QPK> requires std::three_way_comparable_with [[nodiscard]] friend constexpr auto operator<=>(const quantity_point_kind& lhs, const QPK& rhs) { return lhs.relative() <=> rhs.relative(); } - template + template QPK> requires std::equality_comparable_with [[nodiscard]] friend constexpr bool operator==(const quantity_point_kind& lhs, const QPK& rhs) { diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index f3981ce4..0c5b3d9c 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -51,6 +51,7 @@ add_library(unit_tests_static iec80000_test.cpp kind_test.cpp math_test.cpp + point_origin_test.cpp ratio_test.cpp references_test.cpp si_test.cpp diff --git a/test/unit_test/static/chrono_test.cpp b/test/unit_test/static/chrono_test.cpp index ec556723..ed812548 100644 --- a/test/unit_test/static/chrono_test.cpp +++ b/test/unit_test/static/chrono_test.cpp @@ -36,7 +36,7 @@ using namespace std::chrono_literals; using sys_seconds = std::chrono::time_point; using sys_days = std::chrono::time_point, std::chrono::hours::period>>>; -template using time_point = quantity_point; +template using time_point = quantity_point, U, Rep>; static_assert(QuantityLike); static_assert(QuantityPointLike); @@ -50,14 +50,17 @@ static_assert(std::constructible_from>); static_assert(!std::constructible_from, std::chrono::seconds>); static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_seconds>); -static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, sys_seconds>); -static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_seconds>); +static_assert(!std::constructible_from, sys_seconds>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(!std::constructible_from, sys_days>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(!std::constructible_from, sys_days>); +static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, sys_seconds>); +static_assert(!std::convertible_to>); // construction - different rep type (integral to a floating-point) static_assert(std::constructible_from, std::chrono::seconds>); @@ -66,25 +69,25 @@ static_assert(std::constructible_from, std::chrono::hours>) static_assert(!std::convertible_to>); static_assert(std::constructible_from, std::chrono::seconds>); static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_seconds>); -static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(!std::convertible_to>); -static_assert(std::constructible_from, sys_seconds>); -static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_seconds>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, sys_seconds>); +static_assert(!std::convertible_to>); // CTAD static_assert(is_same_v>); static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(is_same_v>); +static_assert(is_same_v>); // operators static_assert(quantity{1s} + 1_q_s == 2_q_s); static_assert(quantity{1s} + 1_q_min == 61_q_s); static_assert(10_q_m / quantity{2s} == 5_q_m_per_s); -static_assert(quantity_point{sys_seconds{1s}} + 1_q_s == quantity_point{2_q_s}); -static_assert(quantity_point{sys_seconds{1s}} + 1_q_min == quantity_point{61_q_s}); +static_assert(quantity_point{sys_seconds{1s}} + 1_q_s == time_point{2_q_s}); +static_assert(quantity_point{sys_seconds{1s}} + 1_q_min == time_point{61_q_s}); } // namespace diff --git a/test/unit_test/static/concepts_test.cpp b/test/unit_test/static/concepts_test.cpp index fd0ce1f2..a54e3cd5 100644 --- a/test/unit_test/static/concepts_test.cpp +++ b/test/unit_test/static/concepts_test.cpp @@ -27,7 +27,7 @@ #include // IWYU pragma: keep #include #include -#include +#include #include #include #include @@ -112,11 +112,11 @@ static_assert(!Representation); static_assert(Quantity>); static_assert(!Quantity); -static_assert(!Quantity>); +static_assert(!Quantity, si::metre>>); // QuantityPoint -static_assert(QuantityPoint>); +static_assert(QuantityPoint, si::metre>>); static_assert(!QuantityPoint>); static_assert(!QuantityPoint); @@ -141,4 +141,9 @@ static_assert(QuantityOf, si::dim_length>); static_assert(QuantityOf, si::fps::dim_length>); static_assert(!QuantityOf, si::dim_time>); +static_assert(QuantityPointOf, si::second, int>, dynamic_origin>); +static_assert(QuantityPointOf, si::second, int>, clock_origin>); +static_assert(!QuantityPointOf, si::second, int>, clock_origin>); +static_assert(!QuantityPointOf, si::second, int>, dynamic_origin>); + } // namespace diff --git a/test/unit_test/static/kind_test.cpp b/test/unit_test/static/kind_test.cpp index fb6ba0bc..3e9b4eb8 100644 --- a/test/unit_test/static/kind_test.cpp +++ b/test/unit_test/static/kind_test.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include using namespace units; @@ -97,7 +98,6 @@ static_assert(PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v>); static_assert(is_same_v>); static_assert(equivalent); @@ -137,7 +137,6 @@ static_assert(PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v>); static_assert(is_same_v>); static_assert(equivalent); diff --git a/test/unit_test/static/point_origin_test.cpp b/test/unit_test/static/point_origin_test.cpp new file mode 100644 index 00000000..8da58e46 --- /dev/null +++ b/test/unit_test/static/point_origin_test.cpp @@ -0,0 +1,73 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include +#include +#include +#include +#include +#include + +using namespace units; +namespace si = isq::si; + +namespace { + +struct width : kind {}; + +struct ones_viewpoint1 : point_origin { + template + using rebind = ones_viewpoint1; +}; + +struct ones_viewpoint2 : point_origin { + template + using rebind = ones_viewpoint1; +}; + +static_assert(PointOrigin>); +static_assert(!PointOrigin>); +static_assert(!PointOrigin); +static_assert(!PointOrigin>); + +static_assert(RebindablePointOriginFor, si::dim_length>); +static_assert(is_same_v, si::dim_length>, + dynamic_origin>); +static_assert(RebindablePointOriginFor, si::dim_time>); +static_assert(is_same_v, si::dim_time>, + dynamic_origin>); +static_assert(RebindablePointOriginFor); +static_assert(is_same_v, ones_viewpoint1>); +static_assert(RebindablePointOriginFor); +static_assert(is_same_v, ones_viewpoint1>); +static_assert(RebindablePointOriginFor); +static_assert(is_same_v, ones_viewpoint2>); +static_assert(!RebindablePointOriginFor); + +static_assert(equivalent, dynamic_origin>); +static_assert(equivalent, dynamic_origin>); +static_assert(!equivalent, clock_origin>); +static_assert(!equivalent, clock_origin>); +static_assert(!equivalent, dynamic_origin>); +static_assert(!equivalent); + +} // namespace diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index 5ffea7fe..740d0973 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -82,16 +82,16 @@ static_assert(QuantityKind>); static_assert(QuantityKind>); static_assert(!QuantityKind); static_assert(!QuantityKind>); -static_assert(!QuantityKind>); +static_assert(!QuantityKind, metre>>); static_assert(QuantityKindOf, width_kind>); static_assert(!QuantityKindOf, height_kind>); static_assert(!QuantityKindOf, metre>); static_assert(!QuantityKindOf, width_kind>); static_assert(!QuantityKindOf, metre>); -static_assert(!QuantityKindOf, width_kind>); -static_assert(!QuantityKindOf, dim_length>); -static_assert(!QuantityKindOf, metre>); +static_assert(!QuantityKindOf, metre>, width_kind>); +static_assert(!QuantityKindOf, metre>, dim_length>); +static_assert(!QuantityKindOf, metre>, metre>); /////////////// @@ -105,7 +105,7 @@ template concept invalid_types = requires { requires !requires { typename quantity_kind; }; // unit of a different dimension requires !requires { typename quantity_kind>; }; // quantity used as Rep - requires !requires { typename quantity_kind>; }; // quantity point used as Rep + requires !requires { typename quantity_kind, metre>>; }; // quantity point used as Rep requires !requires { typename quantity_kind>; }; // quantity kind used as Rep requires !requires { typename quantity_kind; }; // reordered arguments requires !requires { typename quantity_kind; }; // reordered arguments @@ -454,7 +454,7 @@ concept invalid_compound_assignments = requires(quantity_kind requires invalid_compound_assignments_>; requires invalid_compound_assignments_>; requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; + requires invalid_compound_assignments_, metre, int>>; requires invalid_compound_assignments_; }; static_assert(invalid_compound_assignments); @@ -485,12 +485,12 @@ static_assert((width(0 * m) - width(1 static_assert(!std::is_invocable_v, width, double>); static_assert(!std::is_invocable_v, width, length>); -static_assert(!std::is_invocable_v, width, quantity_point>); +static_assert(!std::is_invocable_v, width, quantity_point, metre>>); static_assert(!std::is_invocable_v, width, height>); static_assert(!std::is_invocable_v, width, reference>); static_assert(!std::is_invocable_v, width, double>); static_assert(!std::is_invocable_v, width, length>); -static_assert(!std::is_invocable_v, width, quantity_point>); +static_assert(!std::is_invocable_v, width, quantity_point, metre>>); static_assert(!std::is_invocable_v, width, height>); static_assert(!std::is_invocable_v, width, reference>); @@ -650,17 +650,17 @@ static_assert(is_same_v< static_assert(!std::is_invocable_v, reference, width>); static_assert(!std::is_invocable_v, width, height>); -static_assert(!std::is_invocable_v, height, quantity_point>); -static_assert(!std::is_invocable_v, quantity_point, height>); +static_assert(!std::is_invocable_v, height, quantity_point, metre>>); +static_assert(!std::is_invocable_v, quantity_point, metre>, height>); static_assert(!std::is_invocable_v, reference, width>); static_assert(!std::is_invocable_v, width, height>); -static_assert(!std::is_invocable_v, height, quantity_point>); -static_assert(!std::is_invocable_v, quantity_point, height>); +static_assert(!std::is_invocable_v, height, quantity_point, metre>>); +static_assert(!std::is_invocable_v, quantity_point, metre>, height>); static_assert(!std::is_invocable_v, width, reference>); static_assert(!std::is_invocable_v, width, length>); -static_assert(!std::is_invocable_v, width, quantity_point>); +static_assert(!std::is_invocable_v, width, quantity_point, metre, int>>); static_assert(!std::is_invocable_v, width, double>); static_assert(!std::is_invocable_v, width, width>); @@ -801,8 +801,8 @@ concept invalid_cast = requires { requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast, metre, int>>(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast, one, int>>(quantity_kind(1 * m)); }; }; static_assert(invalid_cast); diff --git a/test/unit_test/static/quantity_point_kind_test.cpp b/test/unit_test/static/quantity_point_kind_test.cpp index b92ba9b5..73738566 100644 --- a/test/unit_test/static/quantity_point_kind_test.cpp +++ b/test/unit_test/static/quantity_point_kind_test.cpp @@ -57,6 +57,18 @@ struct cgs_height_kind : kind {}; struct rate_of_climb_kind : derived_kind {}; struct altitude_kind : point_kind {}; +struct sea_level_origin : point_origin {}; +struct sea_level_altitude_kind : point_kind {}; + +template +struct screen_origin : point_origin { + template + using rebind = screen_origin; +}; +struct screen_si_width_kind : point_kind> {}; +struct screen_si_cgs_width_kind : + point_kind> {}; + struct apple : kind {}; struct orange : kind {}; struct nth_apple_kind : point_kind {}; @@ -65,6 +77,8 @@ struct nth_orange_kind : point_kind {}; struct time_kind : kind {}; struct time_point_kind : point_kind {}; +struct sys_time_point_kind : point_kind> {}; + template using width = quantity_kind; template using height = quantity_kind; template using abscissa = quantity_point_kind; @@ -76,6 +90,13 @@ template using cgs_height = quantity_kind< template using rate_of_climb = quantity_kind; template using altitude = quantity_point_kind; +template +using sea_level_altitude = quantity_point_kind; +template +using screen_si_width = quantity_point_kind; +template +using screen_si_cgs_width = quantity_point_kind; + template using apples = quantity_kind; template using oranges = quantity_kind; template using nth_apple = quantity_point_kind; @@ -89,7 +110,7 @@ static_assert(QuantityPointKind>); static_assert(QuantityPointKind>); static_assert(!QuantityPointKind); static_assert(!QuantityPointKind>); -static_assert(!QuantityPointKind>); +static_assert(!QuantityPointKind, metre>>); static_assert(!QuantityPointKind>); static_assert(QuantityPointKindOf, abscissa_kind>); @@ -100,9 +121,12 @@ static_assert(!QuantityPointKindOf, metre>); static_assert(!QuantityPointKindOf, abscissa_kind>); static_assert(!QuantityPointKindOf, width_kind>); static_assert(!QuantityPointKindOf, metre>); -static_assert(!QuantityPointKindOf, width_kind>); -static_assert(!QuantityPointKindOf, dim_length>); -static_assert(!QuantityPointKindOf, metre>); +static_assert(!QuantityPointKindOf, sea_level_altitude_kind>); +static_assert(!QuantityPointKindOf, sea_level_altitude_kind>); +static_assert(!QuantityPointKindOf, metre>, width_kind>); +static_assert(!QuantityPointKindOf, metre>, dim_length>); +static_assert(!QuantityPointKindOf, metre>, dynamic_origin>); +static_assert(!QuantityPointKindOf, metre>, metre>); /////////////// @@ -117,7 +141,7 @@ concept invalid_types = requires { requires !requires { typename quantity_point_kind; }; // width_kind is not a point kind requires !requires { typename quantity_point_kind; }; // unit of a different dimension requires !requires { typename quantity_point_kind>; }; // quantity used as Rep - requires !requires { typename quantity_point_kind>; }; // quantity point used as Rep + requires !requires { typename quantity_point_kind, metre>>; }; // quantity point used as Rep requires !requires { typename quantity_point_kind>; }; // quantity kind used as Rep requires !requires { typename quantity_point_kind>; }; // quantity point kind used as Rep requires !requires { typename quantity_point_kind; }; // reordered arguments @@ -160,6 +184,7 @@ static_assert(!std::is_aggregate_v>); static_assert(is_same_v::point_kind_type, abscissa_kind>); static_assert(is_same_v::kind_type, width_kind>); +static_assert(is_same_v::origin, dynamic_origin>); static_assert(is_same_v::quantity_kind_type, width>); static_assert(is_same_v::quantity_type, length>); static_assert(is_same_v::dimension, dim_length>); @@ -287,6 +312,14 @@ static_assert(!constructible_or_convertible_from>(quantity_ static_assert(!constructible_or_convertible_from>(quantity_point(1.0 * (m * m)))); static_assert(!constructible_or_convertible_from>(quantity_point(1.0 * s))); +static_assert(construct_from_only>(quantity_point, metre>(1 * m)) + .relative() + .common() == 1 * m); +static_assert(construct_from_only>(quantity_point, metre>(1 * m)) + .relative() + .common() == 1 * m); +static_assert(!constructible_or_convertible_from>(quantity_point(1.0 * m))); + // clang-format off static_assert(construct_from_only>(quantity_point(1)).relative().common() == 1); static_assert(construct_from_only>(quantity_point(1)).relative().common() == 1); @@ -303,8 +336,12 @@ static_assert(!constructible_or_convertible_from>(quantity_p static_assert(!constructible_or_convertible_from>(quantity_point(dimensionless(1)))); static_assert(!constructible_or_convertible_from>(quantity_point(1.0 * s))); -static_assert(construct_from_only>(sys_seconds{42s}).relative().common() == 42 * s); // clang-format on +static_assert( + construct_from_only>(sys_seconds{42s}).relative().common() == + 42 * s); +static_assert(!constructible_or_convertible_from>(sys_seconds{42s}), + "no implicit conversion to/from dynamic_origin"); ////////////////////////////////////// @@ -365,6 +402,15 @@ static_assert(!constructible_or_convertible_from>(nth_orange static_assert(!constructible_or_convertible_from>(abscissa(1 * m))); // clang-format on +static_assert(!constructible_or_convertible_from>( + quantity_point_kind{}), + "no implicit conversion to/from dynamic_origin"); +static_assert(!constructible_or_convertible_from>( + quantity_point_kind{}), + "no implicit conversion to/from dynamic_origin"); +static_assert(!constructible_or_convertible_from>(screen_si_cgs_width(1 * m)), + "base kinds are not the same (required by equivalent)"); + ////////////////////// // other conversions @@ -375,7 +421,7 @@ static_assert(!std::is_convertible_v, dimensionless, length>); static_assert(!std::is_convertible_v, width>); static_assert(!std::is_convertible_v, height>); -static_assert(!std::is_convertible_v, quantity_point>); +static_assert(!std::is_convertible_v, quantity_point, metre, int>>); //////////////////////// @@ -420,7 +466,7 @@ concept invalid_compound_assignments = requires(quantity_point_kind>; requires invalid_compound_assignments_>; requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; + requires invalid_compound_assignments_, metre, int>>; requires invalid_compound_assignments_; }; static_assert(invalid_compound_assignments); @@ -447,13 +493,13 @@ static_assert(same(width(2 * km) + abscissa(3e3 * static_assert(same(width(2e3 * m) + abscissa(3 * km), abscissa(5e3 * m))); static_assert(!std::is_invocable_v, abscissa, double>); static_assert(!std::is_invocable_v, abscissa, length>); -static_assert(!std::is_invocable_v, abscissa, quantity_point>); +static_assert(!std::is_invocable_v, abscissa, quantity_point, metre>>); static_assert(!std::is_invocable_v, abscissa, height>); static_assert(!std::is_invocable_v, abscissa, abscissa>); static_assert(!std::is_invocable_v, abscissa, abscissa>); static_assert(!std::is_invocable_v, abscissa, abscissa>); static_assert(!std::is_invocable_v, height, abscissa>); -static_assert(!std::is_invocable_v, quantity_point, abscissa>); +static_assert(!std::is_invocable_v, quantity_point, metre>, abscissa>); static_assert(!std::is_invocable_v, length, abscissa>); static_assert(!std::is_invocable_v, double, abscissa>); @@ -469,14 +515,15 @@ static_assert(same(abscissa(2 * km) - abscissa(3e static_assert(same(abscissa(2e3 * m) - abscissa(3 * km), width(-1e3 * m))); static_assert(!std::is_invocable_v, abscissa, double>); static_assert(!std::is_invocable_v, abscissa, length>); -static_assert(!std::is_invocable_v, abscissa, quantity_point>); +static_assert(!std::is_invocable_v, abscissa, quantity_point, metre>>); static_assert(!std::is_invocable_v, abscissa, height>); static_assert(!std::is_invocable_v, abscissa, ordinate>); static_assert(!std::is_invocable_v, ordinate, abscissa>); static_assert(!std::is_invocable_v, height, abscissa>); -static_assert(!std::is_invocable_v, quantity_point, abscissa>); +static_assert(!std::is_invocable_v, quantity_point, metre>, abscissa>); static_assert(!std::is_invocable_v, length, abscissa>); static_assert(!std::is_invocable_v, double, abscissa>); +static_assert(!std::is_invocable_v, screen_si_width, screen_si_cgs_width>); // clang-format on @@ -496,8 +543,8 @@ static_assert(std::equality_comparable_with, abscissa, abscissa>); static_assert(std::equality_comparable_with, abscissa>); // clang-format on -template -concept invalid_equality = requires(quantity_point_kind x) { +template +concept invalid_equality = requires(quantity_point_kind x, Int i) { requires !requires { x == 1; }; requires !requires { x != 1.0; }; requires !requires { x == 1 * m; }; @@ -516,8 +563,9 @@ concept invalid_equality = requires(quantity_point_kind x) requires !requires { x == quantity_point(dimensionless(1.0)); }; requires !requires { x != quantity_point_kind(cgs_width(1 * m)); }; requires !requires { x == ordinate(1 * m); }; + requires !requires { screen_si_width{} != screen_si_cgs_width{}; }; }; -static_assert(invalid_equality); +static_assert(invalid_equality); // clang-format off static_assert(abscissa(1 * m) < abscissa(2 * m)); @@ -531,8 +579,8 @@ static_assert(std::three_way_comparable_with, abscissa< static_assert(std::three_way_comparable_with, abscissa>); static_assert(std::three_way_comparable_with, abscissa>); // clang-format on -template -concept invalid_relational = requires(quantity_point_kind x) { +template +concept invalid_relational = requires(quantity_point_kind x, Int i) { requires !requires { x < 1; }; requires !requires { x <= 1.0; }; requires !requires { x >= 1 * m; }; @@ -551,8 +599,9 @@ concept invalid_relational = requires(quantity_point_kind requires !requires { x < quantity_point(dimensionless(1.0)); }; requires !requires { x <= quantity_point_kind(cgs_width(1 * m)); }; requires !requires { x >= ordinate(1 * m); }; + requires !requires { screen_si_width{} > screen_si_cgs_width{}; }; }; -static_assert(invalid_relational); +static_assert(invalid_relational); ///////////////////////////// @@ -600,6 +649,7 @@ static_assert(same(quantity_point_kind_cast>(abscissa>(abscissa(1 * m)), abscissa(100 * cm))); static_assert(same(quantity_point_kind_cast>(abscissa(0.01 * m)), abscissa(1 * cm))); static_assert(same(quantity_point_kind_cast>(abscissa(1 * cgs_cm)), abscissa(1 * cgs_cm))); +static_assert(same(quantity_point_kind_cast>(screen_si_width(1 * m)), screen_si_cgs_width(1 * m))); // clang-format on template concept invalid_cast = requires(Int i) { @@ -617,8 +667,9 @@ concept invalid_cast = requires(Int i) { requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast, metre, Int>>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast, one, Int>>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast, metre, Int>>(screen_si_width(i * m)); }; }; static_assert(invalid_cast); diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index ff7771c9..d8e810d9 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -41,72 +41,89 @@ using namespace references; using namespace std::chrono_literals; using sys_seconds = std::chrono::time_point; +struct sea_level_origin : point_origin {}; + // class invariants template concept invalid_types = requires { - requires !requires { typename quantity_point; }; // unit of a different dimension - requires !requires { typename quantity_point>; }; // quantity used as Rep - // quantity point used as Rep - requires !requires { typename quantity_point>; }; - requires !requires { typename quantity; }; // reordered arguments + // unit of a different dimension: + requires !requires { typename quantity_point, second, int>; }; + // quantity used as Rep: + requires !requires { typename quantity_point, metre, quantity>; }; + // quantity point used as Rep: + requires !requires { typename quantity_point, metre, + quantity_point, metre, int>>; }; + // reordered arguments: + requires !requires { typename quantity_point, double>; }; + // dimension used as origin: + requires !requires { typename quantity_point; }; }; static_assert(invalid_types); // member types -static_assert(is_same_v::rep, int>); -static_assert(is_same_v::rep, double>); -static_assert(is_same_v::unit, metre>); -static_assert(is_same_v::unit, kilometre>); -static_assert(is_same_v::dimension, dim_length>); -static_assert(is_same_v::quantity_type, quantity>); +static_assert(is_same_v, metre, int>::rep, int>); +static_assert(is_same_v, metre, double>::rep, double>); +static_assert(is_same_v, metre, int>::unit, metre>); +static_assert(is_same_v, kilometre, int>::unit, kilometre>); +static_assert(is_same_v, metre, int>::dimension, dim_length>); +static_assert(is_same_v, metre, int>::origin, dynamic_origin>); +static_assert(is_same_v, metre, int>::quantity_type, quantity>); // constructors static_assert(quantity_point(1).relative() == quantity(1)); -static_assert(!std::is_convertible_v>); +static_assert(!std::is_convertible_v, one, int>>); static_assert(quantity_point(42s).relative() == 42 * s); static_assert(quantity_point(sys_seconds{42s}).relative() == 42 * s); -static_assert(!std::is_convertible_v>); -static_assert(!std::is_convertible_v>); +static_assert(!std::is_convertible_v, second, std::chrono::seconds::rep>>); +static_assert(!std::is_convertible_v, second, std::chrono::seconds::rep>>); +static_assert(!std::is_convertible_v, second, sys_seconds::rep>>); +static_assert(!std::is_convertible_v, second, sys_seconds::rep>>); -static_assert(quantity_point().relative() == 0_q_m); -constexpr quantity_point km{1000_q_m}; +static_assert(quantity_point, metre, int>().relative() == 0_q_m); +constexpr quantity_point, metre, int> km{1000_q_m}; static_assert(km.relative() == 1000_q_m); -static_assert(quantity_point(km).relative() == km.relative()); +static_assert(quantity_point, metre, int>(km).relative() == km.relative()); -static_assert(quantity_point(1_q_m).relative() == 1_q_m); -static_assert(!std::is_constructible_v, double>); // truncating conversion -static_assert(quantity_point(1.0_q_m).relative() == 1.0_q_m); -static_assert(quantity_point(1_q_m).relative() == 1_q_m); -static_assert(quantity_point(3.14_q_m).relative() == 3.14_q_m); +static_assert(quantity_point, metre, int>(1_q_m).relative() == 1_q_m); +static_assert(!std::is_constructible_v, metre, int>, double>); // truncating conversion +static_assert(quantity_point, metre, double>(1.0_q_m).relative() == 1.0_q_m); +static_assert(quantity_point, metre, double>(1_q_m).relative() == 1_q_m); +static_assert(quantity_point, metre, long double>(3.14_q_m).relative() == 3.14_q_m); -static_assert(quantity_point(km).relative() == 1000_q_m); -static_assert(!std::is_constructible_v, - quantity_point>); // truncating conversion -static_assert(quantity_point(quantity_point(1000.0_q_m)).relative() == 1000.0_q_m); -static_assert(quantity_point(km).relative() == 1000.0_q_m); -static_assert(quantity_point(quantity_point(1_q_km)).relative() == 1000_q_m); -static_assert(!std::is_constructible_v, - quantity_point>); // different dimensions -static_assert(!std::is_constructible_v, - quantity_point>); // truncating conversion +static_assert(quantity_point, metre, int>(km).relative() == 1000_q_m); +static_assert(!std::is_constructible_v, metre, int>, + quantity_point, metre, double>>); // truncating conversion +static_assert(quantity_point, metre, double>(quantity_point(1000.0_q_m)).relative() == 1000.0_q_m); +static_assert(quantity_point, metre, double>(km).relative() == 1000.0_q_m); +static_assert(quantity_point, metre, int>(quantity_point(1_q_km)).relative() == 1000_q_m); +static_assert(!std::is_constructible_v, metre, int>, + quantity_point, second, int>>); // different dimensions +static_assert(!std::is_constructible_v, kilometre, int>, + quantity_point, metre, int>>); // truncating conversion + +static_assert(!std::is_constructible_v, + quantity_point, metre, int>>, + "non-equivalent origins"); +static_assert(!std::is_constructible_v, second, int>, sys_seconds>, + "non-equivalent origins, no implicit conversion from `clock_origin`"); // assignment operator -static_assert([]() { quantity_point l1(1_q_m), l2{}; return l2 = l1; }().relative() == 1_q_m); +static_assert([]() { quantity_point, metre, int> l1(1_q_m), l2{}; return l2 = l1; }().relative() == 1_q_m); // static member functions -static_assert(quantity_point::min().relative().number() == std::numeric_limits::lowest()); -static_assert(quantity_point::max().relative().number() == std::numeric_limits::max()); -static_assert(quantity_point::min().relative().number() == +static_assert(quantity_point, metre, int>::min().relative().number() == std::numeric_limits::lowest()); +static_assert(quantity_point, metre, int>::max().relative().number() == std::numeric_limits::max()); +static_assert(quantity_point, metre, double>::min().relative().number() == std::numeric_limits::lowest()); -static_assert(quantity_point::max().relative().number() == +static_assert(quantity_point, metre, double>::max().relative().number() == std::numeric_limits::max()); // unary member operators @@ -114,19 +131,19 @@ static_assert(quantity_point::max().relative().number static_assert([](auto v) { auto vv = v++; return std::pair(v, vv); -}(km) == std::pair(quantity_point(1001_q_m), quantity_point(1000_q_m))); +}(km) == std::pair(quantity_point, metre, int>(1001_q_m), quantity_point, metre, int>(1000_q_m))); static_assert([](auto v) { auto vv = ++v; return std::pair(v, vv); -}(km) == std::pair(quantity_point(1001_q_m), quantity_point(1001_q_m))); +}(km) == std::pair(quantity_point, metre, int>(1001_q_m), quantity_point, metre, int>(1001_q_m))); static_assert([](auto v) { auto vv = v--; return std::pair(v, vv); -}(km) == std::pair(quantity_point(999_q_m), quantity_point(1000_q_m))); +}(km) == std::pair(quantity_point, metre, int>(999_q_m), quantity_point, metre, int>(1000_q_m))); static_assert([](auto v) { auto vv = --v; return std::pair(v, vv); -}(km) == std::pair(quantity_point(999_q_m), quantity_point(999_q_m))); +}(km) == std::pair(quantity_point, metre, int>(999_q_m), quantity_point, metre, int>(999_q_m))); // compound assignment @@ -135,23 +152,23 @@ static_assert((quantity_point(2_q_m) -= 1_q_m).relative().number() == 1); // non-member arithmetic operators -static_assert(compare() + length()), - quantity_point>); -static_assert(compare() + quantity_point()), - quantity_point>); -static_assert(compare() + length()), - quantity_point>); -static_assert(compare() + quantity_point()), - quantity_point>); -static_assert(compare() - length()), - quantity_point>); -static_assert(compare() - length()), - quantity_point>); +static_assert(compare, metre, int>() + length()), + quantity_point, metre, double>>); +static_assert(compare() + quantity_point, metre, double>()), + quantity_point, metre, double>>); +static_assert(compare, kilometre, int>() + length()), + quantity_point, metre, double>>); +static_assert(compare() + quantity_point, metre, double>()), + quantity_point, metre, double>>); +static_assert(compare, metre, double>() - length()), + quantity_point, metre, double>>); +static_assert(compare, kilometre, double>() - length()), + quantity_point, metre, double>>); static_assert( - compare() - quantity_point()), + compare, metre, double>() - quantity_point, metre, int>()), length>); static_assert( - compare() - quantity_point()), + compare, kilometre, double>() - quantity_point, metre, int>()), length>); static_assert((1_q_m + km).relative().number() == 1001); @@ -159,6 +176,13 @@ static_assert((quantity_point(1_q_m) + 1_q_km).relative().number() == 1001); static_assert((km - 1_q_m).relative().number() == 999); static_assert((quantity_point(1_q_km) - quantity_point(1_q_m)).number() == 999); +template +concept invalid_subtraction = requires(quantity_point, metre, Int> lhs, + quantity_point rhs) { + requires !requires { rhs - lhs; }; +}; +static_assert(invalid_subtraction); + // comparators static_assert(quantity_point(2_q_m) + 1_q_m == quantity_point(3_q_m)); @@ -190,6 +214,14 @@ static_assert(quantity_point(999_q_m) < quantity_point(1_q_km)); static_assert(quantity_point(1000_q_m) >= quantity_point(1_q_km)); static_assert(quantity_point(1000_q_m) <= quantity_point(1_q_km)); +template +concept invalid_comparisons = requires(quantity_point, metre, Int> lhs, + quantity_point rhs) { + requires !requires { lhs == rhs; }; + requires !requires { lhs < rhs; }; +}; +static_assert(invalid_comparisons); + // alias units static_assert(quantity_point(2_q_l) + 2_q_ml == quantity_point(2002_q_ml)); @@ -199,19 +231,19 @@ static_assert(2_q_dm3 + quantity_point(2_q_cm3) == quantity_point(2002_q_ml)); // is_quantity_point -static_assert(QuantityPoint>); +static_assert(QuantityPoint, millimetre, int>>); // common_quantity_point static_assert(compare< - common_quantity_point, quantity_point>, - quantity_point>); -static_assert(compare, - quantity_point>, - quantity_point>); -static_assert(compare, - quantity_point>, - quantity_point>); + common_quantity_point, metre, int>, quantity_point, kilometre, int>>, + quantity_point, metre, int>>); +static_assert(compare, kilometre, long long>, + quantity_point, metre, int>>, + quantity_point, metre, long long>>); +static_assert(compare, kilometre, long long>, + quantity_point, millimetre, double>>, + quantity_point, millimetre, double>>); // common_type @@ -224,11 +256,11 @@ static_assert(std::equality_comparable_with>(quantity_point(2_q_km)).relative().number() == +static_assert(quantity_point_cast, metre, int>>(quantity_point(2_q_km)).relative().number() == 2000); static_assert( - quantity_point_cast>(quantity_point(2000_q_m)).relative().number() == 2); -static_assert(quantity_point_cast>(quantity_point(1.23_q_m)).relative().number() == + quantity_point_cast, kilometre, int>>(quantity_point(2000_q_m)).relative().number() == 2); +static_assert(quantity_point_cast, metre, int>>(quantity_point(1.23_q_m)).relative().number() == 1); static_assert(quantity_point_cast>(quantity_point(2_q_km)).relative().number() == 2000); static_assert(quantity_point_cast>(quantity_point(2000_q_m)).relative().number() == 2); @@ -238,6 +270,13 @@ static_assert(quantity_point_cast(quantity_point(2000_q_m)).relative( static_assert(quantity_point_cast(quantity_point(1.23_q_m)).relative().number() == 1); static_assert(quantity_point_cast(quantity_point(2000.0_q_m / 3600.0_q_s)).relative().number() == 2); +template +concept invalid_cast = requires(Int i) { + requires !requires { quantity_point_cast, second, Int>>(quantity_point(i * m)); }; + requires !requires { quantity_point_cast, metre, Int>>(quantity_point(i * m)); }; +}; +static_assert(invalid_cast); + // time static_assert(quantity_point{1_q_h} == quantity_point{3600_q_s}); @@ -263,6 +302,6 @@ concept dimensional_analysis = requires(T t) pow<2>(t); }; -static_assert(!dimensional_analysis>); +static_assert(!dimensional_analysis, metre, int>>); } // namespace From 8312b6e463cd132a1aa4e2fea8ae89d456bfde60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Tue, 29 Jun 2021 17:04:03 -0400 Subject: [PATCH 57/59] fix: factor out requires-expression to concept for MSVC --- src/core/include/units/bits/equivalent.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/core/include/units/bits/equivalent.h b/src/core/include/units/bits/equivalent.h index dca2d65f..5025ecc7 100644 --- a/src/core/include/units/bits/equivalent.h +++ b/src/core/include/units/bits/equivalent.h @@ -83,12 +83,15 @@ struct equivalent_unit : std::disjunction, // point origins +template +concept EquivalentPointOrigins = + RebindablePointOriginFor && RebindablePointOriginFor && + std::same_as> && + std::same_as>; + template -struct equivalent_impl : std::bool_constant && RebindablePointOriginFor && - std::same_as> && - std::same_as>; - } && equivalent_impl::value> {}; +struct equivalent_impl : std::bool_constant< + EquivalentPointOrigins && equivalent_impl::value> {}; // (point) kinds From 0768f2739ad09cabd26241b5eb45167f7b6f83f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Tue, 29 Jun 2021 17:23:01 -0400 Subject: [PATCH 58/59] fix: use complete type for MSVC --- test/unit_test/static/point_origin_test.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit_test/static/point_origin_test.cpp b/test/unit_test/static/point_origin_test.cpp index 8da58e46..0b289a75 100644 --- a/test/unit_test/static/point_origin_test.cpp +++ b/test/unit_test/static/point_origin_test.cpp @@ -33,6 +33,7 @@ namespace si = isq::si; namespace { struct width : kind {}; +struct abscissa : point_kind {}; struct ones_viewpoint1 : point_origin { template @@ -47,7 +48,7 @@ struct ones_viewpoint2 : point_origin { static_assert(PointOrigin>); static_assert(!PointOrigin>); static_assert(!PointOrigin); -static_assert(!PointOrigin>); +static_assert(!PointOrigin); static_assert(RebindablePointOriginFor, si::dim_length>); static_assert(is_same_v, si::dim_length>, From 7f64e55d044c8a8d9a5c6d4e4f55167409910749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Tue, 29 Jun 2021 17:27:04 -0400 Subject: [PATCH 59/59] docs: update changelog for #288 --- docs/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dd533d76..ad028535 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,8 @@ # Release notes - **0.8.0 WIP** + - (!) fix: add `quantity_point::origin`, like `std::chrono::time_point::clock` + - fix: account for different dimensions in `quantity_point_cast`'s constraint - build: doxygen updated to 1.9.1 - build: linear_algebra updated to 0.7.1